/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/gpu/ProtectedUtils.h" #include "include/gpu/ganesh/SkImageGanesh.h" #include "include/gpu/ganesh/SkSurfaceGanesh.h" #include "src/gpu/ganesh/GrDirectContextPriv.h" #include "tools/gpu/BackendSurfaceFactory.h" #include "tools/gpu/BackendTextureImageFactory.h" namespace ProtectedUtils { sk_sp CreateProtectedSkSurface(GrDirectContext* dContext, SkISize size, bool textureable, bool isProtected, const SkSurfaceProps* surfaceProps) { sk_sp surface; if (textureable) { surface = sk_gpu_test::MakeBackendTextureSurface(dContext, size, kTopLeft_GrSurfaceOrigin, 1, kRGBA_8888_SkColorType, /* colorSpace= */ nullptr, skgpu::Mipmapped::kNo, skgpu::Protected(isProtected), surfaceProps); } else { surface = sk_gpu_test::MakeBackendRenderTargetSurface(dContext, size, kTopLeft_GrSurfaceOrigin, 1, kRGBA_8888_SkColorType, /* colorSpace= */ nullptr, skgpu::Protected(isProtected), surfaceProps); } if (!surface) { SK_ABORT("Could not create %s surface.", isProtected ? "protected" : "unprotected"); return nullptr; } SkCanvas* canvas = surface->getCanvas(); canvas->clear(SkColors::kBlue); if (textureable) { GrBackendTexture backendTex = SkSurfaces::GetBackendTexture( surface.get(), SkSurfaces::BackendHandleAccess::kFlushRead); SkASSERT(backendTex.isValid()); SkASSERT(backendTex.isProtected() == isProtected); } else { GrBackendRenderTarget backendRT = SkSurfaces::GetBackendRenderTarget( surface.get(), SkSurfaces::BackendHandleAccess::kFlushRead); SkASSERT(backendRT.isValid()); SkASSERT(backendRT.isProtected() == isProtected); } return surface; } void CheckImageBEProtection(SkImage* image, bool expectingProtected) { GrBackendTexture beTex; GrSurfaceOrigin origin; bool result = SkImages::GetBackendTextureFromImage(image, &beTex, /* flushPendingGrContextIO= */ true, &origin); if (!result) { SK_ABORT("GetBackendTextureFromImage failed"); return; } SkASSERT(beTex.isValid()); SkASSERT(beTex.isProtected() == expectingProtected); } sk_sp CreateProtectedSkImage(GrDirectContext* dContext, SkISize size, SkColor4f color, bool isProtected) { SkImageInfo ii = SkImageInfo::Make(size, kRGBA_8888_SkColorType, kPremul_SkAlphaType); sk_sp image = sk_gpu_test::MakeBackendTextureImage(dContext, ii, color, skgpu::Mipmapped::kNo, GrRenderable::kNo, kTopLeft_GrSurfaceOrigin, skgpu::Protected(isProtected)); if (!image) { SK_ABORT("Could not create %s image.", isProtected ? "protected" : "unprotected"); return nullptr; } CheckImageBEProtection(image.get(), isProtected); return image; } } // namespace ProtectedUtils