From b4304b6d1f7ff979d3434c5b19458ede013b6c97 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 18 Oct 2024 12:58:21 +0900 Subject: [PATCH] gl_engine: code refactoring - clean up code - resolve some data casting compiler warnings --- src/renderer/gl_engine/tvgGlRenderTask.h | 14 +- src/renderer/gl_engine/tvgGlRenderer.cpp | 463 +++++++++-------------- 2 files changed, 195 insertions(+), 282 deletions(-) diff --git a/src/renderer/gl_engine/tvgGlRenderTask.h b/src/renderer/gl_engine/tvgGlRenderTask.h index 774b6d7d..cc20ffe2 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.h +++ b/src/renderer/gl_engine/tvgGlRenderTask.h @@ -53,20 +53,20 @@ struct GlBindingResource * Can be a uniform location for a texture * Can be a uniform buffer binding index for a uniform block */ - uint32_t bindPoint = {}; - uint32_t location = {}; - GLuint gBufferId = {}; - uint32_t bufferOffset = {}; - uint32_t bufferRange = {}; + uint32_t bindPoint = 0; + GLint location = 0; + GLuint gBufferId = 0; + uint32_t bufferOffset = 0; + uint32_t bufferRange = 0; GlBindingResource() = default; - GlBindingResource(uint32_t index, uint32_t location, uint32_t bufferId, uint32_t offset, uint32_t range) + GlBindingResource(uint32_t index, GLint location, GLuint bufferId, uint32_t offset, uint32_t range) : type(GlBindingType::kUniformBuffer), bindPoint(index), location(location), gBufferId(bufferId), bufferOffset(offset), bufferRange(range) { } - GlBindingResource(uint32_t bindPoint, uint32_t texId, uint32_t location) + GlBindingResource(uint32_t bindPoint, GLuint texId, GLint location) : type(GlBindingType::kTexture), bindPoint(bindPoint), location(location), gBufferId(texId) { } diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 8eb9865b..fbcfc034 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -126,7 +126,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b, bbox.intersect(vp); - bool complexBlend = beginComplexBlending(bbox, sdata.geometry->getBounds()); + auto complexBlend = beginComplexBlending(bbox, sdata.geometry->getBounds()); if (complexBlend) { vp = currentPass()->getViewport(); @@ -149,12 +149,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b, return; } - task->setViewport(RenderRegion { - x, - vp.h - y - h, - w, - h - }); + task->setViewport({x, vp.h - y - h, w, h}); GlRenderTask* stencilTask = nullptr; @@ -175,60 +170,47 @@ void GlRenderer::drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b, } // matrix buffer - { - const auto& matrix = sdata.geometry->getTransformMatrix(); + const auto& matrix = sdata.geometry->getTransformMatrix(); - float matrix44[16]; + float matrix44[16]; + currentPass()->getMatrix(matrix44, matrix); + auto viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); - currentPass()->getMatrix(matrix44, matrix); + task->addBindResource(GlBindingResource{ + 0, + task->getProgram()->getUniformBlockIndex("Matrix"), + mGpuBuffer->getBufferId(), + viewOffset, + 16 * sizeof(float), + }); - uint32_t loc = task->getProgram()->getUniformBlockIndex("Matrix"); - - uint32_t viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); - - task->addBindResource(GlBindingResource{ + if (stencilTask) { + stencilTask->addBindResource(GlBindingResource{ 0, - loc, + stencilTask->getProgram()->getUniformBlockIndex("Matrix"), mGpuBuffer->getBufferId(), viewOffset, 16 * sizeof(float), }); - - if (stencilTask) { - stencilTask->addBindResource(GlBindingResource{ - 0, - static_cast(stencilTask->getProgram()->getUniformBlockIndex("Matrix")), - mGpuBuffer->getBufferId(), - viewOffset, - 16 * sizeof(float), - }); - } } + // color - { - float color[4] = {r / 255.f, g / 255.f, b / 255.f, a / 255.f}; + float color[4] = {r / 255.f, g / 255.f, b / 255.f, a / 255.f}; - uint32_t loc = task->getProgram()->getUniformBlockIndex("ColorInfo"); + task->addBindResource(GlBindingResource{ + 1, + task->getProgram()->getUniformBlockIndex("ColorInfo"), + mGpuBuffer->getBufferId(), + mGpuBuffer->push(color, 4 * sizeof(float), true), + 4 * sizeof(float), + }); - task->addBindResource(GlBindingResource{ - 1, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(color, 4 * sizeof(float), true), - 4 * sizeof(float), - }); - } - - if (stencilTask) { - currentPass()->addRenderTask(new GlStencilCoverTask(stencilTask, task, stencilMode)); - } else { - currentPass()->addRenderTask(task); - } + if (stencilTask) currentPass()->addRenderTask(new GlStencilCoverTask(stencilTask, task, stencilMode)); + else currentPass()->addRenderTask(task); if (complexBlend) { auto task = new GlRenderTask(mPrograms[RT_Stencil].get()); sdata.geometry->draw(task, mGpuBuffer.get(), flag); - endBlendingCompose(task, sdata.geometry->getTransformMatrix()); } } @@ -242,8 +224,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla bbox.intersect(vp); const Fill::ColorStop* stops = nullptr; - auto stopCnt = min(fill->colorStops(&stops), - static_cast(MAX_GRADIENT_STOPS)); + auto stopCnt = min(fill->colorStops(&stops), static_cast(MAX_GRADIENT_STOPS)); if (stopCnt < 2) return; GlRenderTask* task = nullptr; @@ -263,19 +244,14 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla return; } - bool complexBlend = beginComplexBlending(bbox, sdata.geometry->getBounds()); + auto complexBlend = beginComplexBlending(bbox, sdata.geometry->getBounds()); if (complexBlend) vp = currentPass()->getViewport(); auto x = bbox.x - vp.x; auto y = bbox.y - vp.y; - task->setViewport(RenderRegion { - x, - vp.h - y - bbox.h, - bbox.w, - bbox.h - }); + task->setViewport({x, vp.h - y - bbox.h, bbox.w, bbox.h}); GlRenderTask* stencilTask = nullptr; GlStencilMode stencilMode = sdata.geometry->getStencilMode(flag); @@ -285,139 +261,132 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla } // matrix buffer - { - const auto& matrix = sdata.geometry->getTransformMatrix(); + const auto& matrix = sdata.geometry->getTransformMatrix(); + float invMat4[16]; + Matrix inv; + inverse(&fill->transform(), &inv); + GET_MATRIX44(inv, invMat4); - float invMat4[16]; - Matrix inv; - inverse(&fill->transform(), &inv); - GET_MATRIX44(inv, invMat4); + float matrix44[16]; + currentPass()->getMatrix(matrix44, matrix); - float matrix44[16]; - currentPass()->getMatrix(matrix44, matrix); + auto viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); - uint32_t loc = task->getProgram()->getUniformBlockIndex("Matrix"); - uint32_t viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); + task->addBindResource(GlBindingResource{ + 0, + task->getProgram()->getUniformBlockIndex("Matrix"), + mGpuBuffer->getBufferId(), + viewOffset, + 16 * sizeof(float), + }); - task->addBindResource(GlBindingResource{ + if (stencilTask) { + stencilTask->addBindResource(GlBindingResource{ 0, - loc, - mGpuBuffer->getBufferId(), - viewOffset, - 16 * sizeof(float), - }); - - if (stencilTask) { - stencilTask->addBindResource(GlBindingResource{ - 0, - static_cast(stencilTask->getProgram()->getUniformBlockIndex("Matrix")), - mGpuBuffer->getBufferId(), - viewOffset, - 16 * sizeof(float), - }); - } - - loc = task->getProgram()->getUniformBlockIndex("InvMatrix"); - viewOffset = mGpuBuffer->push(invMat4, 16 * sizeof(float), true); - - task->addBindResource(GlBindingResource{ - 1, - loc, + stencilTask->getProgram()->getUniformBlockIndex("Matrix"), mGpuBuffer->getBufferId(), viewOffset, 16 * sizeof(float), }); } - float alpha = 1.0f; + viewOffset = mGpuBuffer->push(invMat4, 16 * sizeof(float), true); + + task->addBindResource(GlBindingResource{ + 1, + task->getProgram()->getUniformBlockIndex("InvMatrix"), + mGpuBuffer->getBufferId(), + viewOffset, + 16 * sizeof(float), + }); + + auto alpha = 1.0f; if (flag & RenderUpdateFlag::GradientStroke) { - float strokeWidth = sdata.rshape->strokeWidth(); + auto strokeWidth = sdata.rshape->strokeWidth(); if (strokeWidth < MIN_GL_STROKE_WIDTH) { alpha = strokeWidth / MIN_GL_STROKE_WIDTH; } } // gradient block - { - GlBindingResource gradientBinding{}; - uint32_t loc = task->getProgram()->getUniformBlockIndex("GradientInfo"); + GlBindingResource gradientBinding{}; + auto loc = task->getProgram()->getUniformBlockIndex("GradientInfo"); - if (fill->type() == Type::LinearGradient) { - auto linearFill = static_cast(fill); + if (fill->type() == Type::LinearGradient) { + auto linearFill = static_cast(fill); - GlLinearGradientBlock gradientBlock; + GlLinearGradientBlock gradientBlock; - gradientBlock.nStops[1] = NOISE_LEVEL; - gradientBlock.nStops[2] = static_cast(fill->spread()) * 1.f; - uint32_t nStops = 0; - for (uint32_t i = 0; i < stopCnt; ++i) { - if (i > 0 && gradientBlock.stopPoints[nStops - 1] > stops[i].offset) continue; + gradientBlock.nStops[1] = NOISE_LEVEL; + gradientBlock.nStops[2] = static_cast(fill->spread()) * 1.f; + uint32_t nStops = 0; + for (uint32_t i = 0; i < stopCnt; ++i) { + if (i > 0 && gradientBlock.stopPoints[nStops - 1] > stops[i].offset) continue; - gradientBlock.stopPoints[i] = stops[i].offset; - gradientBlock.stopColors[i * 4 + 0] = stops[i].r / 255.f; - gradientBlock.stopColors[i * 4 + 1] = stops[i].g / 255.f; - gradientBlock.stopColors[i * 4 + 2] = stops[i].b / 255.f; - gradientBlock.stopColors[i * 4 + 3] = stops[i].a / 255.f * alpha; - nStops++; - } - gradientBlock.nStops[0] = nStops * 1.f; - - float x1, x2, y1, y2; - linearFill->linear(&x1, &y1, &x2, &y2); - - gradientBlock.startPos[0] = x1; - gradientBlock.startPos[1] = y1; - gradientBlock.stopPos[0] = x2; - gradientBlock.stopPos[1] = y2; - - gradientBinding = GlBindingResource{ - 2, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(&gradientBlock, sizeof(GlLinearGradientBlock), true), - sizeof(GlLinearGradientBlock), - }; - } else { - auto radialFill = static_cast(fill); - - GlRadialGradientBlock gradientBlock; - - gradientBlock.nStops[1] = NOISE_LEVEL; - gradientBlock.nStops[2] = static_cast(fill->spread()) * 1.f; - - uint32_t nStops = 0; - for (uint32_t i = 0; i < stopCnt; ++i) { - if (i > 0 && gradientBlock.stopPoints[nStops - 1] > stops[i].offset) continue; - - gradientBlock.stopPoints[i] = stops[i].offset; - gradientBlock.stopColors[i * 4 + 0] = stops[i].r / 255.f; - gradientBlock.stopColors[i * 4 + 1] = stops[i].g / 255.f; - gradientBlock.stopColors[i * 4 + 2] = stops[i].b / 255.f; - gradientBlock.stopColors[i * 4 + 3] = stops[i].a / 255.f * alpha; - nStops++; - } - gradientBlock.nStops[0] = nStops * 1.f; - - float x, y, r; - radialFill->radial(&x, &y, &r); - - gradientBlock.centerPos[0] = x; - gradientBlock.centerPos[1] = y; - gradientBlock.radius[0] = r; - - gradientBinding = GlBindingResource{ - 2, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(&gradientBlock, sizeof(GlRadialGradientBlock), true), - sizeof(GlRadialGradientBlock), - }; + gradientBlock.stopPoints[i] = stops[i].offset; + gradientBlock.stopColors[i * 4 + 0] = stops[i].r / 255.f; + gradientBlock.stopColors[i * 4 + 1] = stops[i].g / 255.f; + gradientBlock.stopColors[i * 4 + 2] = stops[i].b / 255.f; + gradientBlock.stopColors[i * 4 + 3] = stops[i].a / 255.f * alpha; + nStops++; } + gradientBlock.nStops[0] = nStops * 1.f; - task->addBindResource(gradientBinding); + float x1, x2, y1, y2; + linearFill->linear(&x1, &y1, &x2, &y2); + + gradientBlock.startPos[0] = x1; + gradientBlock.startPos[1] = y1; + gradientBlock.stopPos[0] = x2; + gradientBlock.stopPos[1] = y2; + + gradientBinding = GlBindingResource{ + 2, + loc, + mGpuBuffer->getBufferId(), + mGpuBuffer->push(&gradientBlock, sizeof(GlLinearGradientBlock), true), + sizeof(GlLinearGradientBlock), + }; + } else { + auto radialFill = static_cast(fill); + + GlRadialGradientBlock gradientBlock; + + gradientBlock.nStops[1] = NOISE_LEVEL; + gradientBlock.nStops[2] = static_cast(fill->spread()) * 1.f; + + uint32_t nStops = 0; + for (uint32_t i = 0; i < stopCnt; ++i) { + if (i > 0 && gradientBlock.stopPoints[nStops - 1] > stops[i].offset) continue; + + gradientBlock.stopPoints[i] = stops[i].offset; + gradientBlock.stopColors[i * 4 + 0] = stops[i].r / 255.f; + gradientBlock.stopColors[i * 4 + 1] = stops[i].g / 255.f; + gradientBlock.stopColors[i * 4 + 2] = stops[i].b / 255.f; + gradientBlock.stopColors[i * 4 + 3] = stops[i].a / 255.f * alpha; + nStops++; + } + gradientBlock.nStops[0] = nStops * 1.f; + + float x, y, r; + radialFill->radial(&x, &y, &r); + + gradientBlock.centerPos[0] = x; + gradientBlock.centerPos[1] = y; + gradientBlock.radius[0] = r; + + gradientBinding = GlBindingResource{ + 2, + loc, + mGpuBuffer->getBufferId(), + mGpuBuffer->push(&gradientBlock, sizeof(GlRadialGradientBlock), true), + sizeof(GlRadialGradientBlock), + }; } + task->addBindResource(gradientBinding); + if (stencilTask) { currentPass()->addRenderTask(new GlStencilCoverTask(stencilTask, task, stencilMode)); } else { @@ -494,12 +463,7 @@ void GlRenderer::drawClip(Array& clips) auto x = bbox.x - vp.x; auto y = bbox.y - vp.y; - clipTask->setViewport(RenderRegion { - x, - vp.h - y - bbox.h, - bbox.w, - bbox.h, - }); + clipTask->setViewport({x, vp.h - y - bbox.h, bbox.w, bbox.h}); const auto& matrix = sdata->geometry->getTransformMatrix(); @@ -507,9 +471,8 @@ void GlRenderer::drawClip(Array& clips) currentPass()->getMatrix(matrix44, matrix); - uint32_t loc = clipTask->getProgram()->getUniformBlockIndex("Matrix"); - - uint32_t viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); + auto loc = clipTask->getProgram()->getUniformBlockIndex("Matrix"); + auto viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); clipTask->addBindResource(GlBindingResource{ 0, @@ -532,7 +495,7 @@ void GlRenderer::drawClip(Array& clips) }); maskTask->setDrawRange(identityIndexOffset, 6); - maskTask->setViewport(RenderRegion{0, 0, static_cast(vp.w), static_cast(vp.h)}); + maskTask->setViewport({0, 0, static_cast(vp.w), static_cast(vp.h)}); currentPass()->addRenderTask(new GlClipTask(clipTask, maskTask)); } @@ -585,26 +548,19 @@ void GlRenderer::endBlendingCompose(GlRenderTask* stencilTask, const Matrix& mat auto w = vp.w; auto h = vp.h; - stencilTask->setViewport(RenderRegion{ - x, - passVp.h - y - h, - w, - h, - }); + stencilTask->setViewport({x, passVp.h - y - h, w, h}); } stencilTask->setDrawDepth(currentPass()->nextDrawDepth()); { // set view matrix - uint32_t loc = stencilTask->getProgram()->getUniformBlockIndex("Matrix"); - float matrix44[16]; currentPass()->getMatrix(matrix44, matrix); uint32_t viewOffset = mGpuBuffer->push(matrix44, 16 * sizeof(float), true); stencilTask->addBindResource(GlBindingResource{ 0, - loc, + stencilTask->getProgram()->getUniformBlockIndex("Matrix"), mGpuBuffer->getBufferId(), viewOffset, 16 * sizeof(float), @@ -618,14 +574,8 @@ void GlRenderer::endBlendingCompose(GlRenderTask* stencilTask, const Matrix& mat task->setDrawDepth(currentPass()->nextDrawDepth()); // src and dst texture - { - uint32_t loc = task->getProgram()->getUniformLocation("uSrcTexture"); - task->addBindResource(GlBindingResource{1, blendPass.getFbo()->getColorTexture(), loc}); - } - { - uint32_t loc = task->getProgram()->getUniformLocation("uDstTexture"); - task->addBindResource(GlBindingResource{2, dstCopyFbo->getColorTexture(), loc}); - } + task->addBindResource(GlBindingResource{1, blendPass.getFbo()->getColorTexture(), task->getProgram()->getUniformLocation("uSrcTexture")}); + task->addBindResource(GlBindingResource{2, dstCopyFbo->getColorTexture(), task->getProgram()->getUniformLocation("uDstTexture")}); currentPass()->addRenderTask(task); } @@ -661,11 +611,7 @@ void GlRenderer::prepareBlitTask(GlBlitTask* task) { RenderRegion region{0, 0, static_cast(surface.w), static_cast(surface.h)}; prepareCmpTask(task, region, surface.w, surface.h); - - { - uint32_t loc = task->getProgram()->getUniformLocation("uSrcTexture"); - task->addBindResource(GlBindingResource{0, task->getColorTexture(), loc}); - } + task->addBindResource(GlBindingResource{0, task->getColorTexture(), task->getProgram()->getUniformLocation("uSrcTexture")}); } @@ -739,12 +685,7 @@ void GlRenderer::prepareCmpTask(GlRenderTask* task, const RenderRegion& vp, uint task->setDrawRange(indexOffset, indices.count); - task->setViewport(RenderRegion{ - x, - static_cast((passVp.h - y - h)), - w, - h, - }); + task->setViewport({x, static_cast((passVp.h - y - h)), w, h}); } @@ -810,8 +751,8 @@ void GlRenderer::endRenderPass(RenderCompositor* cmp) prepareCmpTask(compose_task, gl_cmp->bbox, self_pass.getFboWidth(), self_pass.getFboHeight()); - compose_task->addBindResource(GlBindingResource{0, self_pass.getTextureId(), (uint)program->getUniformLocation("uSrcTexture")}); - compose_task->addBindResource(GlBindingResource{1, mask_pass.getTextureId(), (uint)program->getUniformLocation("uMaskTexture")}); + compose_task->addBindResource(GlBindingResource{0, self_pass.getTextureId(), program->getUniformLocation("uSrcTexture")}); + compose_task->addBindResource(GlBindingResource{1, mask_pass.getTextureId(), program->getUniformLocation("uMaskTexture")}); compose_task->setDrawDepth(currentPass()->nextDrawDepth()); compose_task->setParentSize(static_cast(currentPass()->getViewport().w), static_cast(currentPass()->getViewport().h)); @@ -830,41 +771,29 @@ void GlRenderer::endRenderPass(RenderCompositor* cmp) task->setDrawDepth(currentPass()->nextDrawDepth()); // matrix buffer - { - float matrix[16]; - memset(matrix, 0, 16 * sizeof(float)); - matrix[0] = 1.f; - matrix[5] = 1.f; - matrix[10] = 1.f; - matrix[15] = 1.f; - uint32_t loc = task->getProgram()->getUniformBlockIndex("Matrix"); + float matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; + + task->addBindResource(GlBindingResource{ + 0, + task->getProgram()->getUniformBlockIndex("Matrix"), + mGpuBuffer->getBufferId(), + mGpuBuffer->push(matrix, 16 * sizeof(float), true), + 16 * sizeof(float), + }); - task->addBindResource(GlBindingResource{ - 0, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(matrix, 16 * sizeof(float), true), - 16 * sizeof(float), - }); - } // image info - { - uint32_t info[4] = {(uint32_t)ColorSpace::ABGR8888, 0, cmp->opacity, 0}; - uint32_t loc = task->getProgram()->getUniformBlockIndex("ColorInfo"); + uint32_t info[4] = {(uint32_t)ColorSpace::ABGR8888, 0, cmp->opacity, 0}; + + task->addBindResource(GlBindingResource{ + 1, + task->getProgram()->getUniformBlockIndex("ColorInfo"), + mGpuBuffer->getBufferId(), + mGpuBuffer->push(info, 4 * sizeof(uint32_t), true), + 4 * sizeof(uint32_t), + }); - task->addBindResource(GlBindingResource{ - 1, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(info, 4 * sizeof(uint32_t), true), - 4 * sizeof(uint32_t), - }); - } // texture id - { - uint32_t loc = task->getProgram()->getUniformLocation("uTexture"); - task->addBindResource(GlBindingResource{0, renderPass.getTextureId(), loc}); - } + task->addBindResource(GlBindingResource{0, renderPass.getTextureId(), task->getProgram()->getUniformLocation("uTexture")}); task->setParentSize(static_cast(currentPass()->getViewport().w), static_cast(currentPass()->getViewport().h)); currentPass()->addRenderTask(std::move(task)); } @@ -897,7 +826,7 @@ bool GlRenderer::target(int32_t id, uint32_t w, uint32_t h) mTargetFboId = static_cast(id); mRootTarget = make_unique(surface.w, surface.h); - mRootTarget->setViewport(RenderRegion{0, 0, static_cast(surface.w), static_cast(surface.h)}); + mRootTarget->setViewport({0, 0, static_cast(surface.w), static_cast(surface.h)}); mRootTarget->init(mTargetFboId); mRenderPassStack.clear(); @@ -932,7 +861,7 @@ bool GlRenderer::sync() prepareBlitTask(task); task->mClearBuffer = mClearBuffer; - task->setTargetViewport(RenderRegion{0, 0, static_cast(surface.w), static_cast(surface.h)}); + task->setTargetViewport({0, 0, static_cast(surface.w), static_cast(surface.h)}); mGpuBuffer->flushToGPU(); mGpuBuffer->bind(); @@ -955,7 +884,7 @@ bool GlRenderer::sync() RenderRegion GlRenderer::region(RenderData data) { - if (currentPass()->isEmpty()) return RenderRegion{0, 0, 0, 0}; + if (currentPass()->isEmpty()) return {0, 0, 0, 0}; auto shape = reinterpret_cast(data); auto bounds = shape->geometry->getBounds(); @@ -1116,55 +1045,39 @@ bool GlRenderer::renderImage(void* data) if (complexBlend) vp = currentPass()->getViewport(); // matrix buffer - { - const auto& matrix = sdata->geometry->getTransformMatrix(); + const auto& matrix = sdata->geometry->getTransformMatrix(); + float matrix44[16]; + currentPass()->getMatrix(matrix44, matrix); - float matrix44[16]; - - currentPass()->getMatrix(matrix44, matrix); - - uint32_t loc = task->getProgram()->getUniformBlockIndex("Matrix"); - - task->addBindResource(GlBindingResource{ - 0, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(matrix44, 16 * sizeof(float), true), - 16 * sizeof(float), - }); - } - // image info - { - uint32_t info[4] = {(uint32_t)sdata->texColorSpace, sdata->texFlipY, sdata->opacity, 0}; - uint32_t loc = task->getProgram()->getUniformBlockIndex("ColorInfo"); - - task->addBindResource(GlBindingResource{ - 1, - loc, - mGpuBuffer->getBufferId(), - mGpuBuffer->push(info, 4 * sizeof(uint32_t), true), - 4 * sizeof(uint32_t), - }); - } - // texture id - { - uint32_t loc = task->getProgram()->getUniformLocation("uTexture"); - task->addBindResource(GlBindingResource{0, sdata->texId, loc}); - } - - task->setViewport(RenderRegion{ - x, - vp.h - y - bbox.h, - bbox.w, - bbox.h + task->addBindResource(GlBindingResource{ + 0, + task->getProgram()->getUniformBlockIndex("Matrix"), + mGpuBuffer->getBufferId(), + mGpuBuffer->push(matrix44, 16 * sizeof(float), true), + 16 * sizeof(float), }); + // image info + uint32_t info[4] = {(uint32_t)sdata->texColorSpace, sdata->texFlipY, sdata->opacity, 0}; + + task->addBindResource(GlBindingResource{ + 1, + task->getProgram()->getUniformBlockIndex("ColorInfo"), + mGpuBuffer->getBufferId(), + mGpuBuffer->push(info, 4 * sizeof(uint32_t), true), + 4 * sizeof(uint32_t), + }); + + // texture id + task->addBindResource(GlBindingResource{0, sdata->texId, task->getProgram()->getUniformLocation("uTexture")}); + + task->setViewport({x, vp.h - y - bbox.h, bbox.w, bbox.h}); + currentPass()->addRenderTask(task); if (complexBlend) { auto task = new GlRenderTask(mPrograms[RT_Stencil].get()); sdata->geometry->draw(task, mGpuBuffer.get(), RenderUpdateFlag::Image); - endBlendingCompose(task, sdata->geometry->getTransformMatrix()); }