File: YUVABackendTextures.h

package info (click to toggle)
webkit2gtk 2.48.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 429,764 kB
  • sloc: cpp: 3,697,587; javascript: 194,444; ansic: 169,997; python: 46,499; asm: 19,295; ruby: 18,528; perl: 16,602; xml: 4,650; yacc: 2,360; sh: 2,098; java: 1,993; lex: 1,327; pascal: 366; makefile: 298
file content (139 lines) | stat: -rw-r--r-- 4,992 bytes parent folder | download | duplicates (21)
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