@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.
- package/LICENSE +21 -0
- package/README.md +574 -0
- package/package.json +30 -0
- package/src/AtlasManager.d.ts +23 -0
- package/src/AtlasManager.js +123 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.d.ts +13 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateAttachmentObjectService.js +24 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.d.ts +15 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateColorBufferService.js +31 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.d.ts +5 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateRenderPassDescriptorService.js +42 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.d.ts +16 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateStencilBufferService.js +28 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.d.ts +17 -0
- package/src/AttachmentManager/service/AttachmentManagerCreateTextureObjectService.js +33 -0
- package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.d.ts +16 -0
- package/src/AttachmentManager/service/AttachmentManagerGetColorBufferService.js +28 -0
- package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.d.ts +17 -0
- package/src/AttachmentManager/service/AttachmentManagerGetStencilBufferService.js +27 -0
- package/src/AttachmentManager/service/AttachmentManagerGetTextureService.d.ts +18 -0
- package/src/AttachmentManager/service/AttachmentManagerGetTextureService.js +27 -0
- package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.d.ts +12 -0
- package/src/AttachmentManager/service/AttachmentManagerReleaseTextureService.js +17 -0
- package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.d.ts +26 -0
- package/src/AttachmentManager/usecase/AttachmentManagerGetAttachmentObjectUseCase.js +43 -0
- package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.d.ts +18 -0
- package/src/AttachmentManager/usecase/AttachmentManagerReleaseAttachmentUseCase.js +33 -0
- package/src/AttachmentManager.d.ts +19 -0
- package/src/AttachmentManager.js +105 -0
- package/src/BezierConverter/BezierConverter.d.ts +16 -0
- package/src/BezierConverter/BezierConverter.js +15 -0
- package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.d.ts +15 -0
- package/src/BezierConverter/service/BezierConverterCalculateFlatnessService.js +37 -0
- package/src/BezierConverter/service/BezierConverterSplitCubicService.d.ts +15 -0
- package/src/BezierConverter/service/BezierConverterSplitCubicService.js +47 -0
- package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.d.ts +29 -0
- package/src/BezierConverter/usecase/BezierConverterAdaptiveCubicToQuadUseCase.js +80 -0
- package/src/Blend/BlendInstancedManager.d.ts +35 -0
- package/src/Blend/BlendInstancedManager.js +147 -0
- package/src/Blend/service/BlendAddService.d.ts +1 -0
- package/src/Blend/service/BlendAddService.js +8 -0
- package/src/Blend/service/BlendAlphaService.d.ts +1 -0
- package/src/Blend/service/BlendAlphaService.js +8 -0
- package/src/Blend/service/BlendEraseService.d.ts +1 -0
- package/src/Blend/service/BlendEraseService.js +8 -0
- package/src/Blend/service/BlendGetStateService.d.ts +12 -0
- package/src/Blend/service/BlendGetStateService.js +13 -0
- package/src/Blend/service/BlendOneZeroService.d.ts +1 -0
- package/src/Blend/service/BlendOneZeroService.js +8 -0
- package/src/Blend/service/BlendResetService.d.ts +1 -0
- package/src/Blend/service/BlendResetService.js +8 -0
- package/src/Blend/service/BlendScreenService.d.ts +1 -0
- package/src/Blend/service/BlendScreenService.js +8 -0
- package/src/Blend/service/BlendSetModeService.d.ts +2 -0
- package/src/Blend/service/BlendSetModeService.js +4 -0
- package/src/Blend/usecase/BlendApplyComplexBlendUseCase.d.ts +6 -0
- package/src/Blend/usecase/BlendApplyComplexBlendUseCase.js +79 -0
- package/src/Blend/usecase/BlendOperationUseCase.d.ts +11 -0
- package/src/Blend/usecase/BlendOperationUseCase.js +31 -0
- package/src/Blend.d.ts +8 -0
- package/src/Blend.js +91 -0
- package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.d.ts +15 -0
- package/src/BufferManager/service/BufferManagerCreateIndirectBufferService.js +37 -0
- package/src/BufferManager/service/BufferManagerCreateRectVerticesService.d.ts +13 -0
- package/src/BufferManager/service/BufferManagerCreateRectVerticesService.js +23 -0
- package/src/BufferManager/service/BufferManagerCreateStorageBufferService.d.ts +17 -0
- package/src/BufferManager/service/BufferManagerCreateStorageBufferService.js +23 -0
- package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.d.ts +12 -0
- package/src/BufferManager/service/BufferManagerReleaseUniformBufferService.js +32 -0
- package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.d.ts +12 -0
- package/src/BufferManager/service/BufferManagerReleaseVertexBufferService.js +32 -0
- package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.d.ts +12 -0
- package/src/BufferManager/service/BufferManagerUpdateIndirectBufferService.js +20 -0
- package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.d.ts +10 -0
- package/src/BufferManager/service/BufferManagerUpperPowerOfTwoService.js +18 -0
- package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.d.ts +15 -0
- package/src/BufferManager/usecase/BufferManagerAcquireStorageBufferUseCase.js +51 -0
- package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.d.ts +13 -0
- package/src/BufferManager/usecase/BufferManagerAcquireUniformBufferUseCase.js +26 -0
- package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.d.ts +14 -0
- package/src/BufferManager/usecase/BufferManagerAcquireVertexBufferUseCase.js +46 -0
- package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.d.ts +12 -0
- package/src/BufferManager/usecase/BufferManagerCleanupStorageBuffersUseCase.js +20 -0
- package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.d.ts +9 -0
- package/src/BufferManager/usecase/BufferManagerReleaseStorageBufferUseCase.js +15 -0
- package/src/BufferManager.d.ts +93 -0
- package/src/BufferManager.js +487 -0
- package/src/Compute/ComputePipelineManager.d.ts +61 -0
- package/src/Compute/ComputePipelineManager.js +313 -0
- package/src/Compute/service/ComputeExecuteBlurService.d.ts +21 -0
- package/src/Compute/service/ComputeExecuteBlurService.js +81 -0
- package/src/Context/service/ContextComputeBitmapMatrixService.d.ts +1 -0
- package/src/Context/service/ContextComputeBitmapMatrixService.js +74 -0
- package/src/Context/service/ContextComputeGradientMatrixService.d.ts +4 -0
- package/src/Context/service/ContextComputeGradientMatrixService.js +88 -0
- package/src/Context/service/ContextFillSimpleService.d.ts +2 -0
- package/src/Context/service/ContextFillSimpleService.js +28 -0
- package/src/Context/service/ContextFillWithStencilMainService.d.ts +2 -0
- package/src/Context/service/ContextFillWithStencilMainService.js +19 -0
- package/src/Context/service/ContextFillWithStencilService.d.ts +2 -0
- package/src/Context/service/ContextFillWithStencilService.js +19 -0
- package/src/Context/usecase/ContextApplyFilterUseCase.d.ts +5 -0
- package/src/Context/usecase/ContextApplyFilterUseCase.js +668 -0
- package/src/Context/usecase/ContextBitmapFillUseCase.d.ts +4 -0
- package/src/Context/usecase/ContextBitmapFillUseCase.js +210 -0
- package/src/Context/usecase/ContextBitmapStrokeUseCase.d.ts +4 -0
- package/src/Context/usecase/ContextBitmapStrokeUseCase.js +119 -0
- package/src/Context/usecase/ContextClipUseCase.d.ts +5 -0
- package/src/Context/usecase/ContextClipUseCase.js +101 -0
- package/src/Context/usecase/ContextContainerEndLayerUseCase.d.ts +5 -0
- package/src/Context/usecase/ContextContainerEndLayerUseCase.js +476 -0
- package/src/Context/usecase/ContextDrawArraysInstancedUseCase.d.ts +6 -0
- package/src/Context/usecase/ContextDrawArraysInstancedUseCase.js +135 -0
- package/src/Context/usecase/ContextDrawIndirectUseCase.d.ts +6 -0
- package/src/Context/usecase/ContextDrawIndirectUseCase.js +154 -0
- package/src/Context/usecase/ContextGradientFillUseCase.d.ts +4 -0
- package/src/Context/usecase/ContextGradientFillUseCase.js +230 -0
- package/src/Context/usecase/ContextGradientStrokeUseCase.d.ts +4 -0
- package/src/Context/usecase/ContextGradientStrokeUseCase.js +138 -0
- package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.d.ts +6 -0
- package/src/Context/usecase/ContextProcessComplexBlendQueueUseCase.js +213 -0
- package/src/Context.d.ts +430 -0
- package/src/Context.js +2453 -0
- package/src/FillTexturePool.d.ts +6 -0
- package/src/FillTexturePool.js +72 -0
- package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.d.ts +10 -0
- package/src/Filter/BevelFilter/FilterApplyBevelFilterUseCase.js +214 -0
- package/src/Filter/BevelFilterShader.d.ts +2 -0
- package/src/Filter/BevelFilterShader.js +107 -0
- package/src/Filter/BitmapFilterShader.d.ts +2 -0
- package/src/Filter/BitmapFilterShader.js +207 -0
- package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.d.ts +16 -0
- package/src/Filter/BlurFilter/FilterApplyBlurFilterUseCase.js +243 -0
- package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.d.ts +40 -0
- package/src/Filter/BlurFilter/service/BlurFilterComputeShaderService.js +51 -0
- package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.d.ts +25 -0
- package/src/Filter/BlurFilter/usecase/FilterApplyBlurComputeUseCase.js +180 -0
- package/src/Filter/BlurFilterShader.d.ts +5 -0
- package/src/Filter/BlurFilterShader.js +109 -0
- package/src/Filter/BlurFilterUseCase.d.ts +36 -0
- package/src/Filter/BlurFilterUseCase.js +85 -0
- package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.d.ts +12 -0
- package/src/Filter/ColorMatrixFilter/FilterApplyColorMatrixFilterUseCase.js +90 -0
- package/src/Filter/ColorMatrixFilterShader.d.ts +4 -0
- package/src/Filter/ColorMatrixFilterShader.js +51 -0
- package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.d.ts +6 -0
- package/src/Filter/ConvolutionFilter/FilterApplyConvolutionFilterUseCase.js +144 -0
- package/src/Filter/ConvolutionFilterShader.d.ts +2 -0
- package/src/Filter/ConvolutionFilterShader.js +115 -0
- package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.d.ts +6 -0
- package/src/Filter/DisplacementMapFilter/FilterApplyDisplacementMapFilterUseCase.js +172 -0
- package/src/Filter/DisplacementMapFilterShader.d.ts +2 -0
- package/src/Filter/DisplacementMapFilterShader.js +114 -0
- package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.d.ts +24 -0
- package/src/Filter/DropShadowFilter/FilterApplyDropShadowFilterUseCase.js +179 -0
- package/src/Filter/DropShadowFilterShader.d.ts +4 -0
- package/src/Filter/DropShadowFilterShader.js +93 -0
- package/src/Filter/FilterGradientLUTCache.d.ts +29 -0
- package/src/Filter/FilterGradientLUTCache.js +84 -0
- package/src/Filter/FilterOffset.d.ts +8 -0
- package/src/Filter/FilterOffset.js +10 -0
- package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.d.ts +24 -0
- package/src/Filter/GlowFilter/FilterApplyGlowFilterUseCase.js +143 -0
- package/src/Filter/GlowFilterShader.d.ts +4 -0
- package/src/Filter/GlowFilterShader.js +66 -0
- package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.d.ts +29 -0
- package/src/Filter/GradientBevelFilter/FilterApplyGradientBevelFilterUseCase.js +216 -0
- package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.d.ts +29 -0
- package/src/Filter/GradientGlowFilter/FilterApplyGradientGlowFilterUseCase.js +164 -0
- package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.d.ts +4 -0
- package/src/FrameBufferManager/service/FrameBufferManagerCreateRenderPassDescriptorService.js +23 -0
- package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.d.ts +4 -0
- package/src/FrameBufferManager/service/FrameBufferManagerCreateStencilRenderPassDescriptorService.js +28 -0
- package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.d.ts +11 -0
- package/src/FrameBufferManager/service/FrameBufferManagerFlushPendingReleasesService.js +19 -0
- package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.d.ts +23 -0
- package/src/FrameBufferManager/usecase/FrameBufferManagerCreateAttachmentUseCase.js +125 -0
- package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.d.ts +14 -0
- package/src/FrameBufferManager/usecase/FrameBufferManagerReleaseTemporaryAttachmentUseCase.js +23 -0
- package/src/FrameBufferManager.d.ts +24 -0
- package/src/FrameBufferManager.js +161 -0
- package/src/Gradient/GradientLUTCache.d.ts +61 -0
- package/src/Gradient/GradientLUTCache.js +153 -0
- package/src/Gradient/GradientLUTGenerator.d.ts +30 -0
- package/src/Gradient/GradientLUTGenerator.js +202 -0
- package/src/Grid.d.ts +18 -0
- package/src/Grid.js +21 -0
- package/src/Mask/service/MaskBeginMaskService.d.ts +9 -0
- package/src/Mask/service/MaskBeginMaskService.js +22 -0
- package/src/Mask/service/MaskEndMaskService.d.ts +15 -0
- package/src/Mask/service/MaskEndMaskService.js +36 -0
- package/src/Mask/service/MaskSetMaskBoundsService.d.ts +13 -0
- package/src/Mask/service/MaskSetMaskBoundsService.js +36 -0
- package/src/Mask/service/MaskUnionMaskService.d.ts +4 -0
- package/src/Mask/service/MaskUnionMaskService.js +74 -0
- package/src/Mask/usecase/MaskBindUseCase.d.ts +10 -0
- package/src/Mask/usecase/MaskBindUseCase.js +20 -0
- package/src/Mask/usecase/MaskLeaveMaskUseCase.d.ts +13 -0
- package/src/Mask/usecase/MaskLeaveMaskUseCase.js +51 -0
- package/src/Mask.d.ts +12 -0
- package/src/Mask.js +41 -0
- package/src/Mesh/service/MeshFillGenerateService.d.ts +19 -0
- package/src/Mesh/service/MeshFillGenerateService.js +76 -0
- package/src/Mesh/service/MeshLerpService.d.ts +13 -0
- package/src/Mesh/service/MeshLerpService.js +17 -0
- package/src/Mesh/service/MeshStrokeFillGenerateService.d.ts +19 -0
- package/src/Mesh/service/MeshStrokeFillGenerateService.js +76 -0
- package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.d.ts +13 -0
- package/src/Mesh/usecase/MeshBitmapStrokeGenerateUseCase.js +65 -0
- package/src/Mesh/usecase/MeshFillGenerateUseCase.d.ts +12 -0
- package/src/Mesh/usecase/MeshFillGenerateUseCase.js +48 -0
- package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.d.ts +13 -0
- package/src/Mesh/usecase/MeshGradientStrokeGenerateUseCase.js +65 -0
- package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.d.ts +14 -0
- package/src/Mesh/usecase/MeshSplitQuadraticBezierUseCase.js +28 -0
- package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.d.ts +18 -0
- package/src/Mesh/usecase/MeshStrokeFillGenerateUseCase.js +54 -0
- package/src/Mesh/usecase/MeshStrokeGenerateUseCase.d.ts +25 -0
- package/src/Mesh/usecase/MeshStrokeGenerateUseCase.js +608 -0
- package/src/PathCommand.d.ts +123 -0
- package/src/PathCommand.js +317 -0
- package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.d.ts +11 -0
- package/src/SamplerCache/service/SamplerCacheCreateCommonSamplersService.js +35 -0
- package/src/SamplerCache/service/SamplerCacheGenerateKeyService.d.ts +13 -0
- package/src/SamplerCache/service/SamplerCacheGenerateKeyService.js +15 -0
- package/src/SamplerCache/service/SamplerCacheGetOrCreateService.d.ts +15 -0
- package/src/SamplerCache/service/SamplerCacheGetOrCreateService.js +30 -0
- package/src/SamplerCache.d.ts +18 -0
- package/src/SamplerCache.js +61 -0
- package/src/Shader/BlendModeShader.d.ts +51 -0
- package/src/Shader/BlendModeShader.js +71 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.d.ts +12 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTCalculateResolutionService.js +28 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.d.ts +13 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTGeneratePixelsService.js +61 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.d.ts +19 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTInterpolateColorService.js +37 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.d.ts +11 -0
- package/src/Shader/GradientLUTGenerator/service/GradientLUTParseStopsService.js +24 -0
- package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.d.ts +14 -0
- package/src/Shader/GradientLUTGenerator/usecase/GradientLUTGenerateDataUseCase.js +24 -0
- package/src/Shader/PipelineManager.d.ts +57 -0
- package/src/Shader/PipelineManager.js +2868 -0
- package/src/Shader/ShaderInstancedManager.d.ts +8 -0
- package/src/Shader/ShaderInstancedManager.js +18 -0
- package/src/Shader/ShaderSource.d.ts +60 -0
- package/src/Shader/ShaderSource.js +518 -0
- package/src/Shader/wgsl/common/SharedWgsl.d.ts +5 -0
- package/src/Shader/wgsl/common/SharedWgsl.js +37 -0
- package/src/Shader/wgsl/fragment/BasicFragment.d.ts +2 -0
- package/src/Shader/wgsl/fragment/BasicFragment.js +28 -0
- package/src/Shader/wgsl/fragment/BitmapFragment.d.ts +1 -0
- package/src/Shader/wgsl/fragment/BitmapFragment.js +43 -0
- package/src/Shader/wgsl/fragment/BlendFragment.d.ts +8 -0
- package/src/Shader/wgsl/fragment/BlendFragment.js +63 -0
- package/src/Shader/wgsl/fragment/EffectFragment.d.ts +6 -0
- package/src/Shader/wgsl/fragment/EffectFragment.js +324 -0
- package/src/Shader/wgsl/fragment/FillFragment.d.ts +1 -0
- package/src/Shader/wgsl/fragment/FillFragment.js +28 -0
- package/src/Shader/wgsl/fragment/FilterFragment.d.ts +10 -0
- package/src/Shader/wgsl/fragment/FilterFragment.js +212 -0
- package/src/Shader/wgsl/fragment/GradientFragment.d.ts +3 -0
- package/src/Shader/wgsl/fragment/GradientFragment.js +118 -0
- package/src/Shader/wgsl/fragment/InstancedFragment.d.ts +1 -0
- package/src/Shader/wgsl/fragment/InstancedFragment.js +20 -0
- package/src/Shader/wgsl/fragment/MaskFragment.d.ts +1 -0
- package/src/Shader/wgsl/fragment/MaskFragment.js +17 -0
- package/src/Shader/wgsl/fragment/StencilFragment.d.ts +2 -0
- package/src/Shader/wgsl/fragment/StencilFragment.js +33 -0
- package/src/Shader/wgsl/vertex/BasicVertex.d.ts +1 -0
- package/src/Shader/wgsl/vertex/BasicVertex.js +37 -0
- package/src/Shader/wgsl/vertex/BitmapVertex.d.ts +1 -0
- package/src/Shader/wgsl/vertex/BitmapVertex.js +43 -0
- package/src/Shader/wgsl/vertex/FillVertex.d.ts +1 -0
- package/src/Shader/wgsl/vertex/FillVertex.js +35 -0
- package/src/Shader/wgsl/vertex/FilterVertex.d.ts +12 -0
- package/src/Shader/wgsl/vertex/FilterVertex.js +193 -0
- package/src/Shader/wgsl/vertex/GradientVertex.d.ts +1 -0
- package/src/Shader/wgsl/vertex/GradientVertex.js +44 -0
- package/src/Shader/wgsl/vertex/InstancedVertex.d.ts +1 -0
- package/src/Shader/wgsl/vertex/InstancedVertex.js +48 -0
- package/src/Shader/wgsl/vertex/MaskVertex.d.ts +1 -0
- package/src/Shader/wgsl/vertex/MaskVertex.js +36 -0
- package/src/Shader/wgsl/vertex/StencilVertex.d.ts +2 -0
- package/src/Shader/wgsl/vertex/StencilVertex.js +66 -0
- package/src/TextureManager/service/TextureManagerInitializeSamplersService.d.ts +11 -0
- package/src/TextureManager/service/TextureManagerInitializeSamplersService.js +48 -0
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.d.ts +13 -0
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromImageBitmapUseCase.js +30 -0
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.d.ts +15 -0
- package/src/TextureManager/usecase/TextureManagerCreateTextureFromPixelsUseCase.js +26 -0
- package/src/TextureManager.d.ts +15 -0
- package/src/TextureManager.js +87 -0
- package/src/TexturePool/service/TexturePoolCleanupService.d.ts +14 -0
- package/src/TexturePool/service/TexturePoolCleanupService.js +28 -0
- package/src/TexturePool/service/TexturePoolEvictOldestService.d.ts +11 -0
- package/src/TexturePool/service/TexturePoolEvictOldestService.js +24 -0
- package/src/TexturePool/service/TexturePoolReleaseService.d.ts +13 -0
- package/src/TexturePool/service/TexturePoolReleaseService.js +22 -0
- package/src/TexturePool/usecase/TexturePoolAcquireUseCase.d.ts +19 -0
- package/src/TexturePool/usecase/TexturePoolAcquireUseCase.js +90 -0
- package/src/TexturePool.d.ts +69 -0
- package/src/TexturePool.js +151 -0
- package/src/WebGPUUtil.d.ts +102 -0
- package/src/WebGPUUtil.js +157 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/interface/IAttachmentObject.d.ts +41 -0
- package/src/interface/IAttachmentObject.js +1 -0
- package/src/interface/IBlendMode.d.ts +1 -0
- package/src/interface/IBlendMode.js +1 -0
- package/src/interface/IBlendState.d.ts +8 -0
- package/src/interface/IBlendState.js +1 -0
- package/src/interface/IBounds.d.ts +6 -0
- package/src/interface/IBounds.js +1 -0
- package/src/interface/ICachedBindGroup.d.ts +8 -0
- package/src/interface/ICachedBindGroup.js +1 -0
- package/src/interface/IColorBufferObject.d.ts +17 -0
- package/src/interface/IColorBufferObject.js +1 -0
- package/src/interface/IComplexBlendItem.d.ts +19 -0
- package/src/interface/IComplexBlendItem.js +1 -0
- package/src/interface/IFilterConfig.d.ts +29 -0
- package/src/interface/IFilterConfig.js +1 -0
- package/src/interface/IGradientLUTData.d.ts +8 -0
- package/src/interface/IGradientLUTData.js +1 -0
- package/src/interface/IGradientStop.d.ts +11 -0
- package/src/interface/IGradientStop.js +1 -0
- package/src/interface/ILocalFilterConfig.d.ts +21 -0
- package/src/interface/ILocalFilterConfig.js +1 -0
- package/src/interface/IMeshResult.d.ts +8 -0
- package/src/interface/IMeshResult.js +1 -0
- package/src/interface/IPath.d.ts +8 -0
- package/src/interface/IPath.js +1 -0
- package/src/interface/IPoint.d.ts +4 -0
- package/src/interface/IPoint.js +1 -0
- package/src/interface/IPooledBuffer.d.ts +8 -0
- package/src/interface/IPooledBuffer.js +1 -0
- package/src/interface/IPooledTexture.d.ts +17 -0
- package/src/interface/IPooledTexture.js +1 -0
- package/src/interface/IQuadraticSegment.d.ts +9 -0
- package/src/interface/IQuadraticSegment.js +1 -0
- package/src/interface/IRectangleInfo.d.ts +13 -0
- package/src/interface/IRectangleInfo.js +1 -0
- package/src/interface/IStencilBufferObject.d.ts +16 -0
- package/src/interface/IStencilBufferObject.js +1 -0
- package/src/interface/IStorageBufferConfig.d.ts +40 -0
- package/src/interface/IStorageBufferConfig.js +1 -0
- package/src/interface/ITextureObject.d.ts +16 -0
- 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;
|