diff options
Diffstat (limited to 'src/plugins/renderers/opengl')
19 files changed, 148 insertions, 301 deletions
diff --git a/src/plugins/renderers/opengl/CMakeLists.txt b/src/plugins/renderers/opengl/CMakeLists.txt index 9e1ccc329..82328d1f9 100644 --- a/src/plugins/renderers/opengl/CMakeLists.txt +++ b/src/plugins/renderers/opengl/CMakeLists.txt @@ -121,6 +121,9 @@ qt_internal_add_plugin(OpenGLRendererPlugin Qt::OpenGLPrivate ) +# QTransform conflicts +set_target_properties(OpenGLRendererPlugin PROPERTIES UNITY_BUILD OFF) + qt_internal_extend_target(OpenGLRendererPlugin CONDITION NOT INTEGRITY SOURCES debug/imguirenderer.cpp debug/imguirenderer_p.h diff --git a/src/plugins/renderers/opengl/debug/debug.pri b/src/plugins/renderers/opengl/debug/debug.pri deleted file mode 100644 index 38a056f6b..000000000 --- a/src/plugins/renderers/opengl/debug/debug.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -include($$QT3D_ROOT/src/3rdparty/imgui/imgui.pri) - -HEADERS += \ - $$PWD/imguirenderer_p.h - -SOURCES += \ - $$PWD/imguirenderer.cpp diff --git a/src/plugins/renderers/opengl/debug/imguirenderer.cpp b/src/plugins/renderers/opengl/debug/imguirenderer.cpp index 4a53117a0..e2ea3d203 100644 --- a/src/plugins/renderers/opengl/debug/imguirenderer.cpp +++ b/src/plugins/renderers/opengl/debug/imguirenderer.cpp @@ -29,16 +29,10 @@ #define GL_VERTEX_ARRAY_BINDING 0x85B5 #endif -#ifdef _MSC_VER -#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen -#endif - QT_BEGIN_NAMESPACE -using namespace Qt3DRender; -using namespace Render; -using namespace Render::Debug; -using namespace Render::OpenGL; +namespace Qt3DRR = Qt3DRender::Render; +namespace Qt3DRRD = Qt3DRR::Debug; namespace { @@ -70,42 +64,69 @@ namespace { int vertexToPrimitiveCount(Qt3DRender::QGeometryRenderer::PrimitiveType primitiveType, int numVertices) { int nPrimitives = 0; switch (primitiveType) { - case QGeometryRenderer::Points: - case QGeometryRenderer::LineLoop: nPrimitives += numVertices; break; - case QGeometryRenderer::Triangles: nPrimitives += numVertices / 3; break; - case QGeometryRenderer::Lines: nPrimitives += numVertices / 2; break; - case QGeometryRenderer::TriangleFan: - case QGeometryRenderer::TriangleStrip: - case QGeometryRenderer::LineStrip: nPrimitives += numVertices - 1; break; - case QGeometryRenderer::TrianglesAdjacency: nPrimitives += numVertices / 6; break; - case QGeometryRenderer::TriangleStripAdjacency: - case QGeometryRenderer::LineStripAdjacency: nPrimitives += numVertices / 2 - 1; break; - case QGeometryRenderer::LinesAdjacency: nPrimitives += numVertices / 4; break; - case QGeometryRenderer::Patches: nPrimitives += 1; + case Qt3DRender::QGeometryRenderer::Points: + case Qt3DRender::QGeometryRenderer::LineLoop: + nPrimitives += numVertices; + break; + case Qt3DRender::QGeometryRenderer::Triangles: + nPrimitives += numVertices / 3; + break; + case Qt3DRender::QGeometryRenderer::Lines: + nPrimitives += numVertices / 2; + break; + case Qt3DRender::QGeometryRenderer::TriangleFan: + case Qt3DRender::QGeometryRenderer::TriangleStrip: + case Qt3DRender::QGeometryRenderer::LineStrip: + nPrimitives += numVertices - 1; + break; + case Qt3DRender::QGeometryRenderer::TrianglesAdjacency: + nPrimitives += numVertices / 6; + break; + case Qt3DRender::QGeometryRenderer::TriangleStripAdjacency: + case Qt3DRender::QGeometryRenderer::LineStripAdjacency: + nPrimitives += numVertices / 2 - 1; + break; + case Qt3DRender::QGeometryRenderer::LinesAdjacency: + nPrimitives += numVertices / 4; + break; + case Qt3DRender::QGeometryRenderer::Patches: + nPrimitives += 1; } return nPrimitives; } const char *primitiveTypeName(Qt3DRender::QGeometryRenderer::PrimitiveType primitiveType) { switch (primitiveType) { - case QGeometryRenderer::Points: return "Points"; - case QGeometryRenderer::LineLoop: return "LineLoop"; - case QGeometryRenderer::Triangles: return "Triangles"; - case QGeometryRenderer::TrianglesAdjacency: return "TriangleAdjacency"; - case QGeometryRenderer::TriangleFan: return "TriangleFan"; - case QGeometryRenderer::TriangleStrip: return "TriangleStrip"; - case QGeometryRenderer::TriangleStripAdjacency: return "TriangleStringAdjacency"; - case QGeometryRenderer::LineStrip: return "LineStrip"; - case QGeometryRenderer::LineStripAdjacency: return "LineStripAdjacency"; - case QGeometryRenderer::Lines: return "Lines"; - case QGeometryRenderer::LinesAdjacency: return "LinesAdjacency"; - case QGeometryRenderer::Patches: return "Patches"; + case Qt3DRender::QGeometryRenderer::Points: + return "Points"; + case Qt3DRender::QGeometryRenderer::LineLoop: + return "LineLoop"; + case Qt3DRender::QGeometryRenderer::Triangles: + return "Triangles"; + case Qt3DRender::QGeometryRenderer::TrianglesAdjacency: + return "TriangleAdjacency"; + case Qt3DRender::QGeometryRenderer::TriangleFan: + return "TriangleFan"; + case Qt3DRender::QGeometryRenderer::TriangleStrip: + return "TriangleStrip"; + case Qt3DRender::QGeometryRenderer::TriangleStripAdjacency: + return "TriangleStringAdjacency"; + case Qt3DRender::QGeometryRenderer::LineStrip: + return "LineStrip"; + case Qt3DRender::QGeometryRenderer::LineStripAdjacency: + return "LineStripAdjacency"; + case Qt3DRender::QGeometryRenderer::Lines: + return "Lines"; + case Qt3DRender::QGeometryRenderer::LinesAdjacency: + return "LinesAdjacency"; + case Qt3DRender::QGeometryRenderer::Patches: + return "Patches"; } return ""; } } -ImGuiRenderer::ImGuiRenderer(Qt3DRender::Render::OpenGL::Renderer *renderer) +Qt3DRRD::ImGuiRenderer::ImGuiRenderer(Qt3DRR::OpenGL::Renderer *renderer) : m_renderer(renderer) { ImGui::CreateContext(); @@ -132,9 +153,9 @@ ImGuiRenderer::ImGuiRenderer(Qt3DRender::Render::OpenGL::Renderer *renderer) m_jobsRange.first = m_jobsRange.second = 0.f; } -ImGuiRenderer::~ImGuiRenderer() = default; +Qt3DRRD::ImGuiRenderer::~ImGuiRenderer() = default; -void ImGuiRenderer::renderDebugOverlay(const std::vector<RenderView *> &renderViews, const RenderView *renderView, int jobsInLastFrame) +void Qt3DRRD::ImGuiRenderer::renderDebugOverlay(const std::vector<Qt3DRR::OpenGL::RenderView *> &renderViews, const Qt3DRR::OpenGL::RenderView *renderView, int jobsInLastFrame) { if (!newFrame(renderView)) return; @@ -162,7 +183,7 @@ void ImGuiRenderer::renderDebugOverlay(const std::vector<RenderView *> &renderVi { ImGui::Begin("Qt3D Profiling"); char caption[50]; - sprintf(caption, "Avg %.3f ms/frame (%.1f FPS)", static_cast<double>(1000.0f / ImGui::GetIO().Framerate), static_cast<double>(ImGui::GetIO().Framerate)); + snprintf(caption, sizeof(caption), "Avg %.3f ms/frame (%.1f FPS)", static_cast<double>(1000.0f / ImGui::GetIO().Framerate), static_cast<double>(ImGui::GetIO().Framerate)); ImGui::PlotLines("FPS", m_fpsLog, logIndex + 1, 0, caption, m_fpsRange.first, m_fpsRange.second, ImVec2(0, 80)); ImGui::PlotHistogram("Jobs", m_jobsLog, logIndex + 1, 0, nullptr, m_jobsRange.first, m_jobsRange.second, ImVec2(0, 80)); @@ -172,10 +193,10 @@ void ImGuiRenderer::renderDebugOverlay(const std::vector<RenderView *> &renderVi QSet<HGeometryRenderer> inUseGeometries; QSet<Qt3DCore::QNodeId> inUseTextures; for (int j=0; j<renderViewsCount; j++) { - RenderView *rv = renderViews.at(j); + Qt3DRR::OpenGL::RenderView *rv = renderViews.at(j); nCommands += rv->commandCount(); - rv->forEachCommand([&] (const RenderCommand &command) { - if (command.m_type != RenderCommand::Draw) + rv->forEachCommand([&](const Qt3DRR::OpenGL::RenderCommand &command) { + if (command.m_type != Qt3DRR::OpenGL::RenderCommand::Draw) return; nVertices += command.m_primitiveCount; nPrimitives += vertexToPrimitiveCount(command.m_primitiveType, command.m_primitiveCount); @@ -280,24 +301,24 @@ void ImGuiRenderer::renderDebugOverlay(const std::vector<RenderView *> &renderVi renderDrawList(ImGui::GetDrawData()); } -void ImGuiRenderer::setCapabilities(const QString &capabilities) +void Qt3DRRD::ImGuiRenderer::setCapabilities(const QString &capabilities) { m_capabilities = capabilities.toLatin1(); } -void ImGuiRenderer::showGLInfo() +void Qt3DRRD::ImGuiRenderer::showGLInfo() { ImGui::Begin("Open GL Details", &m_showGLInfoWindow); ImGui::Text("%s", m_capabilities.data()); ImGui::End(); } -void ImGuiRenderer::showRenderDetails(const std::vector<RenderView *> &renderViews) +void Qt3DRRD::ImGuiRenderer::showRenderDetails(const std::vector<Qt3DRR::OpenGL::RenderView *> &renderViews) { ImGui::Begin("Render Views", &m_showRenderDetailsWindow); int i = 1; - for (const RenderView *view: renderViews) { + for (const Qt3DRR::OpenGL::RenderView *view : renderViews) { QString label(QLatin1String("View ") + QString::number(i++)); if (ImGui::TreeNode(label.toLatin1().data())) { ImGui::Text("Viewport: (%.1f, %.1f, %.1f, %.1f)", view->viewport().x(), view->viewport().y(), @@ -311,7 +332,7 @@ void ImGuiRenderer::showRenderDetails(const std::vector<RenderView *> &renderVie ImGui::Text("Clear Stencil Value: %d", view->clearStencilValue()); int j = 1; - view->forEachCommand([&] (const RenderCommand &command) { + view->forEachCommand([&](const Qt3DRR::OpenGL::RenderCommand &command) { GeometryRenderer *rGeometryRenderer = m_renderer->nodeManagers()->data<GeometryRenderer, GeometryRendererManager>(command.m_geometryRenderer); QString label = QString(QLatin1String("Command %1 {%2}")).arg(QString::number(j++), QString::number(rGeometryRenderer->peerId().id())); if (ImGui::TreeNode(label.toLatin1().data())) { @@ -334,7 +355,7 @@ void ImGuiRenderer::showRenderDetails(const std::vector<RenderView *> &renderVie ImGui::End(); } -void ImGuiRenderer::renderDrawList(ImDrawData *draw_data) +void Qt3DRRD::ImGuiRenderer::renderDrawList(ImDrawData *draw_data) { // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) ImGuiIO& io = ImGui::GetIO(); @@ -431,7 +452,7 @@ void ImGuiRenderer::renderDrawList(ImDrawData *draw_data) m_funcs->glScissor(last_scissor_box[0], last_scissor_box[1], static_cast<GLsizei>(last_scissor_box[2]), static_cast<GLsizei>(last_scissor_box[3])); } -bool ImGuiRenderer::createFontsTexture() +bool Qt3DRRD::ImGuiRenderer::createFontsTexture() { // Build texture atlas ImGuiIO& io = ImGui::GetIO(); @@ -457,7 +478,7 @@ bool ImGuiRenderer::createFontsTexture() return true; } -bool ImGuiRenderer::createDeviceObjects() +bool Qt3DRRD::ImGuiRenderer::createDeviceObjects() { auto *glContext = m_renderer->submissionContext()->openGLContext(); if (glContext->format().majorVersion() < 3) { @@ -575,7 +596,7 @@ bool ImGuiRenderer::createDeviceObjects() return true; } -bool ImGuiRenderer::newFrame(const RenderView *renderView) +bool Qt3DRRD::ImGuiRenderer::newFrame(const Qt3DRR::OpenGL::RenderView *renderView) { if (!m_funcs) m_funcs = m_renderer->submissionContext()->openGLContext()->extraFunctions(); @@ -611,7 +632,7 @@ bool ImGuiRenderer::newFrame(const RenderView *renderView) return true; } -void ImGuiRenderer::onMouseChange(QMouseEvent *event) +void Qt3DRRD::ImGuiRenderer::onMouseChange(QMouseEvent *event) { ImGuiIO& io = ImGui::GetIO(); io.MousePos = ImVec2(event->pos().x(), event->pos().y()); @@ -620,14 +641,14 @@ void ImGuiRenderer::onMouseChange(QMouseEvent *event) m_mousePressed[2] = event->buttons() & Qt::MiddleButton; } -void ImGuiRenderer::onWheel(QWheelEvent *event) +void Qt3DRRD::ImGuiRenderer::onWheel(QWheelEvent *event) { // 5 lines per unit m_mouseWheelH += event->pixelDelta().x() / (ImGui::GetTextLineHeight()); m_mouseWheel += event->pixelDelta().y() / (5.f * ImGui::GetTextLineHeight()); } -void ImGuiRenderer::onKeyPressRelease(QKeyEvent *event) +void Qt3DRRD::ImGuiRenderer::onKeyPressRelease(QKeyEvent *event) { ImGuiIO& io = ImGui::GetIO(); if (keyMap.contains(event->key())) @@ -652,7 +673,7 @@ void ImGuiRenderer::onKeyPressRelease(QKeyEvent *event) #endif } -void ImGuiRenderer::processEvent(QEvent *event) +void Qt3DRRD::ImGuiRenderer::processEvent(QEvent *event) { switch (event->type()) { case QEvent::MouseMove: diff --git a/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp b/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp index 6bcb3deb1..b62cad811 100644 --- a/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp +++ b/src/plugins/renderers/opengl/graphicshelpers/graphicscontext.cpp @@ -28,9 +28,7 @@ #include <glshader_p.h> #if !QT_CONFIG(opengles2) -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include <QtOpenGL/QOpenGLVersionFunctionsFactory> -#endif #include <QOpenGLFunctions_2_0> #include <QOpenGLFunctions_3_2_Core> #include <QOpenGLFunctions_3_3_Core> @@ -48,13 +46,9 @@ #include <QSurface> #include <QWindow> #include <QOpenGLTexture> -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #ifdef QT_OPENGL_LIB #include <QtOpenGL/QOpenGLDebugLogger> #endif -#else -#include <QOpenGLDebugLogger> -#endif QT_BEGIN_NAMESPACE @@ -358,32 +352,16 @@ GraphicsHelperInterface *GraphicsContext::resolveHighestOpenGLFunctions() #if !QT_CONFIG(opengles2) else { QAbstractOpenGLFunctions *glFunctions = nullptr; -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if ((glFunctions = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_4_3_Core>()) != nullptr) { -#else - if ((glFunctions = m_gl->versionFunctions<QOpenGLFunctions_4_3_Core>()) != nullptr) { -#endif qCDebug(Backend) << Q_FUNC_INFO << " Building OpenGL 4.3"; glHelper = new GraphicsHelperGL4(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) } else if ((glFunctions = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_3_3_Core>()) != nullptr) { -#else - } else if ((glFunctions = m_gl->versionFunctions<QOpenGLFunctions_3_3_Core>()) != nullptr) { -#endif qCDebug(Backend) << Q_FUNC_INFO << " Building OpenGL 3.3"; glHelper = new GraphicsHelperGL3_3(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) } else if ((glFunctions = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_3_2_Core>()) != nullptr) { -#else - } else if ((glFunctions = m_gl->versionFunctions<QOpenGLFunctions_3_2_Core>()) != nullptr) { -#endif qCDebug(Backend) << Q_FUNC_INFO << " Building OpenGL 3.2"; glHelper = new GraphicsHelperGL3_2(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) } else if ((glFunctions = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_2_0>()) != nullptr) { -#else - } else if ((glFunctions = m_gl->versionFunctions<QOpenGLFunctions_2_0>()) != nullptr) { -#endif qCDebug(Backend) << Q_FUNC_INFO << " Building OpenGL 2 Helper"; glHelper = new GraphicsHelperGL2(); } @@ -402,7 +380,7 @@ GraphicsHelperInterface *GraphicsContext::resolveHighestOpenGLFunctions() qCDebug(Backend) << "Qt3D: Enabling OpenGL debug logging"; m_debugLogger.reset(new QOpenGLDebugLogger); if (m_debugLogger->initialize()) { - QObject::connect(m_debugLogger.data(), &QOpenGLDebugLogger::messageLogged, &logOpenGLDebugMessage); + QObject::connect(m_debugLogger.data(), &QOpenGLDebugLogger::messageLogged, m_debugLogger.data(), &logOpenGLDebugMessage); const QString mode = QString::fromLocal8Bit(debugLoggingMode); m_debugLogger->startLogging(mode.startsWith(QLatin1String("sync"), Qt::CaseInsensitive) ? QOpenGLDebugLogger::SynchronousLogging diff --git a/src/plugins/renderers/opengl/graphicshelpers/graphicshelperes3_1.cpp b/src/plugins/renderers/opengl/graphicshelpers/graphicshelperes3_1.cpp index bda79dc3a..d82403d7b 100644 --- a/src/plugins/renderers/opengl/graphicshelpers/graphicshelperes3_1.cpp +++ b/src/plugins/renderers/opengl/graphicshelpers/graphicshelperes3_1.cpp @@ -118,7 +118,7 @@ namespace OpenGL { namespace { -GLbitfield memoryBarrierGLBitfield(QMemoryBarrier::Operations barriers) +GLbitfield memoryBarrierGL3Bitfield(QMemoryBarrier::Operations barriers) { GLbitfield bits = 0; @@ -204,7 +204,7 @@ void GraphicsHelperES3_1::dispatchCompute(GLuint wx, GLuint wy, GLuint wz) void GraphicsHelperES3_1::memoryBarrier(QMemoryBarrier::Operations barriers) { - m_extraFuncs->glMemoryBarrier(memoryBarrierGLBitfield(barriers)); + m_extraFuncs->glMemoryBarrier(memoryBarrierGL3Bitfield(barriers)); } void GraphicsHelperES3_1::drawArraysIndirect(GLenum mode, void *indirect) diff --git a/src/plugins/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp b/src/plugins/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp index 706923298..c2dff740c 100644 --- a/src/plugins/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp +++ b/src/plugins/renderers/opengl/graphicshelpers/graphicshelpergl4.cpp @@ -85,7 +85,7 @@ namespace OpenGL { namespace { -GLbitfield memoryBarrierGLBitfield(QMemoryBarrier::Operations barriers) +GLbitfield memoryBarrierGL4Bitfield(QMemoryBarrier::Operations barriers) { GLbitfield bits = 0; @@ -1306,7 +1306,7 @@ GLint GraphicsHelperGL4::maxClipPlaneCount() void GraphicsHelperGL4::memoryBarrier(QMemoryBarrier::Operations barriers) { - m_funcs->glMemoryBarrier(memoryBarrierGLBitfield(barriers)); + m_funcs->glMemoryBarrier(memoryBarrierGL4Bitfield(barriers)); } void GraphicsHelperGL4::enablePrimitiveRestart(int primitiveRestartIndex) diff --git a/src/plugins/renderers/opengl/graphicshelpers/graphicshelpers.pri b/src/plugins/renderers/opengl/graphicshelpers/graphicshelpers.pri deleted file mode 100644 index 3cfa445ce..000000000 --- a/src/plugins/renderers/opengl/graphicshelpers/graphicshelpers.pri +++ /dev/null @@ -1,33 +0,0 @@ -#DEFINES += QT3D_RENDER_ASPECT_OPENGL_DEBUG - -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/graphicscontext_p.h \ - $$PWD/graphicshelperinterface_p.h \ - $$PWD/graphicshelperes2_p.h \ - $$PWD/graphicshelperes3_p.h \ - $$PWD/graphicshelperes3_1_p.h \ - $$PWD/graphicshelperes3_2_p.h \ - $$PWD/graphicshelpergl2_p.h \ - $$PWD/graphicshelpergl3_3_p.h \ - $$PWD/graphicshelpergl4_p.h \ - $$PWD/graphicshelpergl3_2_p.h \ - $$PWD/imagesubmissioncontext_p.h \ - $$PWD/submissioncontext_p.h \ - $$PWD/texturesubmissioncontext_p.h \ - $$PWD/qgraphicsutils_p.h - -SOURCES += \ - $$PWD/graphicscontext.cpp \ - $$PWD/graphicshelperes2.cpp \ - $$PWD/graphicshelperes3.cpp \ - $$PWD/graphicshelperes3_1.cpp \ - $$PWD/graphicshelperes3_2.cpp \ - $$PWD/graphicshelpergl2.cpp \ - $$PWD/graphicshelpergl3_3.cpp \ - $$PWD/graphicshelpergl4.cpp \ - $$PWD/graphicshelpergl3_2.cpp \ - $$PWD/imagesubmissioncontext.cpp \ - $$PWD/submissioncontext.cpp \ - $$PWD/texturesubmissioncontext.cpp diff --git a/src/plugins/renderers/opengl/graphicshelpers/qgraphicsutils_p.h b/src/plugins/renderers/opengl/graphicshelpers/qgraphicsutils_p.h index 37d999eec..d10e9fa0e 100644 --- a/src/plugins/renderers/opengl/graphicshelpers/qgraphicsutils_p.h +++ b/src/plugins/renderers/opengl/graphicshelpers/qgraphicsutils_p.h @@ -60,12 +60,7 @@ public: static QVarLengthArray<char, 64> array(16 * byteSize); memset(array.data(), 0, array.size()); -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) switch (v.metaType().id()) { -#else - switch (v.type()) { -#endif - // 1 byte case QMetaType::Bool: { T data = v.value<bool>(); @@ -300,11 +295,7 @@ public: } } else -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) qWarning() << Q_FUNC_INFO << "QVariant type conversion not handled for " << v.metaType().id(); -#else - qWarning() << Q_FUNC_INFO << "QVariant type conversion not handled for " << v.type(); -#endif break; } diff --git a/src/plugins/renderers/opengl/graphicshelpers/submissioncontext.cpp b/src/plugins/renderers/opengl/graphicshelpers/submissioncontext.cpp index e2cee1fcd..eb1bd78b3 100644 --- a/src/plugins/renderers/opengl/graphicshelpers/submissioncontext.cpp +++ b/src/plugins/renderers/opengl/graphicshelpers/submissioncontext.cpp @@ -47,13 +47,9 @@ #include <QSurface> #include <QWindow> #include <QOpenGLTexture> -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #ifdef QT_OPENGL_LIB #include <QtOpenGL/QOpenGLDebugLogger> #endif -#else -#include <QOpenGLDebugLogger> -#endif QT_BEGIN_NAMESPACE @@ -65,8 +61,6 @@ QT_BEGIN_NAMESPACE #define GL_DRAW_FRAMEBUFFER 0x8CA9 #endif -using namespace Qt3DCore; - namespace Qt3DRender { namespace Render { namespace OpenGL { @@ -87,14 +81,14 @@ unsigned int nextFreeContextId() namespace { -GLBuffer::Type attributeTypeToGLBufferType(QAttribute::AttributeType type) +GLBuffer::Type attributeTypeToGLBufferType(Qt3DCore::QAttribute::AttributeType type) { switch (type) { - case QAttribute::VertexAttribute: + case Qt3DCore::QAttribute::VertexAttribute: return GLBuffer::ArrayBuffer; - case QAttribute::IndexAttribute: + case Qt3DCore::QAttribute::IndexAttribute: return GLBuffer::IndexBuffer; - case QAttribute::DrawIndirectAttribute: + case Qt3DCore::QAttribute::DrawIndirectAttribute: return GLBuffer::DrawIndirectBuffer; default: Q_UNREACHABLE(); @@ -470,7 +464,19 @@ void SubmissionContext::endDrawing(bool swapBuffers) void SubmissionContext::activateRenderTarget(Qt3DCore::QNodeId renderTargetNodeId, const AttachmentPack &attachments, GLuint defaultFboId) { GLuint fboId = defaultFboId; // Default FBO - if (renderTargetNodeId) { + resolveRenderTargetFormat(); // Reset m_renderTargetFormat based on the default FBO + + // check if target buffer is GL_BACK_LEFT or GL_BACK_RIGHT, as they don't need an + // own fbo + auto allLeftOrRight = std::all_of(attachments.attachments().begin(), attachments.attachments().end(), + [](const Attachment& att){ + return att.m_point == QRenderTargetOutput::Left || att.m_point == QRenderTargetOutput::Right; + }); + + const bool allAttachmentsAreLeftOrRight = attachments.attachments().size() > 0 && allLeftOrRight; + const bool shouldCreateRenderTarget = !allAttachmentsAreLeftOrRight && renderTargetNodeId; + + if (shouldCreateRenderTarget) { // New RenderTarget if (!m_renderTargets.contains(renderTargetNodeId)) { if (m_defaultFBO && fboId == m_defaultFBO) { @@ -480,9 +486,10 @@ void SubmissionContext::activateRenderTarget(Qt3DCore::QNodeId renderTargetNodeI fboId = createRenderTarget(renderTargetNodeId, attachments); } } else { - fboId = updateRenderTarget(renderTargetNodeId, attachments, true); + fboId = updateRenderTarget(renderTargetNodeId, attachments, true); // Overwrites m_renderTargetFormat based on custom FBO } } + m_activeFBO = fboId; m_activeFBONodeId = renderTargetNodeId; m_glHelper->bindFrameBufferObject(m_activeFBO, GraphicsHelperInterface::FBODraw); @@ -612,6 +619,7 @@ QImage SubmissionContext::readFramebuffer(const QRect &rect) QImage::Format imageFormat; uint stride; + // m_renderTargetFormat is set when the current RV FBO is set in activateRenderTarget /* format value should match GL internalFormat */ GLenum internalFormat = m_renderTargetFormat; @@ -860,6 +868,9 @@ void SubmissionContext::activateDrawBuffers(const AttachmentPack &attachments) m_glHelper->drawBuffers(GLsizei(activeDrawBuffers.size()), activeDrawBuffers.data()); } } + else if (activeDrawBuffers.size() == 1){ + m_glHelper->drawBuffer(activeDrawBuffers.at(0)); + } } else { qCWarning(Backend) << "FBO incomplete"; } diff --git a/src/plugins/renderers/opengl/io/io.pri b/src/plugins/renderers/opengl/io/io.pri deleted file mode 100644 index 462978c4d..000000000 --- a/src/plugins/renderers/opengl/io/io.pri +++ /dev/null @@ -1,8 +0,0 @@ -INCLUDEPATH += $$PWD - -SOURCES += \ - $$PWD/glbuffer.cpp - -HEADERS += \ - $$PWD/glbuffer_p.h - diff --git a/src/plugins/renderers/opengl/managers/managers.pri b/src/plugins/renderers/opengl/managers/managers.pri deleted file mode 100644 index 97a4c2c45..000000000 --- a/src/plugins/renderers/opengl/managers/managers.pri +++ /dev/null @@ -1,8 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/gl_handle_types_p.h \ - $$PWD/glresourcemanagers_p.h - -SOURCES += \ - $$PWD/glresourcemanagers.cpp diff --git a/src/plugins/renderers/opengl/opengl.pri b/src/plugins/renderers/opengl/opengl.pri deleted file mode 100644 index 4308992e5..000000000 --- a/src/plugins/renderers/opengl/opengl.pri +++ /dev/null @@ -1,41 +0,0 @@ -QT += core-private gui-private 3dcore 3dcore-private 3drender 3drender-private opengl-private - -CONFIG += c++17 - -# Qt3D is free of Q_FOREACH - make sure it stays that way: -DEFINES += QT_NO_FOREACH -DEFINES += BUILD_QT3D_MODULE - -# For Q_AUTOTEST_EXPORT to work -DEFINES += QT_BUILDING_QT - -DISTFILES += \ - openglrenderer.json - -include (renderer/renderer.pri) -include (io/io.pri) -include (textures/textures.pri) -include (graphicshelpers/graphicshelpers.pri) -include (managers/managers.pri) - -!integrity: include (debug/debug.pri) - -INCLUDEPATH += $$PWD - -# Qt3D is free of Q_FOREACH - make sure it stays that way: -DEFINES += QT_NO_FOREACH - -gcov { - QMAKE_CXXFLAGS += -fprofile-arcs -ftest-coverage - QMAKE_LFLAGS += -fprofile-arcs -ftest-coverage -} - -qtConfig(qt3d-simd-avx2) { - CONFIG += simd - QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_AVX2 -} - -qtConfig(qt3d-simd-sse2):!qtConfig(qt3d-simd-avx2) { - CONFIG += simd - QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE2 -} diff --git a/src/plugins/renderers/opengl/opengl.pro b/src/plugins/renderers/opengl/opengl.pro deleted file mode 100644 index f098513e8..000000000 --- a/src/plugins/renderers/opengl/opengl.pro +++ /dev/null @@ -1,13 +0,0 @@ -TARGET = openglrenderer - -# We use QT_AUTOTEST_EXPORT to test the plug-ins, which needs QT_BUILDING_QT -DEFINES += QT_BUILDING_QT - -include(opengl.pri) - -SOURCES += \ - main.cpp - -PLUGIN_TYPE = renderers -PLUGIN_CLASS_NAME = OpenGLRendererPlugin -load(qt_plugin) diff --git a/src/plugins/renderers/opengl/renderer/glshader.cpp b/src/plugins/renderers/opengl/renderer/glshader.cpp index 7dbc89571..fdd2a710c 100644 --- a/src/plugins/renderers/opengl/renderer/glshader.cpp +++ b/src/plugins/renderers/opengl/renderer/glshader.cpp @@ -79,6 +79,7 @@ void GLShader::setGraphicsContext(GraphicsContext *context) if (m_graphicsContext) { m_contextConnection = QObject::connect(m_graphicsContext->openGLContext(), &QOpenGLContext::aboutToBeDestroyed, + m_graphicsContext->openGLContext(), [this] { setGraphicsContext(nullptr); }); } } diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index e9a2ffe48..fa2d27486 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -90,8 +90,6 @@ QT_BEGIN_NAMESPACE -using namespace Qt3DCore; - namespace Qt3DRender { namespace Render { namespace OpenGL { @@ -322,7 +320,7 @@ void Renderer::setNodeManagers(NodeManagers *managers) m_computableEntityFilterJob->setManager(m_nodesManager->renderNodesManager()); } -void Renderer::setServices(QServiceLocator *services) +void Renderer::setServices(Qt3DCore::QServiceLocator *services) { m_services = services; @@ -439,12 +437,12 @@ void Renderer::initialize() qCWarning(Backend) << Q_FUNC_INFO << "OpenGL context creation failed"; m_ownedContext = true; - QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed, + QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed, m_glContext, [this] { m_frameProfiler.reset(); }); } else { // Context is not owned by us, so we need to know if it gets destroyed m_contextConnection = QObject::connect(m_glContext, &QOpenGLContext::aboutToBeDestroyed, - [this] { releaseGraphicsResources(); }); + m_glContext, [this] { releaseGraphicsResources(); }); } qCDebug(Backend) << "Qt3D shared context:" << m_glContext->shareContext(); @@ -678,12 +676,12 @@ void Renderer::render(bool swapBuffers) // RenderQueue is complete (but that means it may be of size 0) if (!queueIsEmpty) { - QTaskLogger submissionStatsPart1(m_services->systemInformation(), - {JobTypes::FrameSubmissionPart1, 0}, - QTaskLogger::Submission); - QTaskLogger submissionStatsPart2(m_services->systemInformation(), - {JobTypes::FrameSubmissionPart2, 0}, - QTaskLogger::Submission); + Qt3DCore::QTaskLogger submissionStatsPart1(m_services->systemInformation(), + { JobTypes::FrameSubmissionPart1, 0 }, + Qt3DCore::QTaskLogger::Submission); + Qt3DCore::QTaskLogger submissionStatsPart2(m_services->systemInformation(), + { JobTypes::FrameSubmissionPart2, 0 }, + Qt3DCore::QTaskLogger::Submission); { // Scoped to destroy surfaceLock QSurface *surface = nullptr; for (const RenderView *rv: renderViews) { @@ -979,10 +977,10 @@ void Renderer::lookForDirtyTextures() const std::vector<HTexture> &activeTextureHandles = textureManager->activeHandles(); for (const HTexture &handle: activeTextureHandles) { Texture *texture = textureManager->data(handle); - const QNodeIdVector imageIds = texture->textureImageIds(); + const Qt3DCore::QNodeIdVector imageIds = texture->textureImageIds(); // Does the texture reference any of the dirty texture images? - for (const QNodeId &imageId: imageIds) { + for (const Qt3DCore::QNodeId &imageId : imageIds) { if (dirtyImageIds.contains(imageId)) { texture->addDirtyFlag(Texture::DirtyImageGenerators); break; @@ -1010,7 +1008,7 @@ void Renderer::reloadDirtyShaders() // If api of the renderer matches the one from the technique if (technique->isCompatibleWithRenderer()) { const auto passIds = technique->renderPasses(); - for (const QNodeId &passId : passIds) { + for (const Qt3DCore::QNodeId &passId : passIds) { RenderPass *renderPass = m_nodesManager->renderPassManager()->lookupResource(passId); HShader shaderHandle = m_nodesManager->shaderManager()->lookupHandle(renderPass->shaderProgram()); Shader *shader = m_nodesManager->shaderManager()->data(shaderHandle); @@ -1073,7 +1071,7 @@ void Renderer::sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager) // the time needed to destroy the GLShader assoicated with it. if (!frontend) continue; - QShaderProgramPrivate *dFrontend = static_cast<decltype(dFrontend)>(QNodePrivate::get(frontend)); + QShaderProgramPrivate *dFrontend = static_cast<decltype(dFrontend)>(Qt3DCore::QNodePrivate::get(frontend)); s->unsetRequiresFrontendSync(); dFrontend->setStatus(s->status()); dFrontend->setLog(s->log()); @@ -1084,7 +1082,7 @@ void Renderer::sendShaderChangesToFrontend(Qt3DCore::QAspectManager *manager) const std::vector<ShaderBuilderUpdate> shaderBuilderUpdates = Qt3DCore::moveAndClear(m_shaderBuilderUpdates); for (const ShaderBuilderUpdate &update : shaderBuilderUpdates) { QShaderProgramBuilder *builder = static_cast<decltype(builder)>(manager->lookupNode(update.builderId)); - QShaderProgramBuilderPrivate *dBuilder = static_cast<decltype(dBuilder)>(QNodePrivate::get(builder)); + QShaderProgramBuilderPrivate *dBuilder = static_cast<decltype(dBuilder)>(Qt3DCore::QNodePrivate::get(builder)); dBuilder->setShaderCode(update.shaderCode, update.shaderType); } } @@ -1116,7 +1114,7 @@ void Renderer::sendTextureChangesToFrontend(Qt3DCore::QAspectManager *manager) texture->setFormat(properties.format); texture->blockNotifications(blocked); - QAbstractTexturePrivate *dTexture = static_cast<QAbstractTexturePrivate *>(QNodePrivate::get(texture)); + QAbstractTexturePrivate *dTexture = static_cast<QAbstractTexturePrivate *>(Qt3DCore::QNodePrivate::get(texture)); dTexture->setStatus(properties.status); dTexture->setHandleType(pair.first.handleType); @@ -1135,7 +1133,7 @@ void Renderer::sendSetFenceHandlesToFrontend(Qt3DCore::QAspectManager *manager) if (fgNode != nullptr) { // Node could have been deleted before we got a chance to notify it Q_ASSERT(fgNode->nodeType() == FrameGraphNode::SetFence); QSetFence *frontend = static_cast<decltype(frontend)>(manager->lookupNode(fgNode->peerId())); - QSetFencePrivate *dFrontend = static_cast<decltype(dFrontend)>(QNodePrivate::get(frontend)); + QSetFencePrivate *dFrontend = static_cast<decltype(dFrontend)>(Qt3DCore::QNodePrivate::get(frontend)); dFrontend->setHandleType(QSetFence::OpenGLFenceId); dFrontend->setHandle(QVariant::fromValue(pair.second)); } @@ -1267,7 +1265,7 @@ void Renderer::updateGLResources() // We want to upload textures data at this point as the SubmissionThread and // AspectThread are locked ensuring no races between Texture/TextureImage and // GLTexture - QNodeIdVector updatedTexturesForFrame; + Qt3DCore::QNodeIdVector updatedTexturesForFrame; if (m_submissionContext != nullptr) { GLTextureManager *glTextureManager = m_glResourceManagers->glTextureManager(); const std::vector<HGLTexture> &glTextureHandles = glTextureManager->activeHandles(); @@ -1281,7 +1279,7 @@ void Renderer::updateGLResources() // GLTexture creation provides us width/height/format ... information // for textures which had not initially specified these information (TargetAutomatic...) // Gather these information and store them to be distributed by a change next frame - const QNodeIdVector referenceTextureIds = { glTextureManager->texNodeIdForGLTexture.value(glTexture) }; + const Qt3DCore::QNodeIdVector referenceTextureIds = { glTextureManager->texNodeIdForGLTexture.value(glTexture) }; // Store properties and referenceTextureIds if (info.wasUpdated) { Texture::TextureUpdateInfo updateInfo; @@ -1307,7 +1305,7 @@ void Renderer::updateGLResources() // Remove destroyed FBOs { - const QNodeIdVector destroyedRenderTargetIds = m_nodesManager->renderTargetManager()->takeRenderTargetIdsToCleanup(); + const Qt3DCore::QNodeIdVector destroyedRenderTargetIds = m_nodesManager->renderTargetManager()->takeRenderTargetIdsToCleanup(); for (const Qt3DCore::QNodeId &renderTargetId : destroyedRenderTargetIds) m_submissionContext->releaseRenderTarget(renderTargetId); } @@ -1349,11 +1347,11 @@ void Renderer::updateTexture(Texture *texture) // Will make the texture requestUpload if (dirtyFlags.testFlag(Texture::DirtyImageGenerators)) { - const QNodeIdVector textureImageIds = texture->textureImageIds(); + const Qt3DCore::QNodeIdVector textureImageIds = texture->textureImageIds(); std::vector<GLTexture::Image> images; images.reserve(textureImageIds.size()); // TODO: Move this into GLTexture directly - for (const QNodeId &textureImageId : textureImageIds) { + for (const Qt3DCore::QNodeId &textureImageId : textureImageIds) { const TextureImage *img = m_nodesManager->textureImageManager()->lookupResource(textureImageId); if (img == nullptr) { qWarning() << Q_FUNC_INFO << "invalid TextureImage handle"; @@ -1609,7 +1607,7 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const std::vector Render::RenderCapture *renderCapture = static_cast<Render::RenderCapture*>(m_nodesManager->frameGraphManager()->lookupNode(renderView->renderCaptureNodeId())); renderCapture->addRenderCapture(request.captureId, image); - const QNodeId renderCaptureId = renderView->renderCaptureNodeId(); + const Qt3DCore::QNodeId renderCaptureId = renderView->renderCaptureNodeId(); QMutexLocker lock(&m_pendingRenderCaptureSendRequestsMutex); if (!Qt3DCore::contains(m_pendingRenderCaptureSendRequests, renderCaptureId)) m_pendingRenderCaptureSendRequests.push_back(renderView->renderCaptureNodeId()); @@ -1621,8 +1619,8 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const std::vector // Perform BlitFramebuffer operations if (renderView->hasBlitFramebufferInfo()) { const auto &blitFramebufferInfo = renderView->blitFrameBufferInfo(); - const QNodeId inputTargetId = blitFramebufferInfo.sourceRenderTargetId; - const QNodeId outputTargetId = blitFramebufferInfo.destinationRenderTargetId; + const Qt3DCore::QNodeId inputTargetId = blitFramebufferInfo.sourceRenderTargetId; + const Qt3DCore::QNodeId outputTargetId = blitFramebufferInfo.destinationRenderTargetId; const QRect inputRect = blitFramebufferInfo.sourceRect; const QRect outputRect = blitFramebufferInfo.destinationRect; const QRenderTargetOutput::AttachmentPoint inputAttachmentPoint = blitFramebufferInfo.sourceAttachmentPoint; @@ -1761,7 +1759,7 @@ bool Renderer::processKeyEvent(QObject *object, QKeyEvent *event) } // Jobs we may have to run even if no rendering will happen -std::vector<QAspectJobPtr> Renderer::preRenderingJobs() +std::vector<Qt3DCore::QAspectJobPtr> Renderer::preRenderingJobs() { if (m_sendBufferCaptureJob->hasRequests()) return {m_sendBufferCaptureJob}; @@ -1774,10 +1772,10 @@ std::vector<QAspectJobPtr> Renderer::preRenderingJobs() // for the rendering of the scene std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() { - std::vector<QAspectJobPtr> renderBinJobs; + std::vector<Qt3DCore::QAspectJobPtr> renderBinJobs; // Remove previous dependencies - m_cleanupJob->removeDependency(QWeakPointer<QAspectJob>()); + m_cleanupJob->removeDependency(QWeakPointer<Qt3DCore::QAspectJob>()); const bool dirtyParametersForCurrentFrame = m_dirtyBits.marked & AbstractRenderer::ParameterDirty; const BackendNodeDirtySet dirtyBitsForFrame = m_dirtyBits.marked | m_dirtyBits.remaining; @@ -1848,7 +1846,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() m_updatedDisableSubtreeEnablers.push_back(node->peerId()); } - int idealThreadCount = QAspectJobManager::idealThreadCount(); + int idealThreadCount = Qt3DCore::QAspectJobManager::idealThreadCount(); const size_t fgBranchCount = m_frameGraphLeaves.size(); if (fgBranchCount > 1) { @@ -1903,7 +1901,7 @@ std::vector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() return renderBinJobs; } -QAbstractFrameAdvanceService *Renderer::frameAdvanceService() const +Qt3DCore::QAbstractFrameAdvanceService *Renderer::frameAdvanceService() const { return static_cast<Qt3DCore::QAbstractFrameAdvanceService *>(m_vsyncFrameAdvanceService.data()); } @@ -2139,7 +2137,7 @@ bool Renderer::updateVAOWithAttributes(Geometry *geometry, m_dirtyAttributes.reserve(m_dirtyAttributes.size() + geometry->attributes().size()); const auto attributeIds = geometry->attributes(); - for (QNodeId attributeId : attributeIds) { + for (Qt3DCore::QNodeId attributeId : attributeIds) { // TO DO: Improvement we could store handles and use the non locking policy on the attributeManager Attribute *attribute = m_nodesManager->attributeManager()->lookupResource(attributeId); @@ -2155,7 +2153,7 @@ bool Renderer::updateVAOWithAttributes(Geometry *geometry, // Index Attribute bool attributeWasDirty = false; - if (attribute->attributeType() == QAttribute::IndexAttribute) { + if (attribute->attributeType() == Qt3DCore::QAttribute::IndexAttribute) { if ((attributeWasDirty = attribute->isDirty()) == true || forceUpdate) m_submissionContext->specifyIndices(buffer); // Vertex Attribute @@ -2196,16 +2194,14 @@ bool Renderer::requiresVAOAttributeUpdate(Geometry *geometry, { const auto attributeIds = geometry->attributes(); - for (QNodeId attributeId : attributeIds) { + for (Qt3DCore::QNodeId attributeId : attributeIds) { // TO DO: Improvement we could store handles and use the non locking policy on the attributeManager Attribute *attribute = m_nodesManager->attributeManager()->lookupResource(attributeId); if (attribute == nullptr) continue; - if ((attribute->attributeType() == QAttribute::IndexAttribute && attribute->isDirty()) || - (Qt3DCore::contains(command->m_activeAttributes, attribute->nameId()) && - attribute->isDirty())) + if ((attribute->attributeType() == Qt3DCore::QAttribute::IndexAttribute && attribute->isDirty()) || (Qt3DCore::contains(command->m_activeAttributes, attribute->nameId()) && attribute->isDirty())) return true; } return false; diff --git a/src/plugins/renderers/opengl/renderer/renderer.pri b/src/plugins/renderers/opengl/renderer/renderer.pri deleted file mode 100644 index 5d0296523..000000000 --- a/src/plugins/renderers/opengl/renderer/renderer.pri +++ /dev/null @@ -1,29 +0,0 @@ -INCLUDEPATH += $$PWD - -SOURCES += \ - $$PWD/gllights.cpp \ - $$PWD/openglvertexarrayobject.cpp \ - $$PWD/rendercommand.cpp \ - $$PWD/renderer.cpp \ - $$PWD/renderview.cpp \ - $$PWD/renderviewbuilder.cpp \ - $$PWD/shaderparameterpack.cpp \ - $$PWD/glshader.cpp \ - $$PWD/logging.cpp \ - $$PWD/commandexecuter.cpp - -HEADERS += \ - $$PWD/gllights_p.h \ - $$PWD/openglvertexarrayobject_p.h \ - $$PWD/rendercommand_p.h \ - $$PWD/renderer_p.h \ - $$PWD/renderview_p.h \ - $$PWD/renderviewbuilder_p.h \ - $$PWD/shaderparameterpack_p.h \ - $$PWD/shadervariables_p.h \ - $$PWD/glshader_p.h \ - $$PWD/glfence_p.h \ - $$PWD/logging_p.h \ - $$PWD/commandexecuter_p.h \ - $$PWD/frameprofiler_p.h - diff --git a/src/plugins/renderers/opengl/renderer/renderview.cpp b/src/plugins/renderers/opengl/renderer/renderview.cpp index 324e63af9..8cd22eaa2 100644 --- a/src/plugins/renderers/opengl/renderer/renderview.cpp +++ b/src/plugins/renderers/opengl/renderer/renderview.cpp @@ -1077,8 +1077,16 @@ void RenderView::updateRenderCommand(const EntityRenderCommandDataSubView &subVi void RenderView::updateMatrices() { if (m_renderCameraNode && m_renderCameraLens && m_renderCameraLens->isEnabled()) { - const Matrix4x4 cameraWorld = *(m_renderCameraNode->worldTransform()); - setViewMatrix(m_renderCameraLens->viewMatrix(cameraWorld)); + auto transform = m_renderCameraNode->renderComponent<Transform>(); + if (m_renderCameraNode->isParentLessTransform() && transform && transform->hasViewMatrix()) { + // optimization: if the entity is a QCamera and it doesn't have a parent with a transform component, + // then we use the frontend version of the viewMatrix to avoid extra calculations that may introduce + // rounding errors + setViewMatrix(transform->viewMatrix()); + } else { + const Matrix4x4 cameraWorld = *(m_renderCameraNode->worldTransform()); + setViewMatrix(m_renderCameraLens->viewMatrix(cameraWorld)); + } setViewProjectionMatrix(m_renderCameraLens->projection() * viewMatrix()); //To get the eyePosition of the camera, we need to use the inverse of the diff --git a/src/plugins/renderers/opengl/textures/gltexture.cpp b/src/plugins/renderers/opengl/textures/gltexture.cpp index f6bd38fc3..7f358b0e3 100644 --- a/src/plugins/renderers/opengl/textures/gltexture.cpp +++ b/src/plugins/renderers/opengl/textures/gltexture.cpp @@ -9,9 +9,7 @@ #include <private/qopengltexturehelper_p.h> #include <QDebug> #include <QOpenGLFunctions> -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include <QtOpenGL/QOpenGLVersionFunctionsFactory> -#endif #include <QOpenGLTexture> #include <QOpenGLPixelTransferOptions> #include <Qt3DRender/qtexture.h> @@ -30,8 +28,6 @@ QT_BEGIN_NAMESPACE -using namespace Qt3DCore; - namespace Qt3DRender { namespace Render { namespace OpenGL { @@ -656,11 +652,7 @@ void GLTexture::introspectPropertiesFromSharedTextureId() if (ctxGLVersion.first > 4 || (ctxGLVersion.first == 4 && ctxGLVersion.second >= 5)) { // Only for GL 4.5+ #ifdef GL_TEXTURE_TARGET -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QOpenGLFunctions_4_5_Core *gl5 = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_4_5_Core>(); -#else - QOpenGLFunctions_4_5_Core *gl5 = ctx->versionFunctions<QOpenGLFunctions_4_5_Core>(); -#endif if (gl5 != nullptr) gl5->glGetTextureParameteriv(m_sharedTextureId, GL_TEXTURE_TARGET, reinterpret_cast<int *>(&m_properties.target)); #endif @@ -732,11 +724,7 @@ void GLTexture::introspectPropertiesFromSharedTextureId() #if !QT_CONFIG(opengles2) // Try to retrieve dimensions (not available on ES 2.0) if (!ctx->isOpenGLES()) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QOpenGLFunctions_3_1 *gl3 = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_3_1>(); -#else - QOpenGLFunctions_3_1 *gl3 = ctx->versionFunctions<QOpenGLFunctions_3_1>(); -#endif if (!gl3) { qWarning() << "Failed to retrieve shared texture dimensions"; return; diff --git a/src/plugins/renderers/opengl/textures/textures.pri b/src/plugins/renderers/opengl/textures/textures.pri deleted file mode 100644 index e17abfbb3..000000000 --- a/src/plugins/renderers/opengl/textures/textures.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -SOURCES += \ - $$PWD/gltexture.cpp \ - $$PWD/renderbuffer.cpp - -HEADERS += \ - $$PWD/gltexture_p.h \ - $$PWD/renderbuffer_p.h |