@shopify/react-native-skia 1.5.3 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/android/CMakeLists.txt +53 -13
  2. package/android/build.gradle +3 -0
  3. package/android/cpp/rnskia-android/OpenGLContext.h +122 -11
  4. package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +73 -0
  5. package/android/cpp/rnskia-android/OpenGLWindowContext.h +74 -0
  6. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +18 -1
  7. package/android/cpp/rnskia-android/RNSkAndroidVideo.cpp +12 -1
  8. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +13 -1
  9. package/android/cpp/rnskia-android/opengl/Context.h +77 -0
  10. package/android/cpp/rnskia-android/opengl/Display.h +117 -0
  11. package/android/cpp/rnskia-android/opengl/Error.cpp +9 -0
  12. package/android/cpp/rnskia-android/opengl/Error.h +44 -0
  13. package/android/cpp/rnskia-android/opengl/Surface.h +43 -0
  14. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +0 -1
  15. package/cpp/api/JsiSkImage.h +15 -2
  16. package/cpp/api/JsiSkSurface.h +18 -3
  17. package/cpp/rnskia/DawnContext.h +241 -0
  18. package/cpp/rnskia/DawnUtils.h +127 -0
  19. package/cpp/rnskia/DawnWindowContext.cpp +19 -0
  20. package/cpp/rnskia/DawnWindowContext.h +77 -0
  21. package/cpp/rnskia/ImageProvider.h +100 -0
  22. package/cpp/rnskia/RNSkView.h +6 -0
  23. package/cpp/skia/include/android/SkAnimatedImage.h +14 -0
  24. package/cpp/skia/include/codec/SkAvifDecoder.h +39 -3
  25. package/cpp/skia/include/codec/SkCodec.h +16 -0
  26. package/cpp/skia/include/config/SkUserConfig.h +3 -2
  27. package/cpp/skia/include/core/SkCanvas.h +55 -10
  28. package/cpp/skia/include/core/SkContourMeasure.h +76 -0
  29. package/cpp/skia/include/core/SkFontScanner.h +48 -0
  30. package/cpp/skia/include/core/SkMilestone.h +1 -1
  31. package/cpp/skia/include/core/SkPath.h +11 -0
  32. package/cpp/skia/include/core/SkPathEffect.h +0 -23
  33. package/cpp/skia/include/core/SkRect.h +2 -0
  34. package/cpp/skia/include/core/SkString.h +4 -0
  35. package/cpp/skia/include/core/SkTypeface.h +5 -0
  36. package/cpp/skia/include/core/SkTypes.h +8 -3
  37. package/cpp/skia/include/docs/SkPDFDocument.h +3 -3
  38. package/cpp/skia/include/effects/SkOverdrawColorFilter.h +1 -0
  39. package/cpp/skia/include/effects/SkRuntimeEffect.h +2 -1
  40. package/cpp/skia/include/encode/SkJpegEncoder.h +4 -0
  41. package/cpp/skia/include/gpu/ganesh/GrContextOptions.h +8 -1
  42. package/cpp/skia/include/gpu/ganesh/GrDirectContext.h +18 -3
  43. package/cpp/skia/include/gpu/ganesh/GrTypes.h +11 -0
  44. package/cpp/skia/include/gpu/ganesh/gl/GrGLFunctions.h +5 -1
  45. package/cpp/skia/include/gpu/ganesh/gl/GrGLInterface.h +0 -1
  46. package/cpp/skia/include/gpu/graphite/GraphiteTypes.h +8 -0
  47. package/cpp/skia/include/gpu/graphite/Recorder.h +0 -2
  48. package/cpp/skia/include/gpu/graphite/precompile/PaintOptions.h +7 -4
  49. package/cpp/skia/include/gpu/graphite/precompile/PrecompileImageFilter.h +2 -0
  50. package/cpp/skia/include/gpu/graphite/precompile/PrecompileMaskFilter.h +2 -0
  51. package/cpp/skia/include/ports/SkFontMgr_android_ndk.h +25 -0
  52. package/cpp/skia/include/ports/SkFontMgr_fontconfig.h +4 -2
  53. package/cpp/skia/include/ports/SkFontScanner_Fontations.h +15 -0
  54. package/cpp/skia/include/ports/SkFontScanner_FreeType.h +15 -0
  55. package/cpp/skia/include/private/SkExif.h +14 -0
  56. package/cpp/skia/include/private/SkPathRef.h +36 -0
  57. package/cpp/skia/include/private/base/SkFeatures.h +4 -0
  58. package/cpp/skia/include/private/base/SkSpan_impl.h +1 -3
  59. package/cpp/skia/modules/skcms/src/skcms_internals.h +3 -0
  60. package/cpp/skia/src/base/SkMathPriv.h +1 -8
  61. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.h +1 -2
  62. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +25 -19
  63. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +23 -0
  64. package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +4 -8
  65. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +26 -8
  66. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +0 -20
  67. package/libs/android/arm64-v8a/libskia.a +0 -0
  68. package/libs/android/arm64-v8a/libskottie.a +0 -0
  69. package/libs/android/armeabi-v7a/libskia.a +0 -0
  70. package/libs/android/armeabi-v7a/libskottie.a +0 -0
  71. package/libs/android/x86/libskia.a +0 -0
  72. package/libs/android/x86/libskottie.a +0 -0
  73. package/libs/android/x86_64/libskia.a +0 -0
  74. package/libs/android/x86_64/libskottie.a +0 -0
  75. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  76. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  77. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
  78. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
  79. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
  80. package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
  81. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
  82. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
  83. package/libs/ios/libskshaper.xcframework/Info.plist +5 -5
  84. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  85. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  86. package/libs/ios/libskunicode_core.xcframework/Info.plist +5 -5
  87. package/libs/ios/libskunicode_core.xcframework/ios-arm64_arm64e/libskunicode_core.a +0 -0
  88. package/libs/ios/libskunicode_core.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode_core.a +0 -0
  89. package/libs/ios/libskunicode_libgrapheme.xcframework/Info.plist +5 -5
  90. package/libs/ios/libskunicode_libgrapheme.xcframework/ios-arm64_arm64e/libskunicode_libgrapheme.a +0 -0
  91. package/libs/ios/libskunicode_libgrapheme.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode_libgrapheme.a +0 -0
  92. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  93. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  94. package/package.json +1 -1
  95. package/react-native-skia.podspec +35 -9
  96. package/src/renderer/__tests__/e2e/SVG.spec.tsx +2 -1
  97. package/android/cpp/rnskia-android/SkiaOpenGLHelper.h +0 -310
  98. package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp +0 -188
  99. package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h +0 -100
@@ -3,8 +3,8 @@ cmake_minimum_required(VERSION 3.4.1)
3
3
 
4
4
  set (CMAKE_VERBOSE_MAKEFILE ON)
5
5
  set (CMAKE_CXX_STANDARD 17)
6
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSK_GL -DSK_GANESH -DSK_BUILD_FOR_ANDROID -DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID")
7
-
6
+ set(SK_GRAPHITE OFF)
7
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSK_BUILD_FOR_ANDROID -DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID")
8
8
  set (PACKAGE_NAME "rnskia")
9
9
  set (SKIA_LIB "skia")
10
10
  set (SKIA_SVG_LIB "svg")
@@ -13,6 +13,7 @@ set (SKIA_SKPARAGRAPH_LIB "skparagraph")
13
13
  set (SKIA_SKUNICODE_CORE_LIB "skunicode_core")
14
14
  set (SKIA_SKUNICODE_ICU_LIB "skunicode_icu")
15
15
 
16
+
16
17
  # Clear some variables
17
18
  unset(LIBRN_DIR CACHE)
18
19
  unset(libfbjni_link_DIRS CACHE)
@@ -30,6 +31,34 @@ message("-- LIBRN : " ${LIBRN_DIR})
30
31
 
31
32
  link_directories(../libs/android/${ANDROID_ABI}/)
32
33
 
34
+ # Import prebuilt SKIA libraries
35
+ set (SKIA_LIBS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../libs/android/${ANDROID_ABI}")
36
+
37
+ if(SK_GRAPHITE)
38
+ add_definitions(-DSK_GRAPHITE)
39
+ set(DAWN_NATIVE_LIB "libdawn_native_static")
40
+ set(DAWN_PLATFORM_LIB "libdawn_platform_static")
41
+ set(DAWN_PROC_LIB "libdawn_proc_static")
42
+ set(BACKEND_SOURCES
43
+ #TODO: is this source needed to be added?
44
+ "${PROJECT_SOURCE_DIR}/../cpp/rnskia/DawnWindowContext.cpp"
45
+ )
46
+ add_library(libdawn_native_static STATIC IMPORTED)
47
+ set_property(TARGET libdawn_native_static PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libdawn_native_static.a")
48
+
49
+ add_library(libdawn_platform_static STATIC IMPORTED)
50
+ set_property(TARGET libdawn_platform_static PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libdawn_platform_static.a")
51
+
52
+ add_library(libdawn_proc_static STATIC IMPORTED)
53
+ set_property(TARGET libdawn_proc_static PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libdawn_proc_static.a")
54
+ else()
55
+ add_definitions(-DSK_GL -DSK_GANESH)
56
+ set(BACKEND_SOURCES
57
+ "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/OpenGLWindowContext.cpp"
58
+ "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/GrAHardwareBufferUtils.cpp"
59
+ )
60
+ endif()
61
+
33
62
  if(${REACT_NATIVE_VERSION} LESS 66)
34
63
  file(
35
64
  TO_CMAKE_PATH
@@ -45,9 +74,8 @@ add_library(
45
74
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniSkiaManager.cpp"
46
75
 
47
76
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniPlatformContext.cpp"
77
+ "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/opengl/Error.cpp"
48
78
  "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp"
49
- "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp"
50
- "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/GrAHardwareBufferUtils.cpp"
51
79
  "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/AHardwareBufferUtils.cpp"
52
80
  "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkAndroidVideo.cpp"
53
81
 
@@ -66,9 +94,10 @@ add_library(
66
94
 
67
95
  "${PROJECT_SOURCE_DIR}/../cpp/api/third_party/CSSColorParser.cpp"
68
96
  "${PROJECT_SOURCE_DIR}/../cpp/api/third_party/base64.cpp"
69
-
97
+ ${BACKEND_SOURCES}
70
98
  )
71
99
 
100
+
72
101
  target_include_directories(
73
102
  ${PACKAGE_NAME}
74
103
  PRIVATE
@@ -88,6 +117,7 @@ target_include_directories(
88
117
  # so "include/core/SkRef.h" instead of "SkRef.h", as otherwise
89
118
  # the prefab cannot be shipped.
90
119
  ../cpp/skia
120
+ ../cpp/dawn/include
91
121
 
92
122
  ../cpp/api
93
123
  ../cpp/jsi
@@ -102,9 +132,6 @@ target_include_directories(
102
132
  ${libfbjni_include_DIRS}
103
133
  )
104
134
 
105
- # Import prebuilt SKIA libraries
106
- set (SKIA_LIBS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../libs/android/${ANDROID_ABI}")
107
-
108
135
  add_library(skia STATIC IMPORTED)
109
136
  set_property(TARGET skia PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskia.a")
110
137
 
@@ -240,8 +267,7 @@ add_definitions(-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION})
240
267
 
241
268
  # Link
242
269
  if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
243
- target_link_libraries(
244
- ${PACKAGE_NAME}
270
+ set(COMMON_LIBS
245
271
  ${LOG_LIB}
246
272
  ${REACT_LIB}
247
273
  ${FBJNI_LIBRARY}
@@ -258,8 +284,7 @@ if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
258
284
  -landroid
259
285
  )
260
286
  else()
261
- target_link_libraries(
262
- ${PACKAGE_NAME}
287
+ set(COMMON_LIBS
263
288
  ${LOG_LIB}
264
289
  ${FBJNI_LIBRARY}
265
290
  ${REACT_LIB}
@@ -278,4 +303,19 @@ else()
278
303
  -lEGL
279
304
  -landroid
280
305
  )
281
- endif()
306
+ endif()
307
+
308
+ if(SK_GRAPHITE)
309
+ target_link_libraries(${PACKAGE_NAME}
310
+ ${COMMON_LIBS}
311
+ ${DAWN_NATIVE_LIB}
312
+ ${DAWN_PLATFORM_LIB}
313
+ ${DAWN_PROC_LIB}
314
+ )
315
+ else()
316
+ target_link_libraries(${PACKAGE_NAME}
317
+ ${COMMON_LIBS}
318
+ -lGLESv2
319
+ -lEGL
320
+ )
321
+ endif()
@@ -330,6 +330,9 @@ if (ENABLE_PREFAB) {
330
330
  } else if (path.contains("skia/include") || path.contains("skia/modules") || path.contains("skia/src")) {
331
331
  // Skip flattening Skia dir
332
332
  path = path.substring("skia/".length())
333
+ } else if (path.startsWith("dawn/include/")) {
334
+ // Flatten dawn/include/dawn and dawn/include/webgpu
335
+ path = path.substring("dawn/include/".length())
333
336
  } else {
334
337
  // flatten anything else
335
338
  path = path.substring(path.lastIndexOf("/") + 1)
@@ -1,9 +1,18 @@
1
1
  #pragma once
2
2
 
3
- #include "SkiaOpenGLSurfaceFactory.h"
4
- #include "WindowContext.h"
3
+ #include "GrAHardwareBufferUtils.h"
4
+ #include "OpenGLWindowContext.h"
5
+ #include "opengl/Display.h"
5
6
 
7
+ #include "include/core/SkCanvas.h"
8
+ #include "include/core/SkColorSpace.h"
6
9
  #include "include/core/SkSurface.h"
10
+ #include "include/gpu/ganesh/GrDirectContext.h"
11
+ #include "include/gpu/ganesh/SkImageGanesh.h"
12
+ #include "include/gpu/ganesh/gl/GrGLBackendSurface.h"
13
+ #include "include/gpu/ganesh/gl/GrGLDirectContext.h"
14
+ #include "include/gpu/ganesh/gl/GrGLInterface.h"
15
+ #include "src/gpu/ganesh/gl/GrGLDefines.h"
7
16
 
8
17
  class OpenGLContext {
9
18
  public:
@@ -16,25 +25,127 @@ public:
16
25
  }
17
26
 
18
27
  sk_sp<SkSurface> MakeOffscreen(int width, int height) {
19
- return RNSkia::SkiaOpenGLSurfaceFactory::makeOffscreenSurface(
20
- &_context, width, height);
28
+ auto colorType = kRGBA_8888_SkColorType;
29
+
30
+ SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
31
+
32
+ auto result = _ctx->makeCurrent(*_surface);
33
+ if (!result) {
34
+ return nullptr;
35
+ }
36
+
37
+ // Create texture
38
+ auto texture = _directContext->createBackendTexture(
39
+ width, height, colorType, skgpu::Mipmapped::kNo, GrRenderable::kYes);
40
+
41
+ if (!texture.isValid()) {
42
+ RNSkia::RNSkLogger::logToConsole(
43
+ "couldn't create offscreen texture %dx%d", width, height);
44
+ }
45
+
46
+ struct ReleaseContext {
47
+ GrDirectContext *directContext;
48
+ GrBackendTexture texture;
49
+ };
50
+
51
+ auto releaseCtx = new ReleaseContext{.directContext = _directContext.get(),
52
+ .texture = texture};
53
+
54
+ // Create a SkSurface from the GrBackendTexture
55
+ return SkSurfaces::WrapBackendTexture(
56
+ _directContext.get(), texture, kTopLeft_GrSurfaceOrigin, 0, colorType,
57
+ nullptr, &props,
58
+ [](void *addr) {
59
+ auto releaseCtx = reinterpret_cast<ReleaseContext *>(addr);
60
+ releaseCtx->directContext->deleteBackendTexture(releaseCtx->texture);
61
+ delete releaseCtx;
62
+ },
63
+ releaseCtx);
21
64
  }
22
65
 
23
- sk_sp<SkImage> MakeImageFromBuffer(void *buffer) {
24
- return RNSkia::SkiaOpenGLSurfaceFactory::makeImageFromHardwareBuffer(
25
- &_context, buffer);
66
+ sk_sp<SkImage> MakeImageFromBuffer(void *buffer,
67
+ bool requireKnownFormat = false) {
68
+ #if __ANDROID_API__ >= 26
69
+ const AHardwareBuffer *hardwareBuffer =
70
+ static_cast<AHardwareBuffer *>(buffer);
71
+ RNSkia::DeleteImageProc deleteImageProc = nullptr;
72
+ RNSkia::UpdateImageProc updateImageProc = nullptr;
73
+ RNSkia::TexImageCtx deleteImageCtx = nullptr;
74
+
75
+ AHardwareBuffer_Desc description;
76
+ AHardwareBuffer_describe(hardwareBuffer, &description);
77
+ GrBackendFormat format;
78
+ switch (description.format) {
79
+ // TODO: find out if we can detect, which graphic buffers support
80
+ // GR_GL_TEXTURE_2D
81
+ case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
82
+ format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
83
+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
84
+ format = GrBackendFormats::MakeGL(GR_GL_RGBA16F, GR_GL_TEXTURE_EXTERNAL);
85
+ case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
86
+ format = GrBackendFormats::MakeGL(GR_GL_RGB565, GR_GL_TEXTURE_EXTERNAL);
87
+ case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
88
+ format = GrBackendFormats::MakeGL(GR_GL_RGB10_A2, GR_GL_TEXTURE_EXTERNAL);
89
+ case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
90
+ format = GrBackendFormats::MakeGL(GR_GL_RGB8, GR_GL_TEXTURE_EXTERNAL);
91
+ #if __ANDROID_API__ >= 33
92
+ case AHARDWAREBUFFER_FORMAT_R8_UNORM:
93
+ format = GrBackendFormats::MakeGL(GR_GL_R8, GR_GL_TEXTURE_EXTERNAL);
94
+ #endif
95
+ default:
96
+ if (requireKnownFormat) {
97
+ format = GrBackendFormat();
98
+ } else {
99
+ format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
100
+ }
101
+ }
102
+
103
+ auto backendTex = RNSkia::MakeGLBackendTexture(
104
+ _directContext.get(), const_cast<AHardwareBuffer *>(hardwareBuffer),
105
+ description.width, description.height, &deleteImageProc,
106
+ &updateImageProc, &deleteImageCtx, false, format, false);
107
+ if (!backendTex.isValid()) {
108
+ RNSkia::RNSkLogger::logToConsole(
109
+ "Failed to convert HardwareBuffer to OpenGL Texture!");
110
+ return nullptr;
111
+ }
112
+ sk_sp<SkImage> image = SkImages::BorrowTextureFrom(
113
+ _directContext.get(), backendTex, kTopLeft_GrSurfaceOrigin,
114
+ kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, deleteImageProc,
115
+ deleteImageCtx);
116
+ return image;
117
+ #else
118
+ throw std::runtime_error(
119
+ "HardwareBuffers are only supported on Android API 26 or higher! Set "
120
+ "your minSdk to 26 (or higher) and try again.");
121
+ #endif
26
122
  }
27
123
 
28
124
  std::unique_ptr<RNSkia::WindowContext> MakeWindow(ANativeWindow *window,
29
125
  int width, int height) {
30
- return RNSkia::SkiaOpenGLSurfaceFactory::makeContext(&_context, window,
31
- width, height);
126
+ return std::make_unique<RNSkia::OpenGLWindowContext>(
127
+ _config, _display.get(), _ctx.get(), _directContext.get(), window,
128
+ width, height);
32
129
  }
33
130
 
34
131
  private:
35
- RNSkia::SkiaOpenGLContext _context;
132
+ EGLConfig _config;
133
+ std::unique_ptr<RNSkia::Display> _display;
134
+ std::unique_ptr<RNSkia::Context> _ctx;
135
+ std::unique_ptr<RNSkia::Surface> _surface;
136
+ sk_sp<GrDirectContext> _directContext;
36
137
 
37
138
  OpenGLContext() {
38
- RNSkia::SkiaOpenGLHelper::createSkiaDirectContextIfNecessary(&_context);
139
+ _display = std::make_unique<RNSkia::Display>();
140
+ _config = _display->chooseConfig();
141
+ _ctx = _display->makeContext(_config, nullptr);
142
+ _surface = _display->makePixelBufferSurface(_config, 1, 1);
143
+ _ctx->makeCurrent(*_surface);
144
+ auto backendInterface = GrGLMakeNativeInterface();
145
+ _directContext = GrDirectContexts::MakeGL(backendInterface);
146
+
147
+ if (_directContext == nullptr) {
148
+ throw std::runtime_error("GrDirectContexts::MakeGL failed");
149
+ }
39
150
  }
40
151
  };
@@ -0,0 +1,73 @@
1
+ #include "OpenGLWindowContext.h"
2
+ #include "GrAHardwareBufferUtils.h"
3
+
4
+ #pragma clang diagnostic push
5
+ #pragma clang diagnostic ignored "-Wdocumentation"
6
+
7
+ #include "include/gpu/ganesh/SkImageGanesh.h"
8
+ #include "include/gpu/ganesh/gl/GrGLBackendSurface.h"
9
+ #include "src/gpu/ganesh/gl/GrGLDefines.h"
10
+
11
+ #pragma clang diagnostic pop
12
+
13
+ namespace RNSkia {
14
+
15
+ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
16
+ if (_skSurface == nullptr) {
17
+
18
+ struct ReleaseContext {
19
+ std::unique_ptr<Surface> surface = nullptr;
20
+ };
21
+
22
+ auto releaseCtx = new ReleaseContext();
23
+ releaseCtx->surface = _display->makeWindowSurface(_config, _window);
24
+ _surface = releaseCtx->surface.get();
25
+
26
+ // Now make this one current
27
+ _context->makeCurrent(*releaseCtx->surface);
28
+
29
+ // Set up parameters for the render target so that it
30
+ // matches the underlying OpenGL context.
31
+ GrGLFramebufferInfo fboInfo;
32
+
33
+ // We pass 0 as the framebuffer id, since the
34
+ // underlying Skia GrGlGpu will read this when wrapping the context in the
35
+ // render target and the GrGlGpu object.
36
+ fboInfo.fFBOID = 0;
37
+ fboInfo.fFormat = 0x8058; // GL_RGBA8
38
+
39
+ GLint stencil;
40
+ glGetIntegerv(GL_STENCIL_BITS, &stencil);
41
+
42
+ GLint samples;
43
+ glGetIntegerv(GL_SAMPLES, &samples);
44
+
45
+ auto colorType = kN32_SkColorType;
46
+
47
+ auto maxSamples =
48
+ _directContext->maxSurfaceSampleCountForColorType(colorType);
49
+
50
+ if (samples > maxSamples) {
51
+ samples = maxSamples;
52
+ }
53
+
54
+ auto renderTarget = GrBackendRenderTargets::MakeGL(_width, _height, samples,
55
+ stencil, fboInfo);
56
+
57
+ SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
58
+
59
+
60
+ // Create surface object
61
+ _skSurface = SkSurfaces::WrapBackendRenderTarget(
62
+ _directContext, renderTarget, kBottomLeft_GrSurfaceOrigin, colorType,
63
+ nullptr, &props,
64
+ [](void *addr) {
65
+ auto releaseCtx = reinterpret_cast<ReleaseContext *>(addr);
66
+ delete releaseCtx;
67
+ },
68
+ reinterpret_cast<void *>(releaseCtx));
69
+ }
70
+ return _skSurface;
71
+ }
72
+
73
+ } // namespace RNSkia
@@ -0,0 +1,74 @@
1
+ #pragma once
2
+
3
+ #include "RNSkLog.h"
4
+
5
+ #include <fbjni/fbjni.h>
6
+ #include <jni.h>
7
+
8
+ #include <android/native_window_jni.h>
9
+ #include <android/surface_texture.h>
10
+ #include <android/surface_texture_jni.h>
11
+ #include <condition_variable>
12
+ #include <memory>
13
+ #include <thread>
14
+ #include <unordered_map>
15
+
16
+ #include "WindowContext.h"
17
+ #include "opengl/Display.h"
18
+
19
+ #pragma clang diagnostic push
20
+ #pragma clang diagnostic ignored "-Wdocumentation"
21
+
22
+ #include "include/core/SkCanvas.h"
23
+ #include "include/core/SkColorSpace.h"
24
+ #include "include/core/SkSurface.h"
25
+ #include "include/gpu/ganesh/GrBackendSurface.h"
26
+ #include "include/gpu/ganesh/GrDirectContext.h"
27
+ #include "include/gpu/ganesh/SkSurfaceGanesh.h"
28
+ #include "include/gpu/ganesh/gl/GrGLInterface.h"
29
+
30
+ #pragma clang diagnostic pop
31
+
32
+ namespace RNSkia {
33
+
34
+ class OpenGLWindowContext : public WindowContext {
35
+ public:
36
+ OpenGLWindowContext(EGLConfig &config, Display *display, Context *context,
37
+ GrDirectContext *directContext, ANativeWindow *window,
38
+ int width, int height)
39
+ : _config(config), _display(display), _directContext(directContext),
40
+ _context(context), _window(window), _width(width), _height(height) {}
41
+
42
+ ~OpenGLWindowContext() { ANativeWindow_release(_window); }
43
+
44
+ sk_sp<SkSurface> getSurface() override;
45
+
46
+ void present() override {
47
+ _context->makeCurrent(*_surface);
48
+ _directContext->flushAndSubmit();
49
+ _surface->Present();
50
+ }
51
+
52
+ void resize(int width, int height) override {
53
+ _skSurface = nullptr;
54
+ _width = width;
55
+ _height = height;
56
+ }
57
+
58
+ int getWidth() override { return _width; };
59
+
60
+ int getHeight() override { return _height; };
61
+
62
+ private:
63
+ ANativeWindow *_window;
64
+ sk_sp<SkSurface> _skSurface = nullptr;
65
+ EGLConfig _config;
66
+ Context *_context;
67
+ Surface* _surface;
68
+ Display *_display;
69
+ GrDirectContext *_directContext;
70
+ int _width = 0;
71
+ int _height = 0;
72
+ };
73
+
74
+ } // namespace RNSkia
@@ -9,9 +9,14 @@
9
9
  #include <memory>
10
10
  #include <string>
11
11
 
12
+ #if defined(SK_GRAPHITE)
13
+ #include "DawnContext.h"
14
+ #else
15
+ #include "OpenGLContext.h"
16
+ #endif
17
+
12
18
  #include "AHardwareBufferUtils.h"
13
19
  #include "JniPlatformContext.h"
14
- #include "OpenGLContext.h"
15
20
  #include "RNSkAndroidVideo.h"
16
21
  #include "RNSkPlatformContext.h"
17
22
 
@@ -51,17 +56,29 @@ public:
51
56
  }
52
57
 
53
58
  sk_sp<SkSurface> makeOffscreenSurface(int width, int height) override {
59
+ #if defined(SK_GRAPHITE)
60
+ return DawnContext::getInstance().MakeOffscreen(width, height);
61
+ #else
54
62
  return OpenGLContext::getInstance().MakeOffscreen(width, height);
63
+ #endif
55
64
  }
56
65
 
57
66
  std::shared_ptr<WindowContext>
58
67
  makeContextFromNativeSurface(void *surface, int width, int height) override {
68
+ #if defined(SK_GRAPHITE)
69
+ return DawnContext::getInstance().MakeWindow(surface, width, height);
70
+ #else
59
71
  return OpenGLContext::getInstance().MakeWindow(
60
72
  reinterpret_cast<ANativeWindow *>(surface), width, height);
73
+ #endif
61
74
  }
62
75
 
63
76
  sk_sp<SkImage> makeImageFromNativeBuffer(void *buffer) override {
77
+ #if defined(SK_GRAPHITE)
78
+ return DawnContext::getInstance().MakeImageFromBuffer(buffer);
79
+ #else
64
80
  return OpenGLContext::getInstance().MakeImageFromBuffer(buffer);
81
+ #endif
65
82
  }
66
83
 
67
84
  std::shared_ptr<RNSkVideo> createVideo(const std::string &url) override {
@@ -5,6 +5,14 @@
5
5
  #include <android/hardware_buffer_jni.h>
6
6
  #endif
7
7
 
8
+ #include "RNSkLog.h"
9
+
10
+ #if defined(SK_GRAPHITE)
11
+ #include "DawnContext.h"
12
+ #else
13
+ #include "OpenGLContext.h"
14
+ #endif
15
+
8
16
  #pragma clang diagnostic push
9
17
  #pragma clang diagnostic ignored "-Wdocumentation"
10
18
 
@@ -13,7 +21,6 @@
13
21
 
14
22
  #pragma clang diagnostic pop
15
23
 
16
- #include "OpenGLContext.h"
17
24
  #include "RNSkAndroidVideo.h"
18
25
 
19
26
  namespace RNSkia {
@@ -52,7 +59,11 @@ sk_sp<SkImage> RNSkAndroidVideo::nextImage(double *timeStamp) {
52
59
  // Convert jobject to AHardwareBuffer
53
60
  AHardwareBuffer *buffer =
54
61
  AHardwareBuffer_fromHardwareBuffer(env, jHardwareBuffer);
62
+ #if defined(SK_GRAPHITE)
63
+ return DawnContext::getInstance().MakeImageFromBuffer(buffer);
64
+ #else
55
65
  return OpenGLContext::getInstance().MakeImageFromBuffer(buffer);
66
+ #endif
56
67
  #else
57
68
  return nullptr;
58
69
  #endif
@@ -1,8 +1,17 @@
1
1
  #include "RNSkOpenGLCanvasProvider.h"
2
2
 
3
+ #include <android/native_window_jni.h>
4
+ #include <fbjni/fbjni.h>
5
+ #include <jni.h>
3
6
  #include <memory>
4
7
 
8
+ #include "RNSkLog.h"
9
+
10
+ #if defined(SK_GRAPHITE)
11
+ #include "DawnContext.h"
12
+ #else
5
13
  #include "OpenGLContext.h"
14
+ #endif
6
15
 
7
16
  #pragma clang diagnostic push
8
17
  #pragma clang diagnostic ignored "-Wdocumentation"
@@ -62,7 +71,6 @@ bool RNSkOpenGLCanvasProvider::renderToCanvas(
62
71
  return false;
63
72
  }
64
73
  }
65
-
66
74
  return false;
67
75
  }
68
76
 
@@ -89,8 +97,12 @@ void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject jSurfaceTexture,
89
97
  env->DeleteLocalRef(jSurface);
90
98
  env->DeleteLocalRef(surfaceClass);
91
99
  env->DeleteLocalRef(surfaceTextureClass);
100
+ #if defined(SK_GRAPHITE)
101
+ _surfaceHolder = DawnContext::getInstance().MakeWindow(window, width, height);
102
+ #else
92
103
  _surfaceHolder =
93
104
  OpenGLContext::getInstance().MakeWindow(window, width, height);
105
+ #endif
94
106
 
95
107
  // Post redraw request to ensure we paint in the next draw cycle.
96
108
  _requestRedraw();
@@ -0,0 +1,77 @@
1
+ #pragma once
2
+
3
+ #include "opengl/Error.h"
4
+ #include "opengl/Surface.h"
5
+
6
+ namespace RNSkia {
7
+
8
+ class Surface;
9
+ class Display;
10
+
11
+ class Context {
12
+ public:
13
+ ~Context() {
14
+ if (_context != EGL_NO_CONTEXT) {
15
+ if (eglDestroyContext(_display, _context) != EGL_TRUE) {
16
+ LOG_EGL_ERROR;
17
+ }
18
+ }
19
+ }
20
+
21
+ bool isValid() const { return _context != EGL_NO_CONTEXT; }
22
+
23
+ const EGLContext &getHandle() const { return _context; }
24
+
25
+ bool makeCurrent(const Surface &surface) const {
26
+ if (_context == EGL_NO_CONTEXT) {
27
+ return false;
28
+ }
29
+ const auto result =
30
+ eglMakeCurrentIfNecessary(_display, surface.getHandle(),
31
+ surface.getHandle(), _context) == EGL_TRUE;
32
+ if (!result) {
33
+ LOG_EGL_ERROR;
34
+ }
35
+ return result;
36
+ }
37
+
38
+ bool clearCurrent() const {
39
+ const auto result =
40
+ eglMakeCurrentIfNecessary(_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
41
+ EGL_NO_CONTEXT) == EGL_TRUE;
42
+ if (!result) {
43
+ LOG_EGL_ERROR;
44
+ }
45
+ return result;
46
+ }
47
+
48
+ bool isCurrent() const { return eglGetCurrentContext() == _context; }
49
+
50
+ private:
51
+ friend class Display;
52
+
53
+ EGLDisplay _display = EGL_NO_DISPLAY;
54
+ EGLContext _context = EGL_NO_CONTEXT;
55
+
56
+ static EGLBoolean eglMakeCurrentIfNecessary(EGLDisplay display,
57
+ EGLSurface draw, EGLSurface read,
58
+ EGLContext context) {
59
+ if (display != eglGetCurrentDisplay() ||
60
+ draw != eglGetCurrentSurface(EGL_DRAW) ||
61
+ read != eglGetCurrentSurface(EGL_READ) ||
62
+ context != eglGetCurrentContext()) {
63
+ return eglMakeCurrent(display, draw, read, context);
64
+ }
65
+
66
+ return EGL_TRUE;
67
+ }
68
+
69
+ Context(EGLDisplay display, EGLContext context)
70
+ : _display(display), _context(context) {}
71
+
72
+ Context(const Context &) = delete;
73
+
74
+ Context &operator=(const Context &) = delete;
75
+ };
76
+
77
+ } // namespace RNSkia