gl_engine: use raw pointer to pass and hold GlRenderTask

This commit is contained in:
RuiwenTang 2023-10-22 20:01:23 +08:00 committed by Hermet Park
parent db1f171d2a
commit 2038818e16
5 changed files with 60 additions and 33 deletions

View file

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

View file

@ -57,17 +57,17 @@ public:
~GlRenderPass();
void addRenderTask(unique_ptr<GlRenderTask> task);
void addRenderTask(GlRenderTask* task);
GLuint getFboId() { return mFbo->getFboId(); }
template <class T>
unique_ptr<T> endRenderPass(GlProgram* program, GLuint targetFbo) {
return make_unique<T>(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<unique_ptr<GlRenderTask>> mTasks = {};
Array<GlRenderTask*> mTasks = {};
};

View file

@ -90,9 +90,20 @@ void GlRenderTask::setViewport(const RenderRegion &viewport)
mViewport = viewport;
}
GlComposeTask::GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, vector<unique_ptr<GlRenderTask>> tasks)
:GlRenderTask(program) ,mTargetFbo(target), mSelfFbo(selfFbo), mTasks(std::move(tasks))
GlComposeTask::GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, Array<GlRenderTask*>&& 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<unique_ptr<GlRenderTask>> tasks)
GlBlitTask::GlBlitTask(GlProgram* program, GLuint target, GLuint compose, Array<GlRenderTask*>&& 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<unique_ptr<GlRenderTask>> tasks)
GlDrawBlitTask::GlDrawBlitTask(GlProgram* program, GLuint target, GLuint compose, Array<GlRenderTask*>&& tasks)
: GlComposeTask(program, target, compose, std::move(tasks))
{
}

View file

@ -98,8 +98,8 @@ private:
class GlComposeTask : public GlRenderTask
{
public:
GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, vector<unique_ptr<GlRenderTask>> tasks);
~GlComposeTask() override = default;
GlComposeTask(GlProgram* program, GLuint target, GLuint selfFbo, Array<GlRenderTask*>&& tasks);
~GlComposeTask() override;
void run() override;
@ -111,13 +111,13 @@ protected:
private:
GLuint mTargetFbo;
GLuint mSelfFbo;
vector<unique_ptr<GlRenderTask>> mTasks;
Array<GlRenderTask*> mTasks;
};
class GlBlitTask : public GlComposeTask
{
public:
GlBlitTask(GlProgram*, GLuint target, GLuint compose, vector<unique_ptr<GlRenderTask>> tasks);
GlBlitTask(GlProgram*, GLuint target, GLuint compose, Array<GlRenderTask*>&& 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<unique_ptr<GlRenderTask>> tasks);
GlDrawBlitTask(GlProgram*, GLuint target, GLuint compose, Array<GlRenderTask*>&& tasks);
~GlDrawBlitTask() override = default;
void run() override;

View file

@ -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<GlRenderTask>(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<GlRenderTask>(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<GlRenderTask> task;
GlRenderTask* task = nullptr;
if (fill->identifier() == TVG_CLASS_ID_LINEAR) {
task = make_unique<GlRenderTask>(mPrograms[RT_LinGradient].get());
task = new GlRenderTask(mPrograms[RT_LinGradient].get());
} else if (fill->identifier() == TVG_CLASS_ID_RADIAL) {
task = make_unique<GlRenderTask>(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<GlDrawBlitTask>(
mPrograms[RT_Image].get(), currentPass()->getFboId());
prepareCmpTask(task.get());
prepareCmpTask(task);
// matrix buffer
{