Decreased useless OpenGL calls (Optimization)
Former-commit-id: b07c32afa9aa98b91eb8bd146a175f693af539ed
This commit is contained in:
parent
5b33a992ad
commit
308c2cfd78
|
|
@ -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])
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue