diff --git a/src/renderer/wg_engine/tvgWgCompositor.cpp b/src/renderer/wg_engine/tvgWgCompositor.cpp index 62cdadd3..8854dc69 100755 --- a/src/renderer/wg_engine/tvgWgCompositor.cpp +++ b/src/renderer/wg_engine/tvgWgCompositor.cpp @@ -161,11 +161,11 @@ void WgCompositor::renderShape(WgContext& context, WgRenderDataShape* renderData if (renderData->clips.count != 0) { renderClipPath(context, renderData, &storageClipPath); if (renderData->strokeFirst) { - composeStrokes(context, renderData, &storageClipPath, CompositeMethod::ClipPath); - composeShape(context, renderData, &storageClipPath, CompositeMethod::ClipPath); + drawStrokesClipped(context, renderData, &storageClipPath); + drawShapeClipped(context, renderData, &storageClipPath); } else { - composeShape(context, renderData, &storageClipPath, CompositeMethod::ClipPath); - composeStrokes(context, renderData, &storageClipPath, CompositeMethod::ClipPath); + drawShapeClipped(context, renderData, &storageClipPath); + drawStrokesClipped(context, renderData, &storageClipPath); } // use custom blending } else if (blentType == WgPipelineBlendType::Custom) { @@ -197,7 +197,7 @@ void WgCompositor::renderImage(WgContext& context, WgRenderDataPicture* renderDa // apply clip path if neccessary if (renderData->clips.count != 0) { renderClipPath(context, renderData, &storageClipPath); - composeImage(context, renderData, &storageClipPath, CompositeMethod::ClipPath); + drawImageClipped(context, renderData, &storageClipPath); // use custom blending } else if (blentType == WgPipelineBlendType::Custom) blendImage(context, renderData, blendMethod); @@ -281,7 +281,7 @@ void WgCompositor::blendScene(WgContext& context, WgRenderStorage* src, WgCompos } -void WgCompositor::composeShape(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask, CompositeMethod composeMethod) +void WgCompositor::drawShapeClipped(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask) { assert(mask); assert(renderData); @@ -299,12 +299,12 @@ void WgCompositor::composeShape(WgContext& context, WgRenderDataShape* renderDat endRenderPass(); // restore current render pass beginRenderPass(commandEncoder, target, false); - RenderRegion rect { 0, 0,(int32_t)width, (int32_t)height }; - composeRegion(context, &storageInterm, mask, composeMethod, rect); + RenderRegion rect = shrinkRenderRegion(renderData->aabb); + clipRegion(context, &storageInterm, mask, rect); } -void WgCompositor::composeStrokes(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask, CompositeMethod composeMethod) +void WgCompositor::drawStrokesClipped(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask) { assert(mask); assert(renderData); @@ -322,12 +322,12 @@ void WgCompositor::composeStrokes(WgContext& context, WgRenderDataShape* renderD endRenderPass(); // restore current render pass beginRenderPass(commandEncoder, target, false); - RenderRegion rect { 0, 0, (int32_t)width, (int32_t)height }; - composeRegion(context, &storageInterm, mask, composeMethod, rect); + RenderRegion rect = shrinkRenderRegion(renderData->aabb); + clipRegion(context, &storageInterm, mask, rect); } -void WgCompositor::composeImage(WgContext& context, WgRenderDataPicture* renderData, WgRenderStorage* mask, CompositeMethod composeMethod) +void WgCompositor::drawImageClipped(WgContext& context, WgRenderDataPicture* renderData, WgRenderStorage* mask) { assert(mask); assert(renderData); @@ -343,7 +343,18 @@ void WgCompositor::composeImage(WgContext& context, WgRenderDataPicture* renderD // restore current render pass beginRenderPass(commandEncoder, target, false); RenderRegion rect { 0, 0, (int32_t)width, (int32_t)height }; - composeRegion(context, &storageInterm, mask, composeMethod, rect); + clipRegion(context, &storageInterm, mask, rect); +} + + +void WgCompositor::clipRegion(WgContext& context, WgRenderStorage* src, WgRenderStorage* mask, RenderRegion& rect) +{ + wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, rect.x, rect.y, rect.w, rect.h); + wgpuRenderPassEncoderSetStencilReference(renderPassEncoder, 0); + wgpuRenderPassEncoderSetBindGroup(renderPassEncoder, 0, storageInterm.bindGroupTexure, 0, nullptr); + wgpuRenderPassEncoderSetBindGroup(renderPassEncoder, 1, mask->bindGroupTexure, 0, nullptr); + wgpuRenderPassEncoderSetPipeline(renderPassEncoder, pipelines->sceneClip); + meshData.drawImage(context, renderPassEncoder); } @@ -354,21 +365,14 @@ void WgCompositor::composeScene(WgContext& context, WgRenderStorage* src, WgRend assert(mask); assert(renderPassEncoder); RenderRegion rect = shrinkRenderRegion(cmp->aabb); - composeRegion(context, src, mask, cmp->method, rect); -} - - -void WgCompositor::composeRegion(WgContext& context, WgRenderStorage* src, WgRenderStorage* mask, CompositeMethod composeMethod, RenderRegion& rect) -{ wgpuRenderPassEncoderSetScissorRect(renderPassEncoder, rect.x, rect.y, rect.w, rect.h); wgpuRenderPassEncoderSetStencilReference(renderPassEncoder, 0); wgpuRenderPassEncoderSetBindGroup(renderPassEncoder, 0, src->bindGroupTexure, 0, nullptr); wgpuRenderPassEncoderSetBindGroup(renderPassEncoder, 1, mask->bindGroupTexure, 0, nullptr); - wgpuRenderPassEncoderSetPipeline(renderPassEncoder, pipelines->sceneComp[(uint32_t)composeMethod]); + wgpuRenderPassEncoderSetPipeline(renderPassEncoder, pipelines->sceneComp[(uint32_t)cmp->method]); meshData.drawImage(context, renderPassEncoder); } - void WgCompositor::drawClipPath(WgContext& context, WgRenderDataShape* renderData) { assert(renderData); diff --git a/src/renderer/wg_engine/tvgWgCompositor.h b/src/renderer/wg_engine/tvgWgCompositor.h index abf200e2..9d4e44d8 100755 --- a/src/renderer/wg_engine/tvgWgCompositor.h +++ b/src/renderer/wg_engine/tvgWgCompositor.h @@ -59,7 +59,7 @@ private: static WgPipelineBlendType blendMethodToBlendType(BlendMethod blendMethod); - void composeRegion(WgContext& context, WgRenderStorage* src, WgRenderStorage* mask, CompositeMethod composeMethod, RenderRegion& rect); + void clipRegion(WgContext& context, WgRenderStorage* src, WgRenderStorage* mask, RenderRegion& rect); RenderRegion shrinkRenderRegion(RenderRegion& rect); public: // render target dimensions @@ -82,9 +82,10 @@ public: void blendImage(WgContext& context, WgRenderDataPicture* renderData, BlendMethod blendMethod); void blendScene(WgContext& context, WgRenderStorage* src, WgCompose* cmp); - void composeShape(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask, CompositeMethod composeMethod); - void composeStrokes(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask, CompositeMethod composeMethod); - void composeImage(WgContext& context, WgRenderDataPicture* renderData, WgRenderStorage* mask, CompositeMethod composeMethod); + void drawShapeClipped(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask); + void drawStrokesClipped(WgContext& context, WgRenderDataShape* renderData, WgRenderStorage* mask); + void drawImageClipped(WgContext& context, WgRenderDataPicture* renderData, WgRenderStorage* mask); + void composeScene(WgContext& context, WgRenderStorage* src, WgRenderStorage* mask, WgCompose* cmp); void drawClipPath(WgContext& context, WgRenderDataShape* renderData); diff --git a/src/renderer/wg_engine/tvgWgPipelines.cpp b/src/renderer/wg_engine/tvgWgPipelines.cpp index 8924d048..0bb78328 100755 --- a/src/renderer/wg_engine/tvgWgPipelines.cpp +++ b/src/renderer/wg_engine/tvgWgPipelines.cpp @@ -324,7 +324,7 @@ void WgPipelines::initialize(WgContext& context) WGPUCompareFunction_Always, WGPUStencilOperation_Zero, primitiveState, multisampleState, blendStateSrc); - // render pipeline blit + // render pipeline blend sceneBlend = createRenderPipeline(context.device, "The render pipeline scene blend", shaderSceneBlend, "vs_main", "fs_main", layoutSceneBlend, vertexBufferLayoutsImage, 2, @@ -333,10 +333,21 @@ void WgPipelines::initialize(WgContext& context) WGPUCompareFunction_Always, WGPUStencilOperation_Zero, primitiveState, multisampleState, blendStateNrm); + // render pipeline scene clip path + sceneClip = createRenderPipeline( + context.device, "The render pipeline scene clip path", + shaderSceneComp, "vs_main", "fs_main_ClipPath", layoutSceneComp, + vertexBufferLayoutsImage, 2, + WGPUColorWriteMask_All, offscreenTargetFormat, + WGPUCompareFunction_Always, WGPUStencilOperation_Zero, + WGPUCompareFunction_Always, WGPUStencilOperation_Zero, + primitiveState, multisampleState, blendStateNrm); + + // TODO: remove fs_main_ClipPath shader from list after removing CompositeMethod::ClipPath value // compose shader names const char* shaderComposeNames[] { "fs_main_None", - "fs_main_ClipPath", + "fs_main_ClipPath", // TODO: remove after CompositeMethod updated "fs_main_AlphaMask", "fs_main_InvAlphaMask", "fs_main_LumaMask", @@ -349,10 +360,11 @@ void WgPipelines::initialize(WgContext& context) "fs_main_DarkenMask" }; + // TODO: remove fs_main_ClipPath shader from list after removing CompositeMethod::ClipPath value // compose shader blend states const WGPUBlendState composeBlends[] { blendStateNrm, // None - blendStateNrm, // ClipPath + blendStateNrm, // ClipPath // TODO: remove after CompositeMethod updated blendStateNrm, // AlphaMask blendStateNrm, // InvAlphaMask blendStateNrm, // LumaMask @@ -429,6 +441,7 @@ void WgPipelines::releaseGraphicHandles(WgContext& context) releaseRenderPipeline(blit); releaseRenderPipeline(clipPath); releaseRenderPipeline(sceneBlend); + releaseRenderPipeline(sceneClip); size_t pipesSceneCompCnt = sizeof(sceneComp) / sizeof(sceneComp[0]); for (uint32_t i = 0; i < pipesSceneCompCnt; i++) releaseRenderPipeline(sceneComp[i]); diff --git a/src/renderer/wg_engine/tvgWgPipelines.h b/src/renderer/wg_engine/tvgWgPipelines.h index 0a1fee6d..bba7d864 100755 --- a/src/renderer/wg_engine/tvgWgPipelines.h +++ b/src/renderer/wg_engine/tvgWgPipelines.h @@ -65,7 +65,8 @@ public: WGPURenderPipeline radial[2]{}; WGPURenderPipeline linear[2]{}; WGPURenderPipeline image[2]{}; - WGPURenderPipeline sceneComp[12]; + WGPURenderPipeline sceneClip; + WGPURenderPipeline sceneComp[12]; // TODO: update to 11 after removing CompositeMethod::ClipPath enum value WGPURenderPipeline sceneBlend; WGPURenderPipeline blit{}; WGPURenderPipeline clipPath{};