/* * 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 "include/core/SkTypes.h" #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26 #include "include/android/AHardwareBufferUtils.h" #include "include/android/GrAHardwareBufferUtils.h" #include "include/android/SkSurfaceAndroid.h" #include "include/core/SkCanvas.h" #include "include/core/SkColorSpace.h" #include "include/core/SkColorType.h" #include "include/core/SkImage.h" #include "include/core/SkPoint.h" #include "include/core/SkRect.h" #include "include/core/SkSize.h" #include "include/core/SkSurface.h" #include "include/core/SkSurfaceProps.h" #include "include/gpu/GpuTypes.h" #include "include/gpu/ganesh/GrBackendSurface.h" #include "include/gpu/ganesh/GrContextThreadSafeProxy.h" #include "include/gpu/ganesh/GrDirectContext.h" #include "include/gpu/ganesh/GrRecordingContext.h" #include "include/gpu/ganesh/GrTypes.h" #include "include/gpu/ganesh/SkSurfaceGanesh.h" #include "include/private/base/SkTo.h" #include "include/private/chromium/GrSurfaceCharacterization.h" #include "include/private/gpu/ganesh/GrTypesPriv.h" #include "src/core/SkDevice.h" #include "src/core/SkSurfacePriv.h" #include "src/gpu/RefCntedCallback.h" #include "src/gpu/SkBackingFit.h" #include "src/gpu/SkRenderEngineAbortf.h" #include "src/gpu/ganesh/Device.h" #include "src/gpu/ganesh/GrCaps.h" #include "src/gpu/ganesh/GrContextThreadSafeProxyPriv.h" #include "src/gpu/ganesh/GrDirectContextPriv.h" #include "src/gpu/ganesh/GrGpuResourcePriv.h" #include "src/gpu/ganesh/GrProxyProvider.h" #include "src/gpu/ganesh/GrRecordingContextPriv.h" #include "src/gpu/ganesh/GrRenderTarget.h" #include "src/gpu/ganesh/GrRenderTargetProxy.h" #include "src/gpu/ganesh/GrSurfaceProxy.h" #include "src/gpu/ganesh/GrSurfaceProxyPriv.h" #include "src/gpu/ganesh/GrSurfaceProxyView.h" #include "src/gpu/ganesh/GrTexture.h" #include "src/gpu/ganesh/GrTextureProxy.h" #include "src/gpu/ganesh/image/SkImage_Ganesh.h" #include "src/gpu/ganesh/surface/SkSurface_Ganesh.h" #include "src/image/SkImage_Base.h" #include #include #include #include namespace SkSurfaces { sk_sp WrapAndroidHardwareBuffer(GrDirectContext* dContext, AHardwareBuffer* hardwareBuffer, GrSurfaceOrigin origin, sk_sp colorSpace, const SkSurfaceProps* surfaceProps, bool fromWindow) { AHardwareBuffer_Desc bufferDesc; AHardwareBuffer_describe(hardwareBuffer, &bufferDesc); if (!SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT)) { return nullptr; } bool isTextureable = SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE); if (!isTextureable) { return nullptr; } GrBackendFormat backendFormat = GrAHardwareBufferUtils::GetBackendFormat( dContext, hardwareBuffer, bufferDesc.format, true); if (!backendFormat.isValid()) { return nullptr; } GrAHardwareBufferUtils::DeleteImageProc deleteImageProc = nullptr; GrAHardwareBufferUtils::UpdateImageProc updateImageProc = nullptr; GrAHardwareBufferUtils::TexImageCtx deleteImageCtx = nullptr; bool isProtectedContent = SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT); bool fromWindowLocal = false; #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK fromWindowLocal = fromWindow; #endif GrBackendTexture backendTexture = GrAHardwareBufferUtils::MakeBackendTexture(dContext, hardwareBuffer, bufferDesc.width, bufferDesc.height, &deleteImageProc, &updateImageProc, &deleteImageCtx, isProtectedContent, backendFormat, true, fromWindowLocal); if (!backendTexture.isValid()) { return nullptr; } SkColorType colorType = AHardwareBufferUtils::GetSkColorTypeFromBufferFormat(bufferDesc.format); // Will call deleteImageProc if SkSurface creation fails. sk_sp surface = SkSurfaces::WrapBackendTexture(dContext, backendTexture, origin, 0, colorType, std::move(colorSpace), surfaceProps, deleteImageProc, deleteImageCtx); return surface; } } // namespace SkSurfaces #endif