@next2d/webgpu 3.0.0

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 (349) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +574 -0
  3. package/package.json +30 -0
  4. package/src/AtlasManager.d.ts +23 -0
  5. package/src/AtlasManager.js +123 -0
  6. package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.d.ts +13 -0
  7. package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.js +24 -0
  8. package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.d.ts +15 -0
  9. package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.js +31 -0
  10. package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.d.ts +5 -0
  11. package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.js +42 -0
  12. package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.d.ts +16 -0
  13. package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.js +28 -0
  14. package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.d.ts +17 -0
  15. package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.js +33 -0
  16. package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.d.ts +16 -0
  17. package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.js +28 -0
  18. package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.d.ts +17 -0
  19. package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.js +27 -0
  20. package/src/AttachmentManager/service/AttachmentManagerGetTextureService.d.ts +18 -0
  21. package/src/AttachmentManager/service/AttachmentManagerGetTextureService.js +27 -0
  22. package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.d.ts +12 -0
  23. package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.js +17 -0
  24. package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.d.ts +26 -0
  25. package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.js +43 -0
  26. package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.d.ts +18 -0
  27. package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.js +33 -0
  28. package/src/AttachmentManager.d.ts +19 -0
  29. package/src/AttachmentManager.js +105 -0
  30. package/src/BezierConverter/BezierConverter.d.ts +16 -0
  31. package/src/BezierConverter/BezierConverter.js +15 -0
  32. package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.d.ts +15 -0
  33. package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.js +37 -0
  34. package/src/BezierConverter/service/BezierConverterSplitCubicService.d.ts +15 -0
  35. package/src/BezierConverter/service/BezierConverterSplitCubicService.js +47 -0
  36. package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.d.ts +29 -0
  37. package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.js +80 -0
  38. package/src/Blend/BlendInstancedManager.d.ts +35 -0
  39. package/src/Blend/BlendInstancedManager.js +147 -0
  40. package/src/Blend/service/BlendAddService.d.ts +1 -0
  41. package/src/Blend/service/BlendAddService.js +8 -0
  42. package/src/Blend/service/BlendAlphaService.d.ts +1 -0
  43. package/src/Blend/service/BlendAlphaService.js +8 -0
  44. package/src/Blend/service/BlendEraseService.d.ts +1 -0
  45. package/src/Blend/service/BlendEraseService.js +8 -0
  46. package/src/Blend/service/BlendGetStateService.d.ts +12 -0
  47. package/src/Blend/service/BlendGetStateService.js +13 -0
  48. package/src/Blend/service/BlendOneZeroService.d.ts +1 -0
  49. package/src/Blend/service/BlendOneZeroService.js +8 -0
  50. package/src/Blend/service/BlendResetService.d.ts +1 -0
  51. package/src/Blend/service/BlendResetService.js +8 -0
  52. package/src/Blend/service/BlendScreenService.d.ts +1 -0
  53. package/src/Blend/service/BlendScreenService.js +8 -0
  54. package/src/Blend/service/BlendSetModeService.d.ts +2 -0
  55. package/src/Blend/service/BlendSetModeService.js +4 -0
  56. package/src/Blend/usecase/BlendApplyComplexBlendUseCase.d.ts +6 -0
  57. package/src/Blend/usecase/BlendApplyComplexBlendUseCase.js +79 -0
  58. package/src/Blend/usecase/BlendOperationUseCase.d.ts +11 -0
  59. package/src/Blend/usecase/BlendOperationUseCase.js +31 -0
  60. package/src/Blend.d.ts +8 -0
  61. package/src/Blend.js +91 -0
  62. package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.d.ts +15 -0
  63. package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.js +37 -0
  64. package/src/BufferManager/service/BufferManagerCreateRectVerticesService.d.ts +13 -0
  65. package/src/BufferManager/service/BufferManagerCreateRectVerticesService.js +23 -0
  66. package/src/BufferManager/service/BufferManagerCreateStorageBufferService.d.ts +17 -0
  67. package/src/BufferManager/service/BufferManagerCreateStorageBufferService.js +23 -0
  68. package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.d.ts +12 -0
  69. package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.js +32 -0
  70. package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.d.ts +12 -0
  71. package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.js +32 -0
  72. package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.d.ts +12 -0
  73. package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.js +20 -0
  74. package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.d.ts +10 -0
  75. package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.js +18 -0
  76. package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.d.ts +15 -0
  77. package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.js +51 -0
  78. package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.d.ts +13 -0
  79. package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.js +26 -0
  80. package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.d.ts +14 -0
  81. package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.js +46 -0
  82. package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.d.ts +12 -0
  83. package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.js +20 -0
  84. package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.d.ts +9 -0
  85. package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.js +15 -0
  86. package/src/BufferManager.d.ts +93 -0
  87. package/src/BufferManager.js +487 -0
  88. package/src/Compute/ComputePipelineManager.d.ts +61 -0
  89. package/src/Compute/ComputePipelineManager.js +313 -0
  90. package/src/Compute/service/ComputeExecuteBlurService.d.ts +21 -0
  91. package/src/Compute/service/ComputeExecuteBlurService.js +81 -0
  92. package/src/Context/service/ContextComputeBitmapMatrixService.d.ts +1 -0
  93. package/src/Context/service/ContextComputeBitmapMatrixService.js +74 -0
  94. package/src/Context/service/ContextComputeGradientMatrixService.d.ts +4 -0
  95. package/src/Context/service/ContextComputeGradientMatrixService.js +88 -0
  96. package/src/Context/service/ContextFillSimpleService.d.ts +2 -0
  97. package/src/Context/service/ContextFillSimpleService.js +28 -0
  98. package/src/Context/service/ContextFillWithStencilMainService.d.ts +2 -0
  99. package/src/Context/service/ContextFillWithStencilMainService.js +19 -0
  100. package/src/Context/service/ContextFillWithStencilService.d.ts +2 -0
  101. package/src/Context/service/ContextFillWithStencilService.js +19 -0
  102. package/src/Context/usecase/ContextApplyFilterUseCase.d.ts +5 -0
  103. package/src/Context/usecase/ContextApplyFilterUseCase.js +668 -0
  104. package/src/Context/usecase/ContextBitmapFillUseCase.d.ts +4 -0
  105. package/src/Context/usecase/ContextBitmapFillUseCase.js +210 -0
  106. package/src/Context/usecase/ContextBitmapStrokeUseCase.d.ts +4 -0
  107. package/src/Context/usecase/ContextBitmapStrokeUseCase.js +119 -0
  108. package/src/Context/usecase/ContextClipUseCase.d.ts +5 -0
  109. package/src/Context/usecase/ContextClipUseCase.js +101 -0
  110. package/src/Context/usecase/ContextContainerEndLayerUseCase.d.ts +5 -0
  111. package/src/Context/usecase/ContextContainerEndLayerUseCase.js +476 -0
  112. package/src/Context/usecase/ContextDrawArraysInstancedUseCase.d.ts +6 -0
  113. package/src/Context/usecase/ContextDrawArraysInstancedUseCase.js +135 -0
  114. package/src/Context/usecase/ContextDrawIndirectUseCase.d.ts +6 -0
  115. package/src/Context/usecase/ContextDrawIndirectUseCase.js +154 -0
  116. package/src/Context/usecase/ContextGradientFillUseCase.d.ts +4 -0
  117. package/src/Context/usecase/ContextGradientFillUseCase.js +230 -0
  118. package/src/Context/usecase/ContextGradientStrokeUseCase.d.ts +4 -0
  119. package/src/Context/usecase/ContextGradientStrokeUseCase.js +138 -0
  120. package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.d.ts +6 -0
  121. package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.js +213 -0
  122. package/src/Context.d.ts +430 -0
  123. package/src/Context.js +2453 -0
  124. package/src/FillTexturePool.d.ts +6 -0
  125. package/src/FillTexturePool.js +72 -0
  126. package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.d.ts +10 -0
  127. package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.js +214 -0
  128. package/src/Filter/BevelFilterShader.d.ts +2 -0
  129. package/src/Filter/BevelFilterShader.js +107 -0
  130. package/src/Filter/BitmapFilterShader.d.ts +2 -0
  131. package/src/Filter/BitmapFilterShader.js +207 -0
  132. package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.d.ts +16 -0
  133. package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.js +243 -0
  134. package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.d.ts +40 -0
  135. package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.js +51 -0
  136. package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.d.ts +25 -0
  137. package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.js +180 -0
  138. package/src/Filter/BlurFilterShader.d.ts +5 -0
  139. package/src/Filter/BlurFilterShader.js +109 -0
  140. package/src/Filter/BlurFilterUseCase.d.ts +36 -0
  141. package/src/Filter/BlurFilterUseCase.js +85 -0
  142. package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.d.ts +12 -0
  143. package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.js +90 -0
  144. package/src/Filter/ColorMatrixFilterShader.d.ts +4 -0
  145. package/src/Filter/ColorMatrixFilterShader.js +51 -0
  146. package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.d.ts +6 -0
  147. package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.js +144 -0
  148. package/src/Filter/ConvolutionFilterShader.d.ts +2 -0
  149. package/src/Filter/ConvolutionFilterShader.js +115 -0
  150. package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.d.ts +6 -0
  151. package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.js +172 -0
  152. package/src/Filter/DisplacementMapFilterShader.d.ts +2 -0
  153. package/src/Filter/DisplacementMapFilterShader.js +114 -0
  154. package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.d.ts +24 -0
  155. package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.js +179 -0
  156. package/src/Filter/DropShadowFilterShader.d.ts +4 -0
  157. package/src/Filter/DropShadowFilterShader.js +93 -0
  158. package/src/Filter/FilterGradientLUTCache.d.ts +29 -0
  159. package/src/Filter/FilterGradientLUTCache.js +84 -0
  160. package/src/Filter/FilterOffset.d.ts +8 -0
  161. package/src/Filter/FilterOffset.js +10 -0
  162. package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.d.ts +24 -0
  163. package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.js +143 -0
  164. package/src/Filter/GlowFilterShader.d.ts +4 -0
  165. package/src/Filter/GlowFilterShader.js +66 -0
  166. package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.d.ts +29 -0
  167. package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.js +216 -0
  168. package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.d.ts +29 -0
  169. package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.js +164 -0
  170. package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.d.ts +4 -0
  171. package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.js +23 -0
  172. package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.d.ts +4 -0
  173. package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.js +28 -0
  174. package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.d.ts +11 -0
  175. package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.js +19 -0
  176. package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.d.ts +23 -0
  177. package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.js +125 -0
  178. package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.d.ts +14 -0
  179. package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.js +23 -0
  180. package/src/FrameBufferManager.d.ts +24 -0
  181. package/src/FrameBufferManager.js +161 -0
  182. package/src/Gradient/GradientLUTCache.d.ts +61 -0
  183. package/src/Gradient/GradientLUTCache.js +153 -0
  184. package/src/Gradient/GradientLUTGenerator.d.ts +30 -0
  185. package/src/Gradient/GradientLUTGenerator.js +202 -0
  186. package/src/Grid.d.ts +18 -0
  187. package/src/Grid.js +21 -0
  188. package/src/Mask/service/MaskBeginMaskService.d.ts +9 -0
  189. package/src/Mask/service/MaskBeginMaskService.js +22 -0
  190. package/src/Mask/service/MaskEndMaskService.d.ts +15 -0
  191. package/src/Mask/service/MaskEndMaskService.js +36 -0
  192. package/src/Mask/service/MaskSetMaskBoundsService.d.ts +13 -0
  193. package/src/Mask/service/MaskSetMaskBoundsService.js +36 -0
  194. package/src/Mask/service/MaskUnionMaskService.d.ts +4 -0
  195. package/src/Mask/service/MaskUnionMaskService.js +74 -0
  196. package/src/Mask/usecase/MaskBindUseCase.d.ts +10 -0
  197. package/src/Mask/usecase/MaskBindUseCase.js +20 -0
  198. package/src/Mask/usecase/MaskLeaveMaskUseCase.d.ts +13 -0
  199. package/src/Mask/usecase/MaskLeaveMaskUseCase.js +51 -0
  200. package/src/Mask.d.ts +12 -0
  201. package/src/Mask.js +41 -0
  202. package/src/Mesh/service/MeshFillGenerateService.d.ts +19 -0
  203. package/src/Mesh/service/MeshFillGenerateService.js +76 -0
  204. package/src/Mesh/service/MeshLerpService.d.ts +13 -0
  205. package/src/Mesh/service/MeshLerpService.js +17 -0
  206. package/src/Mesh/service/MeshStrokeFillGenerateService.d.ts +19 -0
  207. package/src/Mesh/service/MeshStrokeFillGenerateService.js +76 -0
  208. package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.d.ts +13 -0
  209. package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.js +65 -0
  210. package/src/Mesh/usecase/MeshFillGenerateUseCase.d.ts +12 -0
  211. package/src/Mesh/usecase/MeshFillGenerateUseCase.js +48 -0
  212. package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.d.ts +13 -0
  213. package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.js +65 -0
  214. package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.d.ts +14 -0
  215. package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.js +28 -0
  216. package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.d.ts +18 -0
  217. package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.js +54 -0
  218. package/src/Mesh/usecase/MeshStrokeGenerateUseCase.d.ts +25 -0
  219. package/src/Mesh/usecase/MeshStrokeGenerateUseCase.js +608 -0
  220. package/src/PathCommand.d.ts +123 -0
  221. package/src/PathCommand.js +317 -0
  222. package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.d.ts +11 -0
  223. package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.js +35 -0
  224. package/src/SamplerCache/service/SamplerCacheGenerateKeyService.d.ts +13 -0
  225. package/src/SamplerCache/service/SamplerCacheGenerateKeyService.js +15 -0
  226. package/src/SamplerCache/service/SamplerCacheGetOrCreateService.d.ts +15 -0
  227. package/src/SamplerCache/service/SamplerCacheGetOrCreateService.js +30 -0
  228. package/src/SamplerCache.d.ts +18 -0
  229. package/src/SamplerCache.js +61 -0
  230. package/src/Shader/BlendModeShader.d.ts +51 -0
  231. package/src/Shader/BlendModeShader.js +71 -0
  232. package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.d.ts +12 -0
  233. package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.js +28 -0
  234. package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.d.ts +13 -0
  235. package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.js +61 -0
  236. package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.d.ts +19 -0
  237. package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.js +37 -0
  238. package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.d.ts +11 -0
  239. package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.js +24 -0
  240. package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.d.ts +14 -0
  241. package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.js +24 -0
  242. package/src/Shader/PipelineManager.d.ts +57 -0
  243. package/src/Shader/PipelineManager.js +2868 -0
  244. package/src/Shader/ShaderInstancedManager.d.ts +8 -0
  245. package/src/Shader/ShaderInstancedManager.js +18 -0
  246. package/src/Shader/ShaderSource.d.ts +60 -0
  247. package/src/Shader/ShaderSource.js +518 -0
  248. package/src/Shader/wgsl/common/SharedWgsl.d.ts +5 -0
  249. package/src/Shader/wgsl/common/SharedWgsl.js +37 -0
  250. package/src/Shader/wgsl/fragment/BasicFragment.d.ts +2 -0
  251. package/src/Shader/wgsl/fragment/BasicFragment.js +28 -0
  252. package/src/Shader/wgsl/fragment/BitmapFragment.d.ts +1 -0
  253. package/src/Shader/wgsl/fragment/BitmapFragment.js +43 -0
  254. package/src/Shader/wgsl/fragment/BlendFragment.d.ts +8 -0
  255. package/src/Shader/wgsl/fragment/BlendFragment.js +63 -0
  256. package/src/Shader/wgsl/fragment/EffectFragment.d.ts +6 -0
  257. package/src/Shader/wgsl/fragment/EffectFragment.js +324 -0
  258. package/src/Shader/wgsl/fragment/FillFragment.d.ts +1 -0
  259. package/src/Shader/wgsl/fragment/FillFragment.js +28 -0
  260. package/src/Shader/wgsl/fragment/FilterFragment.d.ts +10 -0
  261. package/src/Shader/wgsl/fragment/FilterFragment.js +212 -0
  262. package/src/Shader/wgsl/fragment/GradientFragment.d.ts +3 -0
  263. package/src/Shader/wgsl/fragment/GradientFragment.js +118 -0
  264. package/src/Shader/wgsl/fragment/InstancedFragment.d.ts +1 -0
  265. package/src/Shader/wgsl/fragment/InstancedFragment.js +20 -0
  266. package/src/Shader/wgsl/fragment/MaskFragment.d.ts +1 -0
  267. package/src/Shader/wgsl/fragment/MaskFragment.js +17 -0
  268. package/src/Shader/wgsl/fragment/StencilFragment.d.ts +2 -0
  269. package/src/Shader/wgsl/fragment/StencilFragment.js +33 -0
  270. package/src/Shader/wgsl/vertex/BasicVertex.d.ts +1 -0
  271. package/src/Shader/wgsl/vertex/BasicVertex.js +37 -0
  272. package/src/Shader/wgsl/vertex/BitmapVertex.d.ts +1 -0
  273. package/src/Shader/wgsl/vertex/BitmapVertex.js +43 -0
  274. package/src/Shader/wgsl/vertex/FillVertex.d.ts +1 -0
  275. package/src/Shader/wgsl/vertex/FillVertex.js +35 -0
  276. package/src/Shader/wgsl/vertex/FilterVertex.d.ts +12 -0
  277. package/src/Shader/wgsl/vertex/FilterVertex.js +193 -0
  278. package/src/Shader/wgsl/vertex/GradientVertex.d.ts +1 -0
  279. package/src/Shader/wgsl/vertex/GradientVertex.js +44 -0
  280. package/src/Shader/wgsl/vertex/InstancedVertex.d.ts +1 -0
  281. package/src/Shader/wgsl/vertex/InstancedVertex.js +48 -0
  282. package/src/Shader/wgsl/vertex/MaskVertex.d.ts +1 -0
  283. package/src/Shader/wgsl/vertex/MaskVertex.js +36 -0
  284. package/src/Shader/wgsl/vertex/StencilVertex.d.ts +2 -0
  285. package/src/Shader/wgsl/vertex/StencilVertex.js +66 -0
  286. package/src/TextureManager/service/TextureManagerInitializeSamplersService.d.ts +11 -0
  287. package/src/TextureManager/service/TextureManagerInitializeSamplersService.js +48 -0
  288. package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.d.ts +13 -0
  289. package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.js +30 -0
  290. package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.d.ts +15 -0
  291. package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.js +26 -0
  292. package/src/TextureManager.d.ts +15 -0
  293. package/src/TextureManager.js +87 -0
  294. package/src/TexturePool/service/TexturePoolCleanupService.d.ts +14 -0
  295. package/src/TexturePool/service/TexturePoolCleanupService.js +28 -0
  296. package/src/TexturePool/service/TexturePoolEvictOldestService.d.ts +11 -0
  297. package/src/TexturePool/service/TexturePoolEvictOldestService.js +24 -0
  298. package/src/TexturePool/service/TexturePoolReleaseService.d.ts +13 -0
  299. package/src/TexturePool/service/TexturePoolReleaseService.js +22 -0
  300. package/src/TexturePool/usecase/TexturePoolAcquireUseCase.d.ts +19 -0
  301. package/src/TexturePool/usecase/TexturePoolAcquireUseCase.js +90 -0
  302. package/src/TexturePool.d.ts +69 -0
  303. package/src/TexturePool.js +151 -0
  304. package/src/WebGPUUtil.d.ts +102 -0
  305. package/src/WebGPUUtil.js +157 -0
  306. package/src/index.d.ts +1 -0
  307. package/src/index.js +1 -0
  308. package/src/interface/IAttachmentObject.d.ts +41 -0
  309. package/src/interface/IAttachmentObject.js +1 -0
  310. package/src/interface/IBlendMode.d.ts +1 -0
  311. package/src/interface/IBlendMode.js +1 -0
  312. package/src/interface/IBlendState.d.ts +8 -0
  313. package/src/interface/IBlendState.js +1 -0
  314. package/src/interface/IBounds.d.ts +6 -0
  315. package/src/interface/IBounds.js +1 -0
  316. package/src/interface/ICachedBindGroup.d.ts +8 -0
  317. package/src/interface/ICachedBindGroup.js +1 -0
  318. package/src/interface/IColorBufferObject.d.ts +17 -0
  319. package/src/interface/IColorBufferObject.js +1 -0
  320. package/src/interface/IComplexBlendItem.d.ts +19 -0
  321. package/src/interface/IComplexBlendItem.js +1 -0
  322. package/src/interface/IFilterConfig.d.ts +29 -0
  323. package/src/interface/IFilterConfig.js +1 -0
  324. package/src/interface/IGradientLUTData.d.ts +8 -0
  325. package/src/interface/IGradientLUTData.js +1 -0
  326. package/src/interface/IGradientStop.d.ts +11 -0
  327. package/src/interface/IGradientStop.js +1 -0
  328. package/src/interface/ILocalFilterConfig.d.ts +21 -0
  329. package/src/interface/ILocalFilterConfig.js +1 -0
  330. package/src/interface/IMeshResult.d.ts +8 -0
  331. package/src/interface/IMeshResult.js +1 -0
  332. package/src/interface/IPath.d.ts +8 -0
  333. package/src/interface/IPath.js +1 -0
  334. package/src/interface/IPoint.d.ts +4 -0
  335. package/src/interface/IPoint.js +1 -0
  336. package/src/interface/IPooledBuffer.d.ts +8 -0
  337. package/src/interface/IPooledBuffer.js +1 -0
  338. package/src/interface/IPooledTexture.d.ts +17 -0
  339. package/src/interface/IPooledTexture.js +1 -0
  340. package/src/interface/IQuadraticSegment.d.ts +9 -0
  341. package/src/interface/IQuadraticSegment.js +1 -0
  342. package/src/interface/IRectangleInfo.d.ts +13 -0
  343. package/src/interface/IRectangleInfo.js +1 -0
  344. package/src/interface/IStencilBufferObject.d.ts +16 -0
  345. package/src/interface/IStencilBufferObject.js +1 -0
  346. package/src/interface/IStorageBufferConfig.d.ts +40 -0
  347. package/src/interface/IStorageBufferConfig.js +1 -0
  348. package/src/interface/ITextureObject.d.ts +16 -0
  349. package/src/interface/ITextureObject.js +1 -0
@@ -0,0 +1,154 @@
1
+ import { getInstancedShaderManager } from "../../Blend/BlendInstancedManager";
2
+ import { $currentBlendMode } from "../../Blend";
3
+ import { renderQueue } from "@next2d/render-queue";
4
+ import { $isMaskTestEnabled, $getMaskStencilReference } from "../../Mask";
5
+ import { $getAtlasAttachmentObject } from "../../AtlasManager";
6
+ let $cachedBindGroup = null;
7
+ let $cachedAtlasView = null;
8
+ export const execute = (device, commandEncoder, renderPassEncoder, mainAttachment, bufferManager, frameBufferManager, textureManager, pipelineManager, useIndirect = true, useStorageBuffer = true) => {
9
+ const shaderManager = getInstancedShaderManager();
10
+ if (shaderManager.count === 0) {
11
+ return renderPassEncoder;
12
+ }
13
+ // 既存のレンダーパスを終了
14
+ if (renderPassEncoder) {
15
+ renderPassEncoder.end();
16
+ renderPassEncoder = null;
17
+ }
18
+ const isMasked = $isMaskTestEnabled();
19
+ const maskReference = $getMaskStencilReference();
20
+ // 現在のブレンドモードを取得
21
+ const blendMode = $currentBlendMode;
22
+ // ブレンドモードに応じたパイプライン名を生成
23
+ const getPipelineName = (mode) => {
24
+ switch (mode) {
25
+ case "add":
26
+ return "instanced_add";
27
+ case "screen":
28
+ return "instanced_screen";
29
+ case "alpha":
30
+ return "instanced_alpha";
31
+ case "erase":
32
+ return "instanced_erase";
33
+ case "copy":
34
+ return "instanced_copy";
35
+ default:
36
+ // normal, layer
37
+ return "instanced";
38
+ }
39
+ };
40
+ const pipelineName = getPipelineName(blendMode);
41
+ const normalPipeline = pipelineManager.getPipeline(pipelineName);
42
+ const maskedPipeline = pipelineManager.getPipeline("instanced_masked");
43
+ const useStencil = isMasked && maskedPipeline
44
+ && (mainAttachment.msaaStencil?.view || mainAttachment.stencil?.view);
45
+ const pipeline = useStencil ? maskedPipeline : normalPipeline;
46
+ if (!pipeline) {
47
+ console.error("[WebGPU] Instanced pipeline not found");
48
+ return null;
49
+ }
50
+ // レンダーパスを作成
51
+ let passEncoder;
52
+ if (useStencil) {
53
+ // MSAA対応
54
+ const useMsaa = mainAttachment.msaa && mainAttachment.msaaTexture?.view;
55
+ const colorView = useMsaa ? mainAttachment.msaaTexture.view : mainAttachment.texture.view;
56
+ const stencilView = useMsaa && mainAttachment.msaaStencil?.view
57
+ ? mainAttachment.msaaStencil.view : mainAttachment.stencil.view;
58
+ const resolveTarget = useMsaa ? mainAttachment.texture.view : null;
59
+ const renderPassDescriptor = frameBufferManager.createStencilRenderPassDescriptor(colorView, stencilView, "load", "load", resolveTarget);
60
+ passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
61
+ }
62
+ else {
63
+ // 通常のレンダーパス(MSAA対応)
64
+ const useMsaa = mainAttachment.msaa && mainAttachment.msaaTexture?.view;
65
+ const colorView = useMsaa ? mainAttachment.msaaTexture.view : mainAttachment.texture.view;
66
+ const resolveTarget = useMsaa ? mainAttachment.texture.view : null;
67
+ const renderPassDescriptor = frameBufferManager.createRenderPassDescriptor(colorView, 0, 0, 0, 0, "load", resolveTarget);
68
+ passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
69
+ }
70
+ passEncoder.setPipeline(pipeline);
71
+ if (useStencil) {
72
+ passEncoder.setStencilReference(maskReference);
73
+ }
74
+ // インスタンスデータを準備
75
+ const instanceData = new Float32Array(renderQueue.buffer.buffer, renderQueue.buffer.byteOffset, renderQueue.offset);
76
+ // インスタンスバッファを作成または取得
77
+ let instanceBuffer;
78
+ if (useStorageBuffer) {
79
+ // Storage Buffer最適化: プールから再利用してメモリアロケーション削減
80
+ // Storage BufferはVERTEXフラグ付きで作成されているため、setVertexBufferで使用可能
81
+ instanceBuffer = bufferManager.acquireStorageBuffer(instanceData.byteLength);
82
+ bufferManager.writeStorageBuffer(instanceBuffer, instanceData);
83
+ }
84
+ else {
85
+ // 従来方式: プールから再利用
86
+ instanceBuffer = bufferManager.acquireVertexBuffer(instanceData.byteLength, instanceData);
87
+ }
88
+ // 頂点バッファ(矩形)を取得(キャッシュ済み)
89
+ const vertexBuffer = bufferManager.getUnitRectBuffer();
90
+ // アトラステクスチャをバインド(複数アトラス対応)
91
+ // AtlasManagerから取得、フォールバックとしてFrameBufferManagerから取得
92
+ const atlasAttachment = $getAtlasAttachmentObject() || frameBufferManager.getAttachment("atlas");
93
+ if (!atlasAttachment) {
94
+ console.error("[WebGPU] Atlas attachment not found");
95
+ passEncoder.end();
96
+ return null;
97
+ }
98
+ // アトラス用サンプラーを取得(キャッシュ済み)
99
+ const sampler = textureManager.createSampler("atlas_instanced_sampler", false);
100
+ const bindGroupLayout = pipelineManager.getBindGroupLayout("instanced");
101
+ if (!bindGroupLayout) {
102
+ console.error("[WebGPU] Instanced bind group layout not found");
103
+ passEncoder.end();
104
+ return null;
105
+ }
106
+ // BindGroupキャッシュ: アトラスのテクスチャビューが同じなら再利用
107
+ const atlasView = atlasAttachment.texture.view;
108
+ if (!$cachedBindGroup || $cachedAtlasView !== atlasView) {
109
+ $cachedBindGroup = device.createBindGroup({
110
+ "layout": bindGroupLayout,
111
+ "entries": [
112
+ {
113
+ "binding": 0,
114
+ "resource": sampler
115
+ },
116
+ {
117
+ "binding": 1,
118
+ "resource": atlasView
119
+ }
120
+ ]
121
+ });
122
+ $cachedAtlasView = atlasView;
123
+ }
124
+ // 描画
125
+ passEncoder.setVertexBuffer(0, vertexBuffer);
126
+ passEncoder.setVertexBuffer(1, instanceBuffer);
127
+ passEncoder.setBindGroup(0, $cachedBindGroup);
128
+ if (useIndirect) {
129
+ // Indirect Drawing: CPU-GPU間のオーバーヘッドを削減
130
+ // 注意: 1フレーム内で複数回呼び出される場合があるため、
131
+ // 毎回新しいIndirect Bufferを作成する必要がある
132
+ // (共有バッファを使うとqueue.writeBufferの更新が全てGPU実行前に行われ、
133
+ // 全てのdrawIndirectが最後の更新値を使用してしまう)
134
+ const indirectBuffer = bufferManager.createIndirectBuffer(6, // vertexCount (2 triangles = 6 vertices)
135
+ shaderManager.count, // instanceCount
136
+ 0, // firstVertex
137
+ 0 // firstInstance
138
+ );
139
+ passEncoder.drawIndirect(indirectBuffer, 0);
140
+ }
141
+ else {
142
+ // 通常の描画
143
+ passEncoder.draw(6, shaderManager.count, 0, 0);
144
+ }
145
+ // レンダーパスを終了
146
+ passEncoder.end();
147
+ // 注意: Storage Bufferはここで解放しない
148
+ // GPUがまだ描画を実行していないため、同一フレーム内で再利用されると
149
+ // データが上書きされてしまう。
150
+ // フレーム終了時(clearFrameBuffers)でまとめて解放される。
151
+ // インスタンスデータをクリア
152
+ shaderManager.clear();
153
+ return null;
154
+ };
@@ -0,0 +1,4 @@
1
+ import type { IPath } from "../../interface/IPath";
2
+ import type { BufferManager } from "../../BufferManager";
3
+ import type { PipelineManager } from "../../Shader/PipelineManager";
4
+ export declare const execute: (device: GPUDevice, render_pass_encoder: GPURenderPassEncoder, buffer_manager: BufferManager, pipeline_manager: PipelineManager, path_vertices: IPath[], context_matrix: Float32Array, fill_style: Float32Array, type: number, stops: number[], gradient_matrix: Float32Array, spread: number, interpolation: number, focal: number, viewport_width: number, viewport_height: number, use_atlas_target: boolean, use_stencil_pipeline?: boolean, _clip_level?: number) => GPUTexture | null;
@@ -0,0 +1,230 @@
1
+ import { execute as meshFillGenerateUseCase } from "../../Mesh/usecase/MeshFillGenerateUseCase";
2
+ import { generateGradientLUT, getAdaptiveResolution } from "../../Gradient/GradientLUTGenerator";
3
+ import { execute as contextComputeGradientMatrixService } from "../service/ContextComputeGradientMatrixService";
4
+ import { $getLUTFromCache, $putLUTToCache } from "../../Gradient/GradientLUTCache";
5
+ import { $acquireFillTexture } from "../../FillTexturePool";
6
+ import { $isMaskDrawing, $getMaskStencilReference } from "../../Mask";
7
+ let $gradientSampler = null;
8
+ const $uniformData36 = new Float32Array(36);
9
+ const $stencilData16 = new Float32Array(16);
10
+ let $stencilDynamicBindGroup = null;
11
+ let $stencilDynamicBuffer = null;
12
+ const $entries3 = [
13
+ { "binding": 0, "resource": { "buffer": null } },
14
+ { "binding": 1, "resource": null },
15
+ { "binding": 2, "resource": null }
16
+ ];
17
+ export const execute = (device, render_pass_encoder, buffer_manager, pipeline_manager, path_vertices, context_matrix, fill_style, type, stops, gradient_matrix, spread, interpolation, focal, viewport_width, viewport_height, use_atlas_target, use_stencil_pipeline = false, _clip_level = 1) => {
18
+ // MeshFillGenerateUseCaseで頂点データを生成(4 floats/vertex: position + bezier)
19
+ const mesh = meshFillGenerateUseCase(path_vertices);
20
+ if (mesh.indexCount === 0) {
21
+ return null;
22
+ }
23
+ // 頂点バッファを取得(プールから再利用)
24
+ const vertexBuffer = buffer_manager.acquireVertexBuffer(mesh.buffer.byteLength, mesh.buffer);
25
+ // グラデーションLUTテクスチャを取得(キャッシュ優先)
26
+ let lutTexture;
27
+ let lutView;
28
+ const cachedLUT = $getLUTFromCache(stops, spread, interpolation);
29
+ if (cachedLUT) {
30
+ lutTexture = cachedLUT.texture;
31
+ lutView = cachedLUT.view;
32
+ }
33
+ else {
34
+ const lutData = generateGradientLUT(stops, spread, interpolation);
35
+ const stopsLength = stops.length / 5;
36
+ const lutResolution = getAdaptiveResolution(stopsLength);
37
+ lutTexture = $acquireFillTexture(device, lutResolution, 1);
38
+ device.queue.writeTexture({ "texture": lutTexture }, lutData, { "bytesPerRow": lutResolution * 4, "rowsPerImage": 1 }, { "width": lutResolution, "height": 1 });
39
+ lutView = lutTexture.createView();
40
+ $putLUTToCache(stops, spread, interpolation, lutTexture, lutView);
41
+ }
42
+ // WebGL版と同じ計算でグラデーション変換データを取得
43
+ const gradientData = contextComputeGradientMatrixService(gradient_matrix, context_matrix, type);
44
+ // グラデーション描画では色は白(1, 1, 1, alpha)を使用
45
+ const alpha = fill_style[3] > 0 ? fill_style[3] : 1;
46
+ // 行列を取得
47
+ const a = context_matrix[0];
48
+ const b = context_matrix[1];
49
+ const c = context_matrix[3];
50
+ const d = context_matrix[4];
51
+ const tx = context_matrix[6];
52
+ const ty = context_matrix[7];
53
+ // Uniformバッファを作成
54
+ // GradientUniforms構造体:
55
+ // - inverseMatrix: mat3x3<f32> (各列がvec4にパディング = 48 bytes)
56
+ // - gradientType, focal, spread, radius (16 bytes)
57
+ // - linearPoints: vec4<f32> (16 bytes)
58
+ // - color: vec4<f32> (16 bytes)
59
+ // - contextMatrix0/1/2: vec4<f32> x3 (48 bytes)
60
+ // 合計: 144 bytes = 36 floats → 使用する配列は32 floats(パディング込み)
61
+ $uniformData36[0] = gradientData.inverseMatrix[0]; // column 0, row 0 (a)
62
+ $uniformData36[1] = gradientData.inverseMatrix[3]; // column 0, row 1 (c)
63
+ $uniformData36[2] = 0; // column 0, row 2 (0)
64
+ $uniformData36[3] = 0; // padding
65
+ $uniformData36[4] = gradientData.inverseMatrix[1]; // column 1, row 0 (b)
66
+ $uniformData36[5] = gradientData.inverseMatrix[4]; // column 1, row 1 (d)
67
+ $uniformData36[6] = 0; // column 1, row 2 (0)
68
+ $uniformData36[7] = 0; // padding
69
+ $uniformData36[8] = gradientData.inverseMatrix[6]; // column 2, row 0 (tx)
70
+ $uniformData36[9] = gradientData.inverseMatrix[7]; // column 2, row 1 (ty)
71
+ $uniformData36[10] = 1; // column 2, row 2 (1)
72
+ $uniformData36[11] = 0; // padding
73
+ // グラデーションパラメータ
74
+ $uniformData36[12] = type; // gradientType
75
+ $uniformData36[13] = Math.max(-0.975, Math.min(0.975, focal)); // focal
76
+ $uniformData36[14] = spread; // spread (0: reflect, 1: repeat, 2: pad)
77
+ $uniformData36[15] = 819.2; // radius(Radial用、WebGL版と同じ定数)
78
+ // Linear用の点a, b
79
+ if (gradientData.linearPoints) {
80
+ $uniformData36[16] = gradientData.linearPoints[0]; // a.x
81
+ $uniformData36[17] = gradientData.linearPoints[1]; // a.y
82
+ $uniformData36[18] = gradientData.linearPoints[2]; // b.x
83
+ $uniformData36[19] = gradientData.linearPoints[3]; // b.y
84
+ }
85
+ else {
86
+ $uniformData36[16] = 0;
87
+ $uniformData36[17] = 0;
88
+ $uniformData36[18] = 0;
89
+ $uniformData36[19] = 0;
90
+ }
91
+ // color (白 + alpha)
92
+ $uniformData36[20] = 1; // red
93
+ $uniformData36[21] = 1; // green
94
+ $uniformData36[22] = 1; // blue
95
+ $uniformData36[23] = alpha;
96
+ // contextMatrix(viewport正規化済み)
97
+ $uniformData36[24] = a / viewport_width;
98
+ $uniformData36[25] = b / viewport_height;
99
+ $uniformData36[26] = 0;
100
+ $uniformData36[27] = 0;
101
+ $uniformData36[28] = c / viewport_width;
102
+ $uniformData36[29] = d / viewport_height;
103
+ $uniformData36[30] = 0;
104
+ $uniformData36[31] = 0;
105
+ // contextMatrix2
106
+ $uniformData36[32] = tx / viewport_width;
107
+ $uniformData36[33] = ty / viewport_height;
108
+ $uniformData36[34] = 1;
109
+ $uniformData36[35] = 0;
110
+ const uniformBuffer = buffer_manager.acquireAndWriteUniformBuffer($uniformData36);
111
+ // サンプラーを作成(キャッシュ済み)
112
+ if (!$gradientSampler) {
113
+ $gradientSampler = device.createSampler({
114
+ "magFilter": "linear",
115
+ "minFilter": "linear",
116
+ "addressModeU": "clamp-to-edge",
117
+ "addressModeV": "clamp-to-edge"
118
+ });
119
+ }
120
+ const sampler = $gradientSampler;
121
+ // バインドグループを作成
122
+ const bindGroupLayout = pipeline_manager.getBindGroupLayout("gradient_fill");
123
+ if (!bindGroupLayout) {
124
+ console.error("[WebGPU] gradient_fill bind group layout not found");
125
+ return null;
126
+ }
127
+ $entries3[0].resource.buffer = uniformBuffer;
128
+ $entries3[1].resource = sampler;
129
+ $entries3[2].resource = lutView;
130
+ const bindGroup = device.createBindGroup({
131
+ "layout": bindGroupLayout,
132
+ "entries": $entries3
133
+ });
134
+ // ステンシル書き込みパス用のDynamic BindGroup + offsetを作成
135
+ // stencil_write_atlas / stencil_write_main はFillUniforms(color+matrix)を期待する
136
+ const createStencilDynamic = () => {
137
+ const dynamicLayout = pipeline_manager.getBindGroupLayout("fill_dynamic");
138
+ if (!dynamicLayout) {
139
+ return null;
140
+ }
141
+ // FillUniformsと同じレイアウト: color(16) + matrix0(16) + matrix1(16) + matrix2(16) = 64 bytes
142
+ $stencilData16[0] = 1; // red
143
+ $stencilData16[1] = 1; // green
144
+ $stencilData16[2] = 1; // blue
145
+ $stencilData16[3] = alpha;
146
+ $stencilData16[4] = a / viewport_width;
147
+ $stencilData16[5] = b / viewport_height;
148
+ $stencilData16[6] = 0;
149
+ $stencilData16[7] = 0;
150
+ $stencilData16[8] = c / viewport_width;
151
+ $stencilData16[9] = d / viewport_height;
152
+ $stencilData16[10] = 0;
153
+ $stencilData16[11] = 0;
154
+ $stencilData16[12] = tx / viewport_width;
155
+ $stencilData16[13] = ty / viewport_height;
156
+ $stencilData16[14] = 1;
157
+ $stencilData16[15] = 0;
158
+ const offset = buffer_manager.dynamicUniform.allocate($stencilData16);
159
+ const currentBuffer = buffer_manager.dynamicUniform.getBuffer();
160
+ if (!$stencilDynamicBindGroup || $stencilDynamicBuffer !== currentBuffer) {
161
+ $stencilDynamicBindGroup = device.createBindGroup({
162
+ "layout": dynamicLayout,
163
+ "entries": [{
164
+ "binding": 0,
165
+ "resource": {
166
+ "buffer": currentBuffer,
167
+ "size": 256
168
+ }
169
+ }]
170
+ });
171
+ $stencilDynamicBuffer = currentBuffer;
172
+ }
173
+ return { "bindGroup": $stencilDynamicBindGroup, "offset": offset };
174
+ };
175
+ // アトラス描画時:2パスステンシルフィル(WebGL版と同じアルゴリズム)
176
+ // これにより中抜き描画(hollow shape)が正しく機能する
177
+ if (use_atlas_target) {
178
+ // === Pass 1: ステンシル書き込み ===
179
+ const stencilWritePipeline = pipeline_manager.getPipeline("stencil_write_atlas");
180
+ if (stencilWritePipeline) {
181
+ const stencilDynamic = createStencilDynamic();
182
+ render_pass_encoder.setPipeline(stencilWritePipeline);
183
+ render_pass_encoder.setStencilReference(0);
184
+ render_pass_encoder.setVertexBuffer(0, vertexBuffer);
185
+ if (stencilDynamic) {
186
+ render_pass_encoder.setBindGroup(0, stencilDynamic.bindGroup, [stencilDynamic.offset]);
187
+ }
188
+ render_pass_encoder.draw(mesh.indexCount, 1, 0, 0);
189
+ }
190
+ // === Pass 2: グラデーション描画(ステンシルテスト付き) ===
191
+ const gradientPipeline = pipeline_manager.getGradientPipeline("gradient_fill_stencil_atlas", type, spread);
192
+ if (gradientPipeline) {
193
+ render_pass_encoder.setPipeline(gradientPipeline);
194
+ render_pass_encoder.setStencilReference(0);
195
+ render_pass_encoder.setBindGroup(0, bindGroup);
196
+ render_pass_encoder.draw(mesh.indexCount, 1, 0, 0);
197
+ }
198
+ return null;
199
+ }
200
+ // キャンバスへの直接描画
201
+ if (use_stencil_pipeline && $isMaskDrawing()) {
202
+ return null;
203
+ }
204
+ // === メインキャンバス直接描画: 2パスステンシルフィル ===
205
+ // === Pass 1: ステンシル書き込み ===
206
+ const stencilWritePipeline = pipeline_manager.getPipeline("stencil_write_main");
207
+ if (stencilWritePipeline) {
208
+ const stencilDynamic = createStencilDynamic();
209
+ render_pass_encoder.setPipeline(stencilWritePipeline);
210
+ render_pass_encoder.setStencilReference(0);
211
+ render_pass_encoder.setVertexBuffer(0, vertexBuffer);
212
+ if (stencilDynamic) {
213
+ render_pass_encoder.setBindGroup(0, stencilDynamic.bindGroup, [stencilDynamic.offset]);
214
+ }
215
+ render_pass_encoder.draw(mesh.indexCount, 1, 0, 0);
216
+ }
217
+ // === Pass 2: グラデーション描画(ステンシルテスト付き) ===
218
+ const pipelineName = use_stencil_pipeline
219
+ ? "gradient_fill_bgra_stencil_masked"
220
+ : "gradient_fill_stencil_main";
221
+ const gradientPipeline = pipeline_manager.getGradientPipeline(pipelineName, type, spread);
222
+ if (gradientPipeline) {
223
+ render_pass_encoder.setPipeline(gradientPipeline);
224
+ render_pass_encoder.setStencilReference(use_stencil_pipeline ? $getMaskStencilReference() : 0);
225
+ render_pass_encoder.setBindGroup(0, bindGroup);
226
+ render_pass_encoder.draw(mesh.indexCount, 1, 0, 0);
227
+ }
228
+ // LUTテクスチャはキャッシュ管理
229
+ return null;
230
+ };
@@ -0,0 +1,4 @@
1
+ import type { IPath } from "../../interface/IPath";
2
+ import type { BufferManager } from "../../BufferManager";
3
+ import type { PipelineManager } from "../../Shader/PipelineManager";
4
+ export declare const execute: (device: GPUDevice, render_pass_encoder: GPURenderPassEncoder, buffer_manager: BufferManager, pipeline_manager: PipelineManager, vertices: IPath[], thickness: number, context_matrix: Float32Array, stroke_style: Float32Array, type: number, stops: number[], gradient_matrix: Float32Array, spread: number, interpolation: number, focal: number, viewport_width: number, viewport_height: number, use_atlas_target: boolean, use_stencil_pipeline: boolean) => GPUTexture | null;
@@ -0,0 +1,138 @@
1
+ import { execute as meshGradientStrokeGenerateUseCase } from "../../Mesh/usecase/MeshGradientStrokeGenerateUseCase";
2
+ import { generateGradientLUT, getAdaptiveResolution } from "../../Gradient/GradientLUTGenerator";
3
+ import { execute as contextComputeGradientMatrixService } from "../service/ContextComputeGradientMatrixService";
4
+ import { $getLUTFromCache, $putLUTToCache } from "../../Gradient/GradientLUTCache";
5
+ import { $acquireFillTexture } from "../../FillTexturePool";
6
+ let $gradientSampler = null;
7
+ const $uniformData36 = new Float32Array(36);
8
+ const $entries3 = [
9
+ { "binding": 0, "resource": { "buffer": null } },
10
+ { "binding": 1, "resource": null },
11
+ { "binding": 2, "resource": null }
12
+ ];
13
+ export const execute = (device, render_pass_encoder, buffer_manager, pipeline_manager, vertices, thickness, context_matrix, stroke_style, type, stops, gradient_matrix, spread, interpolation, focal, viewport_width, viewport_height, use_atlas_target, use_stencil_pipeline) => {
14
+ // グラデーションストローク用メッシュを生成(4 floats/vertex: position + bezier)
15
+ const mesh = meshGradientStrokeGenerateUseCase(vertices, thickness);
16
+ if (mesh.indexCount === 0) {
17
+ return null;
18
+ }
19
+ // 頂点バッファを取得(プールから再利用)
20
+ const vertexBuffer = buffer_manager.acquireVertexBuffer(mesh.buffer.byteLength, mesh.buffer);
21
+ // グラデーションLUTテクスチャを取得(キャッシュ優先)
22
+ let lutTexture;
23
+ let lutView;
24
+ const cachedLUT = $getLUTFromCache(stops, spread, interpolation);
25
+ if (cachedLUT) {
26
+ lutTexture = cachedLUT.texture;
27
+ lutView = cachedLUT.view;
28
+ }
29
+ else {
30
+ const lutData = generateGradientLUT(stops, spread, interpolation);
31
+ const stopsLength = stops.length / 5;
32
+ const lutResolution = getAdaptiveResolution(stopsLength);
33
+ lutTexture = $acquireFillTexture(device, lutResolution, 1);
34
+ device.queue.writeTexture({ "texture": lutTexture }, lutData, { "bytesPerRow": lutResolution * 4, "rowsPerImage": 1 }, { "width": lutResolution, "height": 1 });
35
+ lutView = lutTexture.createView();
36
+ $putLUTToCache(stops, spread, interpolation, lutTexture, lutView);
37
+ }
38
+ // WebGL版と同じ計算でグラデーション変換データを取得
39
+ const gradientData = contextComputeGradientMatrixService(gradient_matrix, context_matrix, type);
40
+ // 色とmatrix
41
+ const alpha = stroke_style[3] > 0 ? stroke_style[3] : 1;
42
+ const a = context_matrix[0];
43
+ const b = context_matrix[1];
44
+ const c = context_matrix[3];
45
+ const d = context_matrix[4];
46
+ const tx = context_matrix[6];
47
+ const ty = context_matrix[7];
48
+ // Uniformバッファを作成(GradientUniforms: 36 floats = 144 bytes)
49
+ $uniformData36[0] = gradientData.inverseMatrix[0]; // column 0, row 0 (a)
50
+ $uniformData36[1] = gradientData.inverseMatrix[3]; // column 0, row 1 (c)
51
+ $uniformData36[2] = 0; // column 0, row 2 (0)
52
+ $uniformData36[3] = 0; // padding
53
+ $uniformData36[4] = gradientData.inverseMatrix[1]; // column 1, row 0 (b)
54
+ $uniformData36[5] = gradientData.inverseMatrix[4]; // column 1, row 1 (d)
55
+ $uniformData36[6] = 0; // column 1, row 2 (0)
56
+ $uniformData36[7] = 0; // padding
57
+ $uniformData36[8] = gradientData.inverseMatrix[6]; // column 2, row 0 (tx)
58
+ $uniformData36[9] = gradientData.inverseMatrix[7]; // column 2, row 1 (ty)
59
+ $uniformData36[10] = 1; // column 2, row 2 (1)
60
+ $uniformData36[11] = 0; // padding
61
+ // グラデーションパラメータ
62
+ $uniformData36[12] = type; // gradientType
63
+ $uniformData36[13] = Math.max(-0.975, Math.min(0.975, focal)); // focal
64
+ $uniformData36[14] = spread; // spread (0: reflect, 1: repeat, 2: pad)
65
+ $uniformData36[15] = 819.2; // radius
66
+ // Linear用の点a, b
67
+ if (gradientData.linearPoints) {
68
+ $uniformData36[16] = gradientData.linearPoints[0]; // a.x
69
+ $uniformData36[17] = gradientData.linearPoints[1]; // a.y
70
+ $uniformData36[18] = gradientData.linearPoints[2]; // b.x
71
+ $uniformData36[19] = gradientData.linearPoints[3]; // b.y
72
+ }
73
+ else {
74
+ $uniformData36[16] = 0;
75
+ $uniformData36[17] = 0;
76
+ $uniformData36[18] = 0;
77
+ $uniformData36[19] = 0;
78
+ }
79
+ // color (白 + alpha)
80
+ $uniformData36[20] = 1;
81
+ $uniformData36[21] = 1;
82
+ $uniformData36[22] = 1;
83
+ $uniformData36[23] = alpha;
84
+ // contextMatrix(viewport正規化済み)
85
+ $uniformData36[24] = a / viewport_width;
86
+ $uniformData36[25] = b / viewport_height;
87
+ $uniformData36[26] = 0;
88
+ $uniformData36[27] = 0;
89
+ $uniformData36[28] = c / viewport_width;
90
+ $uniformData36[29] = d / viewport_height;
91
+ $uniformData36[30] = 0;
92
+ $uniformData36[31] = 0;
93
+ $uniformData36[32] = tx / viewport_width;
94
+ $uniformData36[33] = ty / viewport_height;
95
+ $uniformData36[34] = 1;
96
+ $uniformData36[35] = 0;
97
+ const uniformBuffer = buffer_manager.acquireAndWriteUniformBuffer($uniformData36);
98
+ // サンプラーを取得(キャッシュ済み)
99
+ if (!$gradientSampler) {
100
+ $gradientSampler = device.createSampler({
101
+ "magFilter": "linear",
102
+ "minFilter": "linear",
103
+ "addressModeU": "clamp-to-edge",
104
+ "addressModeV": "clamp-to-edge"
105
+ });
106
+ }
107
+ const sampler = $gradientSampler;
108
+ // バインドグループを作成
109
+ const bindGroupLayout = pipeline_manager.getBindGroupLayout("gradient_fill");
110
+ if (!bindGroupLayout) {
111
+ console.error("[WebGPU] gradient_fill bind group layout not found");
112
+ return null;
113
+ }
114
+ $entries3[0].resource.buffer = uniformBuffer;
115
+ $entries3[1].resource = sampler;
116
+ $entries3[2].resource = lutView;
117
+ const bindGroup = device.createBindGroup({
118
+ "layout": bindGroupLayout,
119
+ "entries": $entries3
120
+ });
121
+ // ストロークのメッシュは各セグメントが独立した凸多角形のため、
122
+ // フィルのような2パスステンシル描画は不要で、直接描画で正しく描画される。
123
+ // ステンシル付きレンダーパスの場合はステンシル互換パイプライン(compare: always)を使用する。
124
+ const pipelineName = use_stencil_pipeline
125
+ ? use_atlas_target ? "gradient_stroke_atlas" : "gradient_stroke_bgra"
126
+ : use_atlas_target ? "gradient_fill" : "gradient_fill_bgra";
127
+ const pipeline = pipeline_manager.getGradientPipeline(pipelineName, type, spread);
128
+ if (!pipeline) {
129
+ console.error(`[WebGPU] ${pipelineName} pipeline not found`);
130
+ return null;
131
+ }
132
+ render_pass_encoder.setPipeline(pipeline);
133
+ render_pass_encoder.setVertexBuffer(0, vertexBuffer);
134
+ render_pass_encoder.setBindGroup(0, bindGroup);
135
+ render_pass_encoder.draw(mesh.indexCount, 1, 0, 0);
136
+ // LUTテクスチャはキャッシュ管理
137
+ return null;
138
+ };
@@ -0,0 +1,6 @@
1
+ import type { IAttachmentObject } from "../../interface/IAttachmentObject";
2
+ import type { BufferManager } from "../../BufferManager";
3
+ import type { FrameBufferManager } from "../../FrameBufferManager";
4
+ import type { TextureManager } from "../../TextureManager";
5
+ import type { PipelineManager } from "../../Shader/PipelineManager";
6
+ export declare const execute: (device: GPUDevice, commandEncoder: GPUCommandEncoder, mainAttachment: IAttachmentObject | null, frameBufferManager: FrameBufferManager, textureManager: TextureManager, pipelineManager: PipelineManager, bufferManager: BufferManager) => void;