From c0ca591827e3ee2904e59ce9c255a66f65e5d131 Mon Sep 17 00:00:00 2001 From: Elderme Date: Thu, 19 Nov 2015 14:16:59 +0100 Subject: [PATCH] Removed useless things in CommandBuffer and GeometryPasses classes, and removed ShadowPassCmd singleton class --- src/graphics/command_buffer.cpp | 100 ++++++++--------- src/graphics/command_buffer.hpp | 143 ++++++++++++++++++----- src/graphics/draw_calls.cpp | 120 +++++++++++--------- src/graphics/draw_calls.hpp | 24 ++-- src/graphics/geometry_passes.cpp | 175 +++-------------------------- src/graphics/irr_driver.cpp | 1 - src/graphics/stk_scene_manager.hpp | 6 - 7 files changed, 254 insertions(+), 315 deletions(-) diff --git a/src/graphics/command_buffer.cpp b/src/graphics/command_buffer.cpp index bfc56da40..19cd3d550 100644 --- a/src/graphics/command_buffer.cpp +++ b/src/graphics/command_buffer.cpp @@ -20,46 +20,55 @@ #include "utils/cpp2011.hpp" - template<> - void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataSingleTex &instance) - { - fillOriginOrientationScale(node, instance); - instance.Texture = mesh->TextureHandles[0]; - } +template<> +void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataSingleTex &instance) +{ + fillOriginOrientationScale(node, instance); + instance.Texture = mesh->TextureHandles[0]; +} - template<> - void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataDualTex &instance) - { - fillOriginOrientationScale(node, instance); - instance.Texture = mesh->TextureHandles[0]; - instance.SecondTexture = mesh->TextureHandles[1]; - } +template<> +void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataDualTex &instance) +{ + fillOriginOrientationScale(node, instance); + instance.Texture = mesh->TextureHandles[0]; + instance.SecondTexture = mesh->TextureHandles[1]; +} - template<> - void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataThreeTex &instance) - { - fillOriginOrientationScale(node, instance); - instance.Texture = mesh->TextureHandles[0]; - instance.SecondTexture = mesh->TextureHandles[1]; - instance.ThirdTexture = mesh->TextureHandles[2]; - } +template<> +void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, InstanceDataThreeTex &instance) +{ + fillOriginOrientationScale(node, instance); + instance.Texture = mesh->TextureHandles[0]; + instance.SecondTexture = mesh->TextureHandles[1]; + instance.ThirdTexture = mesh->TextureHandles[2]; +} - template<> - void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, GlowInstanceData &instance) - { - fillOriginOrientationScale(node, instance); - STKMeshSceneNode *nd = dynamic_cast(node); - instance.Color = nd->getGlowColor().color; - } - - template<> - void expandTexSecondPass(const GLMesh &mesh, - const std::vector &prefilled_tex) - { - TexExpander::template - expandTex(mesh, GrassMat::SecondPassTextures, prefilled_tex[0], - prefilled_tex[1], prefilled_tex[2], prefilled_tex[3]); - } +template<> +void InstanceFiller::add(GLMesh *mesh, scene::ISceneNode *node, GlowInstanceData &instance) +{ + fillOriginOrientationScale(node, instance); + STKMeshSceneNode *nd = dynamic_cast(node); + instance.Color = nd->getGlowColor().color; +} + +template<> +void expandTexSecondPass(const GLMesh &mesh, + const std::vector &prefilled_tex) +{ + TexExpander::template + expandTex(mesh, GrassMat::SecondPassTextures, prefilled_tex[0], + prefilled_tex[1], prefilled_tex[2], prefilled_tex[3]); +} + +template<> +void expandHandlesSecondPass(const std::vector &handles) +{ + uint64_t nulltex[10] = {}; + HandleExpander::template + expand(nulltex, GrassMat::SecondPassTextures, + handles[0], handles[1], handles[2], handles[3]); +} template @@ -152,19 +161,11 @@ ShadowCommandBuffer::ShadowCommandBuffer(): CommandBuffer() { } -//void ShadowCommandBuffer::fill(std::array mesh_map) void ShadowCommandBuffer::fill(MeshMap *mesh_map) { clearMeshes(); std::vector shadow_tex_material_list; - /* createVector(Material::SHADERTYPE_SOLID, - Material::SHADERTYPE_ALPHA_TEST, - Material::SHADERTYPE_SOLID_UNLIT, - Material::SHADERTYPE_NORMAL_MAP, - Material::SHADERTYPE_SPHERE_MAP, - Material::SHADERTYPE_DETAIL_MAP, - Material::SHADERTYPE_VEGETATION);*/ for(int cascade=0; cascade<4; cascade++) { shadow_tex_material_list.push_back(cascade * Material::SHADERTYPE_COUNT @@ -182,10 +183,9 @@ void ShadowCommandBuffer::fill(MeshMap *mesh_map) shadow_tex_material_list.push_back(cascade * Material::SHADERTYPE_COUNT + Material::SHADERTYPE_VEGETATION); } - + fillInstanceData(mesh_map, shadow_tex_material_list, InstanceTypeShadow); - //fillInstanceData(mesh_map.data(), shadow_tex_material_list, InstanceTypeShadow); - + unmapBuffers(); } //ShadowCommandBuffer::fill @@ -243,9 +243,7 @@ void GlowCommandBuffer::fill(MeshMap *mesh_map) GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); } - fillMaterial( 0, - mesh_map, - glow_instance_buffer); + fillMaterial( 0, mesh_map, glow_instance_buffer); unmapBuffers(); } //GlowCommandBuffer::fill diff --git a/src/graphics/command_buffer.hpp b/src/graphics/command_buffer.hpp index b90fe04af..8df14ca1b 100644 --- a/src/graphics/command_buffer.hpp +++ b/src/graphics/command_buffer.hpp @@ -120,6 +120,20 @@ template<> void expandTexSecondPass(const GLMesh &mesh, const std::vector &prefilled_tex); + +template +void expandHandlesSecondPass(const std::vector &handles) +{ + uint64_t nulltex[10] = {}; + HandleExpander::template + expand(nulltex, T::SecondPassTextures, + handles[0], handles[1], handles[2]); +} + +template<> +void expandHandlesSecondPass(const std::vector &handles); + + template class CommandBuffer { @@ -207,41 +221,13 @@ public: inline size_t getPolyCount() const {return m_poly_count;} - inline bool isEmpty(Material::ShaderType shader_type) const - { return m_size[static_cast(shader_type)] == 0;} - inline void bind() const { glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_indirect_cmd_id); } - - - /** Draw the i-th mesh with the specified material - * (require at least OpenGL 4.0 - * or GL_ARB_base_instance and GL_ARB_draw_indirect extensions) - */ - inline void drawIndirect(int material_id, int i) const - { - glDrawElementsIndirect(GL_TRIANGLES, - GL_UNSIGNED_SHORT, - (const void*)((m_offset[material_id] + i) * sizeof(DrawElementsIndirectCommand))); - } - - /** Draw the meshes with the specified material - * (require at least OpenGL 4.3 or AZDO extensions) - */ - inline void multidrawIndirect(int material_id) const - { - glMultiDrawElementsIndirect(GL_TRIANGLES, - GL_UNSIGNED_SHORT, - (const void*)(m_offset[material_id] * sizeof(DrawElementsIndirectCommand)), - (int) m_size[material_id], - sizeof(DrawElementsIndirectCommand)); - } }; - class SolidCommandBuffer: public CommandBuffer(Material::SHADERTYPE_COUNT)> { public: @@ -278,7 +264,25 @@ public: } //drawIndirectFirstPass - + // ---------------------------------------------------------------------------- + template + void multidrawFirstPass(Uniforms...uniforms) const + { + T::InstancedFirstPassShader::getInstance()->use(); + T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, + T::Instance)); + if (m_size[T::MaterialType]) + { + glMultiDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)(m_offset[T::MaterialType] * sizeof(DrawElementsIndirectCommand)), + (int) m_size[T::MaterialType], + sizeof(DrawElementsIndirectCommand)); + } + } // multidrawFirstPass + // ---------------------------------------------------------------------------- template void drawIndirectSecondPass(const std::vector &prefilled_tex, @@ -299,6 +303,62 @@ public: } } //drawIndirectSecondPass + // ---------------------------------------------------------------------------- + template + void multidraw2ndPass(const std::vector &handles, + Uniforms... uniforms) const + { + T::InstancedSecondPassShader::getInstance()->use(); + T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, + T::Instance)); + if (m_size[T::MaterialType]) + { + expandHandlesSecondPass(handles); + glMultiDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)(m_offset[T::MaterialType] * sizeof(DrawElementsIndirectCommand)), + (int) m_size[T::MaterialType], + sizeof(DrawElementsIndirectCommand)); + } + } // multidraw2ndPass + + + // ---------------------------------------------------------------------------- + template + void drawIndirectNormals() const + { + NormalVisualizer::getInstance()->use(); + NormalVisualizer::getInstance()->setUniforms(video::SColor(255, 0, 255, 0)); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, + T::Instance)); + for (unsigned i = 0; i < m_meshes[T::MaterialType].size(); i++) + { + glDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)((m_offset[T::MaterialType] + i) * sizeof(DrawElementsIndirectCommand))); } + } // drawIndirectNormals + + // ---------------------------------------------------------------------------- + template + void multidrawNormals() const + { + NormalVisualizer::getInstance()->use(); + NormalVisualizer::getInstance()->setUniforms(video::SColor(255, 0, 255, 0)); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, + T::Instance)); + if (m_size[T::MaterialType]) + { + glMultiDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)(m_offset[T::MaterialType] * sizeof(DrawElementsIndirectCommand)), + (int) m_size[T::MaterialType], + sizeof(DrawElementsIndirectCommand)); + } + } // multidrawNormals }; class ShadowCommandBuffer: public CommandBuffer<4*static_cast(Material::SHADERTYPE_COUNT)> @@ -330,7 +390,30 @@ public: (const void*)((m_offset[material_id] + i) * sizeof(DrawElementsIndirectCommand))); } // for i - } // renderInstancedShadow + } // drawIndirect + + // ---------------------------------------------------------------------------- + template + void multidrawShadow(Uniforms ...uniforms, unsigned cascade) const + { + T::InstancedShadowPassShader::getInstance()->use(); + T::InstancedShadowPassShader::getInstance()->setUniforms(uniforms..., cascade); + + glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, + InstanceTypeShadow)); + int material_id = T::MaterialType + cascade * Material::SHADERTYPE_COUNT; + + if (m_size[material_id]) + { + glMultiDrawElementsIndirect(GL_TRIANGLES, + GL_UNSIGNED_SHORT, + (const void*)(m_offset[material_id] * sizeof(DrawElementsIndirectCommand)), + (int) m_size[material_id], + sizeof(DrawElementsIndirectCommand)); + } + } // multidrawShadow + + }; class ReflectiveShadowMapCommandBuffer: public CommandBuffer(Material::SHADERTYPE_COUNT)> diff --git a/src/graphics/draw_calls.cpp b/src/graphics/draw_calls.cpp index d24988ad7..6f5602a6c 100644 --- a/src/graphics/draw_calls.cpp +++ b/src/graphics/draw_calls.cpp @@ -66,31 +66,6 @@ void DrawCalls::clearLists() ListInstancedGlow::getInstance()->clear(); } -//TODO: rename (shadow pass only) -template -void DrawCalls::genDrawCalls(unsigned cascade, - std::vector &InstancedList, - T *InstanceBuffer, - DrawElementsIndirectCommand *CommandBuffer, - size_t &InstanceBufferOffset, - size_t &CommandBufferOffset, - size_t &PolyCount) -{ - if (CVS->supportsIndirectInstancingRendering()) - ShadowPassCmd::getInstance()->Offset[cascade][Mat] = CommandBufferOffset; // Store command buffer offset - - FillInstances(m_shadow_pass_mesh[cascade * Material::SHADERTYPE_COUNT + Mat], - InstancedList, - InstanceBuffer, - CommandBuffer, - InstanceBufferOffset, - CommandBufferOffset, - PolyCount); - - if (CVS->isAZDOEnabled()) - ShadowPassCmd::getInstance()->Size[cascade][Mat] = CommandBufferOffset - ShadowPassCmd::getInstance()->Offset[cascade][Mat]; -} - void DrawCalls::handleSTKCommon(scene::ISceneNode *Node, std::vector *ImmediateDraw, @@ -504,7 +479,6 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer InstanceDataSingleTex *ShadowInstanceBuffer; InstanceDataSingleTex *RSMInstanceBuffer; GlowInstanceData *GlowInstanceBuffer; - DrawElementsIndirectCommand *ShadowCmdBuffer; DrawElementsIndirectCommand *RSMCmdBuffer; DrawElementsIndirectCommand *GlowCmdBuffer; @@ -515,7 +489,6 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer ShadowInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeShadow); RSMInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeRSM); GlowInstanceBuffer = (GlowInstanceData*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeGlow); - ShadowCmdBuffer = ShadowPassCmd::getInstance()->Ptr; GlowCmdBuffer = GlowPassCmd::getInstance()->Ptr; RSMCmdBuffer = RSMPassCmd::getInstance()->Ptr; enableOpenMP = 1; @@ -615,24 +588,11 @@ void DrawCalls::renderParticlesList() const particles->render(); } - - /** Draw the i-th mesh with the specified material for the solid pass - * (require at least OpenGL 4.0 +// ---------------------------------------------------------------------------- + /** Render the solid first pass (depth and normals) + * Require at least OpenGL 4.0 * or GL_ARB_base_instance and GL_ARB_draw_indirect extensions) */ -void DrawCalls::drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const -{ - m_solid_cmd_buffer.drawIndirect(static_cast(shader_type), i); -} - -/** Draw the meshes with the specified material - * (require at least OpenGL 4.3 or AZDO extensions) - */ -void DrawCalls::multidrawIndirectSolidCmd(Material::ShaderType shader_type) const -{ - m_solid_cmd_buffer.multidrawIndirect(static_cast(shader_type)); -} - void DrawCalls::drawIndirectSolidFirstPass() const { m_solid_cmd_buffer.drawIndirectFirstPass(); @@ -644,10 +604,24 @@ void DrawCalls::drawIndirectSolidFirstPass() const m_solid_cmd_buffer.drawIndirectFirstPass(); } +// ---------------------------------------------------------------------------- + /** Render the solid first pass (depth and normals) + * Require OpenGL AZDO extensions + */ +void DrawCalls::multidrawSolidFirstPass() const +{ + m_solid_cmd_buffer.multidrawFirstPass(); + m_solid_cmd_buffer.multidrawFirstPass(); + m_solid_cmd_buffer.multidrawFirstPass(); + m_solid_cmd_buffer.multidrawFirstPass(); + m_solid_cmd_buffer.multidrawFirstPass(windDir); + m_solid_cmd_buffer.multidrawFirstPass(); + m_solid_cmd_buffer.multidrawFirstPass(); +} +// ---------------------------------------------------------------------------- void DrawCalls::drawIndirectSolidSecondPass(const std::vector &prefilled_tex) const { - m_solid_cmd_buffer.drawIndirectSecondPass(prefilled_tex); m_solid_cmd_buffer.drawIndirectSecondPass(prefilled_tex); m_solid_cmd_buffer.drawIndirectSecondPass(prefilled_tex); @@ -657,15 +631,41 @@ void DrawCalls::drawIndirectSolidSecondPass(const std::vector &prefilled m_solid_cmd_buffer.drawIndirectSecondPass(prefilled_tex); } -void DrawCalls::drawIndirectReflectiveShadowMaps(const core::matrix4 &rsm_matrix) const +// ---------------------------------------------------------------------------- +void DrawCalls::multidrawSolidSecondPass(const std::vector &handles) const { - m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); - m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); - m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); - m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); - m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); + m_solid_cmd_buffer.multidraw2ndPass(handles); + m_solid_cmd_buffer.multidraw2ndPass(handles); + m_solid_cmd_buffer.multidraw2ndPass(handles); + m_solid_cmd_buffer.multidraw2ndPass(handles); + m_solid_cmd_buffer.multidraw2ndPass(handles); + m_solid_cmd_buffer.multidraw2ndPass(handles); + m_solid_cmd_buffer.multidraw2ndPass(handles, windDir, irr_driver->getSunDirection()); } +// ---------------------------------------------------------------------------- +void DrawCalls::drawIndirectNormals() const +{ + m_solid_cmd_buffer.drawIndirectNormals(); + m_solid_cmd_buffer.drawIndirectNormals(); + m_solid_cmd_buffer.drawIndirectNormals(); + m_solid_cmd_buffer.drawIndirectNormals(); + m_solid_cmd_buffer.drawIndirectNormals(); + m_solid_cmd_buffer.drawIndirectNormals(); +} + +// ---------------------------------------------------------------------------- +void DrawCalls::multidrawNormals() const +{ + m_solid_cmd_buffer.multidrawNormals(); + m_solid_cmd_buffer.multidrawNormals(); + m_solid_cmd_buffer.multidrawNormals(); + m_solid_cmd_buffer.multidrawNormals(); + m_solid_cmd_buffer.multidrawNormals(); + m_solid_cmd_buffer.multidrawNormals(); +} + +// ---------------------------------------------------------------------------- void DrawCalls::drawIndirectShadows(unsigned cascade) const { m_shadow_cmd_buffer.drawIndirect(cascade); @@ -676,3 +676,23 @@ void DrawCalls::drawIndirectShadows(unsigned cascade) const m_shadow_cmd_buffer.drawIndirect(cascade); } + +void DrawCalls::multidrawShadows(unsigned cascade) const +{ + m_shadow_cmd_buffer.multidrawShadow(cascade); + m_shadow_cmd_buffer.multidrawShadow(cascade); + m_shadow_cmd_buffer.multidrawShadow(cascade); + m_shadow_cmd_buffer.multidrawShadow(cascade); + m_shadow_cmd_buffer.multidrawShadow(cascade); + m_shadow_cmd_buffer.multidrawShadow(windDir, cascade); +} + +// ---------------------------------------------------------------------------- +void DrawCalls::drawIndirectReflectiveShadowMaps(const core::matrix4 &rsm_matrix) const +{ + m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); + m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); + m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); + m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); + m_reflective_shadow_map_cmd_buffer.drawIndirect(rsm_matrix); +} diff --git a/src/graphics/draw_calls.hpp b/src/graphics/draw_calls.hpp index 4227a1e5f..bdbedcd43 100644 --- a/src/graphics/draw_calls.hpp +++ b/src/graphics/draw_calls.hpp @@ -60,15 +60,6 @@ private: void clearLists(); - - template - void genDrawCalls( unsigned cascade, - std::vector &InstancedList, - T *InstanceBuffer, - DrawElementsIndirectCommand *CommandBuffer, - size_t &InstanceBufferOffset, - size_t &CommandBufferOffset, - size_t &PolyCount); void handleSTKCommon(scene::ISceneNode *Node, std::vector *ImmediateDraw, @@ -101,17 +92,16 @@ public: inline void bindShadowCmd() const { m_shadow_cmd_buffer.bind(); } inline void bindReflectiveShadowMapsCmd() const { m_reflective_shadow_map_cmd_buffer.bind(); } - - - inline bool isSolidCmdEmpty(Material::ShaderType shader_type) const - { return m_solid_cmd_buffer.isEmpty(shader_type); } - void drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const; - void multidrawIndirectSolidCmd(Material::ShaderType shader_type) const; - void drawIndirectSolidFirstPass() const; - //void multidrawIndirectSolidCmd() const; //TODO + void multidrawSolidFirstPass() const; void drawIndirectSolidSecondPass(const std::vector &prefilled_tex) const; + void multidrawSolidSecondPass(const std::vector &handles) const; + void drawIndirectNormals() const; + void multidrawNormals() const; + void drawIndirectShadows(unsigned cascade) const; + void multidrawShadows(unsigned cascade) const; + void drawIndirectReflectiveShadowMaps(const core::matrix4 &rsm_matrix) const; }; diff --git a/src/graphics/geometry_passes.cpp b/src/graphics/geometry_passes.cpp index 0a5ea2d5a..ac1910060 100644 --- a/src/graphics/geometry_passes.cpp +++ b/src/graphics/geometry_passes.cpp @@ -164,19 +164,6 @@ void renderMeshes1stPass(const DrawCalls& draw_calls) } } // renderMeshes1stPass -// ---------------------------------------------------------------------------- -template -void multidraw1stPass(const DrawCalls& draw_calls, Args...args) -{ - T::InstancedFirstPassShader::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, T::Instance)); - if (!draw_calls.isSolidCmdEmpty(T::MaterialType)) - { - T::InstancedFirstPassShader::getInstance()->setUniforms(args...); - draw_calls.multidrawIndirectSolidCmd(T::MaterialType); - } -} // multidraw1stPass - GeometryPasses::GeometryPasses() { @@ -209,14 +196,7 @@ void GeometryPasses::renderSolidFirstPass(const DrawCalls& draw_calls) if (CVS->isAZDOEnabled()) { - multidraw1stPass(draw_calls); - multidraw1stPass(draw_calls); - multidraw1stPass(draw_calls); - multidraw1stPass(draw_calls); - multidraw1stPass(draw_calls, m_wind_dir); - - multidraw1stPass(draw_calls); - multidraw1stPass(draw_calls); + draw_calls.multidrawSolidFirstPass(); } else if (CVS->supportsIndirectInstancingRendering()) { @@ -264,31 +244,12 @@ void renderMeshes2ndPass( const std::vector &Prefilled_Handle, } } // renderMeshes2ndPass -// ---------------------------------------------------------------------------- -template -void multidraw2ndPass(const DrawCalls& draw_calls, const std::vector &Handles, Args... args) -{ - T::InstancedSecondPassShader::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, - T::Instance)); - uint64_t nulltex[10] = {}; - if (!draw_calls.isSolidCmdEmpty(T::MaterialType)) - { - HandleExpander::template - expand(nulltex, T::SecondPassTextures, Handles[0], Handles[1], - Handles[2]); - T::InstancedSecondPassShader::getInstance()->setUniforms(args...); - draw_calls.multidrawIndirectSolidCmd(T::MaterialType); - } -} // multidraw2ndPass - - // ---------------------------------------------------------------------------- void GeometryPasses::renderSolidSecondPass( const DrawCalls& draw_calls, unsigned render_target_diffuse, unsigned render_target_specular, unsigned render_target_half_red) - { +{ irr_driver->setPhase(SOLID_LIT_PASS); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); @@ -345,29 +306,13 @@ void GeometryPasses::renderSolidSecondPass( const DrawCalls& draw_calls, if (CVS->isAZDOEnabled()) { - multidraw2ndPass(draw_calls, createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0)); - multidraw2ndPass(draw_calls, createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0)); - multidraw2ndPass(draw_calls, createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0)); - multidraw2ndPass(draw_calls, createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0)); - multidraw2ndPass(draw_calls, createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0)); - multidraw2ndPass(draw_calls, createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0, 0, 0)); - - // template does not work with template due to extra depth texture - { - GrassMat::InstancedSecondPassShader::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(GrassMat::VertexType, - GrassMat::Instance)); - uint64_t nulltex[10] = {}; - if (!draw_calls.isSolidCmdEmpty(GrassMat::MaterialType)) - { - HandleExpander - ::expand(nulltex, GrassMat::SecondPassTextures, DiffuseHandle, - SpecularHandle, SSAOHandle, DepthHandle); - GrassMat::InstancedSecondPassShader::getInstance()->setUniforms(m_wind_dir, - irr_driver->getSunDirection()); - draw_calls.multidrawIndirectSolidCmd(GrassMat::MaterialType); - } - } + std::vector handles = + createVector(DiffuseHandle, + SpecularHandle, + SSAOHandle, + DepthHandle); + + draw_calls.multidrawSolidSecondPass(handles); } else if (CVS->supportsIndirectInstancingRendering()) { @@ -381,52 +326,16 @@ void GeometryPasses::renderSolidSecondPass( const DrawCalls& draw_calls, } } // renderSolidSecondPass -// ---------------------------------------------------------------------------- -template -static void renderInstancedMeshNormals(const DrawCalls& draw_calls) -{ - std::vector &meshes = T::InstancedList::getInstance()->SolidPass; - NormalVisualizer::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, T::Instance)); - for (unsigned i = 0; i < meshes.size(); i++) - { - NormalVisualizer::getInstance()->setUniforms(video::SColor(255, 0, 255, 0)); - draw_calls.drawIndirectSolidCmd(T::MaterialType, i); - } -} // renderInstancedMeshNormals - -// ---------------------------------------------------------------------------- -template -static void renderMultiMeshNormals(const DrawCalls& draw_calls) -{ - NormalVisualizer::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, T::Instance)); - if (!draw_calls.isSolidCmdEmpty(T::MaterialType)) - { - NormalVisualizer::getInstance()->setUniforms(video::SColor(255, 0, 255, 0)); - draw_calls.multidrawIndirectSolidCmd(T::MaterialType); - } -} // renderMultiMeshNormals // ---------------------------------------------------------------------------- void GeometryPasses::renderNormalsVisualisation(const DrawCalls& draw_calls) { if (CVS->isAZDOEnabled()) { - renderMultiMeshNormals(draw_calls); - renderMultiMeshNormals(draw_calls); - renderMultiMeshNormals(draw_calls); - renderMultiMeshNormals(draw_calls); - renderMultiMeshNormals(draw_calls); - renderMultiMeshNormals(draw_calls); + draw_calls.multidrawNormals(); } else if (CVS->supportsIndirectInstancingRendering()) { - renderInstancedMeshNormals(draw_calls); - renderInstancedMeshNormals(draw_calls); - renderInstancedMeshNormals(draw_calls); - renderInstancedMeshNormals(draw_calls); - renderInstancedMeshNormals(draw_calls); - renderInstancedMeshNormals(draw_calls); + draw_calls.drawIndirectNormals(); } } // renderNormalsVisualisation @@ -619,48 +528,6 @@ void renderShadow(unsigned cascade) } // for i } // renderShadow -// ---------------------------------------------------------------------------- -template -void renderInstancedShadow(unsigned cascade, Args ...args) -{ - T::InstancedShadowPassShader::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, - InstanceTypeShadow)); - std::vector &t = T::InstancedList::getInstance()->Shadows[cascade]; - for (unsigned i = 0; i < t.size(); i++) - { - GLMesh *mesh = t[i]; - - TexExpander::template - expandTex(*mesh, T::ShadowTextures); - T::InstancedShadowPassShader::getInstance()->setUniforms(args..., cascade); - size_t tmp = ShadowPassCmd::getInstance()->Offset[cascade][T::MaterialType] + i; - glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, - (const void*)((tmp) - * sizeof(DrawElementsIndirectCommand))); - } // for i - -} // renderInstancedShadow - -// ---------------------------------------------------------------------------- -template -static void multidrawShadow(unsigned i, Args ...args) -{ - T::InstancedShadowPassShader::getInstance()->use(); - glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, - InstanceTypeShadow)); - if (ShadowPassCmd::getInstance()->Size[i][T::MaterialType]) - { - T::InstancedShadowPassShader::getInstance()->setUniforms(args..., i); - glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, - (const void*)(ShadowPassCmd::getInstance()->Offset[i][T::MaterialType] - * sizeof(DrawElementsIndirectCommand)), - (int)ShadowPassCmd::getInstance()->Size[i][T::MaterialType], - sizeof(DrawElementsIndirectCommand)); - } -} // multidrawShadow - - // ---------------------------------------------------------------------------- void GeometryPasses::renderShadows(const DrawCalls& draw_calls, const ShadowMatrices& shadow_matrices, @@ -689,39 +556,27 @@ void GeometryPasses::renderShadows(const DrawCalls& draw_calls, { ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_SHADOWS_CASCADE0 + cascade)); - /*renderShadow(cascade); + //TODO: useless if indirect instancing rendering or AZDO + renderShadow(cascade); renderShadow(cascade); renderShadow(cascade); renderShadow(cascade); renderShadow(cascade); renderShadow(cascade); renderShadow(cascade); - renderShadow(cascade);*/ + renderShadow(cascade); if (CVS->supportsIndirectInstancingRendering()) - //glBindBuffer(GL_DRAW_INDIRECT_BUFFER, ShadowPassCmd::getInstance()->drawindirectcmd); draw_calls.bindShadowCmd(); if (CVS->isAZDOEnabled()) { - multidrawShadow(cascade); - multidrawShadow(cascade); - multidrawShadow(cascade); - multidrawShadow(cascade); - multidrawShadow(cascade); - multidrawShadow(cascade, m_wind_dir); + draw_calls.multidrawShadows(cascade); } else if (CVS->supportsIndirectInstancingRendering()) { - //if(cascade==0) draw_calls.drawIndirectShadows(cascade); - /*renderInstancedShadow(cascade); - renderInstancedShadow(cascade); - renderInstancedShadow(cascade); - renderInstancedShadow(cascade); - renderInstancedShadow(cascade, m_wind_dir); - renderInstancedShadow(cascade);*/ } } diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index f8eef91cd..b0142f95e 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -816,7 +816,6 @@ void IrrDriver::applyResolutionSettings() // (we're sure to update main.cpp at some point and forget this one...) ShaderBase::updateShaders(); VAOManager::getInstance()->kill(); - ShadowPassCmd::getInstance()->kill(); RSMPassCmd::getInstance()->kill(); GlowPassCmd::getInstance()->kill(); resetTextureTable(); diff --git a/src/graphics/stk_scene_manager.hpp b/src/graphics/stk_scene_manager.hpp index d39bebcbe..015243ce9 100644 --- a/src/graphics/stk_scene_manager.hpp +++ b/src/graphics/stk_scene_manager.hpp @@ -61,12 +61,6 @@ public: }; -class ShadowPassCmd : public CommandBufferOld(Material::SHADERTYPE_COUNT)> -{ -public: - size_t Offset[4][Material::SHADERTYPE_COUNT], Size[4][Material::SHADERTYPE_COUNT]; -}; - class RSMPassCmd : public CommandBufferOld(Material::SHADERTYPE_COUNT)> { public: