@shopify/react-native-skia 1.5.2 → 1.5.4
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.
- package/android/CMakeLists.txt +52 -13
- package/android/build.gradle +3 -0
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +18 -1
- package/android/cpp/rnskia-android/RNSkAndroidVideo.cpp +12 -1
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +13 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +0 -1
- package/cpp/api/JsiSkImage.h +15 -2
- package/cpp/api/JsiSkSurface.h +18 -3
- package/cpp/rnskia/DawnContext.h +241 -0
- package/cpp/rnskia/DawnUtils.h +127 -0
- package/cpp/rnskia/DawnWindowContext.cpp +19 -0
- package/cpp/rnskia/DawnWindowContext.h +77 -0
- package/cpp/rnskia/ImageProvider.h +100 -0
- package/cpp/rnskia/RNSkView.h +6 -0
- package/cpp/skia/include/android/SkAnimatedImage.h +14 -0
- package/cpp/skia/include/codec/SkAvifDecoder.h +39 -3
- package/cpp/skia/include/codec/SkCodec.h +16 -0
- package/cpp/skia/include/config/SkUserConfig.h +3 -2
- package/cpp/skia/include/core/SkCanvas.h +55 -10
- package/cpp/skia/include/core/SkContourMeasure.h +76 -0
- package/cpp/skia/include/core/SkFontScanner.h +48 -0
- package/cpp/skia/include/core/SkMilestone.h +1 -1
- package/cpp/skia/include/core/SkPath.h +11 -0
- package/cpp/skia/include/core/SkPathEffect.h +0 -23
- package/cpp/skia/include/core/SkRect.h +2 -0
- package/cpp/skia/include/core/SkString.h +4 -0
- package/cpp/skia/include/core/SkTypeface.h +5 -0
- package/cpp/skia/include/core/SkTypes.h +8 -3
- package/cpp/skia/include/docs/SkPDFDocument.h +3 -3
- package/cpp/skia/include/effects/SkOverdrawColorFilter.h +1 -0
- package/cpp/skia/include/effects/SkRuntimeEffect.h +2 -1
- package/cpp/skia/include/encode/SkJpegEncoder.h +4 -0
- package/cpp/skia/include/gpu/ganesh/GrContextOptions.h +8 -1
- package/cpp/skia/include/gpu/ganesh/GrDirectContext.h +18 -3
- package/cpp/skia/include/gpu/ganesh/GrTypes.h +11 -0
- package/cpp/skia/include/gpu/ganesh/gl/GrGLFunctions.h +5 -1
- package/cpp/skia/include/gpu/ganesh/gl/GrGLInterface.h +0 -1
- package/cpp/skia/include/gpu/graphite/GraphiteTypes.h +8 -0
- package/cpp/skia/include/gpu/graphite/Recorder.h +0 -2
- package/cpp/skia/include/gpu/graphite/precompile/PaintOptions.h +7 -4
- package/cpp/skia/include/gpu/graphite/precompile/PrecompileImageFilter.h +2 -0
- package/cpp/skia/include/gpu/graphite/precompile/PrecompileMaskFilter.h +2 -0
- package/cpp/skia/include/ports/SkFontMgr_android_ndk.h +25 -0
- package/cpp/skia/include/ports/SkFontMgr_fontconfig.h +4 -2
- package/cpp/skia/include/ports/SkFontScanner_Fontations.h +15 -0
- package/cpp/skia/include/ports/SkFontScanner_FreeType.h +15 -0
- package/cpp/skia/include/private/SkExif.h +14 -0
- package/cpp/skia/include/private/SkPathRef.h +36 -0
- package/cpp/skia/include/private/base/SkFeatures.h +4 -0
- package/cpp/skia/include/private/base/SkSpan_impl.h +1 -3
- package/cpp/skia/modules/skcms/src/skcms_internals.h +3 -0
- package/cpp/skia/src/base/SkMathPriv.h +1 -8
- package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.h +1 -2
- package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +25 -19
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +23 -0
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +23 -9
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +0 -20
- package/libs/android/arm64-v8a/libskia.a +0 -0
- package/libs/android/arm64-v8a/libskottie.a +0 -0
- package/libs/android/armeabi-v7a/libskia.a +0 -0
- package/libs/android/armeabi-v7a/libskottie.a +0 -0
- package/libs/android/x86/libskia.a +0 -0
- package/libs/android/x86/libskottie.a +0 -0
- package/libs/android/x86_64/libskia.a +0 -0
- package/libs/android/x86_64/libskottie.a +0 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
- package/libs/ios/libskshaper.xcframework/Info.plist +5 -5
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
- package/libs/ios/libskunicode_core.xcframework/Info.plist +5 -5
- package/libs/ios/libskunicode_core.xcframework/ios-arm64_arm64e/libskunicode_core.a +0 -0
- package/libs/ios/libskunicode_core.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode_core.a +0 -0
- package/libs/ios/libskunicode_libgrapheme.xcframework/Info.plist +5 -5
- package/libs/ios/libskunicode_libgrapheme.xcframework/ios-arm64_arm64e/libskunicode_libgrapheme.a +0 -0
- package/libs/ios/libskunicode_libgrapheme.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode_libgrapheme.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
- package/package.json +1 -1
- package/react-native-skia.podspec +35 -9
- package/src/renderer/__tests__/e2e/SVG.spec.tsx +2 -1
package/android/CMakeLists.txt
CHANGED
|
@@ -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
|
|
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/SkiaOpenGLSurfaceFactory.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
|
|
@@ -46,8 +75,6 @@ add_library(
|
|
|
46
75
|
|
|
47
76
|
"${PROJECT_SOURCE_DIR}/cpp/jni/JniPlatformContext.cpp"
|
|
48
77
|
"${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
78
|
"${PROJECT_SOURCE_DIR}/cpp/rnskia-android/AHardwareBufferUtils.cpp"
|
|
52
79
|
"${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkAndroidVideo.cpp"
|
|
53
80
|
|
|
@@ -66,9 +93,10 @@ add_library(
|
|
|
66
93
|
|
|
67
94
|
"${PROJECT_SOURCE_DIR}/../cpp/api/third_party/CSSColorParser.cpp"
|
|
68
95
|
"${PROJECT_SOURCE_DIR}/../cpp/api/third_party/base64.cpp"
|
|
69
|
-
|
|
96
|
+
${BACKEND_SOURCES}
|
|
70
97
|
)
|
|
71
98
|
|
|
99
|
+
|
|
72
100
|
target_include_directories(
|
|
73
101
|
${PACKAGE_NAME}
|
|
74
102
|
PRIVATE
|
|
@@ -88,6 +116,7 @@ target_include_directories(
|
|
|
88
116
|
# so "include/core/SkRef.h" instead of "SkRef.h", as otherwise
|
|
89
117
|
# the prefab cannot be shipped.
|
|
90
118
|
../cpp/skia
|
|
119
|
+
../cpp/dawn/include
|
|
91
120
|
|
|
92
121
|
../cpp/api
|
|
93
122
|
../cpp/jsi
|
|
@@ -102,9 +131,6 @@ target_include_directories(
|
|
|
102
131
|
${libfbjni_include_DIRS}
|
|
103
132
|
)
|
|
104
133
|
|
|
105
|
-
# Import prebuilt SKIA libraries
|
|
106
|
-
set (SKIA_LIBS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../libs/android/${ANDROID_ABI}")
|
|
107
|
-
|
|
108
134
|
add_library(skia STATIC IMPORTED)
|
|
109
135
|
set_property(TARGET skia PROPERTY IMPORTED_LOCATION "${SKIA_LIBS_PATH}/libskia.a")
|
|
110
136
|
|
|
@@ -240,8 +266,7 @@ add_definitions(-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION})
|
|
|
240
266
|
|
|
241
267
|
# Link
|
|
242
268
|
if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
|
243
|
-
|
|
244
|
-
${PACKAGE_NAME}
|
|
269
|
+
set(COMMON_LIBS
|
|
245
270
|
${LOG_LIB}
|
|
246
271
|
${REACT_LIB}
|
|
247
272
|
${FBJNI_LIBRARY}
|
|
@@ -258,8 +283,7 @@ if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
|
|
258
283
|
-landroid
|
|
259
284
|
)
|
|
260
285
|
else()
|
|
261
|
-
|
|
262
|
-
${PACKAGE_NAME}
|
|
286
|
+
set(COMMON_LIBS
|
|
263
287
|
${LOG_LIB}
|
|
264
288
|
${FBJNI_LIBRARY}
|
|
265
289
|
${REACT_LIB}
|
|
@@ -278,4 +302,19 @@ else()
|
|
|
278
302
|
-lEGL
|
|
279
303
|
-landroid
|
|
280
304
|
)
|
|
281
|
-
endif()
|
|
305
|
+
endif()
|
|
306
|
+
|
|
307
|
+
if(SK_GRAPHITE)
|
|
308
|
+
target_link_libraries(${PACKAGE_NAME}
|
|
309
|
+
${COMMON_LIBS}
|
|
310
|
+
${DAWN_NATIVE_LIB}
|
|
311
|
+
${DAWN_PLATFORM_LIB}
|
|
312
|
+
${DAWN_PROC_LIB}
|
|
313
|
+
)
|
|
314
|
+
else()
|
|
315
|
+
target_link_libraries(${PACKAGE_NAME}
|
|
316
|
+
${COMMON_LIBS}
|
|
317
|
+
-lGLESv2
|
|
318
|
+
-lEGL
|
|
319
|
+
)
|
|
320
|
+
endif()
|
package/android/build.gradle
CHANGED
|
@@ -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)
|
|
@@ -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"
|
|
@@ -89,8 +98,12 @@ void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject jSurfaceTexture,
|
|
|
89
98
|
env->DeleteLocalRef(jSurface);
|
|
90
99
|
env->DeleteLocalRef(surfaceClass);
|
|
91
100
|
env->DeleteLocalRef(surfaceTextureClass);
|
|
101
|
+
#if defined(SK_GRAPHITE)
|
|
102
|
+
_surfaceHolder = DawnContext::getInstance().MakeWindow(window, width, height);
|
|
103
|
+
#else
|
|
92
104
|
_surfaceHolder =
|
|
93
105
|
OpenGLContext::getInstance().MakeWindow(window, width, height);
|
|
106
|
+
#endif
|
|
94
107
|
|
|
95
108
|
// Post redraw request to ensure we paint in the next draw cycle.
|
|
96
109
|
_requestRedraw();
|
package/cpp/api/JsiSkImage.h
CHANGED
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
#include "RNSkTypedArray.h"
|
|
14
14
|
|
|
15
|
+
#if defined(SK_GRAPHITE)
|
|
16
|
+
#include "DawnContext.h"
|
|
17
|
+
#include "include/gpu/graphite/Context.h"
|
|
18
|
+
#endif
|
|
19
|
+
|
|
15
20
|
#pragma clang diagnostic push
|
|
16
21
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
17
22
|
|
|
@@ -83,9 +88,13 @@ public:
|
|
|
83
88
|
? arguments[1].asNumber()
|
|
84
89
|
: 100.0;
|
|
85
90
|
auto image = getObject();
|
|
91
|
+
#if defined(SK_GRAPHITE)
|
|
92
|
+
image = DawnContext::getInstance().MakeRasterImage(image);
|
|
93
|
+
#else
|
|
86
94
|
if (image->isTextureBacked()) {
|
|
87
95
|
image = image->makeNonTextureImage();
|
|
88
96
|
}
|
|
97
|
+
#endif
|
|
89
98
|
sk_sp<SkData> data;
|
|
90
99
|
|
|
91
100
|
if (format == SkEncodedImageFormat::kJPEG) {
|
|
@@ -181,9 +190,13 @@ public:
|
|
|
181
190
|
}
|
|
182
191
|
|
|
183
192
|
JSI_HOST_FUNCTION(makeNonTextureImage) {
|
|
184
|
-
|
|
193
|
+
#if defined(SK_GRAPHITE)
|
|
194
|
+
auto rasterImage = DawnContext::getInstance().MakeRasterImage(getObject());
|
|
195
|
+
#else
|
|
196
|
+
auto rasterImage = getObject()->makeNonTextureImage();
|
|
197
|
+
#endif
|
|
185
198
|
return jsi::Object::createFromHostObject(
|
|
186
|
-
runtime, std::make_shared<JsiSkImage>(getContext(),
|
|
199
|
+
runtime, std::make_shared<JsiSkImage>(getContext(), rasterImage));
|
|
187
200
|
}
|
|
188
201
|
|
|
189
202
|
EXPORT_JSI_API_TYPENAME(JsiSkImage, Image)
|
package/cpp/api/JsiSkSurface.h
CHANGED
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
#include "JsiSkCanvas.h"
|
|
11
11
|
#include "JsiSkImage.h"
|
|
12
12
|
|
|
13
|
+
#if defined(SK_GRAPHITE)
|
|
14
|
+
#include "DawnContext.h"
|
|
15
|
+
#endif
|
|
16
|
+
|
|
13
17
|
#pragma clang diagnostic push
|
|
14
18
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
15
19
|
|
|
@@ -44,21 +48,32 @@ public:
|
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
JSI_HOST_FUNCTION(flush) {
|
|
47
|
-
|
|
51
|
+
auto surface = getObject();
|
|
52
|
+
#if defined(SK_GRAPHITE)
|
|
53
|
+
auto recording = surface->recorder()->snap();
|
|
54
|
+
DawnContext::getInstance().submitRecording(recording.get());
|
|
55
|
+
#else
|
|
56
|
+
if (auto dContext = GrAsDirectContext(surface->recordingContext())) {
|
|
48
57
|
dContext->flushAndSubmit();
|
|
49
58
|
}
|
|
59
|
+
#endif
|
|
50
60
|
return jsi::Value::undefined();
|
|
51
61
|
}
|
|
52
62
|
|
|
53
63
|
JSI_HOST_FUNCTION(makeImageSnapshot) {
|
|
64
|
+
auto surface = getObject();
|
|
54
65
|
sk_sp<SkImage> image;
|
|
55
66
|
if (count == 1) {
|
|
56
67
|
auto rect = JsiSkRect::fromValue(runtime, arguments[0]);
|
|
57
|
-
image =
|
|
68
|
+
image = surface->makeImageSnapshot(SkIRect::MakeXYWH(
|
|
58
69
|
rect->x(), rect->y(), rect->width(), rect->height()));
|
|
59
70
|
} else {
|
|
60
|
-
image =
|
|
71
|
+
image = surface->makeImageSnapshot();
|
|
61
72
|
}
|
|
73
|
+
#if defined(SK_GRAPHITE)
|
|
74
|
+
auto recording = surface->recorder()->snap();
|
|
75
|
+
DawnContext::getInstance().submitRecording(recording.get());
|
|
76
|
+
#endif
|
|
62
77
|
return jsi::Object::createFromHostObject(
|
|
63
78
|
runtime, std::make_shared<JsiSkImage>(getContext(), std::move(image)));
|
|
64
79
|
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <mutex>
|
|
5
|
+
|
|
6
|
+
#include "DawnUtils.h"
|
|
7
|
+
#include "DawnWindowContext.h"
|
|
8
|
+
#include "ImageProvider.h"
|
|
9
|
+
|
|
10
|
+
#include "include/core/SkData.h"
|
|
11
|
+
#include "include/gpu/graphite/BackendTexture.h"
|
|
12
|
+
#include "include/gpu/graphite/Context.h"
|
|
13
|
+
#include "include/gpu/graphite/ContextOptions.h"
|
|
14
|
+
#include "include/gpu/graphite/GraphiteTypes.h"
|
|
15
|
+
#include "include/gpu/graphite/Recorder.h"
|
|
16
|
+
#include "include/gpu/graphite/Recording.h"
|
|
17
|
+
#include "include/gpu/graphite/Surface.h"
|
|
18
|
+
#include "include/gpu/graphite/dawn/DawnBackendContext.h"
|
|
19
|
+
#include "include/gpu/graphite/dawn/DawnTypes.h"
|
|
20
|
+
#include "include/gpu/graphite/dawn/DawnUtils.h"
|
|
21
|
+
|
|
22
|
+
#include "src/gpu/graphite/ContextOptionsPriv.h"
|
|
23
|
+
|
|
24
|
+
#ifdef __APPLE__
|
|
25
|
+
#include <CoreVideo/CVPixelBuffer.h>
|
|
26
|
+
#else
|
|
27
|
+
#include <android/hardware_buffer.h>
|
|
28
|
+
#include <android/hardware_buffer_jni.h>
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
namespace RNSkia {
|
|
32
|
+
|
|
33
|
+
struct AsyncContext {
|
|
34
|
+
bool fCalled = false;
|
|
35
|
+
std::unique_ptr<const SkSurface::AsyncReadResult> fResult;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
struct SharedTextureContext {
|
|
39
|
+
wgpu::SharedTextureMemory sharedTextureMemory;
|
|
40
|
+
wgpu::Texture texture;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
static void
|
|
44
|
+
async_callback(void *c,
|
|
45
|
+
std::unique_ptr<const SkImage::AsyncReadResult> result) {
|
|
46
|
+
auto context = static_cast<AsyncContext *>(c);
|
|
47
|
+
context->fResult = std::move(result);
|
|
48
|
+
context->fCalled = true;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
class DawnContext {
|
|
52
|
+
public:
|
|
53
|
+
// TODO: remove
|
|
54
|
+
friend class RNSkiOSPlatformContext;
|
|
55
|
+
|
|
56
|
+
DawnContext(const DawnContext &) = delete;
|
|
57
|
+
DawnContext &operator=(const DawnContext &) = delete;
|
|
58
|
+
|
|
59
|
+
static DawnContext &getInstance() {
|
|
60
|
+
static DawnContext instance;
|
|
61
|
+
return instance;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
sk_sp<SkImage> MakeRasterImage(sk_sp<SkImage> image) {
|
|
65
|
+
if (!image->isTextureBacked()) {
|
|
66
|
+
return image;
|
|
67
|
+
}
|
|
68
|
+
std::lock_guard<std::mutex> lock(_mutex);
|
|
69
|
+
AsyncContext asyncContext;
|
|
70
|
+
fGraphiteContext->asyncRescaleAndReadPixels(
|
|
71
|
+
image.get(), image->imageInfo(), image->imageInfo().bounds(),
|
|
72
|
+
SkImage::RescaleGamma::kSrc, SkImage::RescaleMode::kNearest,
|
|
73
|
+
async_callback, &asyncContext);
|
|
74
|
+
fGraphiteContext->submit();
|
|
75
|
+
while (!asyncContext.fCalled) {
|
|
76
|
+
tick();
|
|
77
|
+
fGraphiteContext->checkAsyncWorkCompletion();
|
|
78
|
+
}
|
|
79
|
+
auto bytesPerRow = asyncContext.fResult->rowBytes(0);
|
|
80
|
+
auto bufferSize = bytesPerRow * image->imageInfo().height();
|
|
81
|
+
auto data = SkData::MakeWithProc(
|
|
82
|
+
asyncContext.fResult->data(0), bufferSize,
|
|
83
|
+
[](const void *ptr, void *context) {
|
|
84
|
+
auto *result =
|
|
85
|
+
reinterpret_cast<const SkSurface::AsyncReadResult *>(context);
|
|
86
|
+
delete result;
|
|
87
|
+
},
|
|
88
|
+
reinterpret_cast<void *>(const_cast<SkSurface::AsyncReadResult *>(
|
|
89
|
+
asyncContext.fResult.release())));
|
|
90
|
+
auto rasterImage =
|
|
91
|
+
SkImages::RasterFromData(image->imageInfo(), data, bytesPerRow);
|
|
92
|
+
return rasterImage;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
void submitRecording(
|
|
96
|
+
skgpu::graphite::Recording *recording,
|
|
97
|
+
skgpu::graphite::SyncToCpu syncToCpu = skgpu::graphite::SyncToCpu::kNo) {
|
|
98
|
+
std::lock_guard<std::mutex> lock(_mutex);
|
|
99
|
+
skgpu::graphite::InsertRecordingInfo info;
|
|
100
|
+
info.fRecording = recording;
|
|
101
|
+
fGraphiteContext->insertRecording(info);
|
|
102
|
+
fGraphiteContext->submit(syncToCpu);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
sk_sp<SkImage> MakeImageFromBuffer(void *buffer) {
|
|
106
|
+
#ifdef __APPLE__
|
|
107
|
+
wgpu::SharedTextureMemoryIOSurfaceDescriptor platformDesc;
|
|
108
|
+
auto ioSurface = CVPixelBufferGetIOSurface((CVPixelBufferRef)buffer);
|
|
109
|
+
platformDesc.ioSurface = ioSurface;
|
|
110
|
+
int width = static_cast<int>(IOSurfaceGetWidth(ioSurface));
|
|
111
|
+
int height = static_cast<int>(IOSurfaceGetHeight(ioSurface));
|
|
112
|
+
#else
|
|
113
|
+
wgpu::SharedTextureMemoryAHardwareBufferDescriptor platformDesc;
|
|
114
|
+
auto ahb = (AHardwareBuffer *)buffer;
|
|
115
|
+
platformDesc.handle = ahb;
|
|
116
|
+
platformDesc.useExternalFormat = true;
|
|
117
|
+
AHardwareBuffer_Desc adesc;
|
|
118
|
+
AHardwareBuffer_describe(ahb, &adesc);
|
|
119
|
+
int width = adesc.width;
|
|
120
|
+
int height = adesc.height;
|
|
121
|
+
#endif
|
|
122
|
+
|
|
123
|
+
wgpu::SharedTextureMemoryDescriptor desc = {};
|
|
124
|
+
desc.nextInChain = &platformDesc;
|
|
125
|
+
wgpu::SharedTextureMemory memory =
|
|
126
|
+
backendContext.fDevice.ImportSharedTextureMemory(&desc);
|
|
127
|
+
|
|
128
|
+
wgpu::TextureDescriptor textureDesc;
|
|
129
|
+
textureDesc.format = DawnUtils::PreferredTextureFormat;
|
|
130
|
+
textureDesc.dimension = wgpu::TextureDimension::e2D;
|
|
131
|
+
textureDesc.usage =
|
|
132
|
+
wgpu::TextureUsage::TextureBinding | wgpu::TextureUsage::CopySrc;
|
|
133
|
+
textureDesc.size = {static_cast<uint32_t>(width),
|
|
134
|
+
static_cast<uint32_t>(height), 1};
|
|
135
|
+
|
|
136
|
+
wgpu::Texture texture = memory.CreateTexture(&textureDesc);
|
|
137
|
+
|
|
138
|
+
wgpu::SharedTextureMemoryBeginAccessDescriptor beginAccessDesc;
|
|
139
|
+
beginAccessDesc.initialized = true;
|
|
140
|
+
beginAccessDesc.fenceCount = 0;
|
|
141
|
+
bool success = memory.BeginAccess(texture, &beginAccessDesc);
|
|
142
|
+
|
|
143
|
+
if (success) {
|
|
144
|
+
skgpu::graphite::BackendTexture betFromView =
|
|
145
|
+
skgpu::graphite::BackendTextures::MakeDawn(texture.Get());
|
|
146
|
+
auto result = SkImages::WrapTexture(
|
|
147
|
+
getRecorder(), betFromView, DawnUtils::PreferedColorType,
|
|
148
|
+
kPremul_SkAlphaType, nullptr,
|
|
149
|
+
[](void *context) {
|
|
150
|
+
auto ctx = static_cast<SharedTextureContext *>(context);
|
|
151
|
+
wgpu::SharedTextureMemoryEndAccessState endState = {};
|
|
152
|
+
ctx->sharedTextureMemory.EndAccess(ctx->texture, &endState);
|
|
153
|
+
delete ctx;
|
|
154
|
+
},
|
|
155
|
+
new SharedTextureContext{memory, texture});
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
if (!success) {
|
|
159
|
+
return nullptr;
|
|
160
|
+
}
|
|
161
|
+
return nullptr;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Create offscreen surface
|
|
165
|
+
sk_sp<SkSurface> MakeOffscreen(int width, int height) {
|
|
166
|
+
SkImageInfo info = SkImageInfo::Make(
|
|
167
|
+
width, height, DawnUtils::PreferedColorType, kPremul_SkAlphaType);
|
|
168
|
+
sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(getRecorder(), info);
|
|
169
|
+
|
|
170
|
+
if (!surface) {
|
|
171
|
+
throw std::runtime_error("Failed to create offscreen Skia surface.");
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return surface;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Create onscreen surface with window
|
|
178
|
+
std::unique_ptr<WindowContext> MakeWindow(void *window, int width,
|
|
179
|
+
int height) {
|
|
180
|
+
// 1. Create Surface
|
|
181
|
+
wgpu::SurfaceDescriptor surfaceDescriptor;
|
|
182
|
+
#ifdef __APPLE__
|
|
183
|
+
wgpu::SurfaceDescriptorFromMetalLayer metalSurfaceDesc;
|
|
184
|
+
metalSurfaceDesc.layer = window;
|
|
185
|
+
surfaceDescriptor.nextInChain = &metalSurfaceDesc;
|
|
186
|
+
#else
|
|
187
|
+
wgpu::SurfaceDescriptorFromAndroidNativeWindow androidSurfaceDesc;
|
|
188
|
+
androidSurfaceDesc.window = window;
|
|
189
|
+
surfaceDescriptor.nextInChain = &androidSurfaceDesc;
|
|
190
|
+
#endif
|
|
191
|
+
auto surface =
|
|
192
|
+
wgpu::Instance(instance->Get()).CreateSurface(&surfaceDescriptor);
|
|
193
|
+
return std::make_unique<DawnWindowContext>(
|
|
194
|
+
getRecorder(), backendContext.fDevice, surface, width, height);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
private:
|
|
198
|
+
std::unique_ptr<dawn::native::Instance> instance;
|
|
199
|
+
std::unique_ptr<skgpu::graphite::Context> fGraphiteContext;
|
|
200
|
+
skgpu::graphite::DawnBackendContext backendContext;
|
|
201
|
+
std::mutex _mutex;
|
|
202
|
+
|
|
203
|
+
DawnContext() {
|
|
204
|
+
DawnProcTable backendProcs = dawn::native::GetProcs();
|
|
205
|
+
dawnProcSetProcs(&backendProcs);
|
|
206
|
+
WGPUInstanceDescriptor desc{};
|
|
207
|
+
desc.features.timedWaitAnyEnable = true;
|
|
208
|
+
instance = std::make_unique<dawn::native::Instance>(&desc);
|
|
209
|
+
|
|
210
|
+
backendContext = DawnUtils::createDawnBackendContext(instance.get());
|
|
211
|
+
|
|
212
|
+
skgpu::graphite::ContextOptions ctxOptions;
|
|
213
|
+
skgpu::graphite::ContextOptionsPriv contextOptionsPriv;
|
|
214
|
+
ctxOptions.fOptionsPriv = &contextOptionsPriv;
|
|
215
|
+
ctxOptions.fOptionsPriv->fStoreContextRefInRecorder = true;
|
|
216
|
+
fGraphiteContext =
|
|
217
|
+
skgpu::graphite::ContextFactory::MakeDawn(backendContext, ctxOptions);
|
|
218
|
+
|
|
219
|
+
if (!fGraphiteContext) {
|
|
220
|
+
throw std::runtime_error("Failed to create graphite context");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
void tick() { backendContext.fTick(backendContext.fInstance); }
|
|
225
|
+
|
|
226
|
+
skgpu::graphite::Recorder *getRecorder() {
|
|
227
|
+
static thread_local skgpu::graphite::RecorderOptions recorderOptions;
|
|
228
|
+
if (!recorderOptions.fImageProvider) {
|
|
229
|
+
auto imageProvider = ImageProvider::Make();
|
|
230
|
+
recorderOptions.fImageProvider = imageProvider;
|
|
231
|
+
}
|
|
232
|
+
static thread_local auto recorder =
|
|
233
|
+
fGraphiteContext->makeRecorder(recorderOptions);
|
|
234
|
+
if (!recorder) {
|
|
235
|
+
throw std::runtime_error("Failed to create graphite context");
|
|
236
|
+
}
|
|
237
|
+
return recorder.get();
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
} // namespace RNSkia
|