/* * 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 __ANDROID_API__ >= 26 #include "include/android/AHardwareBufferUtils.h" #include "include/android/graphite/SurfaceAndroid.h" #include "include/core/SkColorSpace.h" #include "include/gpu/graphite/BackendTexture.h" #include "include/gpu/graphite/Recorder.h" #include "include/gpu/graphite/Surface.h" #include using namespace skgpu::graphite; namespace SkSurfaces { sk_sp WrapAndroidHardwareBuffer(Recorder* recorder, AHardwareBuffer* hardwareBuffer, sk_sp colorSpace, const SkSurfaceProps* surfaceProps, BufferReleaseProc releaseP, ReleaseContext releaseC, bool fromWindow) { if (!recorder || !hardwareBuffer) { return nullptr; } AHardwareBuffer_Desc bufferDesc; AHardwareBuffer_describe(hardwareBuffer, &bufferDesc); if (!SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT) || !SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE)) { if (releaseP) { releaseP(releaseC); } return nullptr; } bool isProtectedContent = SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT); bool fromWindowLocal = false; #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK fromWindowLocal = fromWindow; #endif SkISize dims = SkISize::Make(bufferDesc.width, bufferDesc.height); BackendTexture backendTexture = recorder->createBackendTexture(hardwareBuffer, /* isRenderable= */ true, isProtectedContent, dims, fromWindowLocal); if (!backendTexture.isValid()) { if (releaseP) { releaseP(releaseC); } return nullptr; } SkColorType colorType = AHardwareBufferUtils::GetSkColorTypeFromBufferFormat(bufferDesc.format); // Will call 'releaseP' if SkSurface creation fails. return SkSurfaces::WrapBackendTexture(recorder, backendTexture, colorType, std::move(colorSpace), surfaceProps, releaseP, releaseC); } } // namespace SkSurfaces #endif // __ANDROID_API__ >= 26