@shopify/react-native-skia 0.1.197 → 0.1.199

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. package/android/CMakeLists.txt +32 -31
  2. package/android/cpp/rnskia-android/SkiaOpenGLRenderer.cpp +4 -2
  3. package/android/cpp/rnskia-android/SkiaOpenGLRenderer.h +3 -0
  4. package/cpp/api/JsiSkShaderFactory.h +4 -4
  5. package/cpp/api/JsiSkSurfaceFactory.h +2 -1
  6. package/cpp/rnskia/dom/nodes/JsiShaderNodes.h +2 -2
  7. package/cpp/skia/include/android/SkCanvasAndroid.h +20 -0
  8. package/cpp/skia/include/android/SkHeifDecoder.h +43 -0
  9. package/cpp/skia/include/android/SkSurfaceAndroid.h +50 -0
  10. package/cpp/skia/include/codec/SkAvifDecoder.h +43 -0
  11. package/cpp/skia/include/codec/SkBmpDecoder.h +43 -0
  12. package/cpp/skia/include/codec/SkCodec.h +25 -1
  13. package/cpp/skia/include/codec/SkGifDecoder.h +43 -0
  14. package/cpp/skia/include/codec/SkIcoDecoder.h +43 -0
  15. package/cpp/skia/include/codec/SkJpegDecoder.h +43 -0
  16. package/cpp/skia/include/codec/SkJpegxlDecoder.h +43 -0
  17. package/cpp/skia/include/codec/SkPngDecoder.h +43 -0
  18. package/cpp/skia/include/codec/SkRawDecoder.h +49 -0
  19. package/cpp/skia/include/codec/SkWbmpDecoder.h +43 -0
  20. package/cpp/skia/include/codec/SkWebpDecoder.h +43 -0
  21. package/cpp/skia/include/core/SkBBHFactory.h +5 -1
  22. package/cpp/skia/include/core/SkBlender.h +0 -2
  23. package/cpp/skia/include/core/SkCanvas.h +4 -23
  24. package/cpp/skia/include/core/SkColorFilter.h +14 -1
  25. package/cpp/skia/include/core/SkColorTable.h +59 -0
  26. package/cpp/skia/include/core/SkContourMeasure.h +3 -0
  27. package/cpp/skia/include/core/SkDeferredDisplayList.h +8 -104
  28. package/cpp/skia/include/core/SkDeferredDisplayListRecorder.h +8 -91
  29. package/cpp/skia/include/core/SkDrawable.h +5 -2
  30. package/cpp/skia/include/core/SkGraphics.h +7 -19
  31. package/cpp/skia/include/core/SkImage.h +157 -249
  32. package/cpp/skia/include/core/SkImageGenerator.h +0 -31
  33. package/cpp/skia/include/core/SkMilestone.h +1 -1
  34. package/cpp/skia/include/core/SkPathMeasure.h +3 -3
  35. package/cpp/skia/include/core/SkPictureRecorder.h +1 -1
  36. package/cpp/skia/include/core/SkPoint.h +5 -563
  37. package/cpp/skia/include/core/SkPoint3.h +1 -0
  38. package/cpp/skia/include/core/SkPromiseImageTexture.h +4 -30
  39. package/cpp/skia/include/core/SkRect.h +8 -8
  40. package/cpp/skia/include/core/SkSamplingOptions.h +4 -2
  41. package/cpp/skia/include/core/SkScalar.h +1 -1
  42. package/cpp/skia/include/core/SkSerialProcs.h +5 -1
  43. package/cpp/skia/include/core/SkShader.h +14 -21
  44. package/cpp/skia/include/core/SkString.h +2 -0
  45. package/cpp/skia/include/core/SkSurface.h +169 -701
  46. package/cpp/skia/include/core/SkSurfaceCharacterization.h +8 -256
  47. package/cpp/skia/include/core/SkTiledImageUtils.h +97 -0
  48. package/cpp/skia/include/core/SkTypes.h +4 -2
  49. package/cpp/skia/include/core/SkYUVAPixmaps.h +0 -5
  50. package/cpp/skia/include/effects/SkGradientShader.h +10 -1
  51. package/cpp/skia/include/effects/SkImageFilters.h +62 -37
  52. package/cpp/skia/include/effects/SkPerlinNoiseShader.h +28 -29
  53. package/cpp/skia/include/effects/SkRuntimeEffect.h +17 -12
  54. package/cpp/skia/include/gpu/GrBackendSurface.h +12 -39
  55. package/cpp/skia/include/gpu/GrBackendSurfaceMutableState.h +6 -0
  56. package/cpp/skia/include/gpu/GrContextThreadSafeProxy.h +3 -3
  57. package/cpp/skia/include/gpu/GrDirectContext.h +103 -3
  58. package/cpp/skia/include/gpu/GrRecordingContext.h +10 -19
  59. package/cpp/skia/include/gpu/MutableTextureState.h +4 -0
  60. package/cpp/skia/include/gpu/ganesh/GrExternalTextureGenerator.h +54 -0
  61. package/cpp/skia/include/gpu/ganesh/SkImageGanesh.h +20 -76
  62. package/cpp/skia/include/gpu/ganesh/SkSurfaceGanesh.h +217 -0
  63. package/cpp/skia/include/gpu/ganesh/mtl/SkSurfaceMetal.h +73 -0
  64. package/cpp/skia/include/gpu/gl/GrGLTypes.h +13 -2
  65. package/cpp/skia/include/gpu/graphite/BackendSemaphore.h +78 -0
  66. package/cpp/skia/include/gpu/graphite/BackendTexture.h +1 -0
  67. package/cpp/skia/include/gpu/graphite/Image.h +277 -0
  68. package/cpp/skia/include/gpu/graphite/ImageProvider.h +1 -1
  69. package/cpp/skia/include/gpu/graphite/Recording.h +1 -4
  70. package/cpp/skia/include/gpu/graphite/Surface.h +81 -0
  71. package/cpp/skia/include/gpu/graphite/TextureInfo.h +5 -7
  72. package/cpp/skia/include/gpu/graphite/YUVABackendTextures.h +2 -2
  73. package/cpp/skia/include/gpu/mock/GrMockTypes.h +23 -8
  74. package/cpp/skia/include/ports/SkTypeface_fontations.h +21 -0
  75. package/cpp/skia/include/private/SkGainmapInfo.h +2 -0
  76. package/cpp/skia/include/private/SkGainmapShader.h +1 -0
  77. package/cpp/skia/include/private/SkJpegMetadataDecoder.h +19 -1
  78. package/cpp/skia/include/private/SkPathRef.h +13 -15
  79. package/cpp/skia/include/private/SkXmp.h +53 -0
  80. package/cpp/skia/include/private/base/SkFeatures.h +0 -4
  81. package/cpp/skia/include/private/base/SkFloatingPoint.h +11 -5
  82. package/cpp/skia/include/private/base/SkPoint_impl.h +569 -0
  83. package/cpp/skia/include/private/base/SkSpan_impl.h +3 -7
  84. package/cpp/skia/include/private/base/SkTArray.h +11 -11
  85. package/cpp/skia/include/private/chromium/GrDeferredDisplayList.h +120 -0
  86. package/cpp/skia/include/private/chromium/GrDeferredDisplayListRecorder.h +98 -0
  87. package/cpp/skia/include/private/chromium/GrPromiseImageTexture.h +43 -0
  88. package/cpp/skia/include/private/chromium/GrSurfaceCharacterization.h +215 -0
  89. package/cpp/skia/include/private/chromium/GrVkSecondaryCBDrawContext.h +6 -6
  90. package/cpp/skia/include/private/chromium/SkImageChromium.h +104 -0
  91. package/cpp/skia/include/private/chromium/Slug.h +7 -3
  92. package/cpp/skia/include/private/gpu/ganesh/GrContext_Base.h +7 -3
  93. package/cpp/skia/include/private/gpu/ganesh/GrGLTypesPriv.h +2 -0
  94. package/cpp/skia/include/private/gpu/ganesh/GrImageContext.h +3 -2
  95. package/cpp/skia/include/private/gpu/ganesh/GrMtlTypesPriv.h +10 -2
  96. package/cpp/skia/include/{gpu → private/gpu}/ganesh/GrTextureGenerator.h +2 -13
  97. package/cpp/skia/include/private/gpu/ganesh/GrTypesPriv.h +1 -1
  98. package/cpp/skia/include/private/gpu/graphite/DawnTypesPriv.h +7 -0
  99. package/cpp/skia/include/private/gpu/graphite/MtlGraphiteTypesPriv.h +19 -6
  100. package/cpp/skia/include/private/gpu/graphite/VulkanGraphiteTypesPriv.h +13 -0
  101. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan.h +0 -1
  102. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_android.h +14 -1
  103. package/cpp/skia/include/third_party/vulkan/vulkan/vulkan_core.h +999 -79
  104. package/cpp/skia/modules/skcms/src/Transform_inl.h +36 -236
  105. package/cpp/skia/modules/skparagraph/include/Paragraph.h +2 -0
  106. package/cpp/skia/modules/skparagraph/include/ParagraphBuilder.h +16 -0
  107. package/cpp/skia/modules/skparagraph/include/TextStyle.h +6 -2
  108. package/cpp/skia/modules/skresources/include/SkResources.h +1 -1
  109. package/cpp/skia/modules/svg/include/SkSVGCircle.h +1 -1
  110. package/cpp/skia/modules/svg/include/SkSVGClipPath.h +1 -1
  111. package/cpp/skia/modules/svg/include/SkSVGContainer.h +1 -1
  112. package/cpp/skia/modules/svg/include/SkSVGDOM.h +1 -1
  113. package/cpp/skia/modules/svg/include/SkSVGDefs.h +1 -1
  114. package/cpp/skia/modules/svg/include/SkSVGEllipse.h +1 -1
  115. package/cpp/skia/modules/svg/include/SkSVGFe.h +1 -1
  116. package/cpp/skia/modules/svg/include/SkSVGFeBlend.h +1 -1
  117. package/cpp/skia/modules/svg/include/SkSVGFeColorMatrix.h +1 -1
  118. package/cpp/skia/modules/svg/include/SkSVGFeComposite.h +1 -1
  119. package/cpp/skia/modules/svg/include/SkSVGFeDisplacementMap.h +1 -1
  120. package/cpp/skia/modules/svg/include/SkSVGFeFlood.h +1 -1
  121. package/cpp/skia/modules/svg/include/SkSVGFeGaussianBlur.h +1 -1
  122. package/cpp/skia/modules/svg/include/SkSVGFeImage.h +1 -1
  123. package/cpp/skia/modules/svg/include/SkSVGFeLightSource.h +1 -1
  124. package/cpp/skia/modules/svg/include/SkSVGFeLighting.h +1 -1
  125. package/cpp/skia/modules/svg/include/SkSVGFeOffset.h +1 -1
  126. package/cpp/skia/modules/svg/include/SkSVGFeTurbulence.h +1 -1
  127. package/cpp/skia/modules/svg/include/SkSVGFilter.h +1 -1
  128. package/cpp/skia/modules/svg/include/SkSVGG.h +1 -1
  129. package/cpp/skia/modules/svg/include/SkSVGGradient.h +1 -1
  130. package/cpp/skia/modules/svg/include/SkSVGHiddenContainer.h +1 -1
  131. package/cpp/skia/modules/svg/include/SkSVGImage.h +1 -1
  132. package/cpp/skia/modules/svg/include/SkSVGLine.h +1 -1
  133. package/cpp/skia/modules/svg/include/SkSVGLinearGradient.h +1 -1
  134. package/cpp/skia/modules/svg/include/SkSVGMask.h +1 -1
  135. package/cpp/skia/modules/svg/include/SkSVGNode.h +1 -1
  136. package/cpp/skia/modules/svg/include/SkSVGPath.h +1 -1
  137. package/cpp/skia/modules/svg/include/SkSVGPattern.h +1 -1
  138. package/cpp/skia/modules/svg/include/SkSVGPoly.h +1 -1
  139. package/cpp/skia/modules/svg/include/SkSVGRadialGradient.h +1 -1
  140. package/cpp/skia/modules/svg/include/SkSVGRect.h +1 -1
  141. package/cpp/skia/modules/svg/include/SkSVGRenderContext.h +3 -3
  142. package/cpp/skia/modules/svg/include/SkSVGSVG.h +1 -1
  143. package/cpp/skia/modules/svg/include/SkSVGShape.h +1 -1
  144. package/cpp/skia/modules/svg/include/SkSVGStop.h +1 -1
  145. package/cpp/skia/modules/svg/include/SkSVGText.h +1 -1
  146. package/cpp/skia/modules/svg/include/SkSVGTransformableNode.h +1 -1
  147. package/cpp/skia/modules/svg/include/SkSVGTypes.h +21 -21
  148. package/cpp/skia/modules/svg/include/SkSVGUse.h +1 -1
  149. package/cpp/skia/modules/svg/include/SkSVGValue.h +2 -2
  150. package/cpp/skia/{include/private → src/core}/SkChecksum.h +32 -17
  151. package/cpp/skia/src/core/SkTHash.h +1 -1
  152. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +3 -1
  153. package/ios/RNSkia-iOS/SkiaMetalRenderer.mm +3 -1
  154. package/libs/android/arm64-v8a/libskia.a +0 -0
  155. package/libs/android/arm64-v8a/libskottie.a +0 -0
  156. package/libs/android/arm64-v8a/libsksg.a +0 -0
  157. package/libs/android/arm64-v8a/libsvg.a +0 -0
  158. package/libs/android/armeabi-v7a/libskia.a +0 -0
  159. package/libs/android/armeabi-v7a/libskottie.a +0 -0
  160. package/libs/android/armeabi-v7a/libsksg.a +0 -0
  161. package/libs/android/armeabi-v7a/libsvg.a +0 -0
  162. package/libs/android/x86/libskia.a +0 -0
  163. package/libs/android/x86/libskottie.a +0 -0
  164. package/libs/android/x86/libsksg.a +0 -0
  165. package/libs/android/x86/libsvg.a +0 -0
  166. package/libs/android/x86_64/libskia.a +0 -0
  167. package/libs/android/x86_64/libskottie.a +0 -0
  168. package/libs/android/x86_64/libsksg.a +0 -0
  169. package/libs/android/x86_64/libsvg.a +0 -0
  170. package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
  171. package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
  172. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
  173. package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
  174. package/libs/ios/libsksg.xcframework/Info.plist +5 -5
  175. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
  176. package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
  177. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
  178. package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
  179. package/libs/ios/libsvg.xcframework/Info.plist +5 -5
  180. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
  181. package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
  182. package/package.json +3 -4
  183. package/cpp/skia/include/effects/SkTableColorFilter.h +0 -29
  184. package/cpp/skia/include/private/SkOpts_spi.h +0 -23
  185. package/cpp/skia/include/private/SkSpinlock.h +0 -57
  186. package/cpp/skia/include/private/chromium/GrSlug.h +0 -16
  187. package/scripts/install-npm.js +0 -33
@@ -45,10 +45,9 @@ public:
45
45
  TArray() : fOwnMemory(true), fCapacity{0} {}
46
46
 
47
47
  /**
48
- * Creates an empty array that will preallocate space for reserveCount
49
- * elements.
48
+ * Creates an empty array that will preallocate space for reserveCount elements.
50
49
  */
51
- explicit TArray(int reserveCount) : TArray() { this->reserve_back(reserveCount); }
50
+ explicit TArray(int reserveCount) : TArray() { this->reserve_exact(reserveCount); }
52
51
 
53
52
  /**
54
53
  * Copies one array to another. The new array will be heap allocated.
@@ -149,7 +148,9 @@ public:
149
148
  }
150
149
 
151
150
  /**
152
- * Ensures there is enough reserved space for n elements.
151
+ * Ensures there is enough reserved space for at least n elements. This is guaranteed at least
152
+ * until the array size grows above n and subsequently shrinks below n, any version of reset()
153
+ * is called, or reserve() is called again.
153
154
  */
154
155
  void reserve(int n) {
155
156
  SkASSERT(n >= 0);
@@ -159,14 +160,13 @@ public:
159
160
  }
160
161
 
161
162
  /**
162
- * Ensures there is enough reserved space for n additional elements. The is guaranteed at least
163
- * until the array size grows above n and subsequently shrinks below n, any version of reset()
164
- * is called, or reserve_back() is called again.
163
+ * Ensures there is enough reserved space for exactly n elements. The same capacity guarantees
164
+ * as above apply.
165
165
  */
166
- void reserve_back(int n) {
166
+ void reserve_exact(int n) {
167
167
  SkASSERT(n >= 0);
168
- if (n > 0) {
169
- this->checkRealloc(n, kExactFit);
168
+ if (n > this->size()) {
169
+ this->checkRealloc(n - this->size(), kExactFit);
170
170
  }
171
171
  }
172
172
 
@@ -652,7 +652,7 @@ public:
652
652
  : STArray{data.begin(), SkToInt(data.size())} {}
653
653
 
654
654
  explicit STArray(int reserveCount)
655
- : STArray() { this->reserve_back(reserveCount); }
655
+ : STArray() { this->reserve_exact(reserveCount); }
656
656
 
657
657
  STArray(const STArray& that)
658
658
  : STArray() { *this = that; }
@@ -0,0 +1,120 @@
1
+ /*
2
+ * Copyright 2023 Google LLC
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #ifndef GrDeferredDisplayList_DEFINED
9
+ #define GrDeferredDisplayList_DEFINED
10
+
11
+ #include "include/core/SkRefCnt.h"
12
+ #include "include/core/SkTypes.h"
13
+ #include "include/gpu/GrRecordingContext.h"
14
+ #include "include/private/base/SkTArray.h"
15
+ #include "include/private/chromium/GrSurfaceCharacterization.h"
16
+
17
+ class GrDirectContext;
18
+ class GrRenderTargetProxy;
19
+ class GrRenderTask;
20
+ class GrDeferredDisplayListPriv;
21
+ class SkSurface;
22
+
23
+ /*
24
+ * This class contains pre-processed gpu operations that can be replayed into
25
+ * an SkSurface via SkSurface::draw(GrDeferredDisplayList*).
26
+ */
27
+ class GrDeferredDisplayList : public SkNVRefCnt<GrDeferredDisplayList> {
28
+ public:
29
+ SK_API ~GrDeferredDisplayList();
30
+
31
+ SK_API const GrSurfaceCharacterization& characterization() const {
32
+ return fCharacterization;
33
+ }
34
+ /**
35
+ * Iterate through the programs required by the DDL.
36
+ */
37
+ class SK_API ProgramIterator {
38
+ public:
39
+ ProgramIterator(GrDirectContext*, GrDeferredDisplayList*);
40
+ ~ProgramIterator();
41
+
42
+ // This returns true if any work was done. Getting a cache hit does not count as work.
43
+ bool compile();
44
+ bool done() const;
45
+ void next();
46
+
47
+ private:
48
+ GrDirectContext* fDContext;
49
+ const skia_private::TArray<GrRecordingContext::ProgramData>& fProgramData;
50
+ int fIndex;
51
+ };
52
+
53
+ // Provides access to functions that aren't part of the public API.
54
+ GrDeferredDisplayListPriv priv();
55
+ const GrDeferredDisplayListPriv priv() const; // NOLINT(readability-const-return-type)
56
+
57
+ private:
58
+ friend class GrDrawingManager; // for access to 'fRenderTasks', 'fLazyProxyData', 'fArenas'
59
+ friend class GrDeferredDisplayListRecorder; // for access to 'fLazyProxyData'
60
+ friend class GrDeferredDisplayListPriv;
61
+
62
+ // This object is the source from which the lazy proxy backing the DDL will pull its backing
63
+ // texture when the DDL is replayed. It has to be separately ref counted bc the lazy proxy
64
+ // can outlive the DDL.
65
+ class LazyProxyData : public SkRefCnt {
66
+ public:
67
+ // Upon being replayed - this field will be filled in (by the DrawingManager) with the
68
+ // proxy backing the destination SkSurface. Note that, since there is no good place to
69
+ // clear it, it can become a dangling pointer. Additionally, since the renderTargetProxy
70
+ // doesn't get a ref here, the SkSurface that owns it must remain alive until the DDL
71
+ // is flushed.
72
+ // TODO: the drawing manager could ref the renderTargetProxy for the DDL and then add
73
+ // a renderingTask to unref it after the DDL's ops have been executed.
74
+ GrRenderTargetProxy* fReplayDest = nullptr;
75
+ };
76
+
77
+ SK_API GrDeferredDisplayList(const GrSurfaceCharacterization& characterization,
78
+ sk_sp<GrRenderTargetProxy> fTargetProxy,
79
+ sk_sp<LazyProxyData>);
80
+
81
+ const skia_private::TArray<GrRecordingContext::ProgramData>& programData() const {
82
+ return fProgramData;
83
+ }
84
+
85
+ const GrSurfaceCharacterization fCharacterization;
86
+
87
+ // These are ordered such that the destructor cleans op tasks up first (which may refer back
88
+ // to the arena and memory pool in their destructors).
89
+ GrRecordingContext::OwnedArenas fArenas;
90
+ skia_private::TArray<sk_sp<GrRenderTask>> fRenderTasks;
91
+
92
+ skia_private::TArray<GrRecordingContext::ProgramData> fProgramData;
93
+ sk_sp<GrRenderTargetProxy> fTargetProxy;
94
+ sk_sp<LazyProxyData> fLazyProxyData;
95
+ };
96
+
97
+ namespace skgpu::ganesh {
98
+ /** Draws the deferred display list created via a GrDeferredDisplayListRecorder.
99
+ If the deferred display list is not compatible with the surface, the draw is skipped
100
+ and false is return.
101
+
102
+ The xOffset and yOffset parameters are experimental and, if not both zero, will cause
103
+ the draw to be ignored.
104
+ When implemented, if xOffset or yOffset are non-zero, the DDL will be drawn offset by that
105
+ amount into the surface.
106
+
107
+ @param SkSurface The surface to apply the commands to, cannot be nullptr.
108
+ @param ddl drawing commands, cannot be nullptr.
109
+ @return false if ddl is not compatible
110
+
111
+ example: https://fiddle.skia.org/c/@Surface_draw_2
112
+ */
113
+ SK_API bool DrawDDL(SkSurface*,
114
+ sk_sp<const GrDeferredDisplayList> ddl);
115
+
116
+ SK_API bool DrawDDL(sk_sp<SkSurface>,
117
+ sk_sp<const GrDeferredDisplayList> ddl);
118
+ }
119
+
120
+ #endif
@@ -0,0 +1,98 @@
1
+ /*
2
+ * Copyright 2023 Google LLC
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #ifndef GrDeferredDisplayListRecorder_DEFINED
9
+ #define GrDeferredDisplayListRecorder_DEFINED
10
+
11
+ #include "include/core/SkRefCnt.h"
12
+ #include "include/core/SkTypes.h"
13
+ #include "include/gpu/GrTypes.h"
14
+ #include "include/private/chromium/GrDeferredDisplayList.h"
15
+ #include "include/private/chromium/GrSurfaceCharacterization.h"
16
+
17
+ class GrBackendFormat;
18
+ class GrRecordingContext;
19
+ class GrRenderTargetProxy;
20
+ class GrYUVABackendTextureInfo;
21
+ class SkCanvas;
22
+ class SkColorSpace;
23
+ class SkImage;
24
+ class GrPromiseImageTexture;
25
+ class SkSurface;
26
+ enum SkAlphaType : int;
27
+ enum SkColorType : int;
28
+
29
+ /*
30
+ * This class is intended to be used as:
31
+ * Get a GrSurfaceCharacterization representing the intended gpu-backed destination SkSurface
32
+ * Create one of these (a GrDeferredDisplayListRecorder) on the stack
33
+ * Get the canvas and render into it
34
+ * Snap off and hold on to a GrDeferredDisplayList
35
+ * Once your app actually needs the pixels, call skgpu::ganesh::DrawDDL(GrDeferredDisplayList*)
36
+ *
37
+ * This class never accesses the GPU but performs all the cpu work it can. It
38
+ * is thread-safe (i.e., one can break a scene into tiles and perform their cpu-side
39
+ * work in parallel ahead of time).
40
+ */
41
+ class SK_API GrDeferredDisplayListRecorder {
42
+ public:
43
+ GrDeferredDisplayListRecorder(const GrSurfaceCharacterization&);
44
+ ~GrDeferredDisplayListRecorder();
45
+
46
+ const GrSurfaceCharacterization& characterization() const {
47
+ return fCharacterization;
48
+ }
49
+
50
+ // The backing canvas will become invalid (and this entry point will return
51
+ // null) once 'detach' is called.
52
+ // Note: ownership of the SkCanvas is not transferred via this call.
53
+ SkCanvas* getCanvas();
54
+
55
+ sk_sp<GrDeferredDisplayList> detach();
56
+
57
+ using PromiseImageTextureContext = void*;
58
+ using PromiseImageTextureFulfillProc =
59
+ sk_sp<GrPromiseImageTexture> (*)(PromiseImageTextureContext);
60
+ using PromiseImageTextureReleaseProc = void (*)(PromiseImageTextureContext);
61
+
62
+ #ifndef SK_MAKE_PROMISE_TEXTURE_DISABLE_LEGACY_API
63
+ /** Deprecated: Use SkImages::PromiseTextureFrom instead. */
64
+ sk_sp<SkImage> makePromiseTexture(const GrBackendFormat& backendFormat,
65
+ int width,
66
+ int height,
67
+ GrMipmapped mipmapped,
68
+ GrSurfaceOrigin origin,
69
+ SkColorType colorType,
70
+ SkAlphaType alphaType,
71
+ sk_sp<SkColorSpace> colorSpace,
72
+ PromiseImageTextureFulfillProc textureFulfillProc,
73
+ PromiseImageTextureReleaseProc textureReleaseProc,
74
+ PromiseImageTextureContext textureContext);
75
+
76
+ /** Deprecated: Use SkImages::PromiseTextureFromYUVA instead. */
77
+ sk_sp<SkImage> makeYUVAPromiseTexture(const GrYUVABackendTextureInfo& yuvaBackendTextureInfo,
78
+ sk_sp<SkColorSpace> imageColorSpace,
79
+ PromiseImageTextureFulfillProc textureFulfillProc,
80
+ PromiseImageTextureReleaseProc textureReleaseProc,
81
+ PromiseImageTextureContext textureContexts[]);
82
+ #endif // SK_MAKE_PROMISE_TEXTURE_DISABLE_LEGACY_API
83
+
84
+
85
+ private:
86
+ GrDeferredDisplayListRecorder(const GrDeferredDisplayListRecorder&) = delete;
87
+ GrDeferredDisplayListRecorder& operator=(const GrDeferredDisplayListRecorder&) = delete;
88
+
89
+ bool init();
90
+
91
+ const GrSurfaceCharacterization fCharacterization;
92
+ sk_sp<GrRecordingContext> fContext;
93
+ sk_sp<GrRenderTargetProxy> fTargetProxy;
94
+ sk_sp<GrDeferredDisplayList::LazyProxyData> fLazyProxyData;
95
+ sk_sp<SkSurface> fSurface;
96
+ };
97
+
98
+ #endif
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Copyright 2023 Google LLC
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #ifndef GrPromiseImageTexture_DEFINED
9
+ #define GrPromiseImageTexture_DEFINED
10
+
11
+ #include "include/core/SkRefCnt.h"
12
+ #include "include/core/SkTypes.h"
13
+ #include "include/gpu/GrBackendSurface.h"
14
+ /**
15
+ * This type is used to fulfill textures for PromiseImages. Once an instance is returned from a
16
+ * PromiseImageTextureFulfillProc the GrBackendTexture it wraps must remain valid until the
17
+ * corresponding PromiseImageTextureReleaseProc is called.
18
+ */
19
+ class SK_API GrPromiseImageTexture : public SkNVRefCnt<GrPromiseImageTexture> {
20
+ public:
21
+ GrPromiseImageTexture() = delete;
22
+ GrPromiseImageTexture(const GrPromiseImageTexture&) = delete;
23
+ GrPromiseImageTexture(GrPromiseImageTexture&&) = delete;
24
+ ~GrPromiseImageTexture();
25
+ GrPromiseImageTexture& operator=(const GrPromiseImageTexture&) = delete;
26
+ GrPromiseImageTexture& operator=(GrPromiseImageTexture&&) = delete;
27
+
28
+ static sk_sp<GrPromiseImageTexture> Make(const GrBackendTexture& backendTexture) {
29
+ if (!backendTexture.isValid()) {
30
+ return nullptr;
31
+ }
32
+ return sk_sp<GrPromiseImageTexture>(new GrPromiseImageTexture(backendTexture));
33
+ }
34
+
35
+ GrBackendTexture backendTexture() const { return fBackendTexture; }
36
+
37
+ private:
38
+ explicit GrPromiseImageTexture(const GrBackendTexture& backendTexture);
39
+
40
+ GrBackendTexture fBackendTexture;
41
+ };
42
+
43
+ #endif // GrPromiseImageTexture_DEFINED
@@ -0,0 +1,215 @@
1
+ /*
2
+ * Copyright 2023 Google LLC
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #ifndef GrSurfaceCharacterization_DEFINED
9
+ #define GrSurfaceCharacterization_DEFINED
10
+
11
+ #include "include/core/SkColorSpace.h" // IWYU pragma: keep
12
+ #include "include/core/SkColorType.h"
13
+ #include "include/core/SkImageInfo.h"
14
+ #include "include/core/SkRefCnt.h"
15
+ #include "include/core/SkSize.h"
16
+ #include "include/core/SkSurfaceProps.h"
17
+ #include "include/core/SkTypes.h"
18
+ #include "include/gpu/GpuTypes.h"
19
+ #include "include/gpu/GrBackendSurface.h"
20
+ #include "include/gpu/GrContextThreadSafeProxy.h"
21
+ #include "include/gpu/GrTypes.h"
22
+ #include "include/private/base/SkDebug.h"
23
+
24
+ #include <cstddef>
25
+ #include <utility>
26
+
27
+ /** \class GrSurfaceCharacterization
28
+ A surface characterization contains all the information Ganesh requires to makes its internal
29
+ rendering decisions. When passed into a GrDeferredDisplayListRecorder it will copy the
30
+ data and pass it on to the GrDeferredDisplayList if/when it is created. Note that both of
31
+ those objects (the Recorder and the DisplayList) will take a ref on the
32
+ GrContextThreadSafeProxy and SkColorSpace objects.
33
+ */
34
+ class SK_API GrSurfaceCharacterization {
35
+ public:
36
+ enum class Textureable : bool { kNo = false, kYes = true };
37
+ enum class MipMapped : bool { kNo = false, kYes = true };
38
+ enum class UsesGLFBO0 : bool { kNo = false, kYes = true };
39
+ // This flag indicates that the backing VkImage for this Vulkan surface will have the
40
+ // VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set. This bit allows skia to handle advanced blends
41
+ // more optimally in a shader by being able to directly read the dst values.
42
+ enum class VkRTSupportsInputAttachment : bool { kNo = false, kYes = true };
43
+ // This flag indicates if the surface is wrapping a raw Vulkan secondary command buffer.
44
+ enum class VulkanSecondaryCBCompatible : bool { kNo = false, kYes = true };
45
+
46
+ GrSurfaceCharacterization()
47
+ : fCacheMaxResourceBytes(0)
48
+ , fOrigin(kBottomLeft_GrSurfaceOrigin)
49
+ , fSampleCnt(0)
50
+ , fIsTextureable(Textureable::kYes)
51
+ , fIsMipMapped(MipMapped::kYes)
52
+ , fUsesGLFBO0(UsesGLFBO0::kNo)
53
+ , fVulkanSecondaryCBCompatible(VulkanSecondaryCBCompatible::kNo)
54
+ , fIsProtected(GrProtected::kNo)
55
+ , fSurfaceProps(0, kUnknown_SkPixelGeometry) {
56
+ }
57
+
58
+ GrSurfaceCharacterization(GrSurfaceCharacterization&&) = default;
59
+ GrSurfaceCharacterization& operator=(GrSurfaceCharacterization&&) = default;
60
+
61
+ GrSurfaceCharacterization(const GrSurfaceCharacterization&) = default;
62
+ GrSurfaceCharacterization& operator=(const GrSurfaceCharacterization& other) = default;
63
+ bool operator==(const GrSurfaceCharacterization& other) const;
64
+ bool operator!=(const GrSurfaceCharacterization& other) const {
65
+ return !(*this == other);
66
+ }
67
+
68
+ /*
69
+ * Return a new surface characterization with the only difference being a different width
70
+ * and height
71
+ */
72
+ GrSurfaceCharacterization createResized(int width, int height) const;
73
+
74
+ /*
75
+ * Return a new surface characterization with only a replaced color space
76
+ */
77
+ GrSurfaceCharacterization createColorSpace(sk_sp<SkColorSpace>) const;
78
+
79
+ /*
80
+ * Return a new surface characterization with the backend format replaced. A colorType
81
+ * must also be supplied to indicate the interpretation of the new format.
82
+ */
83
+ GrSurfaceCharacterization createBackendFormat(SkColorType colorType,
84
+ const GrBackendFormat& backendFormat) const;
85
+
86
+ /*
87
+ * Return a new surface characterization with just a different use of FBO0 (in GL)
88
+ */
89
+ GrSurfaceCharacterization createFBO0(bool usesGLFBO0) const;
90
+
91
+ GrContextThreadSafeProxy* contextInfo() const { return fContextInfo.get(); }
92
+ sk_sp<GrContextThreadSafeProxy> refContextInfo() const { return fContextInfo; }
93
+ size_t cacheMaxResourceBytes() const { return fCacheMaxResourceBytes; }
94
+
95
+ bool isValid() const { return kUnknown_SkColorType != fImageInfo.colorType(); }
96
+
97
+ const SkImageInfo& imageInfo() const { return fImageInfo; }
98
+ const GrBackendFormat& backendFormat() const { return fBackendFormat; }
99
+ GrSurfaceOrigin origin() const { return fOrigin; }
100
+ SkISize dimensions() const { return fImageInfo.dimensions(); }
101
+ int width() const { return fImageInfo.width(); }
102
+ int height() const { return fImageInfo.height(); }
103
+ SkColorType colorType() const { return fImageInfo.colorType(); }
104
+ int sampleCount() const { return fSampleCnt; }
105
+ bool isTextureable() const { return Textureable::kYes == fIsTextureable; }
106
+ bool isMipMapped() const { return MipMapped::kYes == fIsMipMapped; }
107
+ bool usesGLFBO0() const { return UsesGLFBO0::kYes == fUsesGLFBO0; }
108
+ bool vkRTSupportsInputAttachment() const {
109
+ return VkRTSupportsInputAttachment::kYes == fVkRTSupportsInputAttachment;
110
+ }
111
+ bool vulkanSecondaryCBCompatible() const {
112
+ return VulkanSecondaryCBCompatible::kYes == fVulkanSecondaryCBCompatible;
113
+ }
114
+ GrProtected isProtected() const { return fIsProtected; }
115
+ SkColorSpace* colorSpace() const { return fImageInfo.colorSpace(); }
116
+ sk_sp<SkColorSpace> refColorSpace() const { return fImageInfo.refColorSpace(); }
117
+ const SkSurfaceProps& surfaceProps()const { return fSurfaceProps; }
118
+
119
+ // Is the provided backend texture compatible with this surface characterization?
120
+ bool isCompatible(const GrBackendTexture&) const;
121
+
122
+ private:
123
+ friend class SkSurface_Ganesh; // for 'set' & 'config'
124
+ friend class GrVkSecondaryCBDrawContext; // for 'set' & 'config'
125
+ friend class GrContextThreadSafeProxy; // for private ctor
126
+ friend class GrDeferredDisplayListRecorder; // for 'config'
127
+ friend class SkSurface; // for 'config'
128
+
129
+ SkDEBUGCODE(void validate() const;)
130
+
131
+ GrSurfaceCharacterization(sk_sp<GrContextThreadSafeProxy> contextInfo,
132
+ size_t cacheMaxResourceBytes,
133
+ const SkImageInfo& ii,
134
+ const GrBackendFormat& backendFormat,
135
+ GrSurfaceOrigin origin,
136
+ int sampleCnt,
137
+ Textureable isTextureable,
138
+ MipMapped isMipMapped,
139
+ UsesGLFBO0 usesGLFBO0,
140
+ VkRTSupportsInputAttachment vkRTSupportsInputAttachment,
141
+ VulkanSecondaryCBCompatible vulkanSecondaryCBCompatible,
142
+ GrProtected isProtected,
143
+ const SkSurfaceProps& surfaceProps)
144
+ : fContextInfo(std::move(contextInfo))
145
+ , fCacheMaxResourceBytes(cacheMaxResourceBytes)
146
+ , fImageInfo(ii)
147
+ , fBackendFormat(backendFormat)
148
+ , fOrigin(origin)
149
+ , fSampleCnt(sampleCnt)
150
+ , fIsTextureable(isTextureable)
151
+ , fIsMipMapped(isMipMapped)
152
+ , fUsesGLFBO0(usesGLFBO0)
153
+ , fVkRTSupportsInputAttachment(vkRTSupportsInputAttachment)
154
+ , fVulkanSecondaryCBCompatible(vulkanSecondaryCBCompatible)
155
+ , fIsProtected(isProtected)
156
+ , fSurfaceProps(surfaceProps) {
157
+ if (fSurfaceProps.flags() & SkSurfaceProps::kDynamicMSAA_Flag) {
158
+ // Dynamic MSAA is not currently supported with DDL.
159
+ *this = {};
160
+ }
161
+ SkDEBUGCODE(this->validate());
162
+ }
163
+
164
+ void set(sk_sp<GrContextThreadSafeProxy> contextInfo,
165
+ size_t cacheMaxResourceBytes,
166
+ const SkImageInfo& ii,
167
+ const GrBackendFormat& backendFormat,
168
+ GrSurfaceOrigin origin,
169
+ int sampleCnt,
170
+ Textureable isTextureable,
171
+ MipMapped isMipMapped,
172
+ UsesGLFBO0 usesGLFBO0,
173
+ VkRTSupportsInputAttachment vkRTSupportsInputAttachment,
174
+ VulkanSecondaryCBCompatible vulkanSecondaryCBCompatible,
175
+ GrProtected isProtected,
176
+ const SkSurfaceProps& surfaceProps) {
177
+ if (surfaceProps.flags() & SkSurfaceProps::kDynamicMSAA_Flag) {
178
+ // Dynamic MSAA is not currently supported with DDL.
179
+ *this = {};
180
+ } else {
181
+ fContextInfo = contextInfo;
182
+ fCacheMaxResourceBytes = cacheMaxResourceBytes;
183
+
184
+ fImageInfo = ii;
185
+ fBackendFormat = backendFormat;
186
+ fOrigin = origin;
187
+ fSampleCnt = sampleCnt;
188
+ fIsTextureable = isTextureable;
189
+ fIsMipMapped = isMipMapped;
190
+ fUsesGLFBO0 = usesGLFBO0;
191
+ fVkRTSupportsInputAttachment = vkRTSupportsInputAttachment;
192
+ fVulkanSecondaryCBCompatible = vulkanSecondaryCBCompatible;
193
+ fIsProtected = isProtected;
194
+ fSurfaceProps = surfaceProps;
195
+ }
196
+ SkDEBUGCODE(this->validate());
197
+ }
198
+
199
+ sk_sp<GrContextThreadSafeProxy> fContextInfo;
200
+ size_t fCacheMaxResourceBytes;
201
+
202
+ SkImageInfo fImageInfo;
203
+ GrBackendFormat fBackendFormat;
204
+ GrSurfaceOrigin fOrigin;
205
+ int fSampleCnt;
206
+ Textureable fIsTextureable;
207
+ MipMapped fIsMipMapped;
208
+ UsesGLFBO0 fUsesGLFBO0;
209
+ VkRTSupportsInputAttachment fVkRTSupportsInputAttachment;
210
+ VulkanSecondaryCBCompatible fVulkanSecondaryCBCompatible;
211
+ GrProtected fIsProtected;
212
+ SkSurfaceProps fSurfaceProps;
213
+ };
214
+
215
+ #endif
@@ -15,15 +15,15 @@
15
15
  #include <memory>
16
16
 
17
17
  class GrBackendSemaphore;
18
+ class GrDeferredDisplayList;
18
19
  class GrRecordingContext;
20
+ class GrSurfaceCharacterization;
19
21
  struct GrVkDrawableInfo;
20
22
  namespace skgpu::ganesh {
21
23
  class Device;
22
24
  }
23
25
  class SkCanvas;
24
- class SkDeferredDisplayList;
25
26
  struct SkImageInfo;
26
- class SkSurfaceCharacterization;
27
27
  class SkSurfaceProps;
28
28
 
29
29
  /**
@@ -107,15 +107,15 @@ public:
107
107
  const SkSurfaceProps& props() const { return fProps; }
108
108
 
109
109
  // TODO: Fill out these calls to support DDL
110
- bool characterize(SkSurfaceCharacterization* characterization) const;
110
+ bool characterize(GrSurfaceCharacterization* characterization) const;
111
111
 
112
112
  #ifndef SK_DDL_IS_UNIQUE_POINTER
113
- bool draw(sk_sp<const SkDeferredDisplayList> deferredDisplayList);
113
+ bool draw(sk_sp<const GrDeferredDisplayList> deferredDisplayList);
114
114
  #else
115
- bool draw(const SkDeferredDisplayList* deferredDisplayList);
115
+ bool draw(const GrDeferredDisplayList* deferredDisplayList);
116
116
  #endif
117
117
 
118
- bool isCompatible(const SkSurfaceCharacterization& characterization) const;
118
+ bool isCompatible(const GrSurfaceCharacterization& characterization) const;
119
119
 
120
120
  private:
121
121
  explicit GrVkSecondaryCBDrawContext(sk_sp<skgpu::ganesh::Device>, const SkSurfaceProps*);
@@ -0,0 +1,104 @@
1
+ /*
2
+ * Copyright 2023 Google LLC
3
+ *
4
+ * Use of this source code is governed by a BSD-style license that can be
5
+ * found in the LICENSE file.
6
+ */
7
+
8
+ #ifndef SkImageChromium_DEFINED
9
+ #define SkImageChromium_DEFINED
10
+
11
+ #include "include/core/SkRefCnt.h"
12
+ #include "include/gpu/GrTypes.h"
13
+ #include "include/private/base/SkAPI.h"
14
+
15
+ class GrBackendFormat;
16
+ class GrContextThreadSafeProxy;
17
+ class GrPromiseImageTexture;
18
+ class GrYUVABackendTextureInfo;
19
+ class SkColorSpace;
20
+ class SkImage;
21
+ enum SkAlphaType : int;
22
+ enum SkColorType : int;
23
+ struct SkISize;
24
+
25
+ /**
26
+ * These functions expose features that are only for external use in Chromium.
27
+ */
28
+
29
+ namespace SkImages {
30
+
31
+ using PromiseImageTextureContext = void*;
32
+ using PromiseImageTextureFulfillProc = sk_sp<GrPromiseImageTexture> (*)(PromiseImageTextureContext);
33
+ using PromiseImageTextureReleaseProc = void (*)(PromiseImageTextureContext);
34
+
35
+ /** Create a new GPU-backed SkImage that is very similar to an SkImage created by BorrowTextureFrom.
36
+ The difference is that the caller need not have created the texture nor populated it with the
37
+ image pixel data. Moreover, the SkImage may be created on a thread as the creation of the
38
+ image does not require access to the backend API or GrDirectContext. Instead of passing a
39
+ GrBackendTexture the client supplies a description of the texture consisting of
40
+ GrBackendFormat, width, height, and GrMipmapped state. The resulting SkImage can be drawn
41
+ to a GrDeferredDisplayListRecorder or directly to a GPU-backed SkSurface.
42
+ When the actual texture is required to perform a backend API draw, textureFulfillProc will
43
+ be called to receive a GrBackendTexture. The properties of the GrBackendTexture must match
44
+ those set during the SkImage creation, and it must refer to a valid existing texture in the
45
+ backend API context/device, and be populated with the image pixel data. The texture cannot
46
+ be deleted until textureReleaseProc is called.
47
+ There is at most one call to each of textureFulfillProc and textureReleaseProc.
48
+ textureReleaseProc is always called even if image creation fails or if the
49
+ image is never fulfilled (e.g. it is never drawn or all draws are clipped out)
50
+ @param gpuContextProxy the thread-safe proxy of the gpu context. required.
51
+ @param backendFormat format of promised gpu texture
52
+ @param dimensions width & height of promised gpu texture
53
+ @param mipmapped mip mapped state of promised gpu texture
54
+ @param origin surface origin of promised gpu texture
55
+ @param colorType color type of promised gpu texture
56
+ @param alphaType alpha type of promised gpu texture
57
+ @param colorSpace range of colors; may be nullptr
58
+ @param textureFulfillProc function called to get actual gpu texture
59
+ @param textureReleaseProc function called when texture can be deleted
60
+ @param textureContext state passed to textureFulfillProc and textureReleaseProc
61
+ @return created SkImage, or nullptr
62
+ */
63
+ SK_API sk_sp<SkImage> PromiseTextureFrom(sk_sp<GrContextThreadSafeProxy> gpuContextProxy,
64
+ const GrBackendFormat& backendFormat,
65
+ SkISize dimensions,
66
+ GrMipmapped mipmapped,
67
+ GrSurfaceOrigin origin,
68
+ SkColorType colorType,
69
+ SkAlphaType alphaType,
70
+ sk_sp<SkColorSpace> colorSpace,
71
+ PromiseImageTextureFulfillProc textureFulfillProc,
72
+ PromiseImageTextureReleaseProc textureReleaseProc,
73
+ PromiseImageTextureContext textureContext);
74
+
75
+ /** This is similar to 'PromiseTextureFrom' but it creates a GPU-backed SkImage from YUV[A] data.
76
+ The source data may be planar (i.e. spread across multiple textures). In
77
+ the extreme Y, U, V, and A are all in different planes and thus the image is specified by
78
+ four textures. 'backendTextureInfo' describes the planar arrangement, texture formats,
79
+ conversion to RGB, and origin of the textures. Separate 'textureFulfillProc' and
80
+ 'textureReleaseProc' calls are made for each texture. Each texture has its own
81
+ PromiseImageTextureContext. If 'backendTextureInfo' is not valid then no release proc
82
+ calls are made. Otherwise, the calls will be made even on failure. 'textureContexts' has one
83
+ entry for each of the up to four textures, as indicated by 'backendTextureInfo'.
84
+ Currently the mip mapped property of 'backendTextureInfo' is ignored. However, in the
85
+ near future it will be required that if it is kYes then textureFulfillProc must return
86
+ a mip mapped texture for each plane in order to successfully draw the image.
87
+ @param gpuContextProxy the thread-safe proxy of the gpu context. required.
88
+ @param backendTextureInfo info about the promised yuva gpu texture
89
+ @param imageColorSpace range of colors; may be nullptr
90
+ @param textureFulfillProc function called to get actual gpu texture
91
+ @param textureReleaseProc function called when texture can be deleted
92
+ @param textureContexts state passed to textureFulfillProc and textureReleaseProc
93
+ @return created SkImage, or nullptr
94
+ */
95
+ SK_API sk_sp<SkImage> PromiseTextureFromYUVA(sk_sp<GrContextThreadSafeProxy> gpuContextProxy,
96
+ const GrYUVABackendTextureInfo& backendTextureInfo,
97
+ sk_sp<SkColorSpace> imageColorSpace,
98
+ PromiseImageTextureFulfillProc textureFulfillProc,
99
+ PromiseImageTextureReleaseProc textureReleaseProc,
100
+ PromiseImageTextureContext textureContexts[]);
101
+
102
+ } // namespace SkImages
103
+
104
+ #endif