1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 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 GrYUVATextureProxies_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrYUVATextureProxies_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkYUVAInfo.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkYUVAInfoLocation.h" // IWYU pragma: keep 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <array> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class GrYUVATextureProxies { 25*c8dee2aaSAndroid Build Coastguard Worker public: 26*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies() = default; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker /** Assumes all planes are sampled with a default "rgba" swizzle. */ 29*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies(const SkYUVAInfo&, 30*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy>[SkYUVAInfo::kMaxPlanes], 31*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin textureOrigin); 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker /** 34*c8dee2aaSAndroid Build Coastguard Worker * When uploading pixmaps to textures it is important that we account for how the original 35*c8dee2aaSAndroid Build Coastguard Worker * pixmaps' channels are swizzled into the texture during upload. This will compute a swizzle 36*c8dee2aaSAndroid Build Coastguard Worker * for each texture based on the original color types and the views' swizzles. The views must 37*c8dee2aaSAndroid Build Coastguard Worker * all have the same origin or the result will be an invalid GrYUVATextureProxies. 38*c8dee2aaSAndroid Build Coastguard Worker */ 39*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies(const SkYUVAInfo&, 40*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView[SkYUVAInfo::kMaxPlanes], 41*c8dee2aaSAndroid Build Coastguard Worker GrColorType[SkYUVAInfo::kMaxPlanes]); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies(const GrYUVATextureProxies&) = default; 44*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies(GrYUVATextureProxies&&) = default; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies& operator=(const GrYUVATextureProxies&) = default; 47*c8dee2aaSAndroid Build Coastguard Worker GrYUVATextureProxies& operator=(GrYUVATextureProxies&&) = default; 48*c8dee2aaSAndroid Build Coastguard Worker yuvaInfo()49*c8dee2aaSAndroid Build Coastguard Worker const SkYUVAInfo& yuvaInfo() const { return fYUVAInfo; } 50*c8dee2aaSAndroid Build Coastguard Worker numPlanes()51*c8dee2aaSAndroid Build Coastguard Worker int numPlanes() const { return fYUVAInfo.numPlanes(); } 52*c8dee2aaSAndroid Build Coastguard Worker textureOrigin()53*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin textureOrigin() const { return fTextureOrigin; } 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker // Overall set of YUVA proxies is mip mapped if each plane is mip mapped. mipmapped()56*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped() const { return fMipmapped; } 57*c8dee2aaSAndroid Build Coastguard Worker proxy(int i)58*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy* proxy(int i) const { return fProxies[i].get(); } 59*c8dee2aaSAndroid Build Coastguard Worker proxies()60*c8dee2aaSAndroid Build Coastguard Worker const std::array<sk_sp<GrSurfaceProxy>, SkYUVAInfo::kMaxPlanes>& proxies() const { 61*c8dee2aaSAndroid Build Coastguard Worker return fProxies; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker refProxy(int i)64*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy> refProxy(int i) const { return fProxies[i]; } 65*c8dee2aaSAndroid Build Coastguard Worker makeView(int i)66*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView makeView(int i) const { 67*c8dee2aaSAndroid Build Coastguard Worker return {fProxies[i], fTextureOrigin, skgpu::Swizzle::RGBA()}; 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker isValid()70*c8dee2aaSAndroid Build Coastguard Worker bool isValid() const { return fYUVAInfo.isValid(); } 71*c8dee2aaSAndroid Build Coastguard Worker yuvaLocations()72*c8dee2aaSAndroid Build Coastguard Worker const SkYUVAInfo::YUVALocations& yuvaLocations() const { return fYUVALocations; } 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker private: 75*c8dee2aaSAndroid Build Coastguard Worker std::array<sk_sp<GrSurfaceProxy>, SkYUVAInfo::kMaxPlanes> fProxies; 76*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo fYUVAInfo; 77*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin fTextureOrigin = kTopLeft_GrSurfaceOrigin; 78*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped fMipmapped = skgpu::Mipmapped::kNo; 79*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo::YUVALocations fYUVALocations = {}; 80*c8dee2aaSAndroid Build Coastguard Worker }; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker #endif 83