Module: wine Branch: master Commit: a7b605af6497765c9b9e3e5d24312dfc89f79b8d URL: http://source.winehq.org/git/wine.git/?a=commit;h=a7b605af6497765c9b9e3e5d24...
Author: Stefan Doesinger stefan@codeweavers.com Date: Thu May 28 19:42:24 2009 +0200
wined3d: Implement D3DSPDM_PARTIALPRECISION support.
---
dlls/wined3d/arb_program_shader.c | 44 ++++++++++++++++++++++++------------ 1 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index b39732d..80bb563 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -913,30 +913,38 @@ static void gen_color_correction(SHADER_BUFFER *buffer, const char *reg, DWORD d static const char *shader_arb_get_modifier(const struct wined3d_shader_instruction *ins) { DWORD mod; - const char *ret = ""; + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; if (!ins->dst_count) return "";
mod = ins->dst[0].modifiers; - if(mod & WINED3DSPDM_SATURATE) - { - ret = "_SAT"; - mod &= ~WINED3DSPDM_SATURATE; - } - if(mod & WINED3DSPDM_PARTIALPRECISION) - { - FIXME("Unhandled modifier WINED3DSPDM_PARTIALPRECISION\n"); - mod &= ~WINED3DSPDM_PARTIALPRECISION; - } + + /* Silently ignore PARTIALPRECISION if its not supported */ + if(priv->target_version == ARB) mod &= ~WINED3DSPDM_PARTIALPRECISION; + if(mod & WINED3DSPDM_MSAMPCENTROID) { FIXME("Unhandled modifier WINED3DSPDM_MSAMPCENTROID\n"); mod &= ~WINED3DSPDM_MSAMPCENTROID; } - if(mod) + + switch(mod) { - FIXME("Unknown modifiers 0x%08x\n", mod); + case WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION: + return "H_SAT"; + + case WINED3DSPDM_SATURATE: + return "_SAT"; + + case WINED3DSPDM_PARTIALPRECISION: + return "H"; + + case 0: + return ""; + + default: + FIXME("Unknown modifiers 0x%08x\n", mod); + return ""; } - return ret; }
#define TEX_PROJ 0x1 @@ -953,7 +961,7 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; - const char *mod = shader_arb_get_modifier(ins); + const char *mod;
switch(sampler_type) { case WINED3DSTT_1D: @@ -989,6 +997,12 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD tex_type = ""; }
+ /* TEX, TXL, TXD and TXP do not support the "H" modifier, + * so don't use shader_arb_get_modifier + */ + if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE) mod = "_SAT"; + else mod = ""; + if (flags & TEX_DERIV) { if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivates\n");