From 2038818e1685e5cc7ac434bb648ee9281b1e17a7 Mon Sep 17 00:00:00 2001 From: RuiwenTang Date: Sun, 22 Oct 2023 20:01:23 +0800 Subject: [PATCH] gl_engine: use raw pointer to pass and hold GlRenderTask --- src/renderer/gl_engine/tvgGlRenderPass.cpp | 26 +++++++++++++++++----- src/renderer/gl_engine/tvgGlRenderPass.h | 8 +++---- src/renderer/gl_engine/tvgGlRenderTask.cpp | 23 ++++++++++++++----- src/renderer/gl_engine/tvgGlRenderTask.h | 10 ++++----- src/renderer/gl_engine/tvgGlRenderer.cpp | 26 ++++++++++++---------- 5 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/renderer/gl_engine/tvgGlRenderPass.cpp b/src/renderer/gl_engine/tvgGlRenderPass.cpp index 1160c3e4..d541e34d 100644 --- a/src/renderer/gl_engine/tvgGlRenderPass.cpp +++ b/src/renderer/gl_engine/tvgGlRenderPass.cpp @@ -63,11 +63,25 @@ void GlRenderTarget::init(GLint resolveId) GlRenderPass::GlRenderPass(GlRenderTarget* fbo): mFbo(fbo), mTasks() {} -GlRenderPass::GlRenderPass(GlRenderPass&& other): mFbo(other.mFbo), mTasks(std::move(other.mTasks)) {} - -GlRenderPass::~GlRenderPass() {} - -void GlRenderPass::addRenderTask(unique_ptr task) +GlRenderPass::GlRenderPass(GlRenderPass&& other): mFbo(other.mFbo), mTasks() { - mTasks.emplace_back(std::move(task)); + mTasks.push(other.mTasks); + + other.mTasks.clear(); +} + +GlRenderPass::~GlRenderPass() +{ + if (mTasks.empty()) return; + + for(uint32_t i = 0; i < mTasks.count; i++) { + delete mTasks[i]; + } + + mTasks.clear(); +} + +void GlRenderPass::addRenderTask(GlRenderTask* task) +{ + mTasks.push(task); } diff --git a/src/renderer/gl_engine/tvgGlRenderPass.h b/src/renderer/gl_engine/tvgGlRenderPass.h index eedad0fc..eb5783ae 100644 --- a/src/renderer/gl_engine/tvgGlRenderPass.h +++ b/src/renderer/gl_engine/tvgGlRenderPass.h @@ -57,17 +57,17 @@ public: ~GlRenderPass(); - void addRenderTask(unique_ptr task); + void addRenderTask(GlRenderTask* task); GLuint getFboId() { return mFbo->getFboId(); } template - unique_ptr endRenderPass(GlProgram* program, GLuint targetFbo) { - return make_unique(program, targetFbo, mFbo->getFboId(), std::move(mTasks)); + T* endRenderPass(GlProgram* program, GLuint targetFbo) { + return new T(program, targetFbo, mFbo->getFboId(), std::move(mTasks)); } private: GlRenderTarget* mFbo; - vector> mTasks = {}; + Array mTasks = {}; }; diff --git a/src/renderer/gl_engine/tvgGlRenderTask.cpp b/src/renderer/gl_engine/tvgGlRenderTask.cpp index 9e06d9d5..def3160d 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.cpp +++ b/src/renderer/gl_engine/tvgGlRenderTask.cpp @@ -90,9 +90,20 @@ void GlRenderTask::setViewport(const RenderRegion &viewport) mViewport = viewport; } -GlComposeTask::GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, vector> tasks) - :GlRenderTask(program) ,mTargetFbo(target), mSelfFbo(selfFbo), mTasks(std::move(tasks)) +GlComposeTask::GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, Array&& tasks) + :GlRenderTask(program) ,mTargetFbo(target), mSelfFbo(selfFbo), mTasks() { + mTasks.push(tasks); + tasks.clear(); +} + +GlComposeTask::~GlComposeTask() +{ + for(uint32_t i = 0; i < mTasks.count; i++) { + delete mTasks[i]; + } + + mTasks.clear(); } void GlComposeTask::run() @@ -106,12 +117,12 @@ void GlComposeTask::run() GL_CHECK(glDrawBuffers(1, &color_buffer)); GL_CHECK(glClearBufferfv(GL_COLOR, 0, transparent)); - for(auto& task : mTasks) { - task->run(); + for(uint32_t i = 0; i < mTasks.count; i++) { + mTasks[i]->run(); } } -GlBlitTask::GlBlitTask(GlProgram* program, GLuint target, GLuint compose, vector> tasks) +GlBlitTask::GlBlitTask(GlProgram* program, GLuint target, GLuint compose, Array&& tasks) : GlComposeTask(program, target, compose, std::move(tasks)) { } @@ -132,7 +143,7 @@ void GlBlitTask::run() GL_CHECK(glBlitFramebuffer(0, 0, mWidth, mHeight, 0, 0, mWidth, mHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST)); } -GlDrawBlitTask::GlDrawBlitTask(GlProgram* program, GLuint target, GLuint compose, vector> tasks) +GlDrawBlitTask::GlDrawBlitTask(GlProgram* program, GLuint target, GLuint compose, Array&& tasks) : GlComposeTask(program, target, compose, std::move(tasks)) { } diff --git a/src/renderer/gl_engine/tvgGlRenderTask.h b/src/renderer/gl_engine/tvgGlRenderTask.h index 12cbeba5..4e00dadd 100644 --- a/src/renderer/gl_engine/tvgGlRenderTask.h +++ b/src/renderer/gl_engine/tvgGlRenderTask.h @@ -98,8 +98,8 @@ private: class GlComposeTask : public GlRenderTask { public: - GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, vector> tasks); - ~GlComposeTask() override = default; + GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, Array&& tasks); + ~GlComposeTask() override; void run() override; @@ -111,13 +111,13 @@ protected: private: GLuint mTargetFbo; GLuint mSelfFbo; - vector> mTasks; + Array mTasks; }; class GlBlitTask : public GlComposeTask { public: - GlBlitTask(GlProgram*, GLuint target, GLuint compose, vector> tasks); + GlBlitTask(GlProgram*, GLuint target, GLuint compose, Array&& tasks); ~GlBlitTask() override = default; void setSize(uint32_t width, uint32_t height); @@ -132,7 +132,7 @@ private: class GlDrawBlitTask : public GlComposeTask { public: - GlDrawBlitTask(GlProgram*, GLuint target, GLuint compose, vector> tasks); + GlDrawBlitTask(GlProgram*, GLuint target, GLuint compose, Array&& tasks); ~GlDrawBlitTask() override = default; void run() override; diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 5ee25fcc..d7a34adb 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -107,6 +107,8 @@ bool GlRenderer::sync() mRenderPassStack.clear(); mPoolIndex = 0; + delete task; + return true; } @@ -202,9 +204,9 @@ bool GlRenderer::renderImage(void* data) if ((sdata->updateFlag & RenderUpdateFlag::Image) == 0) return false; - auto task = make_unique(mPrograms[RT_Image].get()); + auto task = new GlRenderTask(mPrograms[RT_Image].get()); - if (!sdata->geometry->draw(task.get(), mGpuBuffer.get(), RenderUpdateFlag::Image)) return false; + if (!sdata->geometry->draw(task, mGpuBuffer.get(), RenderUpdateFlag::Image)) return false; // matrix buffer { @@ -238,7 +240,7 @@ bool GlRenderer::renderImage(void* data) task->addBindResource(GlBindingResource{0, sdata->texId, loc}); } - currentPass()->addRenderTask(std::move(task)); + currentPass()->addRenderTask(task); return true; } @@ -471,9 +473,9 @@ void GlRenderer::initShaders() void GlRenderer::drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b, uint8_t a, RenderUpdateFlag flag) { - auto task = make_unique(mPrograms[RT_Color].get()); + auto task = new GlRenderTask(mPrograms[RT_Color].get()); - if (!sdata.geometry->draw(task.get(), mGpuBuffer.get(), flag)) return; + if (!sdata.geometry->draw(task, mGpuBuffer.get(), flag)) return; a = MULTIPLY(a, sdata.opacity); @@ -505,7 +507,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b, }); } - currentPass()->addRenderTask(std::move(task)); + currentPass()->addRenderTask(task); } @@ -515,17 +517,17 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla auto stopCnt = fill->colorStops(&stops); if (stopCnt < 2) return; - unique_ptr task; + GlRenderTask* task = nullptr; if (fill->identifier() == TVG_CLASS_ID_LINEAR) { - task = make_unique(mPrograms[RT_LinGradient].get()); + task = new GlRenderTask(mPrograms[RT_LinGradient].get()); } else if (fill->identifier() == TVG_CLASS_ID_RADIAL) { - task = make_unique(mPrograms[RT_RadGradient].get()); + task = new GlRenderTask(mPrograms[RT_RadGradient].get()); } else { return; } - if (!sdata.geometry->draw(task.get(), mGpuBuffer.get(), flag)) return; + if (!sdata.geometry->draw(task, mGpuBuffer.get(), flag)) return; // matrix buffer { @@ -599,7 +601,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla task->addBindResource(gradientBinding); } - currentPass()->addRenderTask(std::move(task)); + currentPass()->addRenderTask(task); } GlRenderPass* GlRenderer::currentPass() @@ -683,7 +685,7 @@ void GlRenderer::endRenderPass(Compositor* cmp) auto task = renderPass.endRenderPass( mPrograms[RT_Image].get(), currentPass()->getFboId()); - prepareCmpTask(task.get()); + prepareCmpTask(task); // matrix buffer {