Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GrVkBackendSurface.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2023 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
8
13#include "include/gpu/GrTypes.h"
25
26#include <algorithm>
27#include <cstddef>
28#include <cstdint>
29#include <string>
30
32public:
34 : fFormat(format), fYcbcrConversionInfo(ycbcrInfo) {}
35
36 VkFormat asVkFormat() const { return fFormat; }
37 const GrVkYcbcrConversionInfo* getYcbcrConversionInfo() const { return &fYcbcrConversionInfo; }
38
39private:
52
53 size_t bytesPerBlock() const override {
54 return skgpu::VkFormatBytesPerBlock(fFormat);
55 }
56
57 int stencilBits() const override {
58 return skgpu::VkFormatStencilBits(fFormat);
59 }
60
61 uint32_t channelMask() const override {
62 return skgpu::VkFormatChannels(fFormat);
63 }
64
65 GrColorFormatDesc desc() const override {
66 return GrVkFormatDesc(fFormat);
67 }
68
69 bool equal(const GrBackendFormatData* that) const override {
70 SkASSERT(!that || that->type() == GrBackendApi::kVulkan);
71 if (auto otherVk = static_cast<const GrVkBackendFormatData*>(that)) {
72 return fFormat == otherVk->fFormat &&
73 fYcbcrConversionInfo == otherVk->fYcbcrConversionInfo;
74 }
75 return false;
76 }
77
78 std::string toString() const override {
79#if defined(SK_DEBUG) || GR_TEST_UTILS
80 return skgpu::VkFormatToStr(fFormat);
81#else
82 return "";
83#endif
84 }
85
86 void copyTo(AnyFormatData& formatData) const override {
87 formatData.emplace<GrVkBackendFormatData>(fFormat, fYcbcrConversionInfo);
88 }
89
90 void makeTexture2D() override {
91 // If we have a ycbcr we remove it from the backend format and set the VkFormat to
92 // R8G8B8A8_UNORM
93 if (fYcbcrConversionInfo.isValid()) {
94 fYcbcrConversionInfo = GrVkYcbcrConversionInfo();
96 }
97 }
98
99#if defined(SK_DEBUG)
100 GrBackendApi type() const override { return GrBackendApi::kVulkan; }
101#endif
102
103 VkFormat fFormat;
104 GrVkYcbcrConversionInfo fYcbcrConversionInfo;
105};
106
109 SkASSERT(!data || data->type() == GrBackendApi::kVulkan);
110 return static_cast<const GrVkBackendFormatData*>(data);
111}
112
113namespace GrBackendFormats {
114
121
122GrBackendFormat MakeVk(const GrVkYcbcrConversionInfo& ycbcrInfo, bool willUseDRMFormatModifiers) {
123 SkASSERT(ycbcrInfo.isValid());
124 GrTextureType textureType =
125 ((ycbcrInfo.isValid() && ycbcrInfo.fExternalFormat) || willUseDRMFormatModifiers)
129 textureType,
131 GrVkBackendFormatData(ycbcrInfo.fFormat, ycbcrInfo));
132}
133
134bool AsVkFormat(const GrBackendFormat& format, VkFormat* vkFormat) {
135 SkASSERT(vkFormat);
136 if (format.isValid() && format.backend() == GrBackendApi::kVulkan) {
138 SkASSERT(data);
139 *vkFormat = data->asVkFormat();
140 return true;
141 }
142 return false;
143}
144
146 if (format.isValid() && format.backend() == GrBackendApi::kVulkan) {
148 SkASSERT(data);
149 return data->getYcbcrConversionInfo();
150 }
151 return nullptr;
152}
153
154} // namespace GrBackendFormats
155
156
158public:
161 : fVkInfo(info) {
162 if (mutableState) {
163 fMutableState = std::move(mutableState);
164 } else {
165 fMutableState =
166 sk_make_sp<skgpu::MutableTextureState>(skgpu::MutableTextureStates::MakeVulkan(
168 }
169 }
170
171 const GrVkImageInfo& info() const { return fVkInfo; }
172
174 return fMutableState;
175 }
177 fMutableState->set(state);
178 }
179
180 skgpu::MutableTextureState* mutableState() { return fMutableState.get(); }
181 const skgpu::MutableTextureState* mutableState() const { return fMutableState.get(); }
182
183private:
184 void copyTo(AnyTextureData& textureData) const override {
185 textureData.emplace<GrVkBackendTextureData>(fVkInfo, fMutableState);
186 }
187
188 bool isProtected() const override { return fVkInfo.fProtected == skgpu::Protected::kYes; }
189
190 bool equal(const GrBackendTextureData* that) const override {
191 SkASSERT(!that || that->type() == GrBackendApi::kVulkan);
192 if (auto otherVk = static_cast<const GrVkBackendTextureData*>(that)) {
193 // For our tests when checking equality we are assuming both backendTexture objects will
194 // be using the same mutable state object.
195 if (fMutableState != otherVk->fMutableState) {
196 return false;
197 }
198 return GrVkImageInfoWithMutableState(fVkInfo, fMutableState.get()) ==
199 GrVkImageInfoWithMutableState(otherVk->fVkInfo, fMutableState.get());
200 }
201 return false;
202 }
203
204 bool isSameTexture(const GrBackendTextureData* that) const override {
205 SkASSERT(!that || that->type() == GrBackendApi::kVulkan);
206 if (auto otherVk = static_cast<const GrVkBackendTextureData*>(that)) {
207 return fVkInfo.fImage == otherVk->fVkInfo.fImage;
208 }
209 return false;
210
211 }
212
214 auto info = GrVkImageInfoWithMutableState(fVkInfo, fMutableState.get());
218 return GrBackendFormats::MakeVk(info.fYcbcrConversionInfo, usesDRMModifier);
219 }
220 return GrBackendFormats::MakeVk(info.fFormat, usesDRMModifier);
221 }
222
223#if defined(SK_DEBUG)
224 GrBackendApi type() const override { return GrBackendApi::kVulkan; }
225#endif
226
227 GrVkImageInfo fVkInfo;
229};
230
233 SkASSERT(!data || data->type() == GrBackendApi::kVulkan);
234 return static_cast<const GrVkBackendTextureData*>(data);
235}
236
239 SkASSERT(!data || data->type() == GrBackendApi::kVulkan);
240 return static_cast<GrVkBackendTextureData*>(data);
241}
242
244 if ((info.fYcbcrConversionInfo.isValid() && info.fYcbcrConversionInfo.fExternalFormat != 0) ||
247 }
248 return GrTextureType::k2D;
249}
250
253
256
257// We don't know if the backend texture is made renderable or not, so we default the usage flags
258// to include color attachment as well.
261
263 VkImageUsageFlags defaultFlags) {
264 if (info.fImageUsageFlags == 0) {
265 GrVkImageInfo newInfo = info;
266 newInfo.fImageUsageFlags = defaultFlags;
267 return newInfo;
268 }
269 return info;
270}
271
272namespace GrBackendTextures {
273
275 int height,
276 const GrVkImageInfo& vkInfo,
277 std::string_view label) {
279 width,
280 height,
281 label,
282 skgpu::Mipmapped(vkInfo.fLevelCount > 1),
286}
287
289 int height,
290 const GrVkImageInfo& vkInfo,
293 width,
294 height,
295 /*label=*/{},
296 skgpu::Mipmapped(vkInfo.fLevelCount > 1),
300 std::move(mutableState)));
301}
302
304 if (!tex.isValid() || tex.backend() != GrBackendApi::kVulkan) {
305 return false;
306 }
307 const GrVkBackendTextureData* data = get_and_cast_data(tex);
308 SkASSERT(data);
309 *outInfo = GrVkImageInfoWithMutableState(data->info(), data->mutableState());
310 return true;
311}
312
314 if (tex && tex->isValid() && tex->backend() == GrBackendApi::kVulkan) {
316 SkASSERT(data);
317 skgpu::MutableTextureStates::SetVkImageLayout(data->mutableState(), layout);
318 }
319}
320
321} // namespace GrBackendTextures
322
323
325public:
328 : fVkInfo(info) {
329 if (mutableState) {
330 fMutableState = std::move(mutableState);
331 } else {
332 fMutableState =
333 sk_make_sp<skgpu::MutableTextureState>(skgpu::MutableTextureStates::MakeVulkan(
335 }
336 }
337
338 const GrVkImageInfo& info() const { return fVkInfo; }
339
341 return fMutableState;
342 }
344 fMutableState->set(state);
345 }
346
347 skgpu::MutableTextureState* mutableState() { return fMutableState.get(); }
348 const skgpu::MutableTextureState* mutableState() const { return fMutableState.get(); }
349
350private:
359
360 bool isProtected() const override { return fVkInfo.fProtected == skgpu::Protected::kYes; }
361
362 bool equal(const GrBackendRenderTargetData* that) const override {
363 SkASSERT(!that || that->type() == GrBackendApi::kVulkan);
364 if (auto otherVk = static_cast<const GrVkBackendRenderTargetData*>(that)) {
365 // For our tests when checking equality we are assuming both objects will be using the
366 // same mutable state object.
367 if (fMutableState != otherVk->fMutableState) {
368 return false;
369 }
370 return GrVkImageInfoWithMutableState(fVkInfo, fMutableState.get()) ==
371 GrVkImageInfoWithMutableState(otherVk->fVkInfo, fMutableState.get());
372 }
373 return false;
374 }
375
376 void copyTo(AnyRenderTargetData& rtData) const override {
377 rtData.emplace<GrVkBackendRenderTargetData>(fVkInfo, fMutableState);
378 }
379
380#if defined(SK_DEBUG)
381 GrBackendApi type() const override { return GrBackendApi::kVulkan; }
382#endif
383
384 GrVkImageInfo fVkInfo;
386};
387
390 SkASSERT(!data || data->type() == GrBackendApi::kVulkan);
391 return static_cast<const GrVkBackendRenderTargetData*>(data);
392}
393
396 SkASSERT(!data || data->type() == GrBackendApi::kVulkan);
397 return static_cast<GrVkBackendRenderTargetData*>(data);
398}
399
400namespace GrBackendRenderTargets {
401
404 width,
405 height,
406 std::max(1U, vkInfo.fSampleCount),
407 /*stencilBits=*/0,
409 /*framebufferOnly=*/false,
411}
412
414 int height,
415 const GrVkImageInfo& vkInfo,
418 width,
419 height,
420 std::max(1U, vkInfo.fSampleCount),
421 /*stencilBits=*/0,
423 /*framebufferOnly=*/false,
425 std::move(mutableState)));
426}
427
429 if (!rt.isValid() || rt.backend() != GrBackendApi::kVulkan) {
430 return false;
431 }
433 SkASSERT(data);
434 *outInfo = GrVkImageInfoWithMutableState(data->info(), data->mutableState());
435 return true;
436}
437
439 if (rt && rt->isValid() && rt->backend() == GrBackendApi::kVulkan) {
441 skgpu::MutableTextureStates::SetVkImageLayout(data->mutableState(), layout);
442 }
443}
444
445} // namespace GrBackendRenderTargets
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition DM.cpp:213
static const GrGLBackendFormatData * get_and_cast_data(const GrBackendFormat &format)
GrTextureType
GrBackendApi
Definition GrTypes.h:95
static const VkImageUsageFlags kDefaultTexRTUsageFlags
static GrVkImageInfo apply_default_usage_flags(const GrVkImageInfo &info, VkImageUsageFlags defaultFlags)
static const VkImageUsageFlags kDefaultRTUsageFlags
static const GrVkBackendFormatData * get_and_cast_data(const GrBackendFormat &format)
static GrTextureType vk_image_info_to_texture_type(const GrVkImageInfo &info)
static const VkImageUsageFlags kDefaultUsageFlags
GrVkImageInfo GrVkImageInfoWithMutableState(const GrVkImageInfo &info, const skgpu::MutableTextureState *mutableState)
skgpu::VulkanYcbcrConversionInfo GrVkYcbcrConversionInfo
Definition GrVkTypes.h:17
static constexpr GrColorFormatDesc GrVkFormatDesc(VkFormat vkFormat)
Definition GrVkUtil.h:57
#define SkASSERT(cond)
Definition SkAssert.h:116
GrBackendApi backend() const
static GrBackendRenderTarget MakeGrBackendRenderTarget(int width, int height, int sampleCnt, int stencilBits, GrBackendApi backend, bool framebufferOnly, const RenderTargetData &data)
static GrBackendTexture MakeGrBackendTexture(int width, int height, std::string_view label, skgpu::Mipmapped mipped, GrBackendApi backend, GrTextureType texture, const TextureData &data)
static GrBackendFormat MakeGrBackendFormat(GrTextureType textureType, GrBackendApi api, const FormatData &data)
static const GrBackendFormatData * GetBackendData(const GrBackendFormat &format)
GrBackendApi backend() const
bool equal(const GrBackendFormatData *that) const override
GrVkBackendFormatData(VkFormat format, const GrVkYcbcrConversionInfo &ycbcrInfo)
const GrVkYcbcrConversionInfo * getYcbcrConversionInfo() const
size_t bytesPerBlock() const override
GrColorFormatDesc desc() const override
SkTextureCompressionType compressionType() const override
int stencilBits() const override
std::string toString() const override
void copyTo(AnyFormatData &formatData) const override
uint32_t channelMask() const override
sk_sp< skgpu::MutableTextureState > getMutableState() const override
void copyTo(AnyRenderTargetData &rtData) const override
GrBackendFormat getBackendFormat() const override
void setMutableState(const skgpu::MutableTextureState &state) override
const GrVkImageInfo & info() const
bool isProtected() const override
GrVkBackendRenderTargetData(const GrVkImageInfo &info, sk_sp< skgpu::MutableTextureState > mutableState=nullptr)
const skgpu::MutableTextureState * mutableState() const
skgpu::MutableTextureState * mutableState()
bool equal(const GrBackendRenderTargetData *that) const override
GrVkBackendTextureData(const GrVkImageInfo &info, sk_sp< skgpu::MutableTextureState > mutableState=nullptr)
sk_sp< skgpu::MutableTextureState > getMutableState() const override
GrBackendFormat getBackendFormat() const override
bool isProtected() const override
bool isSameTexture(const GrBackendTextureData *that) const override
void setMutableState(const skgpu::MutableTextureState &state) override
bool equal(const GrBackendTextureData *that) const override
const skgpu::MutableTextureState * mutableState() const
const GrVkImageInfo & info() const
skgpu::MutableTextureState * mutableState()
void copyTo(AnyTextureData &textureData) const override
void emplace(Args &&... args)
T * get() const
Definition SkRefCnt.h:303
void set(const MutableTextureState &that)
AtkStateType state
uint32_t uint32_t * format
FlTexture * texture
SK_API bool AsVkFormat(const GrBackendFormat &, VkFormat *)
SK_API GrBackendFormat MakeVk(VkFormat format, bool willUseDRMFormatModifiers=false)
SK_API const GrVkYcbcrConversionInfo * GetVkYcbcrConversionInfo(const GrBackendFormat &)
SK_API bool GetVkImageInfo(const GrBackendRenderTarget &, GrVkImageInfo *)
SK_API void SetVkImageLayout(GrBackendRenderTarget *, VkImageLayout)
SK_API GrBackendRenderTarget MakeVk(int width, int height, const GrVkImageInfo &)
SK_API void SetVkImageLayout(GrBackendTexture *, VkImageLayout)
SK_API GrBackendTexture MakeVk(int width, int height, const GrVkImageInfo &, std::string_view label={})
SK_API bool GetVkImageInfo(const GrBackendTexture &, GrVkImageInfo *)
void SetVkImageLayout(MutableTextureState *state, VkImageLayout layout)
SK_API MutableTextureState MakeVulkan(VkImageLayout layout, uint32_t queueFamilyIndex)
static constexpr const char * VkFormatToStr(VkFormat vkFormat)
static constexpr int VkFormatStencilBits(VkFormat format)
static constexpr size_t VkFormatBytesPerBlock(VkFormat vkFormat)
static constexpr uint32_t VkFormatChannels(VkFormat vkFormat)
Mipmapped
Definition GpuTypes.h:53
int32_t height
int32_t width
GrVkYcbcrConversionInfo fYcbcrConversionInfo
Definition GrVkTypes.h:36
VkImage fImage
Definition GrVkTypes.h:26
uint32_t fCurrentQueueFamily
Definition GrVkTypes.h:34
VkFormat fFormat
Definition GrVkTypes.h:30
uint32_t fSampleCount
Definition GrVkTypes.h:32
skgpu::Protected fProtected
Definition GrVkTypes.h:35
uint32_t fLevelCount
Definition GrVkTypes.h:33
VkImageLayout fImageLayout
Definition GrVkTypes.h:29
VkImageUsageFlags fImageUsageFlags
Definition GrVkTypes.h:31
VkImageTiling fImageTiling
Definition GrVkTypes.h:28
VkImageLayout
VkFlags VkImageUsageFlags
@ VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
@ VK_IMAGE_USAGE_SAMPLED_BIT
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
@ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
VkFormat
@ VK_FORMAT_R8G8B8A8_UNORM
@ VK_FORMAT_BC1_RGB_UNORM_BLOCK
@ VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
@ VK_FORMAT_BC1_RGBA_UNORM_BLOCK