Stefan Doesinger : wined3d: Implement texldd in ARB.
Alexandre Julliard
julliard at winehq.org
Tue Jun 16 09:09:39 CDT 2009
Module: wine
Branch: master
Commit: 4830a29101302bcbc896462d27b2d77bfa6ec8ba
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4830a29101302bcbc896462d27b2d77bfa6ec8ba
Author: Stefan Doesinger <stefan at 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,
More information about the wine-cvs
mailing list