CompositeMethod::ClipPath will be replaced with the Scene::clip()

wg_engine needs to refactor to remove the enum value usage before proceeding with its removal
This commit is contained in:
Sergii Liebodkin 2024-09-29 14:11:20 +00:00 committed by Hermet Park
parent ff2cacd25d
commit b66ff36502
4 changed files with 48 additions and 29 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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]);

View file

@ -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{};