Module: wine Branch: master Commit: 4830a29101302bcbc896462d27b2d77bfa6ec8ba URL: http://source.winehq.org/git/wine.git/?a=commit;h=4830a29101302bcbc896462d27...
Author: Stefan Doesinger stefan@codeweavers.com Date: Fri May 29 17:23:35 2009 +0200
wined3d: Implement texldd in ARB.
---
dlls/wined3d/arb_program_shader.c | 53 +++++++++++++++++++++++++++---------- 1 files changed, 39 insertions(+), 14 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 30b48ee..3bb603b 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -901,7 +901,7 @@ static void gen_color_correction(SHADER_BUFFER *buffer, const char *reg, DWORD d #define TEX_DERIV 0x10
static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD sampler_idx, - const char *dst_str, const char *coord_reg, WORD flags) + const char *dst_str, const char *coord_reg, WORD flags, const char *dsx, const char *dsy) { SHADER_BUFFER *buffer = ins->ctx->buffer; DWORD sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; @@ -944,7 +944,14 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD tex_type = ""; }
- if (flags & TEX_BIAS) + if (flags & TEX_DERIV) + { + if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivates\n"); + if(flags & TEX_BIAS) FIXME("Biased texture sampling with custom derivates\n"); + shader_addline(buffer, "TXD %s, %s, %s, %s, texture[%u], %s;\n", dst_str, coord_reg, dsx, dsy, + sampler_idx, tex_type); + } + else if (flags & TEX_BIAS) { /* Shouldn't be possible, but let's check for it */ if(flags & TEX_PROJ) FIXME("Biased and Projected texture sampling\n"); @@ -1439,7 +1446,7 @@ static void pshader_hw_tex(const struct wined3d_shader_instruction *ins) if (ins->flags & WINED3DSI_TEXLD_PROJECT) myflags |= TEX_PROJ; if (ins->flags & WINED3DSI_TEXLD_BIAS) myflags |= TEX_BIAS; } - shader_hw_sample(ins, reg_sampler_code, reg_dest, reg_coord, myflags); + shader_hw_sample(ins, reg_sampler_code, reg_dest, reg_coord, myflags, NULL, NULL); }
static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins) @@ -1483,7 +1490,7 @@ static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins) shader_addline(buffer, "MOV TA.y, %s.x;\n", src_str); shader_addline(buffer, "MOV TA.x, %s.w;\n", src_str); flags = reg1 < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg1][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; - shader_hw_sample(ins, reg1, dst_str, "TA", flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0); + shader_hw_sample(ins, reg1, dst_str, "TA", flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); }
static void pshader_hw_texreg2gb(const struct wined3d_shader_instruction *ins) @@ -1499,7 +1506,7 @@ static void pshader_hw_texreg2gb(const struct wined3d_shader_instruction *ins) shader_arb_get_src_param(ins, &ins->src[0], 0, src_str); shader_addline(buffer, "MOV TA.x, %s.y;\n", src_str); shader_addline(buffer, "MOV TA.y, %s.z;\n", src_str); - shader_hw_sample(ins, reg1, dst_str, "TA", 0); + shader_hw_sample(ins, reg1, dst_str, "TA", 0, NULL, NULL); }
static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins) @@ -1511,7 +1518,7 @@ static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins) /* Note that texreg2rg treats Tx as a temporary register, not as a varying */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); shader_arb_get_src_param(ins, &ins->src[0], 0, src_str); - shader_hw_sample(ins, reg1, dst_str, src_str, 0); + shader_hw_sample(ins, reg1, dst_str, src_str, 0, NULL, NULL); }
static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins) @@ -1557,7 +1564,7 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins) shader_addline(buffer, "ADD TA.xy, TA, %s;\n", reg_coord); }
- shader_hw_sample(ins, reg_dest_code, dst_reg, "TA", 0); + shader_hw_sample(ins, reg_dest_code, dst_reg, "TA", 0, NULL, NULL);
if (ins->handler_idx == WINED3DSIH_TEXBEML) { @@ -1604,7 +1611,7 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins) shader_arb_get_src_param(ins, &ins->src[0], 0, src0_name); shader_addline(buffer, "DP3 %s.y, fragment.texcoord[%u], %s;\n", dst_reg, reg, src0_name); flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; - shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0); + shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); }
static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins) @@ -1649,7 +1656,7 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins) /* Sample the texture using the calculated coordinates */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; - shader_hw_sample(ins, reg, dst_str, dst_name, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0); + shader_hw_sample(ins, reg, dst_str, dst_name, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); current_state->current_row = 0; }
@@ -1691,7 +1698,7 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins /* Sample the texture using the calculated coordinates */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; - shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0); + shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); current_state->current_row = 0; }
@@ -1733,7 +1740,7 @@ static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins) /* Sample the texture using the calculated coordinates */ shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); flags = reg < MAX_TEXTURES ? deviceImpl->stateBlock->textureState[reg][WINED3DTSS_TEXTURETRANSFORMFLAGS] : 0; - shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0); + shader_hw_sample(ins, reg, dst_str, dst_reg, flags & WINED3DTTFF_PROJECTED ? TEX_PROJ : 0, NULL, NULL); current_state->current_row = 0; }
@@ -1780,7 +1787,7 @@ static void pshader_hw_texdp3tex(const struct wined3d_shader_instruction *ins) shader_addline(buffer, "DP3 TB.x, fragment.texcoord[%u], %s;\n", sampler_idx, src0);
shader_arb_get_dst_param(ins, &ins->dst[0], dst_str); - shader_hw_sample(ins, sampler_idx, dst_str, "TB", 0 /* Only one coord, can't be projected */); + shader_hw_sample(ins, sampler_idx, dst_str, "TB", 0 /* Only one coord, can't be projected */, NULL, NULL); }
/** Process the WINED3DSIO_TEXDP3 instruction in ARB: @@ -2374,6 +2381,24 @@ static void shader_hw_endif(const struct wined3d_shader_instruction *ins) } }
+static void shader_hw_texldd(const struct wined3d_shader_instruction *ins) +{ + DWORD sampler_idx = ins->src[1].reg.idx; + char reg_dest[40]; + char reg_src[3][40]; + DWORD flags = TEX_DERIV; + + shader_arb_get_dst_param(ins, &ins->dst[0], reg_dest); + shader_arb_get_src_param(ins, &ins->src[0], 0, reg_src[0]); + shader_arb_get_src_param(ins, &ins->src[2], 1, reg_src[1]); + shader_arb_get_src_param(ins, &ins->src[3], 2, reg_src[2]); + + if (ins->flags & WINED3DSI_TEXLD_PROJECT) flags |= TEX_PROJ; + if (ins->flags & WINED3DSI_TEXLD_BIAS) flags |= TEX_BIAS; + + shader_hw_sample(ins, sampler_idx, reg_dest, reg_src[0], flags, reg_src[1], reg_src[2]); +} + static GLuint create_arb_blt_vertex_program(const WineD3D_GL_Info *gl_info) { GLuint program_id = 0; @@ -2578,7 +2603,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, * Testing shows no performance difference between OPTION NV_fragment_program2 and NV_fragment_program. * So enable the best we can get. */ - if(reg_maps->usesdsx || reg_maps->usesdsy || reg_maps->loop_depth > 0) + if(reg_maps->usesdsx || reg_maps->usesdsy || reg_maps->loop_depth > 0 || reg_maps->usestexldd) { want_nv_prog = TRUE; } @@ -3466,7 +3491,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_TEXDP3 */ pshader_hw_texdp3, /* WINED3DSIH_TEXDP3TEX */ pshader_hw_texdp3tex, /* WINED3DSIH_TEXKILL */ pshader_hw_texkill, - /* WINED3DSIH_TEXLDD */ NULL, + /* WINED3DSIH_TEXLDD */ shader_hw_texldd, /* WINED3DSIH_TEXLDL */ NULL, /* WINED3DSIH_TEXM3x2DEPTH */ pshader_hw_texm3x2depth, /* WINED3DSIH_TEXM3x2PAD */ pshader_hw_texm3x2pad,