blob: 9678f87f7cca4341305d442514d50f62efb8adcc [file] [log] [blame]
/*
* 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_Image_YUVA_Graphite_DEFINED
#define skgpu_graphite_Image_YUVA_Graphite_DEFINED
#include "include/core/SkYUVAInfo.h"
#include "src/gpu/graphite/Image_Base_Graphite.h"
#include "src/gpu/graphite/TextureProxyView.h"
#include <functional>
namespace skgpu::graphite {
class Recorder;
class Image_YUVA final : public Image_Base {
public:
~Image_YUVA() override;
// Create an Image_YUVA by interpreting the multiple 'planes' using 'yuvaInfo'. If the info
// or provided plane proxies do not produce a valid mulitplane image, null is returned.
static sk_sp<Image_YUVA> Make(const Caps* caps,
const SkYUVAInfo& yuvaInfo,
SkSpan<TextureProxyView> planes,
sk_sp<SkColorSpace> imageColorSpace);
// Wraps the Graphite-backed Image planes into a YUV[A] image. The returned image shares
// textures as well as any links to Devices that might modify those textures.
static sk_sp<Image_YUVA> WrapImages(const Caps* caps,
const SkYUVAInfo& yuvaInfo,
SkSpan<const sk_sp<SkImage>> images,
sk_sp<SkColorSpace> imageColorSpace);
SkImage_Base::Type type() const override { return SkImage_Base::Type::kGraphiteYUVA; }
size_t textureSize() const override;
bool onHasMipmaps() const override { return fMipmapped == Mipmapped::kYes; }
bool onIsProtected() const override { return fProtected == Protected::kYes; }
sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const override;
// Returns the proxy view that provides value for the YUVA channel specified by 'channelIndex'.
// The view of the returned proxy applies a swizzle to map the relevant data channel into all
// slots of the sample value. The alpha proxy may be null.
const TextureProxyView& proxyView(int channelIndex) const {
SkASSERT(channelIndex >= 0 && channelIndex < SkYUVAInfo::kYUVAChannelCount);
return fProxies[channelIndex];
}
std::tuple<int, int> uvSubsampleFactors() const { return fUVSubsampleFactors; }
const SkYUVAInfo& yuvaInfo() const { return fYUVAInfo; }
private:
// The proxy views are ordered Y,U,V,A and if the channels are held in the same plane, the
// respective proxy views will share the underlying TextureProxy but have the appropriate
// swizzle to access the appropriate channel and return it in the R slot.
using YUVAProxies = std::array<TextureProxyView, SkYUVAInfo::kYUVAChannelCount>;
Image_YUVA(const YUVAProxies&,
const SkYUVAInfo&,
sk_sp<SkColorSpace>);
YUVAProxies fProxies;
SkYUVAInfo fYUVAInfo;
std::tuple<int, int> fUVSubsampleFactors;
// Aggregate mipmap/protected status from the proxies
Mipmapped fMipmapped = Mipmapped::kYes;
Protected fProtected = Protected::kNo;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_Image_YUVA_Graphite_DEFINED