diff options
Diffstat (limited to 'src/render/renderers/opengl/renderer/renderview.cpp')
-rw-r--r-- | src/render/renderers/opengl/renderer/renderview.cpp | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/src/render/renderers/opengl/renderer/renderview.cpp b/src/render/renderers/opengl/renderer/renderview.cpp index 2a16c9bfd..6b6de01a7 100644 --- a/src/render/renderers/opengl/renderer/renderview.cpp +++ b/src/render/renderers/opengl/renderer/renderview.cpp @@ -69,6 +69,7 @@ #include <Qt3DRender/private/buffercapture_p.h> #include <Qt3DRender/private/stringtoint_p.h> #include <Qt3DRender/private/submissioncontext_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> #include <Qt3DCore/qentity.h> #include <QtGui/qsurface.h> #include <algorithm> @@ -322,7 +323,7 @@ struct AdjacentSubRangeFinder<QSortPolicy::Material> { static bool adjacentSubRange(const RenderCommand &a, const RenderCommand &b) { - return a.m_shaderDna == b.m_shaderDna; + return a.m_glShader == b.m_glShader; } }; @@ -410,9 +411,9 @@ struct SubRangeSorter<QSortPolicy::Material> { static void sortSubRange(CommandIt begin, const CommandIt end) { - // First we sort by shaderDNA + // First we sort by shader std::stable_sort(begin, end, [] (const RenderCommand &a, const RenderCommand &b) { - return a.m_shaderDna > b.m_shaderDna; + return a.m_glShader > b.m_glShader; }); } }; @@ -537,7 +538,9 @@ void sortCommandRange(QVector<RenderCommand> &commands, int begin, const int end void RenderView::sort() { - sortCommandRange(m_commands, 0, m_commands.size(), 0, m_data.m_sortingTypes); + // Compares the bitsetKey of the RenderCommands + // Key[Depth | StateCost | Shader] + sortCommandRange(m_commands, 0, m_commands.size(), 0, m_data.m_sortingTypes); // For RenderCommand with the same shader // We compute the adjacent change cost @@ -553,7 +556,8 @@ void RenderView::sort() int j = i; // Advance while commands share the same shader - while (i < commandSize && m_commands[j].m_shaderDna == m_commands[i].m_shaderDna) + while (i < commandSize && + m_commands[j].m_glShader == m_commands[i].m_glShader) ++i; if (i - j > 0) { // Several commands have the same shader, so we minimize uniform changes @@ -635,6 +639,7 @@ void RenderView::addClearBuffers(const ClearBuffers *cb) { EntityRenderCommandData RenderView::buildDrawRenderCommands(const QVector<Entity *> &entities, int offset, int count) const { + GLShaderManager *glShaderManager = m_renderer->glResourceManagers()->glShaderManager(); EntityRenderCommandData commands; commands.reserve(count); @@ -677,7 +682,13 @@ EntityRenderCommandData RenderView::buildDrawRenderCommands(const QVector<Entity command.m_stateSet->merge(m_stateSet); command.m_changeCost = m_renderer->defaultRenderState()->changeCost(command.m_stateSet.data()); } - command.m_shader = m_manager->lookupHandle<Shader, ShaderManager, HShader>(pass->shaderProgram()); + command.m_shaderId = pass->shaderProgram(); + command.m_glShader = glShaderManager->lookupResource(command.m_shaderId); + + // It takes two frames to have a valid command as we can only + // reference a glShader at frame n if it has been loaded at frame n - 1 + if (!command.m_glShader) + continue; { // Scoped to show extent @@ -763,6 +774,7 @@ EntityRenderCommandData RenderView::buildComputeRenderCommands(const QVector<Ent // layer component // material/effect/technique/parameters/filters/ EntityRenderCommandData commands; + GLShaderManager *glShaderManager = m_renderer->glResourceManagers()->glShaderManager(); commands.reserve(count); @@ -793,7 +805,14 @@ EntityRenderCommandData RenderView::buildComputeRenderCommands(const QVector<Ent command.m_stateSet->merge(m_stateSet); command.m_changeCost = m_renderer->defaultRenderState()->changeCost(command.m_stateSet.data()); } - command.m_shader = m_manager->lookupHandle<Shader, ShaderManager, HShader>(pass->shaderProgram()); + command.m_shaderId = pass->shaderProgram(); + command.m_glShader = glShaderManager->lookupResource(command.m_shaderId); + + // It takes two frames to have a valid command as we can only + // reference a glShader at frame n if it has been loaded at frame n - 1 + if (!command.m_glShader) + continue; + command.m_computeCommand = computeCommandHandle; command.m_type = RenderCommand::Compute; command.m_workGroups[0] = std::max(m_workGroups[0], computeJob->x()); @@ -865,6 +884,7 @@ void RenderView::updateRenderCommand(EntityRenderCommandData *renderCommandData, ParameterInfoList globalParameters = passData.parameterInfo; // setShaderAndUniforms can initialize a localData // make sure this is cleared before we leave this function + setShaderAndUniforms(&command, globalParameters, entity, @@ -944,7 +964,7 @@ void RenderView::setStandardUniformValue(ShaderParameterPack &uniformPack, } void RenderView::setUniformBlockValue(ShaderParameterPack &uniformPack, - Shader *shader, + GLShader *shader, const ShaderUniformBlock &block, const UniformValue &value) const { @@ -965,7 +985,7 @@ void RenderView::setUniformBlockValue(ShaderParameterPack &uniformPack, } void RenderView::setShaderStorageValue(ShaderParameterPack &uniformPack, - Shader *shader, + GLShader *shader, const ShaderStorageBlock &block, const UniformValue &value) const { @@ -983,7 +1003,7 @@ void RenderView::setShaderStorageValue(ShaderParameterPack &uniformPack, } } -void RenderView::setDefaultUniformBlockShaderDataValue(ShaderParameterPack &uniformPack, Shader *shader, ShaderData *shaderData, const QString &structName) const +void RenderView::setDefaultUniformBlockShaderDataValue(ShaderParameterPack &uniformPack, GLShader *shader, ShaderData *shaderData, const QString &structName) const { UniformBlockValueBuilder *builder = m_localData.localData(); builder->activeUniformNamesToValue.clear(); @@ -1023,10 +1043,8 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, // For each ParameterBinder in the RenderPass -> create a QUniformPack // Once that works, improve that to try and minimize QUniformPack updates - // Index Shader by Shader UUID - Shader *shader = m_manager->data<Shader, ShaderManager>(command->m_shader); + GLShader *shader = command->m_glShader; if (shader != nullptr && shader->isLoaded()) { - command->m_shaderDna = shader->dna(); // Builds the QUniformPack, sets shader standard uniforms and store attributes name / glname bindings // If a parameter is defined and not found in the bindings it is assumed to be a binding of Uniform type with the glsl name |