[PATCH] WineD3D: Use the ARB fog option in ARB_fragment_program =

Stefan Doesinger stefan at codeweavers.com
Sun Dec 14 17:10:09 CST 2008


shaders=0A=
=0A=
This is the "replacement" for the fog coord optimization removed in the=0A=
former patch=0A=
---=0A=
 dlls/wined3d/arb_program_shader.c |   63 =
++++++++++++++----------------------=0A=
 1 files changed, 25 insertions(+), 38 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/arb_program_shader.c =
b/dlls/wined3d/arb_program_shader.c=0A=
index 438b025..902c9d3 100644=0A=
--- a/dlls/wined3d/arb_program_shader.c=0A=
+++ b/dlls/wined3d/arb_program_shader.c=0A=
@@ -1924,14 +1924,30 @@ static GLuint =
shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUF=0A=
     const shader_reg_maps* reg_maps =3D &This->baseShader.reg_maps;=0A=
     CONST DWORD *function =3D This->baseShader.function;=0A=
     DWORD shader_version =3D reg_maps->shader_version;=0A=
-    const char *fragcolor;=0A=
     const WineD3D_GL_Info *gl_info =3D &((IWineD3DDeviceImpl =
*)This->baseShader.device)->adapter->gl_info;=0A=
     const local_constant *lconst;=0A=
     GLuint retval;=0A=
+    const char *fragcolor;=0A=
 =0A=
     /*  Create the hw ARB shader */=0A=
     shader_addline(buffer, "!!ARBfp1.0\n");=0A=
 =0A=
+    if (shader_version < WINED3DPS_VERSION(3,0)) {=0A=
+        switch(args->fog) {=0A=
+            case FOG_OFF:=0A=
+                break;=0A=
+            case FOG_LINEAR:=0A=
+                shader_addline(buffer, "OPTION ARB_fog_linear;\n");=0A=
+                break;=0A=
+            case FOG_EXP:=0A=
+                shader_addline(buffer, "OPTION ARB_fog_exp;\n");=0A=
+                break;=0A=
+            case FOG_EXP2:=0A=
+                shader_addline(buffer, "OPTION ARB_fog_exp2;\n");=0A=
+                break;=0A=
+        }=0A=
+    }=0A=
+=0A=
     shader_addline(buffer, "TEMP TMP;\n");     /* Used in matrix ops */=0A=
     shader_addline(buffer, "TEMP TMP2;\n");    /* Used in matrix ops */=0A=
     shader_addline(buffer, "TEMP TA;\n");      /* Used for modifiers */=0A=
@@ -1941,52 +1957,23 @@ static GLuint =
shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUF=0A=
     shader_addline(buffer, "PARAM coefmul =3D { 2, 4, 8, 16 };\n");=0A=
     shader_addline(buffer, "PARAM one =3D { 1.0, 1.0, 1.0, 1.0 };\n");=0A=
 =0A=
+    if (shader_version < WINED3DPS_VERSION(2,0)) {=0A=
+        fragcolor =3D "R0";=0A=
+    } else {=0A=
+        shader_addline(buffer, "TEMP TMP_COLOR;\n");=0A=
+        fragcolor =3D "TMP_COLOR";=0A=
+    }=0A=
+=0A=
     /* Base Declarations */=0A=
     shader_generate_arb_declarations( (IWineD3DBaseShader*) This, =
reg_maps, buffer, &GLINFO_LOCATION);=0A=
 =0A=
-    /* We need two variables for fog blending */=0A=
-    if(args->fog !=3D FOG_OFF) shader_addline(buffer, "TEMP =
TMP_FOG;\n");=0A=
-    if (shader_version >=3D WINED3DPS_VERSION(2,0)) =
shader_addline(buffer, "TEMP TMP_COLOR;\n");=0A=
-=0A=
     /* Base Shader Body */=0A=
     shader_generate_main( (IWineD3DBaseShader*) This, buffer, reg_maps, =
function);=0A=
 =0A=
-    if (shader_version < WINED3DPS_VERSION(2,0)) {=0A=
-        fragcolor =3D "R0";=0A=
-    } else {=0A=
-        fragcolor =3D "TMP_COLOR";=0A=
-    }=0A=
     if(args->srgb_correction) {=0A=
         arbfp_add_sRGB_correction(buffer, fragcolor, "TMP", "TMP2", =
"TA", "TB");=0A=
     }=0A=
-    if (shader_version < WINED3DPS_VERSION(3,0)) {=0A=
-        /* calculate fog and blend it=0A=
-         * NOTE: state.fog.params.y and state.fog.params.z don't hold =
fog start s and end e but=0A=
-         * -1/(e-s) and e/(e-s) respectively.=0A=
-         */=0A=
-        switch(args->fog) {=0A=
-            case FOG_OFF:=0A=
-                shader_addline(buffer, "MOV result.color, %s;\n", =
fragcolor);=0A=
-                break;=0A=
-            case FOG_LINEAR:=0A=
-                shader_addline(buffer, "SUB TMP_FOG.x, =
state.fog.params.z, state.fog.params.y;\n");=0A=
-                shader_addline(buffer, "RCP TMP_FOG, -TMP_FOG.x;\n");=0A=
-                shader_addline(buffer, "MUL TMP_FOG.y, -TMP_FOG.y, =
state.fog.params.z;\n");=0A=
-                shader_addline(buffer, "MAD_SAT TMP_FOG, =
fragment.fogcoord, TMP_FOG.x, TMP_FOG.y;\n");=0A=
-                shader_addline(buffer, "LRP result.color.rgb, =
TMP_FOG.x, %s, state.fog.color;\n", fragcolor);=0A=
-                shader_addline(buffer, "MOV result.color.a, %s.a;\n", =
fragcolor);=0A=
-                break;=0A=
-            case FOG_EXP:=0A=
-                FIXME("Implement EXP fog in ARB\n");=0A=
-                shader_addline(buffer, "MOV result.color, %s;\n", =
fragcolor);=0A=
-                break;=0A=
-            case FOG_EXP2:=0A=
-                FIXME("Implement EXP2 fog in ARB\n");=0A=
-                shader_addline(buffer, "MOV result.color, %s;\n", =
fragcolor);=0A=
-                break;=0A=
-        }=0A=
-    }=0A=
-=0A=
+    shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);=0A=
     shader_addline(buffer, "END\n");=0A=
 =0A=
     /* TODO: change to resource.glObjectHandle or something like that */=0A=
-- =0A=
1.6.0.6=0A=
=0A=

------=_NextPart_000_0009_01C97342.C0ECA5E0--




More information about the wine-patches mailing list