blob: 1e6a5be874d04da5b154b35a036f16998aef5569 [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkImage_GaneshYUVA_DEFINED
#define SkImage_GaneshYUVA_DEFINED
#include "include/core/SkColorSpace.h"
#include "include/core/SkImage.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSamplingOptions.h"
#include "src/gpu/ganesh/GrYUVATextureProxies.h"
#include "src/gpu/ganesh/image/SkImage_GaneshBase.h"
#include "src/image/SkImage_Base.h"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <tuple>
class GrDirectContext;
class GrFragmentProcessor;
class GrImageContext;
class GrRecordingContext;
class GrSurfaceProxyView;
class SkMatrix;
enum SkColorType : int;
enum class GrColorType;
enum class GrImageTexGenPolicy : int;
enum class GrSemaphoresSubmitted : bool;
enum GrSurfaceOrigin : int;
enum class SkTileMode;
struct GrFlushInfo;
struct SkRect;
namespace skgpu {
enum class Mipmapped : bool;
}
// Wraps the 1 to 4 planes of a YUVA image for consumption by the GPU.
// Initially any direct rendering will be done by passing the individual planes to a shader.
// Once any method requests a flattened image (e.g., onReadPixels), the flattened RGB
// proxy will be stored and used for any future rendering.
class SkImage_GaneshYUVA final : public SkImage_GaneshBase {
public:
SkImage_GaneshYUVA(sk_sp<GrImageContext>,
uint32_t uniqueID,
GrYUVATextureProxies proxies,
sk_sp<SkColorSpace>);
// From SkImage.h
size_t textureSize() const override;
// From SkImage_Base.h
SkImage_Base::Type type() const override { return SkImage_Base::Type::kGaneshYUVA; }
bool onHasMipmaps() const override;
bool onIsProtected() const override;
using SkImage_GaneshBase::onMakeColorTypeAndColorSpace;
sk_sp<SkImage> onMakeColorTypeAndColorSpace(SkColorType,
sk_sp<SkColorSpace>,
GrDirectContext*) const final;
sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const final;
// From SkImage_GaneshBase.h
GrSemaphoresSubmitted flush(GrDirectContext*, const GrFlushInfo&) const override;
std::tuple<GrSurfaceProxyView, GrColorType> asView(GrRecordingContext*,
skgpu::Mipmapped,
GrImageTexGenPolicy) const override;
std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(GrRecordingContext*,
SkSamplingOptions,
const SkTileMode[2],
const SkMatrix&,
const SkRect*,
const SkRect*) const override;
bool setupMipmapsForPlanes(GrRecordingContext*) const;
GrSurfaceOrigin origin() const override { return fYUVAProxies.textureOrigin(); }
private:
enum class ColorSpaceMode {
kConvert,
kReinterpret,
};
SkImage_GaneshYUVA(sk_sp<GrImageContext>,
const SkImage_GaneshYUVA* image,
sk_sp<SkColorSpace> targetCS,
ColorSpaceMode csMode);
mutable GrYUVATextureProxies fYUVAProxies;
// If this is non-null then the planar data should be converted from fFromColorSpace to
// this->colorSpace(). Otherwise we assume the planar data (post YUV->RGB conversion) is already
// in this->colorSpace().
const sk_sp<SkColorSpace> fFromColorSpace;
// Repeated calls to onMakeColorSpace will result in a proliferation of unique IDs and
// SkImage_GaneshYUVA instances. Cache the result of the last successful onMakeColorSpace call.
mutable sk_sp<SkColorSpace> fOnMakeColorSpaceTarget;
mutable sk_sp<SkImage> fOnMakeColorSpaceResult;
using INHERITED = SkImage_GaneshBase;
};
#endif