Skip to content

Commit 66f877f

Browse files
wcandillonmrousavy
andauthored
fix(🤖): Align Android hardware buffer formats handling (#2392)
Co-authored-by: Marc Rousavy <[email protected]>
1 parent 36c10bd commit 66f877f

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

Diff for: ‎package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp

+27-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ namespace RNSkia {
1616
thread_local SkiaOpenGLContext ThreadContextHolder::ThreadSkiaOpenGLContext;
1717

1818
sk_sp<SkImage>
19-
SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(void *buffer) {
19+
SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(void *buffer,
20+
bool requireKnownFormat) {
2021
#if __ANDROID_API__ >= 26
2122
// Setup OpenGL and Skia:
2223
if (!SkiaOpenGLHelper::createSkiaDirectContextIfNecessary(
@@ -31,14 +32,32 @@ SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(void *buffer) {
3132

3233
AHardwareBuffer_Desc description;
3334
AHardwareBuffer_describe(hardwareBuffer, &description);
34-
if (description.format != AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM)
35-
[[unlikely]] {
36-
throw std::runtime_error("AHardwareBuffer has unknown format (" +
37-
std::to_string(description.format) +
38-
") - cannot convert to SkImage!");
35+
GrBackendFormat format;
36+
switch (description.format) {
37+
// TODO: find out if we can detect, which graphic buffers support
38+
// GR_GL_TEXTURE_2D
39+
case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
40+
case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
41+
format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
42+
case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
43+
format = GrBackendFormats::MakeGL(GR_GL_RGBA16F, GR_GL_TEXTURE_EXTERNAL);
44+
case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
45+
format = GrBackendFormats::MakeGL(GR_GL_RGB565, GR_GL_TEXTURE_EXTERNAL);
46+
case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
47+
format = GrBackendFormats::MakeGL(GR_GL_RGB10_A2, GR_GL_TEXTURE_EXTERNAL);
48+
case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
49+
format = GrBackendFormats::MakeGL(GR_GL_RGB8, GR_GL_TEXTURE_EXTERNAL);
50+
#if __ANDROID_API__ >= 33
51+
case AHARDWAREBUFFER_FORMAT_R8_UNORM:
52+
format = GrBackendFormats::MakeGL(GR_GL_R8, GR_GL_TEXTURE_EXTERNAL);
53+
#endif
54+
default:
55+
if (requireKnownFormat) {
56+
format = GrBackendFormat();
57+
} else {
58+
format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
59+
}
3960
}
40-
GrBackendFormat format =
41-
GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
4261

4362
auto backendTex = MakeGLBackendTexture(
4463
ThreadContextHolder::ThreadSkiaOpenGLContext.directContext.get(),

Diff for: ‎package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ class SkiaOpenGLSurfaceFactory {
149149
*/
150150
static sk_sp<SkSurface> makeOffscreenSurface(int width, int height);
151151

152-
static sk_sp<SkImage> makeImageFromHardwareBuffer(void *buffer);
152+
static sk_sp<SkImage>
153+
makeImageFromHardwareBuffer(void *buffer, bool requireKnownFormat = false);
153154

154155
/**
155156
* Creates a windowed Skia Surface holder.

0 commit comments

Comments
 (0)