1 /* 2 * Copyright 2021 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 8 #ifndef skgpu_graphite_TextureInfo_DEFINED 9 #define skgpu_graphite_TextureInfo_DEFINED 10 11 #include "include/core/SkString.h" 12 #include "include/core/SkTextureCompressionType.h" 13 #include "include/gpu/graphite/GraphiteTypes.h" 14 #include "include/private/base/SkAPI.h" 15 #include "include/private/base/SkAnySubclass.h" 16 17 struct SkISize; 18 19 namespace skgpu::graphite { 20 21 class TextureInfoData; 22 23 class SK_API TextureInfo { 24 public: 25 TextureInfo(); 26 ~TextureInfo(); 27 TextureInfo(const TextureInfo&); 28 TextureInfo& operator=(const TextureInfo&); 29 30 bool operator==(const TextureInfo&) const; 31 bool operator!=(const TextureInfo& that) const { return !(*this == that); } 32 isValid()33 bool isValid() const { return fValid; } backend()34 BackendApi backend() const { return fBackend; } 35 numSamples()36 uint32_t numSamples() const { return fSampleCount; } mipmapped()37 Mipmapped mipmapped() const { return fMipmapped; } isProtected()38 Protected isProtected() const { return fProtected; } 39 SkTextureCompressionType compressionType() const; 40 bool isMemoryless() const; 41 42 bool isCompatible(const TextureInfo& that) const; 43 // Return a string containing the full description of this TextureInfo. 44 SkString toString() const; 45 // Return a string containing only the info relevant for its use as a RenderPass attachment. 46 SkString toRPAttachmentString() const; 47 48 private: 49 friend class TextureInfoData; 50 friend class TextureInfoPriv; 51 52 // Size determined by looking at the TextureInfoData subclasses, then guessing-and-checking. 53 // Compiler will complain if this is too small - in that case, just increase the number. 54 inline constexpr static size_t kMaxSubclassSize = 112; 55 using AnyTextureInfoData = SkAnySubclass<TextureInfoData, kMaxSubclassSize>; 56 57 template <typename SomeTextureInfoData> TextureInfo(BackendApi backend,uint32_t sampleCount,skgpu::Mipmapped mipped,skgpu::Protected isProtected,const SomeTextureInfoData & textureInfoData)58 TextureInfo(BackendApi backend, 59 uint32_t sampleCount, 60 skgpu::Mipmapped mipped, 61 skgpu::Protected isProtected, 62 const SomeTextureInfoData& textureInfoData) 63 : fBackend(backend) 64 , fValid(true) 65 , fSampleCount(sampleCount) 66 , fMipmapped(mipped) 67 , fProtected(isProtected) { 68 fTextureInfoData.emplace<SomeTextureInfoData>(textureInfoData); 69 } 70 71 friend size_t ComputeSize(SkISize dimensions, const TextureInfo&); // for bytesPerPixel 72 73 size_t bytesPerPixel() const; 74 75 BackendApi fBackend = BackendApi::kMock; 76 bool fValid = false; 77 78 uint32_t fSampleCount = 1; 79 Mipmapped fMipmapped = Mipmapped::kNo; 80 Protected fProtected = Protected::kNo; 81 82 AnyTextureInfoData fTextureInfoData; 83 }; 84 85 } // namespace skgpu::graphite 86 87 #endif //skgpu_graphite_TextureInfo_DEFINED 88