Removed RSMPassCmd singleton class
This commit is contained in:
@@ -268,13 +268,13 @@ public:
|
||||
template<typename T, typename...Uniforms>
|
||||
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])
|
||||
{
|
||||
T::InstancedFirstPassShader::getInstance()->use();
|
||||
T::InstancedFirstPassShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)(m_offset[T::MaterialType] * sizeof(DrawElementsIndirectCommand)),
|
||||
@@ -308,13 +308,13 @@ public:
|
||||
void multidraw2ndPass(const std::vector<uint64_t> &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])
|
||||
{
|
||||
T::InstancedSecondPassShader::getInstance()->use();
|
||||
T::InstancedSecondPassShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
expandHandlesSecondPass<T>(handles);
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
@@ -345,13 +345,15 @@ public:
|
||||
template<typename T>
|
||||
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])
|
||||
{
|
||||
NormalVisualizer::getInstance()->use();
|
||||
NormalVisualizer::getInstance()->setUniforms(video::SColor(255, 0, 255, 0));
|
||||
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
T::Instance));
|
||||
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)(m_offset[T::MaterialType] * sizeof(DrawElementsIndirectCommand)),
|
||||
@@ -396,15 +398,15 @@ public:
|
||||
template<typename T, typename...Uniforms>
|
||||
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])
|
||||
{
|
||||
T::InstancedShadowPassShader::getInstance()->use();
|
||||
T::InstancedShadowPassShader::getInstance()->setUniforms(uniforms..., cascade);
|
||||
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
InstanceTypeShadow));
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)(m_offset[material_id] * sizeof(DrawElementsIndirectCommand)),
|
||||
@@ -442,7 +444,27 @@ public:
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)((m_offset[T::MaterialType] + i) * sizeof(DrawElementsIndirectCommand)));
|
||||
}
|
||||
} //drawIndirectReflectiveShadowMap
|
||||
} //drawIndirect
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
template<typename T, typename... Uniforms>
|
||||
void multidraw(Uniforms...uniforms) const
|
||||
{
|
||||
if (m_size[T::MaterialType])
|
||||
{
|
||||
T::InstancedRSMShader::getInstance()->use();
|
||||
T::InstancedRSMShader::getInstance()->setUniforms(uniforms...);
|
||||
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
InstanceTypeRSM));
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)(m_offset[T::MaterialType] * sizeof(DrawElementsIndirectCommand)),
|
||||
(int) m_size[T::MaterialType],
|
||||
sizeof(DrawElementsIndirectCommand));
|
||||
}
|
||||
} // multidraw
|
||||
|
||||
};
|
||||
|
||||
class GlowCommandBuffer: public CommandBuffer<1>
|
||||
|
||||
@@ -476,21 +476,15 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
|
||||
if (!CVS->supportsIndirectInstancingRendering())
|
||||
return;
|
||||
|
||||
InstanceDataSingleTex *ShadowInstanceBuffer;
|
||||
InstanceDataSingleTex *RSMInstanceBuffer;
|
||||
GlowInstanceData *GlowInstanceBuffer;
|
||||
DrawElementsIndirectCommand *RSMCmdBuffer;
|
||||
DrawElementsIndirectCommand *GlowCmdBuffer;
|
||||
|
||||
int enableOpenMP = 0;
|
||||
|
||||
if (CVS->supportsAsyncInstanceUpload())
|
||||
{
|
||||
ShadowInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeShadow);
|
||||
RSMInstanceBuffer = (InstanceDataSingleTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeRSM);
|
||||
GlowInstanceBuffer = (GlowInstanceData*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeGlow);
|
||||
GlowCmdBuffer = GlowPassCmd::getInstance()->Ptr;
|
||||
RSMCmdBuffer = RSMPassCmd::getInstance()->Ptr;
|
||||
enableOpenMP = 1;
|
||||
}
|
||||
|
||||
@@ -696,3 +690,14 @@ void DrawCalls::drawIndirectReflectiveShadowMaps(const core::matrix4 &rsm_matrix
|
||||
m_reflective_shadow_map_cmd_buffer.drawIndirect<NormalMat>(rsm_matrix);
|
||||
m_reflective_shadow_map_cmd_buffer.drawIndirect<DetailMat>(rsm_matrix);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void DrawCalls::multidrawReflectiveShadowMaps(const core::matrix4 &rsm_matrix) const
|
||||
{
|
||||
m_reflective_shadow_map_cmd_buffer.multidraw<DefaultMaterial>(rsm_matrix);
|
||||
m_reflective_shadow_map_cmd_buffer.multidraw<NormalMat>(rsm_matrix);
|
||||
m_reflective_shadow_map_cmd_buffer.multidraw<AlphaRef>(rsm_matrix);
|
||||
m_reflective_shadow_map_cmd_buffer.multidraw<UnlitMat>(rsm_matrix);
|
||||
m_reflective_shadow_map_cmd_buffer.multidraw<DetailMat>(rsm_matrix);
|
||||
}
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ public:
|
||||
void multidrawShadows(unsigned cascade) const;
|
||||
|
||||
void drawIndirectReflectiveShadowMaps(const core::matrix4 &rsm_matrix) const;
|
||||
void multidrawReflectiveShadowMaps(const core::matrix4 &rsm_matrix) const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -627,44 +627,6 @@ void drawRSM(const core::matrix4 & rsm_matrix)
|
||||
}
|
||||
} // drawRSM
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
template<typename T, typename...Args>
|
||||
void renderRSMShadow(Args ...args)
|
||||
{
|
||||
T::InstancedRSMShader::getInstance()->use();
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType, InstanceTypeRSM));
|
||||
auto t = T::InstancedList::getInstance()->RSM;
|
||||
for (unsigned i = 0; i < t.size(); i++)
|
||||
{
|
||||
std::vector<GLuint> Textures;
|
||||
GLMesh *mesh = t[i];
|
||||
|
||||
TexExpander<typename T::InstancedRSMShader>::template expandTex(*mesh, T::RSMTextures);
|
||||
T::InstancedRSMShader::getInstance()->setUniforms(args...);
|
||||
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT,
|
||||
(const void*)((RSMPassCmd::getInstance()->Offset[T::MaterialType] + i)
|
||||
* sizeof(DrawElementsIndirectCommand)));
|
||||
}
|
||||
} // renderRSMShadow
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
template<typename T, typename... Args>
|
||||
void multidrawRSM(Args...args)
|
||||
{
|
||||
T::InstancedRSMShader::getInstance()->use();
|
||||
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(T::VertexType,
|
||||
InstanceTypeRSM));
|
||||
if (RSMPassCmd::getInstance()->Size[T::MaterialType])
|
||||
{
|
||||
T::InstancedRSMShader::getInstance()->setUniforms(args...);
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT,
|
||||
(const void*)(RSMPassCmd::getInstance()->Offset[T::MaterialType]
|
||||
* sizeof(DrawElementsIndirectCommand)),
|
||||
(int)RSMPassCmd::getInstance()->Size[T::MaterialType],
|
||||
sizeof(DrawElementsIndirectCommand));
|
||||
}
|
||||
} // multidrawRSM
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void GeometryPasses::renderReflectiveShadowMap(const DrawCalls& draw_calls,
|
||||
const ShadowMatrices& shadow_matrices,
|
||||
@@ -687,11 +649,7 @@ void GeometryPasses::renderReflectiveShadowMap(const DrawCalls& draw_calls,
|
||||
|
||||
if (CVS->isAZDOEnabled())
|
||||
{
|
||||
multidrawRSM<DefaultMaterial>(rsm_matrix);
|
||||
multidrawRSM<NormalMat>(rsm_matrix);
|
||||
multidrawRSM<AlphaRef>(rsm_matrix);
|
||||
multidrawRSM<UnlitMat>(rsm_matrix);
|
||||
multidrawRSM<DetailMat>(rsm_matrix);
|
||||
draw_calls.multidrawReflectiveShadowMaps(rsm_matrix);
|
||||
}
|
||||
else if (CVS->supportsIndirectInstancingRendering())
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
RSMPassCmd::getInstance()->kill();
|
||||
GlowPassCmd::getInstance()->kill();
|
||||
resetTextureTable();
|
||||
// initDevice will drop the current device.
|
||||
|
||||
@@ -61,12 +61,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class RSMPassCmd : public CommandBufferOld<RSMPassCmd, 1, static_cast<int>(Material::SHADERTYPE_COUNT)>
|
||||
{
|
||||
public:
|
||||
size_t Offset[Material::SHADERTYPE_COUNT], Size[Material::SHADERTYPE_COUNT];
|
||||
};
|
||||
|
||||
class GlowPassCmd : public CommandBufferOld<GlowPassCmd, 1, 1>
|
||||
{
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user