77 std::move(imageColorSpace)),
79 , fYUVAProxies(
std::move(proxies)) {
88 ColorSpaceMode csMode)
90 image->imageInfo().makeColorSpace(
std::move(targetCS)),
92 , fYUVAProxies(
image->fYUVAProxies)
95 , fFromColorSpace(csMode == ColorSpaceMode::kReinterpret
97 : (
image->colorSpace() ?
image->refColorSpace()
110 for (
int i = 0; i < n; ++i) {
112 if (t->mipmapped() == skgpu::Mipmapped::kNo && (t->width() > 1 || t->height() > 1)) {
118 newProxies[i] = newView.detachProxy();
120 newProxies[i] = fYUVAProxies.
refProxy(i);
134 if (
info.fSubmittedProc) {
135 info.fSubmittedProc(
info.fSubmittedContext,
false);
137 if (
info.fFinishedProc) {
138 info.fFinishedProc(
info.fFinishedContext);
144 size_t numProxies = fYUVAProxies.
numPlanes();
145 for (
size_t i = 0; i < numProxies; ++i) {
146 proxies[i] = fYUVAProxies.
proxy(i);
153 return fYUVAProxies.
mipmapped() == skgpu::Mipmapped::kYes;
160 for (
int i = 1; i < fYUVAProxies.
numPlanes(); ++i) {
171 for (
int i = 0; i < fYUVAProxies.
numPlanes(); ++i) {
183 if (fOnMakeColorSpaceTarget &&
185 return fOnMakeColorSpaceResult;
190 fOnMakeColorSpaceTarget = targetCS;
191 fOnMakeColorSpaceResult =
result;
208 "Image_GpuYUVA_ReinterpretColorSpace",
221 if (fFromColorSpace) {
223 fFromColorSpace.
get(),
228 sfc->fillWithFP(std::move(fp));
230 return {sfc->readSurfaceView(), sfc->colorInfo().colorType()};
239 const SkRect* domain)
const {
252 if (sampler.
mipmapped() == skgpu::Mipmapped::kYes && !this->setupMipmapsForPlanes(
context)) {
256 GrSamplerState::MipmapMode::kNone);
269 if (fFromColorSpace) {
271 fFromColorSpace.
get(),
296 for (
int plane = 0; plane < numPlanes; ++plane) {
302 if (!proxies[plane]) {
313 return sk_make_sp<SkImage_GaneshYUVA>(
320 bool limitToMaxTextureSize) {
327 bool limitToMaxTextureSize,
338 buildMips = skgpu::Mipmapped::kNo;
349 if (maxDim > maxTextureSize) {
350 if (!limitToMaxTextureSize) {
353 float scale =
static_cast<float>(maxTextureSize) / maxDim;
364 for (
int i = 0; i < numPlanes; ++i) {
369 pixmapsToUpload = &tempPixmaps;
375 for (
int i = 0; i < numPlanes; ++i) {
388 return sk_make_sp<SkImage_GaneshYUVA>(
sk_ref_sp(context),
390 std::move(yuvaProxies),
391 std::move(imageColorSpace));
400 if (!backendTextureInfo.
isValid()) {
409 textureReleaseProc = textureReleaseProc ? textureReleaseProc : [](
void*) {};
411 for (
int i = 0; i < n; ++i) {
415 if (!threadSafeProxy) {
429 for (
int i = 0; i < n; ++i) {
434 skgpu::Mipmapped::kNo,
436 std::move(releaseHelpers[i]));
445 return sk_make_sp<SkImage_GaneshYUVA>(std::move(ctx),
447 std::move(yuvaTextureProxies),
448 std::move(imageColorSpace));
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
@ kBorrow_GrWrapOwnership
static constexpr GrColorType SkColorTypeToGrColorType(SkColorType ct)
@ kOpaque_SkAlphaType
pixel is opaque
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
GrSurfaceProxyView GrCopyBaseMipMapToView(GrRecordingContext *context, GrSurfaceProxyView src, skgpu::Budgeted budgeted)
std::tuple< GrSurfaceProxyView, GrColorType > GrMakeUncachedBitmapProxyView(GrRecordingContext *rContext, const SkBitmap &bitmap, skgpu::Mipmapped mipmapped, SkBackingFit fit, skgpu::Budgeted budgeted)
static constexpr GrSamplerState::WrapMode SkTileModeToWrapMode(SkTileMode tileMode)
static bool SkImageInfoIsValid(const SkImageInfo &info)
static constexpr auto kAssumedColorType
static std::unique_ptr< SkEncoder > Make(SkWStream *dst, const SkPixmap *src, const SkYUVAPixmaps *srcYUVA, const SkColorSpace *srcYUVAColorSpace, const SkJpegEncoder::Options &options)
#define INHERITED(method,...)
sk_sp< T > sk_ref_sp(T *obj)
bool matches(GrContext_Base *candidate) const
const GrCaps * caps() const
static std::unique_ptr< GrFragmentProcessor > Make(GrSurfaceProxyView view, SkAlphaType, const SkMatrix &, SkCubicResampler, Direction)
bool mipmapSupport() const
int maxTextureSize() const
GrSemaphoresSubmitted flushSurfaces(SkSpan< GrSurfaceProxy * >, SkSurfaces::BackendSurfaceAccess=SkSurfaces::BackendSurfaceAccess::kNoAccess, const GrFlushInfo &={}, const skgpu::MutableTextureState *newState=nullptr)
bool abandoned() override
GrDirectContextPriv priv()
static sk_sp< GrImageContext > MakeForPromiseImage(sk_sp< GrContextThreadSafeProxy > tsp)
GrImageContextPriv priv()
sk_sp< GrTextureProxy > wrapBackendTexture(const GrBackendTexture &, GrWrapOwnership, GrWrapCacheable, GrIOType, sk_sp< skgpu::RefCntedCallback >=nullptr)
GrProxyProvider * proxyProvider()
std::unique_ptr< skgpu::ganesh::SurfaceFillContext > makeSFC(GrImageInfo, std::string_view label, SkBackingFit=SkBackingFit::kExact, int sampleCount=1, skgpu::Mipmapped=skgpu::Mipmapped::kNo, skgpu::Protected=skgpu::Protected::kNo, GrSurfaceOrigin=kTopLeft_GrSurfaceOrigin, skgpu::Budgeted=skgpu::Budgeted::kYes)
GrRecordingContextPriv priv()
constexpr skgpu::Mipmapped mipmapped() const
constexpr WrapMode wrapModeX() const
constexpr Filter filter() const
constexpr WrapMode wrapModeY() const
skgpu::Swizzle swizzle() const
GrProtected isProtected() const
size_t gpuMemorySize() const
virtual GrTextureProxy * asTextureProxy()
const SkYUVAInfo & yuvaInfo() const
GrSurfaceOrigin textureOrigin() const
const GrBackendFormat & planeFormat(int i) const
const SkYUVAInfo & yuvaInfo() const
GrBackendTexture texture(int i) const
GrSurfaceOrigin textureOrigin() const
GrSurfaceProxy * proxy(int i) const
const SkYUVAInfo & yuvaInfo() const
skgpu::Mipmapped mipmapped() const
GrSurfaceProxyView makeView(int i) const
sk_sp< GrSurfaceProxy > refProxy(int i) const
GrSurfaceOrigin textureOrigin() const
static std::unique_ptr< GrFragmentProcessor > Make(const GrYUVATextureProxies &yuvaProxies, GrSamplerState samplerState, const GrCaps &, const SkMatrix &localMatrix=SkMatrix::I(), const SkRect *subset=nullptr, const SkRect *domain=nullptr)
bool installPixels(const SkImageInfo &info, void *pixels, size_t rowBytes, void(*releaseProc)(void *addr, void *context), void *context)
SkColorType colorType() const
static bool Equals(const SkColorSpace *, const SkColorSpace *)
sk_sp< GrImageContext > fContext
GrImageContext * context() const final
static sk_sp< GrTextureProxy > MakePromiseImageLazyProxy(GrContextThreadSafeProxy *, SkISize dimensions, const GrBackendFormat &, skgpu::Mipmapped, SkImages::PromiseImageTextureFulfillProc, sk_sp< skgpu::RefCntedCallback > releaseHelper)
std::unique_ptr< GrFragmentProcessor > asFragmentProcessor(GrRecordingContext *, SkSamplingOptions, const SkTileMode[2], const SkMatrix &, const SkRect *, const SkRect *) const override
bool onIsProtected() const override
SkImage_GaneshYUVA(sk_sp< GrImageContext >, uint32_t uniqueID, GrYUVATextureProxies proxies, sk_sp< SkColorSpace >)
sk_sp< SkImage > onReinterpretColorSpace(sk_sp< SkColorSpace >) const final
GrSemaphoresSubmitted flush(GrDirectContext *, const GrFlushInfo &) const override
size_t textureSize() const override
std::tuple< GrSurfaceProxyView, GrColorType > asView(GrRecordingContext *, skgpu::Mipmapped, GrImageTexGenPolicy) const override
sk_sp< SkImage > onMakeColorTypeAndColorSpace(SkColorType, sk_sp< SkColorSpace >, GrDirectContext *) const final
bool setupMipmapsForPlanes(GrRecordingContext *) const
bool onHasMipmaps() const override
const SkImageInfo & imageInfo() const
SkAlphaType alphaType() const
static const SkMatrix & I()
bool scalePixels(const SkPixmap &dst, const SkSamplingOptions &) const
static SkSamplingOptions AnisoFallback(bool imageIsMipped)
static constexpr int kMaxPlanes
SkYUVAInfo makeDimensions(SkISize) const
int planeDimensions(SkISize planeDimensions[kMaxPlanes]) const
SkISize dimensions() const
DataType dataType() const
const SkYUVAInfo & yuvaInfo() const
const SkPixmap & plane(int i) const
static SkYUVAPixmaps Allocate(const SkYUVAPixmapInfo &yuvaPixmapInfo)
static sk_sp< RefCntedCallback > Make(Callback proc, Context ctx)
SK_API sk_sp< SkImage > TextureFromYUVAPixmaps(GrRecordingContext *context, const SkYUVAPixmaps &pixmaps, skgpu::Mipmapped buildMips, bool limitToMaxTextureSize, sk_sp< SkColorSpace > imageColorSpace)
void * PromiseImageTextureContext
SK_API sk_sp< SkImage > PromiseTextureFromYUVA(skgpu::graphite::Recorder *, const skgpu::graphite::YUVABackendTextureInfo &, sk_sp< SkColorSpace > imageColorSpace, skgpu::graphite::Volatile, GraphitePromiseTextureFulfillProc, GraphitePromiseImageReleaseProc, GraphitePromiseTextureReleaseProc, GraphitePromiseImageContext imageContext, GraphitePromiseTextureFulfillContext planeContexts[])
SK_API sk_sp< SkImage > TextureFromYUVATextures(GrRecordingContext *context, const GrYUVABackendTextures &yuvaTextures, sk_sp< SkColorSpace > imageColorSpace, TextureReleaseProc textureReleaseProc=nullptr, ReleaseContext releaseContext=nullptr)
void(*)(PromiseImageTextureContext) PromiseImageTextureReleaseProc
void(*)(ReleaseContext) TextureReleaseProc
@ kNoAccess
back-end surface will not be used by client
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
const SkCubicResampler cubic
const SkFilterMode filter
const SkMipmapMode mipmap