Commit 2eaf05bf authored by Jason Edmeades's avatar Jason Edmeades Committed by Alexandre Julliard

Avoid the use of glGet when we know the information locally.

parent 84cd1925
...@@ -322,6 +322,8 @@ struct IDirect3DDevice8Impl ...@@ -322,6 +322,8 @@ struct IDirect3DDevice8Impl
UINT srcBlend; UINT srcBlend;
UINT dstBlend; UINT dstBlend;
UINT alphafunc;
UINT stencilfunc;
/* State block related */ /* State block related */
BOOL isRecordingState; BOOL isRecordingState;
......
...@@ -1234,7 +1234,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST REC ...@@ -1234,7 +1234,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST REC
ENTER_GL(); ENTER_GL();
glXSwapBuffers(This->display, This->drawable); glXSwapBuffers(This->display, This->drawable);
checkGLcall("glXSwapBuffers"); /* Dont call checkGLcall, as glGetError is not applicable here */
TRACE("glXSwapBuffers called, Starting new frame");
LEAVE_GL(); LEAVE_GL();
...@@ -2922,10 +2923,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3 ...@@ -2922,10 +2923,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
case D3DRS_ALPHAFUNC : case D3DRS_ALPHAFUNC :
{ {
int glParm = GL_LESS; int glParm = GL_LESS;
float ref = 1.0; float ref = ((float) This->StateBlock->renderstate[D3DRS_ALPHAREF]) / 255.0f;
glGetFloatv(GL_ALPHA_TEST_REF, &ref);
checkGLcall("glGetFloatv(GL_ALPHA_TEST_REF, &ref);");
switch ((D3DCMPFUNC) Value) { switch ((D3DCMPFUNC) Value) {
case D3DCMP_NEVER: glParm=GL_NEVER; break; case D3DCMP_NEVER: glParm=GL_NEVER; break;
...@@ -2941,18 +2939,16 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3 ...@@ -2941,18 +2939,16 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
} }
TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref); TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref);
glAlphaFunc(glParm, ref); glAlphaFunc(glParm, ref);
This->alphafunc = glParm;
checkGLcall("glAlphaFunc"); checkGLcall("glAlphaFunc");
} }
break; break;
case D3DRS_ALPHAREF : case D3DRS_ALPHAREF :
{ {
int glParm = GL_LESS; int glParm = This->alphafunc;
float ref = 1.0f; float ref = 1.0f;
glGetIntegerv(GL_ALPHA_TEST_FUNC, &glParm);
checkGLcall("glGetFloatv(GL_ALPHA_TEST_FUNC, &glParm);");
ref = ((float) Value) / 255.0f; ref = ((float) Value) / 255.0f;
TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref); TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref);
glAlphaFunc(glParm, ref); glAlphaFunc(glParm, ref);
...@@ -3075,13 +3071,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3 ...@@ -3075,13 +3071,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
case D3DRS_STENCILFUNC : case D3DRS_STENCILFUNC :
{ {
int glParm = GL_ALWAYS; int glParm = GL_ALWAYS;
int ref = 0; int ref = This->StateBlock->renderstate[D3DRS_STENCILREF];
GLuint mask = 0xFFFFFFFF; GLuint mask = This->StateBlock->renderstate[D3DRS_STENCILMASK];
glGetIntegerv(GL_STENCIL_REF, &ref);
checkGLcall("glGetFloatv(GL_STENCIL_REF, &ref);");
glGetIntegerv(GL_STENCIL_VALUE_MASK, &mask);
checkGLcall("glGetFloatv(GL_STENCIL_VALUE_MASK, &glParm);");
switch ((D3DCMPFUNC) Value) { switch ((D3DCMPFUNC) Value) {
case D3DCMP_NEVER: glParm=GL_NEVER; break; case D3DCMP_NEVER: glParm=GL_NEVER; break;
...@@ -3103,14 +3094,9 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3 ...@@ -3103,14 +3094,9 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
case D3DRS_STENCILREF : case D3DRS_STENCILREF :
{ {
int glParm = GL_ALWAYS; int glParm = This->stencilfunc;
int ref = 0; int ref = 0;
GLuint mask = 0xFFFFFFFF; GLuint mask = This->StateBlock->renderstate[D3DRS_STENCILMASK];
glGetIntegerv(GL_STENCIL_FUNC, &glParm);
checkGLcall("glGetFloatv(GL_STENCIL_FUNC, &glParm);");
glGetIntegerv(GL_STENCIL_VALUE_MASK, &mask);
checkGLcall("glGetFloatv(GL_STENCIL_VALUE_MASK, &glParm);");
ref = Value; ref = Value;
TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask); TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask);
...@@ -3121,15 +3107,10 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3 ...@@ -3121,15 +3107,10 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
case D3DRS_STENCILMASK : case D3DRS_STENCILMASK :
{ {
int glParm = GL_ALWAYS; int glParm = This->stencilfunc;
int ref = 0.0; int ref = This->StateBlock->renderstate[D3DRS_STENCILREF];
GLuint mask = Value; GLuint mask = Value;
glGetIntegerv(GL_STENCIL_REF, &ref);
checkGLcall("glGetFloatv(GL_STENCIL_REF, &ref);");
glGetIntegerv(GL_STENCIL_FUNC, &glParm);
checkGLcall("glGetFloatv(GL_STENCIL_FUNC, &glParm);");
TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask); TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask);
glStencilFunc(glParm, ref, mask); glStencilFunc(glParm, ref, mask);
checkGLcall("glStencilFunc"); checkGLcall("glStencilFunc");
......
...@@ -106,9 +106,16 @@ HRESULT WINAPI IDirect3DDeviceImpl_InitStartupStateBlock(IDirect3DDevice8Impl* T ...@@ -106,9 +106,16 @@ HRESULT WINAPI IDirect3DDeviceImpl_InitStartupStateBlock(IDirect3DDevice8Impl* T
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
/* Setting stencil func also uses values for stencil ref/mask, so manually set defaults
* so only a single call performed (and ensure defaults initialized before making that call)
*
* IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILREF, 0);
* IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILMASK, 0xFFFFFFFF);
*/
This->StateBlock->renderstate[D3DRS_STENCILREF] = 0;
This->StateBlock->renderstate[D3DRS_STENCILMASK] = 0xFFFFFFFF;
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILFUNC, D3DCMP_ALWAYS); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILREF, 0);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILMASK, 0xFFFFFFFF);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILWRITEMASK, 0xFFFFFFFF); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_TEXTUREFACTOR, 0xFFFFFFFF); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_TEXTUREFACTOR, 0xFFFFFFFF);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_WRAP0, 0); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_WRAP0, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment