@@ -16,7 +16,8 @@ namespace RNSkia {
16
16
thread_local SkiaOpenGLContext ThreadContextHolder::ThreadSkiaOpenGLContext;
17
17
18
18
sk_sp<SkImage>
19
- SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer (void *buffer) {
19
+ SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer (void *buffer,
20
+ bool requireKnownFormat) {
20
21
#if __ANDROID_API__ >= 26
21
22
// Setup OpenGL and Skia:
22
23
if (!SkiaOpenGLHelper::createSkiaDirectContextIfNecessary (
@@ -31,14 +32,32 @@ SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(void *buffer) {
31
32
32
33
AHardwareBuffer_Desc description;
33
34
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
+ }
39
60
}
40
- GrBackendFormat format =
41
- GrBackendFormats::MakeGL (GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
42
61
43
62
auto backendTex = MakeGLBackendTexture (
44
63
ThreadContextHolder::ThreadSkiaOpenGLContext.directContext .get (),
0 commit comments