summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-05-09 13:49:09 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-05-09 13:49:09 +0200
commit66feeb8de70291786499b3008ab8fded4043172a (patch)
tree4c2029d9f51b2471c7c8dc0c3be9311640831595 /src/render
parent7eb41022f19a57505c8eef3497ad6710fc92bd7d (diff)
parent15e863517ea37ca7ba6bcb75b078272eddbc5d37 (diff)
Merge remote-tracking branch 'origin/5.11.0' into 5.11
Diffstat (limited to 'src/render')
-rw-r--r--src/render/backend/abstractrenderer_p.h3
-rw-r--r--src/render/framegraph/qrenderpassfilter.cpp2
-rw-r--r--src/render/framegraph/qrenderstateset.cpp2
-rw-r--r--src/render/framegraph/qtechniquefilter.cpp2
-rw-r--r--src/render/frontend/qrendertarget.cpp2
-rw-r--r--src/render/frontend/qrendertargetoutput.cpp2
-rw-r--r--src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp3
-rw-r--r--src/render/renderers/opengl/renderer/renderer.cpp59
-rw-r--r--src/render/renderers/opengl/renderer/renderer_p.h3
9 files changed, 57 insertions, 21 deletions
diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h
index 5fe7031ca..f1bdca7be 100644
--- a/src/render/backend/abstractrenderer_p.h
+++ b/src/render/backend/abstractrenderer_p.h
@@ -53,6 +53,7 @@
#include <QtCore/qflags.h>
#include <QtCore/qmutex.h>
#include <Qt3DRender/private/qt3drender_global_p.h>
+#include <Qt3DRender/private/handle_types_p.h>
#include <Qt3DCore/qaspectjob.h>
#include <Qt3DCore/qnodeid.h>
#include <QtGui/qsurfaceformat.h>
@@ -181,7 +182,7 @@ public:
// These commands are executed in a dedicated command thread
// More will be added later
- virtual void loadShader(Shader *shader) const = 0;
+ virtual void loadShader(Shader *shader, Qt3DRender::Render::HShader shaderHandle) = 0;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractRenderer::BackendNodeDirtySet)
diff --git a/src/render/framegraph/qrenderpassfilter.cpp b/src/render/framegraph/qrenderpassfilter.cpp
index 1654b284e..409a97c01 100644
--- a/src/render/framegraph/qrenderpassfilter.cpp
+++ b/src/render/framegraph/qrenderpassfilter.cpp
@@ -72,7 +72,7 @@ namespace Qt3DRender {
/*!
\qmltype RenderPassFilter
- \inmodule Qt3D.Render
+ \inqmlmodule Qt3D.Render
\since 5.7
\instantiates Qt3DRender::QRenderPassFilter
\inherits FrameGraphNode
diff --git a/src/render/framegraph/qrenderstateset.cpp b/src/render/framegraph/qrenderstateset.cpp
index f44e9d50f..6f70456ab 100644
--- a/src/render/framegraph/qrenderstateset.cpp
+++ b/src/render/framegraph/qrenderstateset.cpp
@@ -101,7 +101,7 @@ QRenderStateSetPrivate::QRenderStateSetPrivate()
/*!
\qmltype RenderStateSet
- \inmodule Qt3D.Render
+ \inqmlmodule Qt3D.Render
\since 5.5
\inherits FrameGraphNode
\instantiates Qt3DRender::QRenderStateSet
diff --git a/src/render/framegraph/qtechniquefilter.cpp b/src/render/framegraph/qtechniquefilter.cpp
index 639a6cd15..0f64d8765 100644
--- a/src/render/framegraph/qtechniquefilter.cpp
+++ b/src/render/framegraph/qtechniquefilter.cpp
@@ -74,7 +74,7 @@ QTechniqueFilterPrivate::QTechniqueFilterPrivate()
/*!
\qmltype TechniqueFilter
- \inmodule Qt3D.Render
+ \inqmlmodule Qt3D.Render
\instantiates Qt3DRender::QTechniqueFilter
\inherits FrameGraphNode
\since 5.7
diff --git a/src/render/frontend/qrendertarget.cpp b/src/render/frontend/qrendertarget.cpp
index bdf8b5fa1..9aa9c8c41 100644
--- a/src/render/frontend/qrendertarget.cpp
+++ b/src/render/frontend/qrendertarget.cpp
@@ -70,7 +70,7 @@ namespace Qt3DRender {
\brief The RenderTarget class encapsulates a target (usually a frame buffer
object) which the renderer can render into.
\since 5.7
- \inmodule Qt3D.Render
+ \inqmlmodule Qt3D.Render
\instantiates Qt3DRender::QRenderTarget
A RenderTarget comprises of RenderTargetOutput objects, which specify the the buffers
diff --git a/src/render/frontend/qrendertargetoutput.cpp b/src/render/frontend/qrendertargetoutput.cpp
index 6d65ec08e..14ac9c817 100644
--- a/src/render/frontend/qrendertargetoutput.cpp
+++ b/src/render/frontend/qrendertargetoutput.cpp
@@ -64,7 +64,7 @@ namespace Qt3DRender {
\brief The RenderTargetOutput type allows the specification of an attachment
of a render target (whether it is a color texture, a depth texture, etc... ).
\since 5.7
- \inmodule Qt3D.Render
+ \inqmlmodule Qt3D.Render
\inherits Node
\instantiates Qt3DRender::QRenderTargetOutput
diff --git a/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp b/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp
index cd082011b..4ec929b6e 100644
--- a/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp
+++ b/src/render/renderers/opengl/graphicshelpers/submissioncontext.cpp
@@ -887,7 +887,8 @@ int SubmissionContext::activateTexture(TextureScope scope, GLTexture *tex, int o
// actually re-bind if required, the tex->dna on the unit not being the same
// Note: tex->dna() could be 0 if the texture has not been created yet
if (m_activeTextures[onUnit].texture != tex) {
- QOpenGLTexture *glTex = tex->getOrCreateGLTexture();
+ // Texture must have been created and updated at this point
+ QOpenGLTexture *glTex = tex->getGLTexture();
if (glTex == nullptr)
return -1;
glTex->bind(onUnit);
diff --git a/src/render/renderers/opengl/renderer/renderer.cpp b/src/render/renderers/opengl/renderer/renderer.cpp
index bcc5fba80..b889799a3 100644
--- a/src/render/renderers/opengl/renderer/renderer.cpp
+++ b/src/render/renderers/opengl/renderer/renderer.cpp
@@ -128,6 +128,9 @@
QT_BEGIN_NAMESPACE
+// Crashes on AMD Radeon drivers on Windows. Disable for now.
+//#define SHADER_LOADING_IN_COMMAND_THREAD
+
using namespace Qt3DCore;
namespace Qt3DRender {
@@ -323,11 +326,17 @@ QOpenGLContext *Renderer::shareContext() const
}
// Executed in the command thread
-void Renderer::loadShader(Shader *shader) const
+void Renderer::loadShader(Shader *shader, HShader shaderHandle)
{
+#ifdef SHADER_LOADING_IN_COMMAND_THREAD
+ Q_UNUSED(shaderHandle);
Profiling::GLTimeRecorder recorder(Profiling::ShaderUpload);
LoadShaderCommand cmd(shader);
m_commandThread->executeCommand(&cmd);
+#else
+ Q_UNUSED(shader);
+ m_dirtyShaders.push_back(shaderHandle);
+#endif
}
void Renderer::setOpenGLContext(QOpenGLContext *context)
@@ -1123,7 +1132,7 @@ void Renderer::reloadDirtyShaders()
shader->submitPendingNotifications();
// If the shader hasn't be loaded, load it
if (shader != nullptr && !shader->isLoaded())
- loadShader(shader);
+ loadShader(shader, shaderHandle);
}
}
}
@@ -1147,14 +1156,37 @@ void Renderer::updateGLResources()
}
}
+#ifndef SHADER_LOADING_IN_COMMAND_THREAD
+ {
+ Profiling::GLTimeRecorder recorder(Profiling::ShaderUpload);
+ const QVector<HShader> dirtyShaderHandles = std::move(m_dirtyShaders);
+ ShaderManager *shaderManager = m_nodesManager->shaderManager();
+ for (const HShader &handle: dirtyShaderHandles) {
+ Shader *shader = shaderManager->data(handle);
+ // Compile shader
+ m_submissionContext->loadShader(shader, shaderManager);
+ }
+ }
+#endif
+
{
Profiling::GLTimeRecorder recorder(Profiling::TextureUpload);
const QVector<HTexture> activeTextureHandles = std::move(m_dirtyTextures);
for (const HTexture &handle: activeTextureHandles) {
Texture *texture = m_nodesManager->textureManager()->data(handle);
- // Upload/Update texture
+ // Update texture properties
updateTexture(texture);
}
+ // We want to upload textures data at this point as the SubmissionThread and
+ // AspectThread are locked ensuring no races between Texture/TextureImage and
+ // GLTexture
+ if (m_submissionContext != nullptr) {
+ GLTextureManager *glTextureManager = m_nodesManager->glTextureManager();
+ const QVector<GLTexture *> glTextures = glTextureManager->activeResources();
+ // Upload texture data
+ for (GLTexture *glTexture : glTextures)
+ glTexture->getOrCreateGLTexture();
+ }
}
// When Textures are cleaned up, their id is saved
// so that they can be cleaned up in the render thread
@@ -1196,13 +1228,18 @@ void Renderer::updateTexture(Texture *texture)
GLTextureManager *glTextureManager = m_nodesManager->glTextureManager();
GLTexture *glTexture = glTextureManager->lookupResource(texture->peerId());
- // No GLTexture associated yet -> create it
- if (glTexture == nullptr) {
+ auto createOrUpdateGLTexture = [=] () {
+ GLTexture *newGLTexture = nullptr;
if (isUnique)
- glTextureManager->createUnique(texture);
+ newGLTexture = glTextureManager->createUnique(texture);
else
- glTextureManager->getOrCreateShared(texture);
+ newGLTexture = glTextureManager->getOrCreateShared(texture);
texture->unsetDirty();
+ };
+
+ // No GLTexture associated yet -> create it
+ if (glTexture == nullptr) {
+ createOrUpdateGLTexture();
return;
}
@@ -1210,12 +1247,8 @@ void Renderer::updateTexture(Texture *texture)
// and abandon the old one
if (glTextureManager->isShared(glTexture)) {
glTextureManager->abandon(glTexture, texture);
- // Check if a shared texture should become unique
- if (isUnique)
- glTextureManager->createUnique(texture);
- else
- glTextureManager->getOrCreateShared(texture);
- texture->unsetDirty();
+ // Note: if isUnique is true, a once shared texture will become unique
+ createOrUpdateGLTexture();
return;
}
diff --git a/src/render/renderers/opengl/renderer/renderer_p.h b/src/render/renderers/opengl/renderer/renderer_p.h
index 1d459a15e..bf9554a54 100644
--- a/src/render/renderers/opengl/renderer/renderer_p.h
+++ b/src/render/renderers/opengl/renderer/renderer_p.h
@@ -226,7 +226,7 @@ public:
// Executed in secondary GL thread
- void loadShader(Shader *shader) const override;
+ void loadShader(Shader *shader, Qt3DRender::Render::HShader shaderHandle) override;
void updateGLResources();
@@ -382,6 +382,7 @@ private:
QVector<HBuffer> m_dirtyBuffers;
QVector<HBuffer> m_downloadableBuffers;
+ QVector<HShader> m_dirtyShaders;
QVector<HTexture> m_dirtyTextures;
bool m_ownedContext;