• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef skgpu_graphite_TextureInfoPriv_DEFINED
8 #define skgpu_graphite_TextureInfoPriv_DEFINED
9 
10 #include "include/core/SkStream.h"
11 #include "include/core/SkString.h"
12 #include "include/gpu/graphite/TextureInfo.h"
13 #include "src/gpu/graphite/TextureFormat.h"
14 
15 #include <cstdint>
16 
17 namespace skgpu::graphite {
18 
19 class Caps;
20 
21 // NOTE: This is a class so that it can be friended by TextureInfo and the backend info classes.
22 class TextureInfoPriv {
23 public:
ViewFormat(const TextureInfo & info)24     static TextureFormat ViewFormat(const TextureInfo& info) {
25         return info.fViewFormat;
26     }
ChannelMask(const TextureInfo & info)27     static uint32_t ChannelMask(const TextureInfo& info) {
28         return TextureFormatChannelMask(ViewFormat(info));
29     }
30 
31     static SkString GetAttachmentLabel(const TextureInfo&);
32 
33     template <typename BackendTextureInfo>
Make(const BackendTextureInfo & data)34     static TextureInfo Make(const BackendTextureInfo& data) {
35         return TextureInfo(data);
36     }
37 
38     template <typename BackendTextureInfo>
Get(const TextureInfo & info)39     static const BackendTextureInfo& Get(const TextureInfo& info) {
40         SkASSERT(info.isValid() && info.backend() == BackendTextureInfo::kBackend);
41         return *(static_cast<const BackendTextureInfo*>(info.fData.get()));
42     }
43 
44     template <typename BackendTextureInfo>
Copy(const TextureInfo & info,BackendTextureInfo * out)45     static bool Copy(const TextureInfo& info, BackendTextureInfo* out) {
46         if (!info.isValid() || info.backend() != BackendTextureInfo::kBackend) {
47             return false;
48         }
49 
50         SkASSERT(out);
51         *out = Get<BackendTextureInfo>(info);
52         return true;
53     }
54 
55     template <typename BackendTextureInfo>
Serialize(const TextureInfo & info,SkWStream * out)56     static bool Serialize(const TextureInfo& info, SkWStream* out) {
57         if (info.isValid()) {
58             if (!out->write32(GetInfoTag(info))) {
59                 return false;
60             }
61             return Get<BackendTextureInfo>(info).serialize(out);
62         } else {
63             // Write a 0 to signal an empty TextureInfo
64             return out->write32(0);
65         }
66     }
67 
68     template <typename BackendTextureInfo>
Deserialize(SkStream * in,TextureInfo * out)69     static bool Deserialize(SkStream* in, TextureInfo* out) {
70         uint32_t tag;
71         if (!in->readU32(&tag)) {
72             return false;
73         }
74         if (tag == 0) {
75             // Allow deserializing an empty info
76             *out = TextureInfo();
77             return true;
78         }
79 
80         auto [backend, mipmapped, sampleCount] = ParseInfoTag(tag);
81         if (backend != BackendTextureInfo::kBackend) {
82             return false;
83         }
84 
85         BackendTextureInfo info;
86         info.fMipmapped = mipmapped;
87         info.fSampleCount = sampleCount;
88         if (info.deserialize(in)) {
89             *out = Make(info);
90             return true;
91         }
92 
93         return false;
94     }
95 
96 private:
97     TextureInfoPriv() = delete;
98     TextureInfoPriv(const TextureInfoPriv&) = delete;
99 
100     static uint32_t GetInfoTag(const TextureInfo&);
101     static std::tuple<BackendApi, Mipmapped, int> ParseInfoTag(uint32_t);
102 };
103 
104 }  // namespace skgpu::graphite
105 
106 #endif
107