blob: 068dde75efa2fe3d5d6b378fb9ec8a1d1f8c13dc [file] [log] [blame]
/*
* 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 <android/hardware_buffer.h>
using namespace skgpu::graphite;
namespace SkSurfaces {
sk_sp<SkSurface> WrapAndroidHardwareBuffer(Recorder* recorder,
AHardwareBuffer* hardwareBuffer,
sk_sp<SkColorSpace> 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