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