Module: wine Branch: master Commit: 4ed605f081b21ea311adfa3a0027204165dac6de URL: http://source.winehq.org/git/wine.git/?a=commit;h=4ed605f081b21ea311adfa3a00...
Author: Matteo Bruni mbruni@codeweavers.com Date: Thu Mar 8 18:22:16 2012 +0100
wined3d: Clamp fog coordinate in the ARB backend too.
---
dlls/wined3d/arb_program_shader.c | 29 ++++++++++++++++++++++++----- 1 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index cf9b909..50cd91a 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -344,6 +344,7 @@ static BOOL need_helper_const(const struct arb_vshader_private *shader_data, if (!use_nv_clip(gl_info)) return TRUE; /* Init the clip texcoord */ if (reg_maps->usesnrm) return TRUE; /* 0.0 */ if (reg_maps->usespow) return TRUE; /* EPS, 0.0 and 1.0 */ + if (reg_maps->fog) return TRUE; /* Clamping fog coord, 0.0 and 1.0 */ return FALSE; }
@@ -962,7 +963,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction const struct wined3d_shader_register *reg, char *register_name, BOOL *is_color) { /* oPos, oFog and oPts in D3D */ - static const char * const rastout_reg_names[] = {"TMP_OUT", "result.fogcoord", "result.pointsize"}; + static const char * const rastout_reg_names[] = {"TMP_OUT", "TMP_FOGCOORD", "result.pointsize"}; const struct wined3d_shader *shader = ins->ctx->shader; const struct wined3d_shader_reg_maps *reg_maps = ins->ctx->reg_maps; BOOL pshader = shader_is_pshader_version(reg_maps->shader_version.type); @@ -3139,10 +3140,26 @@ static void vshader_add_footer(struct shader_arb_ctx_priv *priv_ctx, * the shader, it is set to 0.0(fully fogged, since start = 1.0, end = 0.0) */ if (args->super.fog_src == VS_FOG_Z) + { shader_addline(buffer, "MOV result.fogcoord, TMP_OUT.z;\n"); - else if (!reg_maps->fog) - /* posFixup.x is always 1.0, so we can safely use it */ - shader_addline(buffer, "ADD result.fogcoord, posFixup.x, -posFixup.x;\n"); + } + else + { + if (!reg_maps->fog) + { + /* posFixup.x is always 1.0, so we can safely use it */ + shader_addline(buffer, "ADD result.fogcoord, posFixup.x, -posFixup.x;\n"); + } + else + { + /* Clamp fogcoord */ + const char *zero = arb_get_helper_value(reg_maps->shader_version.type, ARB_ZERO); + const char *one = arb_get_helper_value(reg_maps->shader_version.type, ARB_ONE); + + shader_addline(buffer, "MIN TMP_FOGCOORD.x, TMP_FOGCOORD.x, %s;\n", one); + shader_addline(buffer, "MAX result.fogcoord.x, TMP_FOGCOORD.x, %s;\n", zero); + } + }
/* Clipplanes are always stored without y inversion */ if (use_nv_clip(gl_info) && priv_ctx->target_version >= NV2) @@ -3962,7 +3979,7 @@ static void init_output_registers(const struct wined3d_shader *shader, DWORD sig } priv_ctx->color_output[0] = "result.color.primary"; priv_ctx->color_output[1] = "result.color.secondary"; - priv_ctx->fog_output = "result.fogcoord"; + priv_ctx->fog_output = "TMP_FOGCOORD";
/* Map declared regs to builtins. Use "TA" to /dev/null unread output */ for (i = 0; i < (sizeof(shader->output_signature) / sizeof(*shader->output_signature)); ++i) @@ -4148,6 +4165,8 @@ static GLuint shader_arb_generate_vshader(const struct wined3d_shader *shader, }
shader_addline(buffer, "TEMP TMP_OUT;\n"); + if (reg_maps->fog) + shader_addline(buffer, "TEMP TMP_FOGCOORD;\n"); if (need_helper_const(shader_data, reg_maps, gl_info)) { shader_addline(buffer, "PARAM helper_const = { 0.0, 1.0, 2.0, %1.10f};\n", eps);