From d0cbdd65ecb2c053c71cdf5d8e0a2f9786c6d061 Mon Sep 17 00:00:00 2001 From: wuyize Date: Thu, 9 Mar 2023 22:54:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3ElementRenderer=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=97=A0=E6=B3=95=E9=80=80=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Renderer/Preview/ElementRenderer.cpp | 30 +++++++++++-------- .../src/Renderer/Preview/ElementRenderer.h | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp index 1cb69c9..756222b 100644 --- a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.cpp @@ -118,11 +118,15 @@ Renderer::ElementRenderer::ElementRenderer() { surface.create(); thread = std::jthread([&](std::stop_token stop) { + std::stop_callback cb(stop, [&] { + draw.notify_all(); + }); + QOpenGLContext context; context.create(); context.makeCurrent(&surface); - initializeOpenGLFunctions(); + auto gl = context.versionFunctions(); shader = std::make_unique(); if (!shader->addShaderFromSourceFile(QOpenGLShader::Compute, ":/Shaders/element.comp")) qDebug() << "ERROR: " << shader->log(); @@ -134,7 +138,8 @@ Renderer::ElementRenderer::ElementRenderer() while (!stop.stop_requested()) { std::unique_lock lock(drawMutex); - draw.wait(lock, [&] {return needDraw; }); + draw.wait(lock, [&] {return needDraw || stop.stop_requested(); }); + if (needDraw) { needDraw = false; auto baseStyles = style->toBaseStyles(); @@ -146,14 +151,14 @@ Renderer::ElementRenderer::ElementRenderer() auto styleBuffer = generateStyleBuffer(baseStyles); GLuint ssbo[2]; - glCreateBuffers(2, ssbo); - glNamedBufferData(ssbo[0], pathBuffer.size() * sizeof(glm::vec2), pathBuffer.data(), GL_STATIC_READ); - glNamedBufferData(ssbo[1], styleBuffer.size() * sizeof(GLfloat), styleBuffer.data(), GL_STATIC_READ); + gl->glCreateBuffers(2, ssbo); + gl->glNamedBufferData(ssbo[0], pathBuffer.size() * sizeof(glm::vec2), pathBuffer.data(), GL_STATIC_READ); + gl->glNamedBufferData(ssbo[1], styleBuffer.size() * sizeof(GLfloat), styleBuffer.data(), GL_STATIC_READ); auto fbo = QOpenGLFramebufferObject(size, QOpenGLFramebufferObject::NoAttachment, GL_TEXTURE_2D); fbo.bind(); - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); + gl->glClearColor(0, 0, 0, 0); + gl->glClear(GL_COLOR_BUFFER_BIT); fbo.release(); shader->bind(); @@ -161,19 +166,20 @@ Renderer::ElementRenderer::ElementRenderer() shader->setUniformValue("styleSize", (GLint)styleBuffer.size()); shader->setUniformValue("leftTop", leftTop); shader->setUniformValue("pixelRatio", pixelRatio); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, ssbo[0]); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, ssbo[1]); - glBindImageTexture(0, fbo.texture(), 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8); - glDispatchCompute(ceil(size.width() / 8.), ceil(size.height() / 8.), 1); + gl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 10, ssbo[0]); + gl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 11, ssbo[1]); + gl->glBindImageTexture(0, fbo.texture(), 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8); + gl->glDispatchCompute(ceil(size.width() / 8.), ceil(size.height() / 8.), 1); shader->release(); auto image = fbo.toImage(false); - glDeleteBuffers(2, ssbo); + gl->glDeleteBuffers(2, ssbo); result = { image, leftTop }; drawFinished = true; } draw.notify_all(); } + context.doneCurrent(); }); while (!initialized) diff --git a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h index 9c59db5..bed57f6 100644 --- a/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h +++ b/ArchitectureColoredPainting/src/Renderer/Preview/ElementRenderer.h @@ -7,7 +7,7 @@ namespace Renderer { - class ElementRenderer : protected QOpenGLFunctions_4_5_Core + class ElementRenderer { public: static ElementRenderer* instance();