Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
blit_pass.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6#include <memory>
7#include <utility>
8
12
13namespace impeller {
14
16
17BlitPass::~BlitPass() = default;
18
19void BlitPass::SetLabel(std::string label) {
20 if (label.empty()) {
21 return;
22 }
23 OnSetLabel(std::move(label));
24}
25
26bool BlitPass::AddCopy(std::shared_ptr<Texture> source,
27 std::shared_ptr<Texture> destination,
28 std::optional<IRect> source_region,
29 IPoint destination_origin,
30 std::string label) {
31 if (!source) {
32 VALIDATION_LOG << "Attempted to add a texture blit with no source.";
33 return false;
34 }
35 if (!destination) {
36 VALIDATION_LOG << "Attempted to add a texture blit with no destination.";
37 return false;
38 }
39
40 if (source->GetTextureDescriptor().sample_count !=
41 destination->GetTextureDescriptor().sample_count) {
43 "The source sample count (%d) must match the destination sample count "
44 "(%d) for blits.",
45 static_cast<int>(source->GetTextureDescriptor().sample_count),
46 static_cast<int>(destination->GetTextureDescriptor().sample_count));
47 return false;
48 }
49 if (source->GetTextureDescriptor().format !=
50 destination->GetTextureDescriptor().format) {
52 "The source pixel format (%s) must match the destination pixel format "
53 "(%s) "
54 "for blits.",
55 PixelFormatToString(source->GetTextureDescriptor().format),
56 PixelFormatToString(destination->GetTextureDescriptor().format));
57 return false;
58 }
59
60 if (!source_region.has_value()) {
61 source_region = IRect::MakeSize(source->GetSize());
62 }
63
64 // Clip the source image.
65 source_region =
66 source_region->Intersection(IRect::MakeSize(source->GetSize()));
67 if (!source_region.has_value()) {
68 return true; // Nothing to blit.
69 }
70
71 // Clip the destination image.
72 source_region = source_region->Intersection(
73 IRect::MakeOriginSize(-destination_origin, destination->GetSize()));
74 if (!source_region.has_value()) {
75 return true; // Nothing to blit.
76 }
77
79 std::move(source), std::move(destination), source_region.value(),
80 destination_origin, std::move(label));
81}
82
83bool BlitPass::AddCopy(std::shared_ptr<Texture> source,
84 std::shared_ptr<DeviceBuffer> destination,
85 std::optional<IRect> source_region,
86 size_t destination_offset,
87 std::string label) {
88 if (!source) {
89 VALIDATION_LOG << "Attempted to add a texture blit with no source.";
90 return false;
91 }
92 if (!destination) {
93 VALIDATION_LOG << "Attempted to add a texture blit with no destination.";
94 return false;
95 }
96
97 if (!source_region.has_value()) {
98 source_region = IRect::MakeSize(source->GetSize());
99 }
100
101 auto bytes_per_pixel =
102 BytesPerPixelForPixelFormat(source->GetTextureDescriptor().format);
103 auto bytes_per_image = source_region->Area() * bytes_per_pixel;
104 if (destination_offset + bytes_per_image >
105 destination->GetDeviceBufferDescriptor().size) {
107 << "Attempted to add a texture blit with out of bounds access.";
108 return false;
109 }
110
111 // Clip the source image.
112 source_region =
113 source_region->Intersection(IRect::MakeSize(source->GetSize()));
114 if (!source_region.has_value()) {
115 return true; // Nothing to blit.
116 }
117
118 return OnCopyTextureToBufferCommand(std::move(source), std::move(destination),
119 source_region.value(), destination_offset,
120 std::move(label));
121}
122
124 std::shared_ptr<Texture> destination,
125 IPoint destination_origin,
126 std::string label) {
127 if (!destination) {
128 VALIDATION_LOG << "Attempted to add a texture blit with no destination.";
129 return false;
130 }
131
132 auto bytes_per_pixel =
133 BytesPerPixelForPixelFormat(destination->GetTextureDescriptor().format);
134 auto bytes_per_image =
135 destination->GetTextureDescriptor().size.Area() * bytes_per_pixel;
136
137 if (source.range.length != bytes_per_image) {
139 << "Attempted to add a texture blit with out of bounds access.";
140 return false;
141 }
142
143 return OnCopyBufferToTextureCommand(std::move(source), std::move(destination),
144 destination_origin, std::move(label));
145}
146
147bool BlitPass::GenerateMipmap(std::shared_ptr<Texture> texture,
148 std::string label) {
149 if (!texture) {
150 VALIDATION_LOG << "Attempted to add an invalid mipmap generation command "
151 "with no texture.";
152 return false;
153 }
154
155 return OnGenerateMipmapCommand(std::move(texture), std::move(label));
156}
157
158} // namespace impeller
virtual bool OnCopyTextureToBufferCommand(std::shared_ptr< Texture > source, std::shared_ptr< DeviceBuffer > destination, IRect source_region, size_t destination_offset, std::string label)=0
virtual bool OnCopyBufferToTextureCommand(BufferView source, std::shared_ptr< Texture > destination, IPoint destination_origin, std::string label)=0
bool AddCopy(std::shared_ptr< Texture > source, std::shared_ptr< Texture > destination, std::optional< IRect > source_region=std::nullopt, IPoint destination_origin={}, std::string label="")
Record a command to copy the contents of one texture to another texture. The blit area is limited by ...
Definition blit_pass.cc:26
bool GenerateMipmap(std::shared_ptr< Texture > texture, std::string label="")
Record a command to generate all mip levels for a texture. No work is encoded into the command buffer...
Definition blit_pass.cc:147
void SetLabel(std::string label)
Definition blit_pass.cc:19
virtual void OnSetLabel(std::string label)=0
virtual bool OnGenerateMipmapCommand(std::shared_ptr< Texture > texture, std::string label)=0
virtual bool OnCopyTextureToTextureCommand(std::shared_ptr< Texture > source, std::shared_ptr< Texture > destination, IRect source_region, IPoint destination_origin, std::string label)=0
SkBitmap source
Definition examples.cpp:28
FlTexture * texture
constexpr size_t BytesPerPixelForPixelFormat(PixelFormat format)
Definition formats.h:448
std::string SPrintF(const char *format,...)
Definition strings.cc:12
constexpr const char * PixelFormatToString(PixelFormat format)
Definition formats.h:141
static size_t bytes_per_pixel(skcms_PixelFormat fmt)
Definition skcms.cc:2449
static constexpr TRect MakeOriginSize(const TPoint< Type > &origin, const TSize< Type > &size)
Definition rect.h:140
static constexpr TRect MakeSize(const TSize< U > &size)
Definition rect.h:146
#define VALIDATION_LOG
Definition validation.h:73