Decreased useless OpenGL calls (Optimization)

Former-commit-id: b07c32afa9aa98b91eb8bd146a175f693af539ed
This commit is contained in:
Lynix 2013-06-27 12:50:38 +02:00
parent 5b33a992ad
commit 308c2cfd78
1 changed files with 51 additions and 33 deletions

View File

@ -135,6 +135,9 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
NzRenderStates& currentRenderStates = s_contextStates->renderStates; NzRenderStates& currentRenderStates = s_contextStates->renderStates;
// Les fonctions de blend n'a aucun intérêt sans blending
if (states.parameters[nzRendererParameter_Blend])
{
if (currentRenderStates.dstBlend != states.dstBlend || if (currentRenderStates.dstBlend != states.dstBlend ||
currentRenderStates.srcBlend != states.srcBlend) currentRenderStates.srcBlend != states.srcBlend)
{ {
@ -142,18 +145,34 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
currentRenderStates.dstBlend = states.dstBlend; currentRenderStates.dstBlend = states.dstBlend;
currentRenderStates.srcBlend = states.srcBlend; currentRenderStates.srcBlend = states.srcBlend;
} }
}
if (states.parameters[nzRendererParameter_DepthBuffer])
{
// La comparaison de profondeur n'a aucun intérêt sans depth buffer
if (currentRenderStates.depthFunc != states.depthFunc) if (currentRenderStates.depthFunc != states.depthFunc)
{ {
glDepthFunc(RendererComparison[states.depthFunc]); glDepthFunc(RendererComparison[states.depthFunc]);
currentRenderStates.depthFunc = states.depthFunc; currentRenderStates.depthFunc = states.depthFunc;
} }
// Le DepthWrite n'a aucune importance si le DepthBuffer est désactivé
if (currentRenderStates.parameters[nzRendererParameter_DepthWrite] != states.parameters[nzRendererParameter_DepthWrite])
{
glDepthMask((states.parameters[nzRendererParameter_DepthWrite]) ? GL_TRUE : GL_FALSE);
currentRenderStates.parameters[nzRendererParameter_DepthWrite] = states.parameters[nzRendererParameter_DepthWrite];
}
}
// Inutile de changer le mode de face culling s'il n'est pas actif
if (states.parameters[nzRendererParameter_FaceCulling])
{
if (currentRenderStates.faceCulling != states.faceCulling) if (currentRenderStates.faceCulling != states.faceCulling)
{ {
glCullFace(FaceCulling[states.faceCulling]); glCullFace(FaceCulling[states.faceCulling]);
currentRenderStates.faceCulling = states.faceCulling; currentRenderStates.faceCulling = states.faceCulling;
} }
}
if (currentRenderStates.faceFilling != states.faceFilling) if (currentRenderStates.faceFilling != states.faceFilling)
{ {
@ -161,6 +180,9 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
currentRenderStates.faceFilling = states.faceFilling; currentRenderStates.faceFilling = states.faceFilling;
} }
// Ici encore, ça ne sert à rien de se soucier des fonctions de stencil sans qu'il soit activé
if (states.parameters[nzRendererParameter_StencilTest])
{
if (currentRenderStates.stencilCompare != states.stencilCompare || if (currentRenderStates.stencilCompare != states.stencilCompare ||
currentRenderStates.stencilMask != states.stencilMask || currentRenderStates.stencilMask != states.stencilMask ||
currentRenderStates.stencilReference != states.stencilReference) currentRenderStates.stencilReference != states.stencilReference)
@ -171,6 +193,7 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
currentRenderStates.stencilReference = states.stencilReference; currentRenderStates.stencilReference = states.stencilReference;
} }
// Ici encore, ça ne sert à rien de se soucier des fonctions de stencil sans qu'il soit activé
if (currentRenderStates.stencilFail != states.stencilFail || if (currentRenderStates.stencilFail != states.stencilFail ||
currentRenderStates.stencilPass != states.stencilPass || currentRenderStates.stencilPass != states.stencilPass ||
currentRenderStates.stencilZFail != states.stencilZFail) currentRenderStates.stencilZFail != states.stencilZFail)
@ -180,6 +203,7 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
currentRenderStates.stencilPass = states.stencilPass; currentRenderStates.stencilPass = states.stencilPass;
currentRenderStates.stencilZFail = states.stencilZFail; currentRenderStates.stencilZFail = states.stencilZFail;
} }
}
if (!NzNumberEquals(currentRenderStates.lineWidth, states.lineWidth, 0.001f)) if (!NzNumberEquals(currentRenderStates.lineWidth, states.lineWidth, 0.001f))
{ {
@ -222,12 +246,6 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
currentRenderStates.parameters[nzRendererParameter_DepthBuffer] = states.parameters[nzRendererParameter_DepthBuffer]; currentRenderStates.parameters[nzRendererParameter_DepthBuffer] = states.parameters[nzRendererParameter_DepthBuffer];
} }
if (currentRenderStates.parameters[nzRendererParameter_DepthWrite] != states.parameters[nzRendererParameter_DepthWrite])
{
glDepthMask((states.parameters[nzRendererParameter_DepthWrite]) ? GL_TRUE : GL_FALSE);
currentRenderStates.parameters[nzRendererParameter_DepthWrite] = states.parameters[nzRendererParameter_DepthWrite];
}
if (currentRenderStates.parameters[nzRendererParameter_FaceCulling] != states.parameters[nzRendererParameter_FaceCulling]) if (currentRenderStates.parameters[nzRendererParameter_FaceCulling] != states.parameters[nzRendererParameter_FaceCulling])
{ {
if (states.parameters[nzRendererParameter_FaceCulling]) if (states.parameters[nzRendererParameter_FaceCulling])