diff --git a/src/renderer/gl_engine/tvgGlGeometry.cpp b/src/renderer/gl_engine/tvgGlGeometry.cpp index 99d81004..1a3d837b 100644 --- a/src/renderer/gl_engine/tvgGlGeometry.cpp +++ b/src/renderer/gl_engine/tvgGlGeometry.cpp @@ -178,7 +178,7 @@ bool GlGeometry::draw(GlRenderTask* task, GlStageBuffer* gpuBuffer, RenderUpdate task->addVertexLayout(GlVertexLayout{0, 3, 3 * sizeof(float), vertexOffset}); } task->setDrawRange(indexOffset, indexBuffer->count); - + task->setViewport(viewport); return true; } @@ -200,6 +200,11 @@ void GlGeometry::updateTransform(const RenderTransform* transform, float w, floa MULTIPLY_MATRIX(mvp, modelMatrix, mTransform) } +void GlGeometry::setViewport(const RenderRegion& viewport) +{ + this->viewport = viewport; +} + float* GlGeometry::getTransforMatrix() { return mTransform; diff --git a/src/renderer/gl_engine/tvgGlGeometry.h b/src/renderer/gl_engine/tvgGlGeometry.h index a42ddc3b..355b61cc 100644 --- a/src/renderer/gl_engine/tvgGlGeometry.h +++ b/src/renderer/gl_engine/tvgGlGeometry.h @@ -193,9 +193,11 @@ public: void disableVertex(uint32_t location); bool draw(GlRenderTask* task, GlStageBuffer* gpuBuffer, RenderUpdateFlag flag); void updateTransform(const RenderTransform* transform, float w, float h); + void setViewport(const RenderRegion& viewport); float* getTransforMatrix(); private: + RenderRegion viewport = {}; Array fillVertex = {}; Array strokeVertex = {}; Array fillIndex = {}; diff --git a/src/renderer/gl_engine/tvgGlRenderTask.cpp b/src/renderer/gl_engine/tvgGlRenderTask.cpp index 62190187..afc17ce5 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.cpp +++ b/src/renderer/gl_engine/tvgGlRenderTask.cpp @@ -31,6 +31,10 @@ void GlRenderTask::run() { // bind shader mProgram->load(); + + // setup scissor rect + GL_CHECK(glScissor(mViewport.x, mViewport.y, mViewport.w, mViewport.h)); + // setup attribute layout for (uint32_t i = 0; i < mVertexLayout.count; i++) { const auto &layout = mVertexLayout[i]; @@ -79,4 +83,9 @@ void GlRenderTask::setDrawRange(uint32_t offset, uint32_t count) { mIndexOffset = offset; mIndexCount = count; -} \ No newline at end of file +} + +void GlRenderTask::setViewport(const RenderRegion &viewport) +{ + mViewport = viewport; +} diff --git a/src/renderer/gl_engine/tvgGlRenderTask.h b/src/renderer/gl_engine/tvgGlRenderTask.h index f69156e3..2405e4ec 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.h +++ b/src/renderer/gl_engine/tvgGlRenderTask.h @@ -81,10 +81,12 @@ public: void addVertexLayout(const GlVertexLayout& layout); void addBindResource(const GlBindingResource& binding); void setDrawRange(uint32_t offset, uint32_t count); + void setViewport(const RenderRegion& viewport); GlProgram* getProgram() { return mProgram; } private: GlProgram* mProgram; + RenderRegion mViewport = {}; uint32_t mIndexOffset = {}; uint32_t mIndexCount = {}; Array mVertexLayout = {}; diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 1f98b5bb..0da20987 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -63,6 +63,11 @@ bool GlRenderer::target(TVG_UNUSED uint32_t* buffer, uint32_t stride, uint32_t w surface.w = w; surface.h = h; + mViewport.x = 0; + mViewport.y = 0; + mViewport.w = surface.w; + mViewport.h = surface.h; + return true; } @@ -74,6 +79,7 @@ bool GlRenderer::sync() // Blend function for straight alpha GL_CHECK(glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); GL_CHECK(glEnable(GL_BLEND)); + GL_CHECK(glEnable(GL_SCISSOR_TEST)); mGpuBuffer->bind(); @@ -85,6 +91,8 @@ bool GlRenderer::sync() mRenderTasks.clear(); + GL_CHECK(glDisable(GL_SCISSOR_TEST)); + return true; } @@ -204,8 +212,6 @@ bool GlRenderer::renderShape(RenderData data) uint8_t r = 0, g = 0, b = 0, a = 0; size_t flags = static_cast(sdata->updateFlag); - GL_CHECK(glViewport(0, 0, (GLsizei)sdata->viewWd, (GLsizei)sdata->viewHt)); - if (flags & (RenderUpdateFlag::Gradient | RenderUpdateFlag::Transform)) { auto gradient = sdata->rshape->fill; @@ -283,6 +289,12 @@ RenderData GlRenderer::prepare(Surface* image, const RenderMesh* mesh, RenderDat sdata->geometry = make_unique(); sdata->geometry->updateTransform(transform, sdata->viewWd, sdata->viewHt); + sdata->geometry->setViewport(RenderRegion{ + mViewport.x, + static_cast((surface.h - mViewport.y - mViewport.h)), + mViewport.w, + mViewport.h, + }); sdata->geometry->tesselate(image, mesh, flags); @@ -327,6 +339,12 @@ RenderData GlRenderer::prepare(const RenderShape& rshape, RenderData data, const } sdata->geometry->updateTransform(transform, sdata->viewWd, sdata->viewHt); + sdata->geometry->setViewport(RenderRegion{ + mViewport.x, + static_cast(surface.h - mViewport.y - mViewport.h), + mViewport.w, + mViewport.h, + }); if (sdata->updateFlag & (RenderUpdateFlag::Color | RenderUpdateFlag::Stroke | RenderUpdateFlag::Gradient | RenderUpdateFlag::Transform) ) { @@ -342,9 +360,9 @@ RenderRegion GlRenderer::viewport() } -bool GlRenderer::viewport(TVG_UNUSED const RenderRegion& vp) +bool GlRenderer::viewport(const RenderRegion& vp) { - //TODO: + mViewport = vp; return true; } @@ -382,7 +400,7 @@ GlRenderer* GlRenderer::gen() return new GlRenderer(); } -GlRenderer::GlRenderer() :mGpuBuffer(new GlStageBuffer), mPrograms(), mRenderTasks() +GlRenderer::GlRenderer() :mViewport() ,mGpuBuffer(new GlStageBuffer), mPrograms(), mRenderTasks() { } diff --git a/src/renderer/gl_engine/tvgGlRenderer.h b/src/renderer/gl_engine/tvgGlRenderer.h index 08fdd090..d394cd5c 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.h +++ b/src/renderer/gl_engine/tvgGlRenderer.h @@ -78,6 +78,7 @@ private: void drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b, uint8_t a, RenderUpdateFlag flag); void drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFlag flag); + RenderRegion mViewport; std::unique_ptr mGpuBuffer; vector> mPrograms; vector> mRenderTasks;