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