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