55 * found in the LICENSE file.
66 */
77
8- #include < cstddef>
9- #include < cstring>
10- #include < type_traits>
8+ #include " src/image/SkImage_Gpu.h"
119
1210#include " include/core/SkCanvas.h"
1311#include " include/gpu/GrBackendSurface.h"
1412#include " include/gpu/GrDirectContext.h"
1513#include " include/gpu/GrRecordingContext.h"
14+ #include " include/gpu/GrYUVABackendTextures.h"
1615#include " include/private/SkImageInfoPriv.h"
1716#include " src/core/SkAutoPixmapStorage.h"
1817#include " src/core/SkBitmapCache.h"
4241#include " src/gpu/GrTextureProxyPriv.h"
4342#include " src/gpu/SkGr.h"
4443#include " src/gpu/gl/GrGLTexture.h"
45- #include " src/image/SkImage_Gpu.h"
44+
45+ #include < cstddef>
46+ #include < cstring>
47+ #include < type_traits>
4648
4749SkImage_Gpu::SkImage_Gpu (sk_sp<GrImageContext> context, uint32_t uniqueID, GrSurfaceProxyView view,
4850 SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> colorSpace)
@@ -325,9 +327,11 @@ sk_sp<SkImage> SkImage::MakeTextureFromCompressed(GrDirectContext* direct, sk_sp
325327sk_sp<SkImage> SkImage_Gpu::ConvertYUVATexturesToRGB (GrRecordingContext* rContext,
326328 SkYUVColorSpace yuvColorSpace,
327329 const GrBackendTexture yuvaTextures[],
328- const SkYUVAIndex yuvaIndices[4 ], SkISize size,
330+ const SkYUVAIndex yuvaIndices[4 ],
331+ SkISize size,
329332 GrSurfaceOrigin origin,
330- GrRenderTargetContext* renderTargetContext) {
333+ GrRenderTargetContext* renderTargetContext,
334+ sk_sp<GrRefCntedCallback> releaseHelper) {
331335 SkASSERT (renderTargetContext);
332336
333337 int numTextures;
@@ -337,7 +341,7 @@ sk_sp<SkImage> SkImage_Gpu::ConvertYUVATexturesToRGB(GrRecordingContext* rContex
337341
338342 GrSurfaceProxyView tempViews[4 ];
339343 if (!SkImage_GpuBase::MakeTempTextureProxies (rContext, yuvaTextures, numTextures, yuvaIndices,
340- origin, tempViews, nullptr )) {
344+ origin, tempViews, std::move (releaseHelper) )) {
341345 return nullptr ;
342346 }
343347
@@ -364,39 +368,29 @@ static sk_sp<SkImage> make_flattened_image_with_external_backend(
364368 SkISize imageSize,
365369 GrSurfaceOrigin imageOrigin,
366370 const GrBackendTexture& backendTexture,
371+ GrColorType colorType,
367372 sk_sp<SkColorSpace> imageColorSpace,
368- SkImage::TextureReleaseProc textureReleaseProc ,
369- SkImage::ReleaseContext releaseContext ) {
373+ sk_sp<GrRefCntedCallback> yuvaReleaseHelper ,
374+ sk_sp<GrRefCntedCallback> rgbaReleaseHelper ) {
370375 const GrCaps* caps = rContext->priv ().caps ();
371-
372- sk_sp<GrRefCntedCallback> releaseHelper;
373- if (textureReleaseProc) {
374- releaseHelper.reset (new GrRefCntedCallback (textureReleaseProc, releaseContext));
375- }
376-
377- GrColorType grColorType = SkColorTypeAndFormatToGrColorType (caps, kRGBA_8888_SkColorType ,
378- backendTexture.getBackendFormat ());
379- if (GrColorType::kUnknown == grColorType) {
380- return nullptr ;
381- }
382-
383376 SkAlphaType at = SkImage_GpuBase::GetAlphaTypeFromYUVAIndices (yuvaIndices);
384- if (!SkImage_Gpu::ValidateBackendTexture (caps, backendTexture, grColorType ,
377+ if (!SkImage_Gpu::ValidateBackendTexture (caps, backendTexture, colorType ,
385378 kRGBA_8888_SkColorType , at, nullptr )) {
386379 return nullptr ;
387380 }
388381
389382 // Needs to create a render target with external texture
390383 // in order to draw to it for the yuv->rgb conversion.
391384 auto renderTargetContext = GrRenderTargetContext::MakeFromBackendTexture (
392- rContext, grColorType , std::move (imageColorSpace), backendTexture, 1 , imageOrigin,
393- nullptr , std::move (releaseHelper ));
385+ rContext, colorType , std::move (imageColorSpace), backendTexture, 1 , imageOrigin,
386+ nullptr , std::move (rgbaReleaseHelper ));
394387 if (!renderTargetContext) {
395388 return nullptr ;
396389 }
397390
398391 return SkImage_Gpu::ConvertYUVATexturesToRGB (rContext, yuvColorSpace, yuvaTextures, yuvaIndices,
399- imageSize, imageOrigin, renderTargetContext.get ());
392+ imageSize, imageOrigin, renderTargetContext.get (),
393+ std::move (yuvaReleaseHelper));
400394}
401395
402396// Some YUVA factories infer the YUVAIndices. This helper identifies the channel to use for single
@@ -413,6 +407,48 @@ static SkColorChannel get_single_channel(const GrBackendTexture& tex) {
413407 }
414408}
415409
410+ sk_sp<SkImage> SkImage::MakeFromYUVATexturesCopyToExternal (
411+ GrRecordingContext* context,
412+ const GrYUVABackendTextures& yuvaTextures,
413+ const GrBackendTexture& rgbaResultTexture,
414+ SkColorType colorType,
415+ sk_sp<SkColorSpace> imageColorSpace,
416+ TextureReleaseProc yuvaReleaseProc,
417+ ReleaseContext yuvaReleaseContext,
418+ TextureReleaseProc rgbaReleaseProc,
419+ ReleaseContext rgbaReleaseContext) {
420+ sk_sp<GrRefCntedCallback> yuvaReleaseHelper;
421+ if (yuvaReleaseProc) {
422+ yuvaReleaseHelper.reset (new GrRefCntedCallback (yuvaReleaseProc, yuvaReleaseContext));
423+ }
424+ sk_sp<GrRefCntedCallback> rgbaReleaseHelper;
425+ if (rgbaReleaseProc) {
426+ rgbaReleaseHelper.reset (new GrRefCntedCallback (rgbaReleaseProc, rgbaReleaseContext));
427+ }
428+
429+ SkYUVAIndex yuvaIndices[4 ];
430+ int numTextures;
431+ if (!yuvaTextures.toYUVAIndices (yuvaIndices) ||
432+ !SkYUVAIndex::AreValidIndices (yuvaIndices, &numTextures)) {
433+ return nullptr ;
434+ }
435+ SkASSERT (numTextures == yuvaTextures.numPlanes ());
436+ if (rgbaResultTexture.dimensions () != yuvaTextures.yuvaInfo ().dimensions ()) {
437+ return nullptr ;
438+ }
439+ return make_flattened_image_with_external_backend (context,
440+ yuvaTextures.yuvaInfo ().yuvColorSpace (),
441+ yuvaTextures.textures ().data (),
442+ yuvaIndices,
443+ rgbaResultTexture.dimensions (),
444+ yuvaTextures.textureOrigin (),
445+ rgbaResultTexture,
446+ SkColorTypeToGrColorType (colorType),
447+ std::move (imageColorSpace),
448+ std::move (yuvaReleaseHelper),
449+ std::move (rgbaReleaseHelper));
450+ }
451+
416452sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopyWithExternalBackend (
417453 GrRecordingContext* ctx, SkYUVColorSpace yuvColorSpace,
418454 const GrBackendTexture yuvTextures[3 ], GrSurfaceOrigin imageOrigin,
@@ -422,9 +458,17 @@ sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopyWithExternalBackend(
422458 SkYUVAIndex{1 , get_single_channel (yuvTextures[1 ])},
423459 SkYUVAIndex{2 , get_single_channel (yuvTextures[2 ])},
424460 SkYUVAIndex{-1 , SkColorChannel::kA }};
425- return make_flattened_image_with_external_backend (
426- ctx, yuvColorSpace, yuvTextures, yuvaIndices, yuvTextures[0 ].dimensions (), imageOrigin,
427- backendTexture, std::move (imageColorSpace), nullptr , nullptr );
461+ return make_flattened_image_with_external_backend (ctx,
462+ yuvColorSpace,
463+ yuvTextures,
464+ yuvaIndices,
465+ yuvTextures[0 ].dimensions (),
466+ imageOrigin,
467+ backendTexture,
468+ GrColorType::kRGBA_8888 ,
469+ std::move (imageColorSpace),
470+ nullptr ,
471+ nullptr );
428472}
429473
430474sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopyWithExternalBackend (
@@ -436,15 +480,29 @@ sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopyWithExternalBackend(
436480 sk_sp<SkColorSpace> imageColorSpace,
437481 TextureReleaseProc textureReleaseProc,
438482 ReleaseContext releaseContext) {
483+ sk_sp<GrRefCntedCallback> releaseHelper;
484+ if (textureReleaseProc) {
485+ releaseHelper.reset (new GrRefCntedCallback (textureReleaseProc, releaseContext));
486+ }
487+
439488 SkYUVAIndex yuvaIndices[4 ] = {
440489 SkYUVAIndex{0 , get_single_channel (nv12Textures[0 ])},
441490 SkYUVAIndex{1 , SkColorChannel::kR },
442491 SkYUVAIndex{1 , SkColorChannel::kG },
443492 SkYUVAIndex{-1 , SkColorChannel::kA }};
444493 SkISize size{nv12Textures[0 ].width (), nv12Textures[0 ].height ()};
445- return make_flattened_image_with_external_backend (
446- ctx, yuvColorSpace, nv12Textures, yuvaIndices, size, imageOrigin, backendTexture,
447- std::move (imageColorSpace), textureReleaseProc, releaseContext);
494+
495+ return make_flattened_image_with_external_backend (ctx,
496+ yuvColorSpace,
497+ nv12Textures,
498+ yuvaIndices,
499+ size,
500+ imageOrigin,
501+ backendTexture,
502+ GrColorType::kRGBA_8888 ,
503+ std::move (imageColorSpace),
504+ /* plane release helper*/ nullptr ,
505+ std::move (releaseHelper));
448506}
449507
450508static sk_sp<SkImage> create_image_from_producer (GrRecordingContext* context,
0 commit comments