1 /*
2 * Copyright 2024 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 */
7 #include "include/core/SkString.h"
8 #include "include/gpu/graphite/dawn/DawnTypes.h"
9 #include "src/gpu/graphite/TextureInfoPriv.h"
10 #include "src/gpu/graphite/dawn/DawnGraphiteTypesPriv.h"
11 #include "src/gpu/graphite/dawn/DawnUtilsPriv.h"
12
13 #include <cstdint>
14
15 namespace skgpu::graphite {
16
17 class DawnTextureInfoData final : public TextureInfoData {
18 public:
DawnTextureInfoData(DawnTextureSpec v)19 DawnTextureInfoData(DawnTextureSpec v) : fDawnSpec(v) {}
20
21 #if defined(SK_DEBUG)
type() const22 skgpu::BackendApi type() const override { return skgpu::BackendApi::kDawn; }
23 #endif
24
spec() const25 DawnTextureSpec spec() const { return fDawnSpec; }
26
27 private:
28 DawnTextureSpec fDawnSpec;
29
bytesPerPixel() const30 size_t bytesPerPixel() const override {
31 return DawnFormatBytesPerBlock(fDawnSpec.getViewFormat());
32 }
33
compressionType() const34 SkTextureCompressionType compressionType() const override {
35 return DawnFormatToCompressionType(fDawnSpec.getViewFormat());
36 }
37
isMemoryless() const38 bool isMemoryless() const override {
39 #if !defined(__EMSCRIPTEN__)
40 return fDawnSpec.fUsage & wgpu::TextureUsage::TransientAttachment;
41 #else
42 return false;
43 #endif
44 }
45
toString() const46 SkString toString() const override {
47 return SkStringPrintf("Dawn(%s,", fDawnSpec.toString().c_str());
48 }
49
toRPAttachmentString(uint32_t sampleCount) const50 SkString toRPAttachmentString(uint32_t sampleCount) const override {
51 return SkStringPrintf(
52 "Dawn(f=%u,s=%u)", static_cast<unsigned int>(fDawnSpec.fFormat), sampleCount);
53 }
54
copyTo(AnyTextureInfoData & dstData) const55 void copyTo(AnyTextureInfoData& dstData) const override {
56 // Don't assert that dstData has a Dawn type() because it could be
57 // uninitialized and that assert would fail.
58 dstData.emplace<DawnTextureInfoData>(fDawnSpec);
59 }
60
equal(const TextureInfoData * that) const61 bool equal(const TextureInfoData* that) const override {
62 SkASSERT(!that || that->type() == skgpu::BackendApi::kDawn);
63 if (auto otherDawn = static_cast<const DawnTextureInfoData*>(that)) {
64 return fDawnSpec == otherDawn->fDawnSpec;
65 }
66 return false;
67 }
68
isCompatible(const TextureInfoData * that) const69 bool isCompatible(const TextureInfoData* that) const override {
70 SkASSERT(!that || that->type() == skgpu::BackendApi::kDawn);
71 if (auto otherDawn = static_cast<const DawnTextureInfoData*>(that)) {
72 return fDawnSpec.isCompatible(otherDawn->fDawnSpec);
73 }
74 return false;
75 }
76 };
77
get_and_cast_data(const TextureInfo & info)78 static const DawnTextureInfoData* get_and_cast_data(const TextureInfo& info) {
79 auto data = TextureInfoPriv::GetData(info);
80 SkASSERT(!data || data->type() == skgpu::BackendApi::kDawn);
81 return static_cast<const DawnTextureInfoData*>(data);
82 }
83
84 namespace TextureInfos {
MakeDawn(const DawnTextureInfo & dawnInfo)85 TextureInfo MakeDawn(const DawnTextureInfo& dawnInfo) {
86 return TextureInfoPriv::Make(skgpu::BackendApi::kDawn,
87 dawnInfo.fSampleCount,
88 dawnInfo.fMipmapped,
89 Protected::kNo,
90 DawnTextureInfoData(dawnInfo));
91 }
92
GetDawnTextureInfo(const TextureInfo & info,DawnTextureInfo * out)93 bool GetDawnTextureInfo(const TextureInfo& info, DawnTextureInfo* out) {
94 if (!info.isValid() || info.backend() != skgpu::BackendApi::kDawn) {
95 return false;
96 }
97 SkASSERT(out);
98 const DawnTextureInfoData* dawnData = get_and_cast_data(info);
99 SkASSERT(dawnData);
100 *out = DawnTextureSpecToTextureInfo(dawnData->spec(), info.numSamples(), info.mipmapped());
101 return true;
102 }
103
104 // This cannot return a const reference or we get a warning about returning
105 // a reference to a temporary local variable.
GetDawnTextureSpec(const TextureInfo & info)106 DawnTextureSpec GetDawnTextureSpec(const TextureInfo& info) {
107 SkASSERT(info.isValid() && info.backend() == skgpu::BackendApi::kDawn);
108 const DawnTextureInfoData* dawnData = get_and_cast_data(info);
109 SkASSERT(dawnData);
110 return dawnData->spec();
111 }
112
GetDawnViewFormat(const TextureInfo & info)113 wgpu::TextureFormat GetDawnViewFormat(const TextureInfo& info) {
114 SkASSERT(info.isValid() && info.backend() == skgpu::BackendApi::kDawn);
115 const DawnTextureInfoData* dawnData = get_and_cast_data(info);
116 SkASSERT(dawnData);
117 return dawnData->spec().getViewFormat();
118 }
119
GetDawnAspect(const TextureInfo & info)120 wgpu::TextureAspect GetDawnAspect(const TextureInfo& info) {
121 SkASSERT(info.isValid() && info.backend() == skgpu::BackendApi::kDawn);
122 const DawnTextureInfoData* dawnData = get_and_cast_data(info);
123 SkASSERT(dawnData);
124 return dawnData->spec().fAspect;
125 }
126
127 } // namespace TextureInfos
128
129 } // namespace skgpu::graphite
130