Module: wine Branch: master Commit: e7122e9a79efd0e06b4be4107a62e5efc9295692 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e7122e9a79efd0e06b4be4107a...
Author: H. Verbeet hverbeet@gmail.com Date: Mon Nov 27 20:50:47 2006 +0100
wined3d: Create a separate function for sampling a texture.
---
dlls/wined3d/arb_program_shader.c | 72 +++++++++++++++------------ dlls/wined3d/glsl_shader.c | 98 +++++++++++++++++------------------- 2 files changed, 85 insertions(+), 85 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index a0d0d53..9f2be9b 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -423,6 +423,44 @@ static void vshader_program_add_param(SH } }
+static void shader_hw_sample(SHADER_OPCODE_ARG* arg, DWORD sampler_idx, const char *dst_str, const char *coord_reg) { + IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader; + IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + + SHADER_BUFFER* buffer = arg->buffer; + DWORD sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK; + const char *tex_type; + + switch(sampler_type) { + case WINED3DSTT_1D: + tex_type = "1D"; + break; + + case WINED3DSTT_2D: + tex_type = "2D"; + break; + + case WINED3DSTT_VOLUME: + tex_type = "3D"; + break; + + case WINED3DSTT_CUBE: + tex_type = "CUBE"; + break; + + default: + ERR("Unexpected texture type %d\n", sampler_type); + tex_type = ""; + } + + if (deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) { + shader_addline(buffer, "TXP %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type); + } else { + shader_addline(buffer, "TEX %s, %s, texture[%u], %s;\n", dst_str, coord_reg, sampler_idx, tex_type); + } +} + + static void pshader_gen_input_modifier_line ( SHADER_BUFFER* buffer, const DWORD instr, @@ -618,7 +656,6 @@ void pshader_hw_map2gl(SHADER_OPCODE_ARG void pshader_hw_tex(SHADER_OPCODE_ARG* arg) {
IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
DWORD dst = arg->dst; DWORD* src = arg->src; @@ -627,10 +664,8 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a
char reg_dest[40]; char reg_coord[40]; - const char *tex_type; DWORD reg_dest_code; DWORD reg_sampler_code; - DWORD sampler_type;
/* All versions have a destination register */ reg_dest_code = dst & WINED3DSP_REGNUM_MASK; @@ -650,36 +685,7 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a else reg_sampler_code = src[1] & WINED3DSP_REGNUM_MASK;
- sampler_type = arg->reg_maps->samplers[reg_sampler_code] & WINED3DSP_TEXTURETYPE_MASK; - switch(sampler_type) { - case WINED3DSTT_1D: - tex_type = "1D"; - break; - - case WINED3DSTT_2D: - tex_type = "2D"; - break; - - case WINED3DSTT_VOLUME: - tex_type = "3D"; - break; - - case WINED3DSTT_CUBE: - tex_type = "CUBE"; - break; - - default: - ERR("Unexpected texture type %d\n", sampler_type); - tex_type = "2D"; - } - - if (deviceImpl->stateBlock->textureState[reg_sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) { - shader_addline(buffer, "TXP %s, %s, texture[%u], %s;\n", - reg_dest, reg_coord, reg_sampler_code, tex_type); - } else { - shader_addline(buffer, "TEX %s, %s, texture[%u], %s;\n", - reg_dest, reg_coord, reg_sampler_code, tex_type); - } + shader_hw_sample(arg, reg_sampler_code, reg_dest, reg_coord); }
void pshader_hw_texcoord(SHADER_OPCODE_ARG* arg) { diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 01b3b75..6be71bb 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -855,6 +855,47 @@ static inline const char* shader_get_com } }
+static void shader_glsl_sample(SHADER_OPCODE_ARG* arg, DWORD sampler_idx, const char *dst_str, const char *coord_reg) { + IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader; + IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + DWORD sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK; + const char sampler_prefix = shader_is_pshader_version(This->baseShader.hex_version) ? 'P' : 'V'; + SHADER_BUFFER* buffer = arg->buffer; + + if(deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) { + /* Note that there's no such thing as a projected cube texture. */ + switch(sampler_type) { + case WINED3DSTT_2D: + shader_addline(buffer, "%s = texture2DProj(%cshader%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + break; + case WINED3DSTT_VOLUME: + shader_addline(buffer, "%s = texture3DProj(%cshader%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + break; + default: + shader_addline(buffer, "%s = unrecognized_stype(%cshader%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + FIXME("Unrecognized sampler type: %#x;\n", sampler_type); + break; + } + } else { + switch(sampler_type) { + case WINED3DSTT_2D: + shader_addline(buffer, "%s = texture2D(%csampler%u, %s.xy);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + break; + case WINED3DSTT_CUBE: + shader_addline(buffer, "%s = textureCube(%csampler%u, %s.xyz);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + break; + case WINED3DSTT_VOLUME: + shader_addline(buffer, "%s = texture3D(%csampler%u, %s.xyz);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + break; + default: + shader_addline(buffer, "%s = unrecognized_stype(%csampler%u, %s);\n", dst_str, sampler_prefix, sampler_idx, coord_reg); + FIXME("Unrecognized sampler type: %#x;\n", sampler_type); + break; + } + } +} + + /***************************************************************************** * * Begin processing individual instruction opcodes @@ -1356,20 +1397,12 @@ void shader_glsl_callnz(SHADER_OPCODE_AR * Pixel Shader Specific Code begins here ********************************************/ void pshader_glsl_tex(SHADER_OPCODE_ARG* arg) { - - /* FIXME: Make this work for more than just 2D textures */ - IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
- SHADER_BUFFER* buffer = arg->buffer; DWORD hex_version = This->baseShader.hex_version;
char dst_str[100], dst_reg[50], dst_mask[6]; char coord_str[100], coord_reg[50], coord_mask[6]; - char sampler_str[100], sampler_reg[50], sampler_mask[6]; - DWORD reg_dest_code = arg->dst & WINED3DSP_REGNUM_MASK; - DWORD sampler_code, sampler_type;
/* All versions have a destination register */ shader_glsl_add_param(arg, arg->dst, 0, FALSE, dst_reg, dst_mask, dst_str); @@ -1381,53 +1414,14 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG* else shader_glsl_add_param(arg, arg->src[0], arg->src_addr[0], TRUE, coord_reg, coord_mask, coord_str);
- /* 1.0-1.4: Use destination register as coordinate source. - * 2.0+: Use provided coordinate source register. */ + /* 1.0-1.4: Use destination register as sampler source. + * 2.0+: Use provided sampler source. */ if (hex_version < WINED3DPS_VERSION(2,0)) { - sprintf(sampler_str, "Psampler%u", reg_dest_code); - sampler_code = reg_dest_code; - } - else { - shader_glsl_add_param(arg, arg->src[1], arg->src_addr[1], TRUE, sampler_reg, sampler_mask, sampler_str); - sampler_code = arg->src[1] & WINED3DSP_REGNUM_MASK; - } - - sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK; - if(deviceImpl->stateBlock->textureState[sampler_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) { - switch(sampler_type) { - - case WINED3DSTT_2D: - shader_addline(buffer, "%s = texture2DProj(%s, %s);\n", dst_str, sampler_str, coord_reg); - break; - case WINED3DSTT_CUBE: - shader_addline(buffer, "%s = textureCubeProj(%s, %s);\n", dst_str, sampler_str, coord_reg); - break; - case WINED3DSTT_VOLUME: - shader_addline(buffer, "%s = texture3DProj(%s, %s);\n", dst_str, sampler_str, coord_reg); - break; - default: - shader_addline(buffer, "%s = unrecognized_stype(%s, %s.stp);\n", dst_str, sampler_str, coord_reg); - FIXME("Unrecognized sampler type: %#x;\n", sampler_type); - break; - } + shader_glsl_sample(arg, arg->dst & WINED3DSP_REGNUM_MASK, dst_str, coord_reg); } else { - switch(sampler_type) { - - case WINED3DSTT_2D: - shader_addline(buffer, "%s = texture2D(%s, %s.st);\n", dst_str, sampler_str, coord_reg); - break; - case WINED3DSTT_CUBE: - shader_addline(buffer, "%s = textureCube(%s, %s.stp);\n", dst_str, sampler_str, coord_reg); - break; - case WINED3DSTT_VOLUME: - shader_addline(buffer, "%s = texture3D(%s, %s.stp);\n", dst_str, sampler_str, coord_reg); - break; - default: - shader_addline(buffer, "%s = unrecognized_stype(%s, %s.stp);\n", dst_str, sampler_str, coord_reg); - FIXME("Unrecognized sampler type: %#x;\n", sampler_type); - break; - } + shader_glsl_sample(arg, arg->src[1] & WINED3DSP_REGNUM_MASK, dst_str, coord_reg); } + }
void pshader_glsl_texcoord(SHADER_OPCODE_ARG* arg) {