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,24 +135,43 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
NzRenderStates& currentRenderStates = s_contextStates->renderStates; NzRenderStates& currentRenderStates = s_contextStates->renderStates;
if (currentRenderStates.dstBlend != states.dstBlend || // Les fonctions de blend n'a aucun intérêt sans blending
currentRenderStates.srcBlend != states.srcBlend) if (states.parameters[nzRendererParameter_Blend])
{ {
glBlendFunc(BlendFunc[states.srcBlend], BlendFunc[states.dstBlend]); if (currentRenderStates.dstBlend != states.dstBlend ||
currentRenderStates.dstBlend = states.dstBlend; currentRenderStates.srcBlend != states.srcBlend)
currentRenderStates.srcBlend = states.srcBlend; {
glBlendFunc(BlendFunc[states.srcBlend], BlendFunc[states.dstBlend]);
currentRenderStates.dstBlend = states.dstBlend;
currentRenderStates.srcBlend = states.srcBlend;
}
} }
if (currentRenderStates.depthFunc != states.depthFunc) if (states.parameters[nzRendererParameter_DepthBuffer])
{ {
glDepthFunc(RendererComparison[states.depthFunc]); // La comparaison de profondeur n'a aucun intérêt sans depth buffer
currentRenderStates.depthFunc = states.depthFunc; if (currentRenderStates.depthFunc != states.depthFunc)
{
glDepthFunc(RendererComparison[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];
}
} }
if (currentRenderStates.faceCulling != states.faceCulling) // Inutile de changer le mode de face culling s'il n'est pas actif
if (states.parameters[nzRendererParameter_FaceCulling])
{ {
glCullFace(FaceCulling[states.faceCulling]); if (currentRenderStates.faceCulling != states.faceCulling)
currentRenderStates.faceCulling = states.faceCulling; {
glCullFace(FaceCulling[states.faceCulling]);
currentRenderStates.faceCulling = states.faceCulling;
}
} }
if (currentRenderStates.faceFilling != states.faceFilling) if (currentRenderStates.faceFilling != states.faceFilling)
@ -161,24 +180,29 @@ void NzOpenGL::ApplyStates(const NzRenderStates& states)
currentRenderStates.faceFilling = states.faceFilling; currentRenderStates.faceFilling = states.faceFilling;
} }
if (currentRenderStates.stencilCompare != states.stencilCompare || // Ici encore, ça ne sert à rien de se soucier des fonctions de stencil sans qu'il soit activé
currentRenderStates.stencilMask != states.stencilMask || if (states.parameters[nzRendererParameter_StencilTest])
currentRenderStates.stencilReference != states.stencilReference)
{ {
glStencilFunc(RendererComparison[states.stencilCompare], states.stencilReference, states.stencilMask); if (currentRenderStates.stencilCompare != states.stencilCompare ||
currentRenderStates.stencilCompare = states.stencilCompare; currentRenderStates.stencilMask != states.stencilMask ||
currentRenderStates.stencilMask = states.stencilMask; currentRenderStates.stencilReference != states.stencilReference)
currentRenderStates.stencilReference = states.stencilReference; {
} glStencilFunc(RendererComparison[states.stencilCompare], states.stencilReference, states.stencilMask);
currentRenderStates.stencilCompare = states.stencilCompare;
currentRenderStates.stencilMask = states.stencilMask;
currentRenderStates.stencilReference = states.stencilReference;
}
if (currentRenderStates.stencilFail != states.stencilFail || // Ici encore, ça ne sert à rien de se soucier des fonctions de stencil sans qu'il soit activé
currentRenderStates.stencilPass != states.stencilPass || if (currentRenderStates.stencilFail != states.stencilFail ||
currentRenderStates.stencilZFail != states.stencilZFail) currentRenderStates.stencilPass != states.stencilPass ||
{ currentRenderStates.stencilZFail != states.stencilZFail)
glStencilOp(StencilOperation[states.stencilFail], StencilOperation[states.stencilZFail], StencilOperation[states.stencilPass]); {
currentRenderStates.stencilFail = states.stencilFail; glStencilOp(StencilOperation[states.stencilFail], StencilOperation[states.stencilZFail], StencilOperation[states.stencilPass]);
currentRenderStates.stencilPass = states.stencilPass; currentRenderStates.stencilFail = states.stencilFail;
currentRenderStates.stencilZFail = states.stencilZFail; currentRenderStates.stencilPass = states.stencilPass;
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])