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