From 93afdf79a3e32108a565d2b889c4c1999eabe3a0 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 21 Jul 2015 11:17:41 -0700 Subject: [PATCH 1/4] Removing the gl driver version report intiialization code out of applciation --- interface/src/Application.h | 1 + libraries/gpu/src/gpu/GLBackend.cpp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/interface/src/Application.h b/interface/src/Application.h index 736f515390..9e234354b1 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -482,6 +482,7 @@ private: glm::vec3 getSunDirection(); void renderRearViewMirror(RenderArgs* renderArgs, const QRect& region, bool billboard = false); + void setMenuShortcutsEnabled(bool enabled); static void attachNewHeadToNode(Node *newNode); diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index adebee2f20..558c94f062 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -91,6 +91,11 @@ GLBackend::GLBackend() : { initInput(); initTransform(); + + qCDebug(gpulogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); + qCDebug(gpulogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); + qCDebug(gpulogging) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR)); + qCDebug(gpulogging) << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER)); } GLBackend::~GLBackend() { From 7ac20308621f19afd921c49693e7f8b2cce9d254 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 22 Jul 2015 10:43:50 -0700 Subject: [PATCH 2/4] Preparing for first pr --- interface/src/Application.cpp | 43 ++++----------------- interface/src/Application.h | 4 ++ interface/src/avatar/MyAvatar.cpp | 4 +- interface/src/ui/ApplicationOverlay.h | 1 - libraries/gpu/src/gpu/Context.h | 2 +- libraries/gpu/src/gpu/GLBackend.cpp | 40 ++++++++++++++++--- libraries/gpu/src/gpu/GLBackend.h | 1 + libraries/render-utils/src/TextureCache.cpp | 21 ---------- libraries/render-utils/src/TextureCache.h | 9 +++-- libraries/shared/src/RenderArgs.h | 4 +- 10 files changed, 57 insertions(+), 72 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f0dcdd1a8a..62c1374179 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -765,32 +765,9 @@ void Application::initializeGL() { } #endif - qCDebug(interfaceapp) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); - qCDebug(interfaceapp) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); - qCDebug(interfaceapp) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR)); - qCDebug(interfaceapp) << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER)); - #ifdef WIN32 - GLenum err = glewInit(); - if (GLEW_OK != err) { - /* Problem: glewInit failed, something is seriously wrong. */ - qCDebug(interfaceapp, "Error: %s\n", glewGetErrorString(err)); - } - qCDebug(interfaceapp, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); - - if (wglewGetExtension("WGL_EXT_swap_control")) { - int swapInterval = wglGetSwapIntervalEXT(); - qCDebug(interfaceapp, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF")); - } - #endif - -#if defined(Q_OS_LINUX) - // TODO: Write the correct code for Linux... - /* if (wglewGetExtension("WGL_EXT_swap_control")) { - int swapInterval = wglGetSwapIntervalEXT(); - qCDebug(interfaceapp, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF")); - }*/ -#endif + // Where the gpuContext is created and where the TRUE Backend is created and assigned + _gpuContext = std::make_shared(new gpu::GLBackend()); initDisplay(); qCDebug(interfaceapp, "Initialized Display."); @@ -879,8 +856,9 @@ void Application::paintGL() { _glWidget->makeCurrent(); auto lodManager = DependencyManager::get(); - gpu::Context context(new gpu::GLBackend()); - RenderArgs renderArgs(&context, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), + + + RenderArgs renderArgs(_gpuContext, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); @@ -896,6 +874,7 @@ void Application::paintGL() { PerformanceWarning warn(showWarnings, "Application::paintGL()"); resizeGL(); + { PerformanceTimer perfTimer("renderOverlay"); @@ -906,8 +885,6 @@ void Application::paintGL() { _applicationOverlay.renderOverlay(&renderArgs); } - glEnable(GL_LINE_SMOOTH); - if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON || _myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, _myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !(_myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN)); @@ -958,7 +935,6 @@ void Application::paintGL() { } // Sync up the View Furstum with the camera - // FIXME: it's happening again in the updateSHadow and it shouldn't, this should be the place loadViewFrustum(_myCamera, _viewFrustum); @@ -997,7 +973,7 @@ void Application::paintGL() { displaySide(&renderArgs, _myCamera); - if (_myCamera.getMode() != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; renderRearViewMirror(&renderArgs, _mirrorViewRect); renderArgs._renderMode = RenderArgs::NORMAL_RENDER_MODE; @@ -3172,10 +3148,6 @@ namespace render { model::Skybox::render(batch, *(Application::getInstance()->getDisplayViewFrustum()), *skybox); } } - // FIX ME - If I don't call this renderBatch() here, then the atmosphere and skybox don't render, but it - // seems like these payloadRender() methods shouldn't be doing this. We need to investigate why the engine - // isn't rendering our batch - gpu::GLBackend::renderBatch(batch, true); } } @@ -3444,7 +3416,6 @@ void Application::renderRearViewMirror(RenderArgs* renderArgs, const QRect& regi bool updateViewFrustum = false; loadViewFrustum(_mirrorCamera, _viewFrustum); - // render rear mirror view displaySide(renderArgs, _mirrorCamera, true, billboard); diff --git a/interface/src/Application.h b/interface/src/Application.h index 766ab14eff..ea800d60cb 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -69,6 +69,7 @@ #include "octree/OctreePacketProcessor.h" #include "UndoStackScriptingInterface.h" +#include "gpu/Context.h" #include "render/Engine.h" class QGLWidget; @@ -326,6 +327,8 @@ public: render::ScenePointer getMain3DScene() const { return _main3DScene; } + gpu::ContextPointer getGPUContext() const { return _gpuContext; } + signals: /// Fired when we're simulating; allows external parties to hook in. @@ -633,6 +636,7 @@ private: render::ScenePointer _main3DScene{ new render::Scene() }; render::EnginePointer _renderEngine{ new render::Engine() }; + gpu::ContextPointer _gpuContext; // initialized during window creation Overlays _overlays; ApplicationOverlay _applicationOverlay; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 27a54fc42d..a5ddb43637 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1524,8 +1524,8 @@ void MyAvatar::maybeUpdateBillboard() { return; } } - gpu::Context context(new gpu::GLBackend()); - RenderArgs renderArgs(&context); + + RenderArgs renderArgs(qApp->getGPUContext()); QImage image = qApp->renderAvatarBillboard(&renderArgs); _billboard.clear(); QBuffer buffer(&_billboard); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index ae09aa0b10..532fea23dc 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -49,7 +49,6 @@ private: gpu::TexturePointer _overlayDepthTexture; gpu::TexturePointer _overlayColorTexture; gpu::FramebufferPointer _overlayFramebuffer; - }; #endif // hifi_ApplicationOverlay_h diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 4eb0976e3c..484c772c71 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -134,7 +134,7 @@ protected: friend class Shader; }; - +typedef std::shared_ptr ContextPointer; }; diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 558c94f062..0a6f3a423d 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -14,6 +14,8 @@ using namespace gpu; +bool GLBackend::_initialized = false; + GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = { (&::gpu::GLBackend::do_draw), @@ -89,13 +91,38 @@ GLBackend::GLBackend() : _pipeline(), _output() { + if (!_initialized) { + qCDebug(gpulogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); + qCDebug(gpulogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); + qCDebug(gpulogging) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR)); + qCDebug(gpulogging) << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER)); + +#ifdef WIN32 + GLenum err = glewInit(); + if (GLEW_OK != err) { + /* Problem: glewInit failed, something is seriously wrong. */ + qCDebug(gpulogging, "Error: %s\n", glewGetErrorString(err)); + } + qCDebug(gpulogging, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); + + if (wglewGetExtension("WGL_EXT_swap_control")) { + int swapInterval = wglGetSwapIntervalEXT(); + qCDebug(gpulogging, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF")); + } +#endif + +#if defined(Q_OS_LINUX) + // TODO: Write the correct code for Linux... + /* if (wglewGetExtension("WGL_EXT_swap_control")) { + int swapInterval = wglGetSwapIntervalEXT(); + qCDebug(gpulogging, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF")); + }*/ +#endif + _initialized = true; + } + initInput(); initTransform(); - - qCDebug(gpulogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); - qCDebug(gpulogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); - qCDebug(gpulogging) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR)); - qCDebug(gpulogging) << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER)); } GLBackend::~GLBackend() { @@ -118,6 +145,7 @@ void GLBackend::render(Batch& batch) { } void GLBackend::renderBatch(Batch& batch, bool syncCache) { + qCDebug(gpulogging) << "GLBackend::renderBatch : Deprecated call, don;t do it!!!"; GLBackend backend; if (syncCache) { backend.syncCache(); @@ -171,6 +199,8 @@ void GLBackend::syncCache() { syncTransformStateCache(); syncPipelineStateCache(); syncInputStateCache(); + + glEnable(GL_LINE_SMOOTH); } void GLBackend::do_draw(Batch& batch, uint32 paramOffset) { diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 60c01a815c..b4906b4ac7 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -448,6 +448,7 @@ protected: typedef void (GLBackend::*CommandCall)(Batch&, uint32); static CommandCall _commandCalls[Batch::NUM_COMMANDS]; + static bool _initialized; }; diff --git a/libraries/render-utils/src/TextureCache.cpp b/libraries/render-utils/src/TextureCache.cpp index ddfcc1589c..2baa58d256 100644 --- a/libraries/render-utils/src/TextureCache.cpp +++ b/libraries/render-utils/src/TextureCache.cpp @@ -237,27 +237,6 @@ GLuint TextureCache::getPrimaryDepthTextureID() { return gpu::GLBackend::getTextureID(getPrimaryDepthTexture()); } -void TextureCache::setPrimaryDrawBuffers(bool color, bool normal, bool specular) { - gpu::Batch batch; - setPrimaryDrawBuffers(batch, color, normal, specular); - gpu::GLBackend::renderBatch(batch); -} - -void TextureCache::setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool normal, bool specular) { - GLenum buffers[3]; - int bufferCount = 0; - if (color) { - buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; - } - if (normal) { - buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; - } - if (specular) { - buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; - } - batch._glDrawBuffers(bufferCount, buffers); -} - gpu::FramebufferPointer TextureCache::getSecondaryFramebuffer() { if (!_secondaryFramebuffer) { _secondaryFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create(gpu::Element::COLOR_RGBA_32, _frameBufferSize.width(), _frameBufferSize.height())); diff --git a/libraries/render-utils/src/TextureCache.h b/libraries/render-utils/src/TextureCache.h index 6b4fff4f6b..020b502eb9 100644 --- a/libraries/render-utils/src/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -79,10 +79,6 @@ public: /// Returns the ID of the primary framebuffer object's depth texture. This contains the Z buffer used in rendering. uint32_t getPrimaryDepthTextureID(); - /// Enables or disables draw buffers on the primary framebuffer. Note: the primary framebuffer must be bound. - void setPrimaryDrawBuffers(bool color, bool normal = false, bool specular = false); - void setPrimaryDrawBuffers(gpu::Batch& batch, bool color, bool normal = false, bool specular = false); - /// Returns a pointer to the secondary framebuffer object, used as an additional render target when performing full /// screen effects. gpu::FramebufferPointer getSecondaryFramebuffer(); @@ -94,6 +90,11 @@ public: /// Returns the framebuffer object used to render shadow maps; gpu::FramebufferPointer getShadowFramebuffer(); + + // The framebuffer used for the selfie view of the avatar. used for creating the billboard view and the rearViewMirror image + gpu::FramebufferPointer getSelfieFramebuffer(); + + protected: virtual QSharedPointer createResource(const QUrl& url, diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index 604cb46731..7a5daf7a17 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -80,7 +80,7 @@ public: RENDER_DEBUG_SIMULATION_OWNERSHIP = 2, }; - RenderArgs(gpu::Context* context = nullptr, + RenderArgs(std::shared_ptr context = nullptr, OctreeRenderer* renderer = nullptr, ViewFrustum* viewFrustum = nullptr, float sizeScale = 1.0f, @@ -102,7 +102,7 @@ public: _shouldRender(shouldRender) { } - gpu::Context* _context = nullptr; + std::shared_ptr _context = nullptr; OctreeRenderer* _renderer = nullptr; ViewFrustum* _viewFrustum = nullptr; glm::ivec4 _viewport{ 0, 0, 1, 1 }; From 8dbd991652d5d881c9bc6e5c4b70ac68cc6f9735 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 22 Jul 2015 10:54:40 -0700 Subject: [PATCH 3/4] USing a modern singleton guard --- libraries/gpu/src/gpu/GLBackend.cpp | 9 ++++----- libraries/gpu/src/gpu/GLBackend.h | 2 -- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 0a6f3a423d..721be0f402 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -8,14 +8,13 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include "GPULogging.h" #include "GLBackendShared.h" #include using namespace gpu; -bool GLBackend::_initialized = false; - GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = { (&::gpu::GLBackend::do_draw), @@ -91,7 +90,8 @@ GLBackend::GLBackend() : _pipeline(), _output() { - if (!_initialized) { + static std::once_flag once; + std::call_once(once, [] { qCDebug(gpulogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); qCDebug(gpulogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); qCDebug(gpulogging) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR)); @@ -118,8 +118,7 @@ GLBackend::GLBackend() : qCDebug(gpulogging, "V-Sync is %s\n", (swapInterval > 0 ? "ON" : "OFF")); }*/ #endif - _initialized = true; - } + }); initInput(); initTransform(); diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index b4906b4ac7..b3e905bf21 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -447,8 +447,6 @@ protected: typedef void (GLBackend::*CommandCall)(Batch&, uint32); static CommandCall _commandCalls[Batch::NUM_COMMANDS]; - - static bool _initialized; }; From 837ff4576396c32bc102618860b57168cbf8c205 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 22 Jul 2015 10:57:08 -0700 Subject: [PATCH 4/4] Removing code aroung the selfie fremebuffer --- libraries/render-utils/src/TextureCache.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libraries/render-utils/src/TextureCache.h b/libraries/render-utils/src/TextureCache.h index 020b502eb9..be7aef5cfe 100644 --- a/libraries/render-utils/src/TextureCache.h +++ b/libraries/render-utils/src/TextureCache.h @@ -90,11 +90,6 @@ public: /// Returns the framebuffer object used to render shadow maps; gpu::FramebufferPointer getShadowFramebuffer(); - - // The framebuffer used for the selfie view of the avatar. used for creating the billboard view and the rearViewMirror image - gpu::FramebufferPointer getSelfieFramebuffer(); - - protected: virtual QSharedPointer createResource(const QUrl& url,