[PATCH] WineD3D: Add fog and tex types to the ffp fragment =

Stefan Doesinger stefan at codeweavers.com
Fri Jul 11 21:18:06 CDT 2008


description=0A=
=0A=
An ARB_fragment_program or GLSL fragment pipeline replacement=0A=
needs those=0A=
---=0A=
 dlls/wined3d/ati_fragment_shader.c |   12 ++--=0A=
 dlls/wined3d/utils.c               |  135 =
+++++++++++++++++++++++-------------=0A=
 dlls/wined3d/wined3d_private.h     |   17 ++++-=0A=
 3 files changed, 108 insertions(+), 56 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/ati_fragment_shader.c =
b/dlls/wined3d/ati_fragment_shader.c=0A=
index 8989aa6..eb7837f 100644=0A=
--- a/dlls/wined3d/ati_fragment_shader.c=0A=
+++ b/dlls/wined3d/ati_fragment_shader.c=0A=
@@ -780,13 +780,13 @@ static GLuint gen_ati_shader(struct =
texture_stage_op op[MAX_TEXTURES], WineD3D_G=0A=
 static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
     IWineD3DDeviceImpl          *This =3D stateblock->wineD3DDevice;=0A=
     struct atifs_ffp_desc       *desc;=0A=
-    struct texture_stage_op     op[MAX_TEXTURES];=0A=
+    struct ffp_settings settings;=0A=
     struct atifs_private_data   *priv =3D (struct atifs_private_data *) =
This->fragment_priv;=0A=
     DWORD mapped_stage;=0A=
     unsigned int i;=0A=
 =0A=
-    gen_ffp_op(stateblock, op);=0A=
-    desc =3D (struct atifs_ffp_desc *) =
find_ffp_shader(&priv->fragment_shaders, op);=0A=
+    gen_ffp_op(stateblock, &settings, TRUE);=0A=
+    desc =3D (struct atifs_ffp_desc *) =
find_ffp_shader(&priv->fragment_shaders, &settings);=0A=
     if(!desc) {=0A=
         desc =3D HeapAlloc(GetProcessHeap(), 0, sizeof(*desc));=0A=
         if(!desc) {=0A=
@@ -795,12 +795,12 @@ static void set_tex_op_atifs(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Wi=0A=
         }=0A=
         desc->num_textures_used =3D 0;=0A=
         for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
-            if(op[i].cop =3D=3D WINED3DTOP_DISABLE) break;=0A=
+            if(settings.op[i].cop =3D=3D WINED3DTOP_DISABLE) break;=0A=
             desc->num_textures_used =3D i;=0A=
         }=0A=
 =0A=
-        memcpy(desc->parent.op, op, sizeof(op));=0A=
-        desc->shader =3D gen_ati_shader(op, &GLINFO_LOCATION);=0A=
+        memcpy(&desc->parent.settings, &settings, sizeof(settings));=0A=
+        desc->shader =3D gen_ati_shader(settings.op, &GLINFO_LOCATION);=0A=
         add_ffp_shader(&priv->fragment_shaders, &desc->parent);=0A=
         TRACE("Allocated fixed function replacement shader descriptor =
%p\n", desc);=0A=
     }=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index da08d4f..cbcaa17 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -1750,7 +1750,7 @@ void *hash_table_get(hash_table_t *table, void =
*key)=0A=
 }=0A=
 =0A=
 #define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info=0A=
-void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct =
texture_stage_op op[MAX_TEXTURES]) {=0A=
+void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings =
*settings, BOOL ignore_textype) {=0A=
 #define ARG1 0x01=0A=
 #define ARG2 0x02=0A=
 #define ARG0 0x04=0A=
@@ -1789,42 +1789,54 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct texture_stage_op op[M=0A=
     for(i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
         IWineD3DBaseTextureImpl *texture;=0A=
         if(stateblock->textureState[i][WINED3DTSS_COLOROP] =3D=3D =
WINED3DTOP_DISABLE) {=0A=
-            op[i].cop =3D WINED3DTOP_DISABLE;=0A=
-            op[i].aop =3D WINED3DTOP_DISABLE;=0A=
-            op[i].carg0 =3D op[i].carg1 =3D op[i].carg2 =3D 0xffffffff;=0A=
-            op[i].aarg0 =3D op[i].aarg1 =3D op[i].aarg2 =3D 0xffffffff;=0A=
-            op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
-            op[i].dst =3D 0xffffffff;=0A=
+            settings->op[i].cop =3D WINED3DTOP_DISABLE;=0A=
+            settings->op[i].aop =3D WINED3DTOP_DISABLE;=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=
             i++;=0A=
             break;=0A=
         }=0A=
 =0A=
         texture =3D (IWineD3DBaseTextureImpl *) stateblock->textures[i];=0A=
-        op[i].color_correction =3D texture ? =
texture->baseTexture.shader_conversion_group : WINED3DFMT_UNKNOWN;=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=
+            } else {=0A=
+                settings->op[i].tex_type =3D =
stateblock->textureDimensions[i];=0A=
+            }=0A=
+        } else {=0A=
+            settings->op[i].color_correction =3D WINED3DFMT_UNKNOWN;=0A=
+            settings->op[i].tex_type =3D 0;=0A=
+        }=0A=
 =0A=
-        op[i].cop =3D stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
-        op[i].aop =3D stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
+        settings->op[i].cop =3D =
stateblock->textureState[i][WINED3DTSS_COLOROP];=0A=
+        settings->op[i].aop =3D =
stateblock->textureState[i][WINED3DTSS_ALPHAOP];=0A=
 =0A=
-        op[i].carg1 =3D (args[op[i].cop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff;=0A=
-        op[i].carg2 =3D (args[op[i].cop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff;=0A=
-        op[i].carg0 =3D (args[op[i].cop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff;=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=
 =0A=
-        if(is_invalid_op(stateblock->wineD3DDevice, i, op[i].cop, =
op[i].carg1, op[i].carg2, op[i].carg0)) {=0A=
-            op[i].carg0 =3D 0xffffffff;=0A=
-            op[i].carg2 =3D 0xffffffff;=0A=
-            op[i].carg1 =3D WINED3DTA_CURRENT;=0A=
-            op[i].cop =3D WINED3DTOP_SELECTARG1;=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=
         }=0A=
 =0A=
-        op[i].aarg1 =3D (args[op[i].aop] & ARG1) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff;=0A=
-        op[i].aarg2 =3D (args[op[i].aop] & ARG2) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff;=0A=
-        op[i].aarg0 =3D (args[op[i].aop] & ARG0) ? =
stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff;=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, op[i].aop, =
op[i].aarg1, op[i].aarg2, op[i].aarg0)) {=0A=
-            op[i].aarg0 =3D 0xffffffff;=0A=
-            op[i].aarg2 =3D 0xffffffff;=0A=
-            op[i].aarg1 =3D WINED3DTA_CURRENT;=0A=
-            op[i].aop =3D WINED3DTOP_SELECTARG1;=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=
                   stateblock->renderState[WINED3DRS_COLORKEYENABLE] &&=0A=
                  (stateblock->textureDimensions[0] =3D=3D GL_TEXTURE_2D =
||=0A=
@@ -1834,52 +1846,81 @@ void gen_ffp_op(IWineD3DStateBlockImpl =
*stateblock, struct texture_stage_op op[M=0A=
             if(surf->CKeyFlags & WINEDDSD_CKSRCBLT &&=0A=
                getFormatDescEntry(surf->resource.format, NULL, =
NULL)->alphaMask =3D=3D 0x00000000) {=0A=
 =0A=
-                if(op[0].aop =3D=3D WINED3DTOP_DISABLE) {=0A=
-                    op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
-                    op[0].aop =3D WINED3DTOP_SELECTARG1;=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=
                 }=0A=
-                else if(op[0].aop =3D=3D WINED3DTOP_SELECTARG1 && =
op[0].aarg1 !=3D WINED3DTA_TEXTURE) {=0A=
+                else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG1 && settings->op[0].aarg1 !=3D WINED3DTA_TEXTURE) {=0A=
                     if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
-                        op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
-                        op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+                        settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
+                        settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
                     }=0A=
-                    else op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
+                    else settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
                 }=0A=
-                else if(op[0].aop =3D=3D WINED3DTOP_SELECTARG2 && =
op[0].aarg2 !=3D WINED3DTA_TEXTURE) {=0A=
+                else if(settings->op[0].aop =3D=3D =
WINED3DTOP_SELECTARG2 && settings->op[0].aarg2 !=3D WINED3DTA_TEXTURE) {=0A=
                     if =
(stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) {=0A=
-                        op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
-                        op[0].aop =3D WINED3DTOP_MODULATE;=0A=
+                        settings->op[0].aarg1 =3D WINED3DTA_TEXTURE;=0A=
+                        settings->op[0].aop =3D WINED3DTOP_MODULATE;=0A=
                     }=0A=
-                    else op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
+                    else settings->op[0].aarg2 =3D WINED3DTA_TEXTURE;=0A=
                 }=0A=
             }=0A=
         }=0A=
 =0A=
-        if(op[i].carg1 =3D=3D WINED3DTA_TEXTURE || op[i].carg2 =3D=3D =
WINED3DTA_TEXTURE || op[i].carg0 =3D=3D WINED3DTA_TEXTURE ||=0A=
-           op[i].aarg1 =3D=3D WINED3DTA_TEXTURE || op[i].aarg2 =3D=3D =
WINED3DTA_TEXTURE || op[i].aarg0 =3D=3D WINED3DTA_TEXTURE) {=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=
             ttff =3D =
stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS];=0A=
             if(ttff =3D=3D (WINED3DTTFF_PROJECTED | =
WINED3DTTFF_COUNT3)) {=0A=
-                op[i].projected =3D proj_count3;=0A=
+                settings->op[i].projected =3D proj_count3;=0A=
             } else if(ttff =3D=3D (WINED3DTTFF_PROJECTED | =
WINED3DTTFF_COUNT4)) {=0A=
-                op[i].projected =3D proj_count4;=0A=
+                settings->op[i].projected =3D proj_count4;=0A=
             } else {=0A=
-                op[i].projected =3D proj_none;=0A=
+                settings->op[i].projected =3D proj_none;=0A=
             }=0A=
         } else {=0A=
-            op[i].projected =3D proj_none;=0A=
+            settings->op[i].projected =3D proj_none;=0A=
         }=0A=
 =0A=
-        op[i].dst =3D stateblock->textureState[i][WINED3DTSS_RESULTARG];=0A=
+        settings->op[i].dst =3D =
stateblock->textureState[i][WINED3DTSS_RESULTARG];=0A=
     }=0A=
 =0A=
     /* Clear unsupported stages */=0A=
     for(; i < MAX_TEXTURES; i++) {=0A=
-        memset(&op[i], 0xff, sizeof(op[i]));=0A=
+        memset(&settings->op[i], 0xff, sizeof(settings->op[i]));=0A=
+    }=0A=
+=0A=
+    if(stateblock->renderState[WINED3DRS_FOGENABLE] =3D=3D FALSE) {=0A=
+        settings->fog =3D FOG_OFF;=0A=
+    } else if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] =3D=3D =
WINED3DFOG_NONE) {=0A=
+        switch(stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) {=0A=
+            case WINED3DFOG_NONE:=0A=
+            case WINED3DFOG_LINEAR:=0A=
+                settings->fog =3D FOG_LINEAR;=0A=
+                break;=0A=
+            case WINED3DFOG_EXP:=0A=
+                settings->fog =3D FOG_EXP;=0A=
+                break;=0A=
+            case WINED3DFOG_EXP2:=0A=
+                settings->fog =3D FOG_EXP2;=0A=
+                break;=0A=
+        }=0A=
+    } else {=0A=
+        switch(stateblock->renderState[WINED3DRS_FOGTABLEMODE]) {=0A=
+            case WINED3DFOG_LINEAR:=0A=
+                settings->fog =3D FOG_LINEAR;=0A=
+                break;=0A=
+            case WINED3DFOG_EXP:=0A=
+                settings->fog =3D FOG_EXP;=0A=
+                break;=0A=
+            case WINED3DFOG_EXP2:=0A=
+                settings->fog =3D FOG_EXP2;=0A=
+                break;=0A=
+        }=0A=
     }=0A=
 }=0A=
 #undef GLINFO_LOCATION=0A=
 =0A=
-struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
texture_stage_op op[MAX_TEXTURES])=0A=
+struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
ffp_settings *settings)=0A=
 {=0A=
     struct ffp_desc *entry;=0A=
 =0A=
@@ -1887,7 +1928,7 @@ struct ffp_desc *find_ffp_shader(struct list =
*shaders, struct texture_stage_op o=0A=
      * or maybe consider using hashtables=0A=
      */=0A=
     LIST_FOR_EACH_ENTRY(entry, shaders, struct ffp_desc, entry) {=0A=
-        if(memcmp(op, entry->op, sizeof(struct texture_stage_op) * =
MAX_TEXTURES) =3D=3D 0) {=0A=
+        if(memcmp(settings, &entry->settings, sizeof(*settings)) =3D=3D =
0) {=0A=
             TRACE("Found shader entry %p\n", entry);=0A=
             return entry;=0A=
         }=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 61b2983..e86bb1e 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -728,18 +728,29 @@ struct texture_stage_op=0A=
     DWORD                   carg1, carg2, carg0;=0A=
     DWORD                   aarg1, aarg2, aarg0;=0A=
     WINED3DFORMAT           color_correction;=0A=
+    DWORD                   tex_type;=0A=
     DWORD                   dst;=0A=
     enum projection_types   projected;=0A=
 };=0A=
 =0A=
+struct ffp_settings {=0A=
+    struct texture_stage_op     op[MAX_TEXTURES];=0A=
+    enum {=0A=
+        FOG_OFF,=0A=
+        FOG_LINEAR,=0A=
+        FOG_EXP,=0A=
+        FOG_EXP2=0A=
+    } fog;=0A=
+};=0A=
+=0A=
 struct ffp_desc=0A=
 {=0A=
-    struct texture_stage_op     op[MAX_TEXTURES];=0A=
+    struct ffp_settings         settings;=0A=
     struct list                 entry;=0A=
 };=0A=
 =0A=
-void gen_ffp_op(IWineD3DStateBlockImpl *stateblock,struct =
texture_stage_op op[MAX_TEXTURES]);=0A=
-struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
texture_stage_op op[MAX_TEXTURES]);=0A=
+void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct ffp_settings =
*settings, BOOL ignore_textype);=0A=
+struct ffp_desc *find_ffp_shader(struct list *shaders, struct =
ffp_settings *settings);=0A=
 void add_ffp_shader(struct list *shaders, struct ffp_desc *desc);=0A=
 =0A=
 =
/************************************************************************=
*****=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_002C_01C8EFF4.24DB4E30--




More information about the wine-patches mailing list