xref: /aosp_15_r20/external/skia/src/gpu/graphite/dawn/DawnTextureInfo.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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