Stefan Dösinger : wined3d: Use the ARB fog option in ARB_fragment_program shaders.
Alexandre Julliard
julliard at winehq.org
Mon Jan 12 10:40:31 CST 2009
Module: wine
Branch: master
Commit: e61aa24aa31cd09f63d54512e4459ef4afdbd71c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e61aa24aa31cd09f63d54512e4459ef4afdbd71c
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sun Dec 14 17:10:09 2008 +0100
wined3d: Use the ARB fog option in ARB_fragment_program shaders.
This is the "replacement" for the fog coord optimization removed in
the previous patch.
---
dlls/wined3d/arb_program_shader.c | 63 ++++++++++++++----------------------
1 files changed, 25 insertions(+), 38 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 438b025..902c9d3 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -1924,14 +1924,30 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUF
const shader_reg_maps* reg_maps = &This->baseShader.reg_maps;
CONST DWORD *function = This->baseShader.function;
DWORD shader_version = reg_maps->shader_version;
- const char *fragcolor;
const WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info;
const local_constant *lconst;
GLuint retval;
+ const char *fragcolor;
/* Create the hw ARB shader */
shader_addline(buffer, "!!ARBfp1.0\n");
+ if (shader_version < WINED3DPS_VERSION(3,0)) {
+ switch(args->fog) {
+ case FOG_OFF:
+ break;
+ case FOG_LINEAR:
+ shader_addline(buffer, "OPTION ARB_fog_linear;\n");
+ break;
+ case FOG_EXP:
+ shader_addline(buffer, "OPTION ARB_fog_exp;\n");
+ break;
+ case FOG_EXP2:
+ shader_addline(buffer, "OPTION ARB_fog_exp2;\n");
+ break;
+ }
+ }
+
shader_addline(buffer, "TEMP TMP;\n"); /* Used in matrix ops */
shader_addline(buffer, "TEMP TMP2;\n"); /* Used in matrix ops */
shader_addline(buffer, "TEMP TA;\n"); /* Used for modifiers */
@@ -1941,52 +1957,23 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUF
shader_addline(buffer, "PARAM coefmul = { 2, 4, 8, 16 };\n");
shader_addline(buffer, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n");
+ if (shader_version < WINED3DPS_VERSION(2,0)) {
+ fragcolor = "R0";
+ } else {
+ shader_addline(buffer, "TEMP TMP_COLOR;\n");
+ fragcolor = "TMP_COLOR";
+ }
+
/* Base Declarations */
shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION);
- /* We need two variables for fog blending */
- if(args->fog != FOG_OFF) shader_addline(buffer, "TEMP TMP_FOG;\n");
- if (shader_version >= WINED3DPS_VERSION(2,0)) shader_addline(buffer, "TEMP TMP_COLOR;\n");
-
/* Base Shader Body */
shader_generate_main( (IWineD3DBaseShader*) This, buffer, reg_maps, function);
- if (shader_version < WINED3DPS_VERSION(2,0)) {
- fragcolor = "R0";
- } else {
- fragcolor = "TMP_COLOR";
- }
if(args->srgb_correction) {
arbfp_add_sRGB_correction(buffer, fragcolor, "TMP", "TMP2", "TA", "TB");
}
- if (shader_version < WINED3DPS_VERSION(3,0)) {
- /* calculate fog and blend it
- * NOTE: state.fog.params.y and state.fog.params.z don't hold fog start s and end e but
- * -1/(e-s) and e/(e-s) respectively.
- */
- switch(args->fog) {
- case FOG_OFF:
- shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
- break;
- case FOG_LINEAR:
- shader_addline(buffer, "SUB TMP_FOG.x, state.fog.params.z, state.fog.params.y;\n");
- shader_addline(buffer, "RCP TMP_FOG, -TMP_FOG.x;\n");
- shader_addline(buffer, "MUL TMP_FOG.y, -TMP_FOG.y, state.fog.params.z;\n");
- shader_addline(buffer, "MAD_SAT TMP_FOG, fragment.fogcoord, TMP_FOG.x, TMP_FOG.y;\n");
- shader_addline(buffer, "LRP result.color.rgb, TMP_FOG.x, %s, state.fog.color;\n", fragcolor);
- shader_addline(buffer, "MOV result.color.a, %s.a;\n", fragcolor);
- break;
- case FOG_EXP:
- FIXME("Implement EXP fog in ARB\n");
- shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
- break;
- case FOG_EXP2:
- FIXME("Implement EXP2 fog in ARB\n");
- shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
- break;
- }
- }
-
+ shader_addline(buffer, "MOV result.color, %s;\n", fragcolor);
shader_addline(buffer, "END\n");
/* TODO: change to resource.glObjectHandle or something like that */
More information about the wine-cvs
mailing list