[PATCH] WineD3D: Use C bitfields to compact the ffp description=0A=

Stefan Doesinger stefan at codeweavers.com
Wed Jul 30 09:47:29 CDT 2008


=0A=
---=0A=
 dlls/wined3d/ati_fragment_shader.c |    4 +-=0A=
 dlls/wined3d/utils.c               |  112 =
+++++++++++++++++++++++-------------=0A=
 dlls/wined3d/wined3d_private.h     |   33 ++++++++---=0A=
 3 files changed, 98 insertions(+), 51 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index eb7837f..6dc0193 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -226,7 +226,7 @@ static GLuint find_tmpreg(struct texture_stage_op =
op[MAX_TEXTURES]) {=0A=
             lowest_read =3D i;=0A=
         }=0A=
 =0A=
-        if(lowest_write =3D=3D -1 && op[i].dst =3D=3D WINED3DTA_TEMP) {=0A=
+        if(lowest_write =3D=3D -1 && op[i].dst =3D=3D tempreg) {=0A=
             lowest_write =3D i;=0A=
         }=0A=
 =0A=
@@ -418,7 +418,7 @@ static GLuint gen_ati_shader(struct texture_stage_op =
op[MAX_TEXTURES], WineD3D_G=0A=
             break;=0A=
         }=0A=
 =0A=
-        if(op[stage].dst =3D=3D WINED3DTA_TEMP) {=0A=
+        if(op[stage].dst =3D=3D tempreg) {=0A=
             /* If we're writing to D3DTA_TEMP, but never reading from =
it we don't have to write there in the first place.=0A=
              * skip the entire stage, this saves some GPU time=0A=
              */=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index cbcaa17..e8a854d 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -1785,6 +1785,7 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
     };=0A=
     unsigned int i;=0A=
     DWORD ttff;=0A=
+    DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2;=0A=
 =0A=
     for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
         IWineD3DBaseTextureImpl *texture;=0A=
@@ -1794,7 +1795,7 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
             settings->op[i].carg0 =3D settings->op[i].carg1 =3D =
settings->op[i].carg2 =3D 0xffffffff;=0A=
             settings->op[i].aarg0 =3D settings->op[i].aarg1 =3D =
settings->op[i].aarg2 =3D 0xffffffff;=0A=
             settings->op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
-            settings->op[i].dst =3D 0xffffffff;=0A=
+            settings->op[i].dst =3D resultreg;=0A=
             i++;=0A=
             break;=0A=
         }=0A=
@@ -1803,41 +1804,51 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
         if(texture) {=0A=
             settings->op[i].color_correction =3D =
texture->baseTexture.shader_conversion_group;=0A=
             if(ignore_textype) {=0A=
-                settings->op[i].tex_type =3D 0;=0A=
+                settings->op[i].tex_type =3D tex_1d;=0A=
             } else {=0A=
-                settings->op[i].tex_type =3D =
stateblock->textureDimensions[i];=0A=
+                switch(stateblock->textureDimensions[i]) {=0A=
+                    case GL_TEXTURE_1D:=0A=
+                        settings->op[i].tex_type =3D tex_1d;=0A=
+                        break;=0A=
+                    case GL_TEXTURE_2D:=0A=
+                        settings->op[i].tex_type =3D tex_2d;=0A=
+                        break;=0A=
+                    case GL_TEXTURE_3D:=0A=
+                        settings->op[i].tex_type =3D tex_3d;=0A=
+                        break;=0A=
+                    case GL_TEXTURE_CUBE_MAP_ARB:=0A=
+                        settings->op[i].tex_type =3D tex_cube;=0A=
+                        break;=0A=
+                    case GL_TEXTURE_RECTANGLE_ARB:=0A=
+                        settings->op[i].tex_type =3D tex_rect;=0A=
+                        break;=0A=
+                }=0A=
             }=0A=
         } else {=0A=
             settings->op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
-            settings->op[i].tex_type =3D 0;=0A=
+            settings->op[i].tex_type =3D tex_1d;=0A=
         }=0A=
 =0A=
-        settings->op[i].cop =3D =
stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
-        settings->op[i].aop =3D =
stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
+        cop =3D stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
+        aop =3D stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
 =0A=
-        settings->op[i].carg1 =3D (args[settings->op[i].cop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff;=0A=
-        settings->op[i].carg2 =3D (args[settings->op[i].cop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff;=0A=
-        settings->op[i].carg0 =3D (args[settings->op[i].cop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff;=0A=
+        carg1 =3D (args[cop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff;=0A=
+        carg2 =3D (args[cop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff;=0A=
+        carg0 =3D (args[cop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff;=0A=
 =0A=
-        if(is_invalid_op(stateblock->wineD3DDevice, =
i,settings->op[i].cop,=0A=
-                         settings->op[i].carg1, settings->op[i].carg2, =
settings->op[i].carg0)) {=0A=
-            settings->op[i].carg0 =3D 0xffffffff;=0A=
-            settings->op[i].carg2 =3D 0xffffffff;=0A=
-            settings->op[i].carg1 =3D WINED3DTA_CURRENT;=0A=
-            settings->op[i].cop =3D WINED3DTOP_SELECTARG1;=0A=
+        if(is_invalid_op(stateblock->wineD3DDevice, i, cop,=0A=
+                         carg1, carg2, carg0)) {=0A=
+            carg0 =3D 0xffffffff;=0A=
+            carg2 =3D 0xffffffff;=0A=
+            carg1 =3D WINED3DTA_CURRENT;=0A=
+            cop =3D WINED3DTOP_SELECTARG1;=0A=
         }=0A=
 =0A=
-        settings->op[i].aarg1 =3D (args[settings->op[i].aop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff;=0A=
-        settings->op[i].aarg2 =3D (args[settings->op[i].aop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff;=0A=
-        settings->op[i].aarg0 =3D (args[settings->op[i].aop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff;=0A=
-=0A=
-        if(is_invalid_op(stateblock->wineD3DDevice, i, =
settings->op[i].aop,=0A=
-                         settings->op[i].aarg1, settings->op[i].aarg2, =
settings->op[i].aarg0)) {=0A=
-            settings->op[i].aarg0 =3D 0xffffffff;=0A=
-            settings->op[i].aarg2 =3D 0xffffffff;=0A=
-            settings->op[i].aarg1 =3D WINED3DTA_CURRENT;=0A=
-            settings->op[i].aop =3D WINED3DTOP_SELECTARG1;=0A=
-        } else if(i =3D=3D 0 && stateblock->textures[0] &&=0A=
+        aarg1 =3D (args[aop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff;=0A=
+        aarg2 =3D (args[aop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff;=0A=
+        aarg0 =3D (args[aop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff;=0A=
+=0A=
+        if(i =3D=3D 0 && stateblock->textures[0] &&=0A=
                   stateblock->renderState[WINED3DRS_COLORKEYENABLE] &&=0A=
                  (stateblock->textureDimensions[0] =3D=3D GL_TEXTURE_2D =
||=0A=
                   stateblock->textureDimensions[0] =3D=3D =
GL_TEXTURE_RECTANGLE_ARB)) {=0A=
@@ -1846,29 +1857,37 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
             if(surf->CKeyFlags & WINEDDSD_CKSRCBLT &&=0A=
                getFormatDescEntry(surf->resource.format, NULL, =
NULL)->alphaMask =3D=3D 0x00000000) {=0A=
 =0A=
-                if(settings->op[0].aop =3D=3D WINED3DTOP_DISABLE) {=0A=
-                   settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
-                   settings->op[0].aop =3D WINED3DTOP_SELECTARG1;=0A=
+                if(aop =3D=3D WINED3DTOP_DISABLE) {=0A=
+                   aarg1 =3D WINED3DTA_TEXTURE;=0A=
+                   aop =3D WINED3DTOP_SELECTARG1;=0A=
                 }=0A=
-                else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG1 && settings->op[0].aarg1 !=3D WINED3DTA_TEXTURE) {=0A=
+                else if(aop =3D=3D WINED3DTOP_SELECTARG1 && aarg1 !=3D =
WINED3DTA_TEXTURE) {=0A=
                     if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
-                        settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
-                        settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+                        aarg2 =3D WINED3DTA_TEXTURE;=0A=
+                        aop =3D WINED3DTOP_MODULATE;=0A=
                     }=0A=
-                    else settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
+                    else aarg1 =3D WINED3DTA_TEXTURE;=0A=
                 }=0A=
-                else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG2 && settings->op[0].aarg2 !=3D WINED3DTA_TEXTURE) {=0A=
+                else if(aop =3D=3D WINED3DTOP_SELECTARG2 && aarg2 !=3D =
WINED3DTA_TEXTURE) {=0A=
                     if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
-                        settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
-                        settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+                        aarg1 =3D WINED3DTA_TEXTURE;=0A=
+                        aop =3D WINED3DTOP_MODULATE;=0A=
                     }=0A=
-                    else settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
+                    else aarg2 =3D WINED3DTA_TEXTURE;=0A=
                 }=0A=
             }=0A=
         }=0A=
 =0A=
-        if(settings->op[i].carg1 =3D=3D WINED3DTA_TEXTURE || =
settings->op[i].carg2 =3D=3D WINED3DTA_TEXTURE || settings->op[i].carg0 =
=3D=3D WINED3DTA_TEXTURE ||=0A=
-           settings->op[i].aarg1 =3D=3D WINED3DTA_TEXTURE || =
settings->op[i].aarg2 =3D=3D WINED3DTA_TEXTURE || settings->op[i].aarg0 =
=3D=3D WINED3DTA_TEXTURE) {=0A=
+        if(is_invalid_op(stateblock->wineD3DDevice, i, aop,=0A=
+           aarg1, aarg2, aarg0)) {=0A=
+               aarg0 =3D 0xffffffff;=0A=
+               aarg2 =3D 0xffffffff;=0A=
+               aarg1 =3D WINED3DTA_CURRENT;=0A=
+               aop =3D WINED3DTOP_SELECTARG1;=0A=
+        }=0A=
+=0A=
+        if(carg1 =3D=3D WINED3DTA_TEXTURE || carg2 =3D=3D =
WINED3DTA_TEXTURE || carg0 =3D=3D WINED3DTA_TEXTURE ||=0A=
+           aarg1 =3D=3D WINED3DTA_TEXTURE || aarg2 =3D=3D =
WINED3DTA_TEXTURE || aarg0 =3D=3D WINED3DTA_TEXTURE) {=0A=
             ttff =3D =
stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS];=0A=
             if(ttff =3D=3D (WINED3DTTFF_PROJECTED | =
WINED3DTTFF_COUNT3)) {=0A=
                 settings->op[i].projected =3D proj_count3;=0A=
@@ -1881,7 +1900,20 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct ffp_settings *setting=0A=
             settings->op[i].projected =3D proj_none;=0A=
         }=0A=
 =0A=
-        settings->op[i].dst =3D =
stateblock->textureState[i][WINED3DTSS_RESULTARG];=0A=
+        settings->op[i].cop =3D cop;=0A=
+        settings->op[i].aop =3D aop;=0A=
+        settings->op[i].carg0 =3D carg0;=0A=
+        settings->op[i].carg1 =3D carg1;=0A=
+        settings->op[i].carg2 =3D carg2;=0A=
+        settings->op[i].aarg0 =3D aarg0;=0A=
+        settings->op[i].aarg1 =3D aarg1;=0A=
+        settings->op[i].aarg2 =3D aarg2;=0A=
+=0A=
+        if(stateblock->textureState[i][WINED3DTSS_RESULTARG] =3D=3D =
WINED3DTA_TEMP) {=0A=
+            settings->op[i].dst =3D tempreg;=0A=
+        } else {=0A=
+            settings->op[i].dst =3D resultreg;=0A=
+        }=0A=
     }=0A=
 =0A=
     /* Clear unsupported stages */=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index e86bb1e..66e5a32 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -714,9 +714,24 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl =
*This, struct WineD3DRectPatch *p=0A=
 =0A=
 enum projection_types=0A=
 {=0A=
-    proj_none,=0A=
-    proj_count3,=0A=
-    proj_count4=0A=
+    proj_none    =3D 0,=0A=
+    proj_count3  =3D 1,=0A=
+    proj_count4  =3D 2=0A=
+};=0A=
+=0A=
+enum tex_types=0A=
+{=0A=
+    tex_1d       =3D 0,=0A=
+    tex_2d       =3D 1,=0A=
+    tex_3d       =3D 2,=0A=
+    tex_cube     =3D 3,=0A=
+    tex_rect     =3D 4=0A=
+};=0A=
+=0A=
+enum dst_arg=0A=
+{=0A=
+    resultreg    =3D 0,=0A=
+    tempreg      =3D 1=0A=
 };=0A=
 =0A=
 =
/************************************************************************=
*****=0A=
@@ -724,13 +739,13 @@ enum projection_types=0A=
  */=0A=
 struct texture_stage_op=0A=
 {=0A=
-    WINED3DTEXTUREOP        cop, aop;=0A=
-    DWORD                   carg1, carg2, carg0;=0A=
-    DWORD                   aarg1, aarg2, aarg0;=0A=
+    unsigned                cop : 5, aop : 5;=0A=
+    unsigned                carg1 : 6, carg2 : 6, carg0 : 6;=0A=
+    unsigned                tex_type : 3;=0A=
+    unsigned                dst : 1;=0A=
+    unsigned                aarg1 : 6, aarg2 : 6, aarg0 : 6;=0A=
+    unsigned                projected : 2;=0A=
     WINED3DFORMAT           color_correction;=0A=
-    DWORD                   tex_type;=0A=
-    DWORD                   dst;=0A=
-    enum projection_types   projected;=0A=
 };=0A=
 =0A=
 struct ffp_settings {=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0018_01C8F22B.ECA43880--




More information about the wine-patches mailing list