[PATCH] d3dx9: Recognize the D3DXSPRITE_DONOTMODIFY_RENDERSTATE flag

Tony Wasserka tony.wasserka at freenet.de
Mon Mar 9 11:26:41 CDT 2009


---
 dlls/d3dx9_36/sprite.c |  151 +++++++++++++++++++++++++-----------------------
 1 files changed, 78 insertions(+), 73 deletions(-)

diff --git a/dlls/d3dx9_36/sprite.c b/dlls/d3dx9_36/sprite.c
index 82db409..8f27fc3 100644
--- a/dlls/d3dx9_36/sprite.c
+++ b/dlls/d3dx9_36/sprite.c
@@ -130,72 +130,74 @@ static void set_states(ID3DXSpriteImpl *object)
     D3DXMATRIX mat;
     D3DVIEWPORT9 vp;
 
-    /* Miscelaneous stuff */
-    IDirect3DDevice9_SetVertexShader(object->device, NULL);
-    IDirect3DDevice9_SetPixelShader(object->device, NULL);
-    IDirect3DDevice9_SetNPatchMode(object->device, 0.0f);
-
-    /* Render states */
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHABLENDENABLE, TRUE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHAREF, 0x00);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHATESTENABLE, object->alphacmp_caps);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_BLENDOP, D3DBLENDOP_ADD);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_CLIPPING, TRUE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_CLIPPLANEENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE |
-                                    D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_CULLMODE, D3DCULL_NONE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_ENABLEADAPTIVETESSELLATION, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_FILLMODE, D3DFILL_SOLID);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_FOGENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_LIGHTING, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_RANGEFOGENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_SPECULARENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_SRGBWRITEENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_STENCILENABLE, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_VERTEXBLEND, FALSE);
-    IDirect3DDevice9_SetRenderState(object->device, D3DRS_WRAP0, 0);
-
-    /* Texture stage states */
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_TEXCOORDINDEX, 0);
-    IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
-    IDirect3DDevice9_SetTextureStageState(object->device, 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
-
-    /* Sampler states */
-    IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
-    IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
-
-    if(object->texfilter_caps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
-        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
-    else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
-
-    IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAXMIPLEVEL, 0);
-    IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAXANISOTROPY, object->maxanisotropy);
-
-    if(object->texfilter_caps & D3DPTFILTERCAPS_MINFANISOTROPIC)
-        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
-    else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
-
-    if(object->texfilter_caps & D3DPTFILTERCAPS_MIPFLINEAR)
-        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
-    else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
-
-    IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPMAPLODBIAS, 0);
-    IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_SRGBTEXTURE, 0);
+    if(!(object->flags & D3DXSPRITE_DONOTMODIFY_RENDERSTATE)) {
+        /* Miscelaneous stuff */
+        IDirect3DDevice9_SetVertexShader(object->device, NULL);
+        IDirect3DDevice9_SetPixelShader(object->device, NULL);
+        IDirect3DDevice9_SetNPatchMode(object->device, 0.0f);
+
+        /* Render states */
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHABLENDENABLE, TRUE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHAREF, 0x00);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_ALPHATESTENABLE, object->alphacmp_caps);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_BLENDOP, D3DBLENDOP_ADD);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_CLIPPING, TRUE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_CLIPPLANEENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE |
+                                        D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_CULLMODE, D3DCULL_NONE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_ENABLEADAPTIVETESSELLATION, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_FILLMODE, D3DFILL_SOLID);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_FOGENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_LIGHTING, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_RANGEFOGENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_SPECULARENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_SRGBWRITEENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_STENCILENABLE, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_VERTEXBLEND, FALSE);
+        IDirect3DDevice9_SetRenderState(object->device, D3DRS_WRAP0, 0);
+
+        /* Texture stage states */
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_TEXCOORDINDEX, 0);
+        IDirect3DDevice9_SetTextureStageState(object->device, 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
+        IDirect3DDevice9_SetTextureStageState(object->device, 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
+
+        /* Sampler states */
+        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+
+        if(object->texfilter_caps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
+            IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
+        else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+
+        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAXMIPLEVEL, 0);
+        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MAXANISOTROPY, object->maxanisotropy);
+
+        if(object->texfilter_caps & D3DPTFILTERCAPS_MINFANISOTROPIC)
+            IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
+        else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+
+        if(object->texfilter_caps & D3DPTFILTERCAPS_MIPFLINEAR)
+            IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
+        else IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
+
+        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_MIPMAPLODBIAS, 0);
+        IDirect3DDevice9_SetSamplerState(object->device, 0, D3DSAMP_SRGBTEXTURE, 0);
+    }
 
     /* Matrices */
     D3DXMatrixIdentity(&mat);
@@ -213,11 +215,12 @@ static HRESULT WINAPI ID3DXSpriteImpl_Begin(LPD3DXSPRITE iface, DWORD flags)
     TRACE("(%p): relay\n", This);
 
     if(flags>D3DXSPRITE_FLAGLIMIT || This->ready) return D3DERR_INVALIDCALL;
+    This->flags=flags;
 
 /* TODO: Implement flags:
 D3DXSPRITE_ALPHABLEND: enables alpha blending
 D3DXSPRITE_BILLBOARD: makes the sprite always face the camera
-D3DXSPRITE_DONOTMODIFY_RENDERSTATE: name says it all
+D3DXSPRITE_DONOTMODIFY_RENDERSTATE: name says it all (done)
 D3DXSPRITE_OBJECTSPACE: do not change device transforms
 D3DXSPRITE_SORT_DEPTH_BACKTOFRONT: sort by position
 D3DXSPRITE_SORT_DEPTH_FRONTTOBACK: sort by position
@@ -225,7 +228,7 @@ D3DXSPRITE_SORT_TEXTURE: sort by texture (so that it doesn't change too often)
 D3DXSPRITE_DO_NOT_ADDREF_TEXTURE: don't call AddRef/Release on every Draw/Flush call (done)
 D3DXSPRITE_DONOTSAVESTATE: don't save and restore the current device state (done)
 */
-    if(This->vdecl==NULL) {
+    if(This->vdecl==NULL && !(object->flags & D3DXSPRITE_DONOTMODIFY_RENDERSTATE)) {
         static const D3DVERTEXELEMENT9 elements[] =
         {
             { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
@@ -244,9 +247,11 @@ D3DXSPRITE_DONOTSAVESTATE: don't save and restore the current device state (done
 
             set_states(This);
 
-            IDirect3DDevice9_SetVertexDeclaration(This->device, This->vdecl);
-            IDirect3DDevice9_SetStreamSource(This->device, 0, NULL, 0, sizeof(SPRITEVERTEX));
-            IDirect3DDevice9_SetIndices(This->device, NULL);
+            if(!(This->flags & D3DXSPRITE_DONOTMODIFY_RENDERSTATE)) {
+                IDirect3DDevice9_SetVertexDeclaration(This->device, This->vdecl);
+                IDirect3DDevice9_SetStreamSource(This->device, 0, NULL, 0, sizeof(SPRITEVERTEX));
+                IDirect3DDevice9_SetIndices(This->device, NULL);
+            }
             IDirect3DDevice9_SetTexture(This->device, 0, NULL);
 
             IDirect3DDevice9_EndStateBlock(This->device, &This->stateblock);
@@ -260,7 +265,6 @@ D3DXSPRITE_DONOTSAVESTATE: don't save and restore the current device state (done
     D3DXMatrixIdentity(&This->transform);
     D3DXMatrixIdentity(&This->view);
 
-    This->flags=flags;
     This->ready=TRUE;
 
     return D3D_OK;
@@ -371,7 +375,8 @@ static HRESULT WINAPI ID3DXSpriteImpl_Flush(LPD3DXSPRITE iface)
     D3DXVec3TransformCoordArray(&vertices[0].pos, sizeof(SPRITEVERTEX), &vertices[0].pos, sizeof(SPRITEVERTEX), &This->transform, 4*This->sprite_count);
     D3DXVec3TransformCoordArray(&vertices[0].pos, sizeof(SPRITEVERTEX), &vertices[0].pos, sizeof(SPRITEVERTEX), &This->view,      4*This->sprite_count);
 
-    IDirect3DDevice9_SetVertexDeclaration(This->device, This->vdecl);
+    if(!(This->flags & D3DXSPRITE_DONOTMODIFY_RENDERSTATE))
+        IDirect3DDevice9_SetVertexDeclaration(This->device, This->vdecl);
 
     for(i=0;i<This->sprite_count;i++) {
         if(!i)
-- 
1.5.6.6


--------------020704060702050408020804--



More information about the wine-patches mailing list