From ba692161de9f75bc2475bb80570670d8667dd0c3 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Fri, 19 Apr 2024 16:23:22 +0200 Subject: [PATCH] Align format handling with Skia --- .../SkiaOpenGLSurfaceFactory.cpp | 36 ++++++++++++++----- .../rnskia-android/SkiaOpenGLSurfaceFactory.h | 2 +- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp b/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp index da1b1cd287..d17c5b4686 100644 --- a/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp +++ b/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp @@ -15,8 +15,8 @@ namespace RNSkia { thread_local SkiaOpenGLContext ThreadContextHolder::ThreadSkiaOpenGLContext; -sk_sp -SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(void *buffer) { +sk_sp SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer( + void *buffer, bool requireKnownFormat) { #if __ANDROID_API__ >= 26 // Setup OpenGL and Skia: if (!SkiaOpenGLHelper::createSkiaDirectContextIfNecessary( @@ -31,14 +31,32 @@ SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(void *buffer) { AHardwareBuffer_Desc description; AHardwareBuffer_describe(hardwareBuffer, &description); - if (description.format != AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM) - [[unlikely]] { - throw std::runtime_error("AHardwareBuffer has unknown format (" + - std::to_string(description.format) + - ") - cannot convert to SkImage!"); + GrBackendFormat format; + switch (description.format) { + // TODO: find out if we can detect, which graphic buffers support + // GR_GL_TEXTURE_2D + case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: + case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: + format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL); + case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: + format = GrBackendFormats::MakeGL(GR_GL_RGBA16F, GR_GL_TEXTURE_EXTERNAL); + case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: + format = GrBackendFormats::MakeGL(GR_GL_RGB565, GR_GL_TEXTURE_EXTERNAL); + case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: + format = GrBackendFormats::MakeGL(GR_GL_RGB10_A2, GR_GL_TEXTURE_EXTERNAL); + case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: + format = GrBackendFormats::MakeGL(GR_GL_RGB8, GR_GL_TEXTURE_EXTERNAL); +#if __ANDROID_API__ >= 33 + case AHARDWAREBUFFER_FORMAT_R8_UNORM: + format = GrBackendFormats::MakeGL(GR_GL_R8, GR_GL_TEXTURE_EXTERNAL); +#endif + default: + if (requireKnownFormat) { + format = GrBackendFormat(); + } else { + format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL); + } } - GrBackendFormat format = - GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL); auto backendTex = MakeGLBackendTexture( ThreadContextHolder::ThreadSkiaOpenGLContext.directContext.get(), diff --git a/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h b/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h index ce7aa5d23f..4171243e31 100644 --- a/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h +++ b/package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h @@ -149,7 +149,7 @@ class SkiaOpenGLSurfaceFactory { */ static sk_sp makeOffscreenSurface(int width, int height); - static sk_sp makeImageFromHardwareBuffer(void *buffer); + static sk_sp makeImageFromHardwareBuffer(void *buffer, bool requireKnownFormat = false); /** * Creates a windowed Skia Surface holder.