1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_YUVABackendTextures_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_YUVABackendTextures_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkYUVAInfo.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/BackendTexture.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 18*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker /** 21*c8dee2aaSAndroid Build Coastguard Worker * A description of a set of BackendTextures that hold the planar data described by a SkYUVAInfo. 22*c8dee2aaSAndroid Build Coastguard Worker */ 23*c8dee2aaSAndroid Build Coastguard Worker class SK_API YUVABackendTextureInfo { 24*c8dee2aaSAndroid Build Coastguard Worker public: 25*c8dee2aaSAndroid Build Coastguard Worker static constexpr auto kMaxPlanes = SkYUVAInfo::kMaxPlanes; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** Default YUVABackendTextureInfo is invalid. */ 28*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextureInfo() = default; 29*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextureInfo(const YUVABackendTextureInfo&) = default; 30*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextureInfo& operator=(const YUVABackendTextureInfo&) = default; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /** 33*c8dee2aaSAndroid Build Coastguard Worker * Initializes a YUVABackendTextureInfo to describe a set of textures that can store the 34*c8dee2aaSAndroid Build Coastguard Worker * planes indicated by the SkYUVAInfo. The texture dimensions are taken from the SkYUVAInfo's 35*c8dee2aaSAndroid Build Coastguard Worker * plane dimensions. All the described textures share a common origin. The planar image this 36*c8dee2aaSAndroid Build Coastguard Worker * describes will be mip mapped if all the textures are individually mip mapped as indicated 37*c8dee2aaSAndroid Build Coastguard Worker * by Mipmapped. This will produce an invalid result (return false from isValid()) if the 38*c8dee2aaSAndroid Build Coastguard Worker * passed formats' channels don't agree with SkYUVAInfo. 39*c8dee2aaSAndroid Build Coastguard Worker */ 40*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextureInfo(const Recorder*, 41*c8dee2aaSAndroid Build Coastguard Worker const SkYUVAInfo&, 42*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const TextureInfo>, 43*c8dee2aaSAndroid Build Coastguard Worker Mipmapped); 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const YUVABackendTextureInfo&) const; 46*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const YUVABackendTextureInfo& that) const { return !(*this == that); } 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker /** TextureInfo for the ith plane, or invalid if i >= numPlanes() */ planeTextureInfo(int i)49*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo& planeTextureInfo(int i) const { 50*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(i >= 0); 51*c8dee2aaSAndroid Build Coastguard Worker return fPlaneTextureInfos[static_cast<size_t>(i)]; 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker yuvaInfo()54*c8dee2aaSAndroid Build Coastguard Worker const SkYUVAInfo& yuvaInfo() const { return fYUVAInfo; } 55*c8dee2aaSAndroid Build Coastguard Worker yuvColorSpace()56*c8dee2aaSAndroid Build Coastguard Worker SkYUVColorSpace yuvColorSpace() const { return fYUVAInfo.yuvColorSpace(); } 57*c8dee2aaSAndroid Build Coastguard Worker mipmapped()58*c8dee2aaSAndroid Build Coastguard Worker Mipmapped mipmapped() const { return fMipmapped; } 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker /** The number of planes, 0 if this YUVABackendTextureInfo is invalid. */ numPlanes()61*c8dee2aaSAndroid Build Coastguard Worker int numPlanes() const { return fYUVAInfo.numPlanes(); } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker /** 64*c8dee2aaSAndroid Build Coastguard Worker * Returns true if this has been configured with a valid SkYUVAInfo with compatible texture 65*c8dee2aaSAndroid Build Coastguard Worker * formats. 66*c8dee2aaSAndroid Build Coastguard Worker */ isValid()67*c8dee2aaSAndroid Build Coastguard Worker bool isValid() const { return fYUVAInfo.isValid(); } 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker /** 70*c8dee2aaSAndroid Build Coastguard Worker * Computes a YUVALocations representation of the planar layout. The result is guaranteed to be 71*c8dee2aaSAndroid Build Coastguard Worker * valid if this->isValid(). 72*c8dee2aaSAndroid Build Coastguard Worker */ 73*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo::YUVALocations toYUVALocations() const; 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker private: 76*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo fYUVAInfo; 77*c8dee2aaSAndroid Build Coastguard Worker std::array<TextureInfo, kMaxPlanes> fPlaneTextureInfos; 78*c8dee2aaSAndroid Build Coastguard Worker std::array<uint32_t, kMaxPlanes> fPlaneChannelMasks; 79*c8dee2aaSAndroid Build Coastguard Worker Mipmapped fMipmapped = Mipmapped::kNo; 80*c8dee2aaSAndroid Build Coastguard Worker }; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker /** 83*c8dee2aaSAndroid Build Coastguard Worker * A set of BackendTextures that hold the planar data for an image described a SkYUVAInfo. 84*c8dee2aaSAndroid Build Coastguard Worker */ 85*c8dee2aaSAndroid Build Coastguard Worker class SK_API YUVABackendTextures { 86*c8dee2aaSAndroid Build Coastguard Worker public: 87*c8dee2aaSAndroid Build Coastguard Worker static constexpr auto kMaxPlanes = SkYUVAInfo::kMaxPlanes; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextures() = default; 90*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextures(const YUVABackendTextures&) = delete; 91*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextures& operator=(const YUVABackendTextures&) = delete; 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker /** 94*c8dee2aaSAndroid Build Coastguard Worker * Initializes a YUVABackendTextures object from a set of textures that store the planes 95*c8dee2aaSAndroid Build Coastguard Worker * indicated by the SkYUVAInfo. This will produce an invalid result (return false from 96*c8dee2aaSAndroid Build Coastguard Worker * isValid()) if the passed texture formats' channels don't agree with SkYUVAInfo. 97*c8dee2aaSAndroid Build Coastguard Worker */ 98*c8dee2aaSAndroid Build Coastguard Worker YUVABackendTextures(const Recorder*, 99*c8dee2aaSAndroid Build Coastguard Worker const SkYUVAInfo&, 100*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const BackendTexture>); 101*c8dee2aaSAndroid Build Coastguard Worker planeTextures()102*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const BackendTexture> planeTextures() const { 103*c8dee2aaSAndroid Build Coastguard Worker return SkSpan<const BackendTexture>(fPlaneTextures); 104*c8dee2aaSAndroid Build Coastguard Worker } 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker /** BackendTexture for the ith plane, or invalid if i >= numPlanes() */ planeTexture(int i)107*c8dee2aaSAndroid Build Coastguard Worker BackendTexture planeTexture(int i) const { 108*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(i >= 0); 109*c8dee2aaSAndroid Build Coastguard Worker return fPlaneTextures[static_cast<size_t>(i)]; 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker yuvaInfo()112*c8dee2aaSAndroid Build Coastguard Worker const SkYUVAInfo& yuvaInfo() const { return fYUVAInfo; } 113*c8dee2aaSAndroid Build Coastguard Worker yuvColorSpace()114*c8dee2aaSAndroid Build Coastguard Worker SkYUVColorSpace yuvColorSpace() const { return fYUVAInfo.yuvColorSpace(); } 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker /** The number of planes, 0 if this YUVABackendTextureInfo is invalid. */ numPlanes()117*c8dee2aaSAndroid Build Coastguard Worker int numPlanes() const { return fYUVAInfo.numPlanes(); } 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker /** 120*c8dee2aaSAndroid Build Coastguard Worker * Returns true if this has been configured with a valid SkYUVAInfo with compatible texture 121*c8dee2aaSAndroid Build Coastguard Worker * formats. 122*c8dee2aaSAndroid Build Coastguard Worker */ isValid()123*c8dee2aaSAndroid Build Coastguard Worker bool isValid() const { return fYUVAInfo.isValid(); } 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker /** 126*c8dee2aaSAndroid Build Coastguard Worker * Computes a YUVALocations representation of the planar layout. The result is guaranteed to be 127*c8dee2aaSAndroid Build Coastguard Worker * valid if this->isValid(). 128*c8dee2aaSAndroid Build Coastguard Worker */ 129*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo::YUVALocations toYUVALocations() const; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker private: 132*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo fYUVAInfo; 133*c8dee2aaSAndroid Build Coastguard Worker std::array<BackendTexture, kMaxPlanes> fPlaneTextures; 134*c8dee2aaSAndroid Build Coastguard Worker std::array<uint32_t, kMaxPlanes> fPlaneChannelMasks; 135*c8dee2aaSAndroid Build Coastguard Worker }; 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker } // End of namespace skgpu::graphite 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_YUVABackendTextures_DEFINED 140