Stefan Dösinger : wined3d: Find the correct sampler type for < 2.0 pshaders.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 28 05:09:18 CDT 2006
Module: wine
Branch: master
Commit: 760456dc7fefe300845b99307e98b6f04e64052d
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=760456dc7fefe300845b99307e98b6f04e64052d
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sun Aug 27 19:16:01 2006 +0200
wined3d: Find the correct sampler type for < 2.0 pshaders.
---
dlls/wined3d/arb_program_shader.c | 33 +++++++++++++++++++++++++++++----
dlls/wined3d/baseshader.c | 34 +++++++++++++++++++++++++++++++---
dlls/wined3d/pixelshader.c | 18 +++++++++---------
dlls/wined3d/vertexshader.c | 2 +-
dlls/wined3d/wined3d_private.h | 3 ++-
5 files changed, 72 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e3c21e3..e984b9d 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -621,8 +621,10 @@ 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 & D3DSP_REGNUM_MASK;
@@ -642,12 +644,35 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a
else
reg_sampler_code = src[1] & D3DSP_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 %ld\n", sampler_type);
+ tex_type = "2D";
+ }
+
if(This->wineD3DDevice->stateBlock->textureState[reg_sampler_code][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED) {
- shader_addline(buffer, "TXP %s, %s, texture[%lu], 2D;\n",
- reg_dest, reg_coord, reg_sampler_code);
+ shader_addline(buffer, "TXP %s, %s, texture[%lu], %s;\n",
+ reg_dest, reg_coord, reg_sampler_code, tex_type);
} else {
- shader_addline(buffer, "TEX %s, %s, texture[%lu], 2D;\n",
- reg_dest, reg_coord, reg_sampler_code);
+ shader_addline(buffer, "TEX %s, %s, texture[%lu], %s;\n",
+ reg_dest, reg_coord, reg_sampler_code, tex_type);
}
}
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index f5e3de5..ebcc160 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -180,7 +180,8 @@ HRESULT shader_get_registers_used(
shader_reg_maps* reg_maps,
semantic* semantics_in,
semantic* semantics_out,
- CONST DWORD* pToken) {
+ CONST DWORD* pToken,
+ IWineD3DStateBlockImpl *stateBlock) {
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
@@ -299,8 +300,35 @@ HRESULT shader_get_registers_used(
/* Fake sampler usage, only set reserved bit and ttype */
DWORD sampler_code = *pToken & D3DSP_REGNUM_MASK;
- reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_2D;
-
+
+ if(!stateBlock->textures[sampler_code]) {
+ ERR("No texture bound to sampler %ld\n", sampler_code);
+ reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_2D;
+ } else {
+ int texType = IWineD3DBaseTexture_GetTextureDimensions(stateBlock->textures[sampler_code]);
+ switch(texType) {
+ case GL_TEXTURE_1D:
+ reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_1D;
+ break;
+
+ case GL_TEXTURE_2D:
+ reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_2D;
+ break;
+
+ case GL_TEXTURE_3D:
+ reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_VOLUME;
+ break;
+
+ case GLTEXTURECUBEMAP:
+ reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_CUBE;
+ break;
+
+ default:
+ ERR("Unexpected gl texture type found: %d\n", texType);
+ reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_2D;
+ }
+ }
+
} else if (D3DSHADER_VERSION_MAJOR(This->baseShader.hex_version) == 1 &&
(D3DSIO_TEXM3x3SPEC == curOpcode->opcode ||
D3DSIO_TEXM3x3VSPEC == curOpcode->opcode)) {
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index ab05dbb..814c40e 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -917,8 +917,6 @@ #endif
static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, CONST DWORD *pFunction) {
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
- HRESULT hr;
- shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
TRACE("(%p) : pFunction %p\n", iface, pFunction);
@@ -931,13 +929,6 @@ static HRESULT WINAPI IWineD3DPixelShade
list_init(&This->baseShader.constantsB);
list_init(&This->baseShader.constantsI);
- /* Second pass: figure out which registers are used, what the semantics are, etc.. */
- memset(reg_maps, 0, sizeof(shader_reg_maps));
- hr = shader_get_registers_used((IWineD3DBaseShader*) This, reg_maps,
- This->semantics_in, NULL, pFunction);
- if (hr != WINED3D_OK) return hr;
- /* FIXME: validate reg_maps against OpenGL */
-
This->baseShader.shader_mode = wined3d_settings.ps_selected_mode;
TRACE("(%p) : Copying the function\n", This);
@@ -955,6 +946,8 @@ static HRESULT WINAPI IWineD3DPixelShade
static HRESULT WINAPI IWineD3DPixelShaderImpl_CompileShader(IWineD3DPixelShader *iface) {
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
CONST DWORD *function = This->baseShader.function;
+ shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
+ HRESULT hr;
TRACE("(%p) : function %p\n", iface, function);
@@ -967,6 +960,13 @@ static HRESULT WINAPI IWineD3DPixelShade
return WINED3D_OK;
}
+ /* Second pass: figure out which registers are used, what the semantics are, etc.. */
+ memset(reg_maps, 0, sizeof(shader_reg_maps));
+ hr = shader_get_registers_used((IWineD3DBaseShader*) This, reg_maps,
+ This->semantics_in, NULL, This->baseShader.function, This->wineD3DDevice->stateBlock);
+ if (hr != WINED3D_OK) return hr;
+ /* FIXME: validate reg_maps against OpenGL */
+
/* Generate the HW shader */
TRACE("(%p) : Generating hardware program\n", This);
IWineD3DPixelShaderImpl_GenerateShader(iface, &This->baseShader.reg_maps, function);
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index 3427dff..2f3de86 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -1183,7 +1183,7 @@ static HRESULT WINAPI IWineD3DVertexShad
/* Second pass: figure out registers used, semantics, etc.. */
memset(reg_maps, 0, sizeof(shader_reg_maps));
hr = shader_get_registers_used((IWineD3DBaseShader*) This, reg_maps,
- This->semantics_in, This->semantics_out, pFunction);
+ This->semantics_in, This->semantics_out, pFunction, This->wineD3DDevice->stateBlock);
if (hr != WINED3D_OK) return hr;
This->baseShader.shader_mode = wined3d_settings.vs_selected_mode;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index bc8a9b5..f136ff2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1599,7 +1599,8 @@ extern HRESULT shader_get_registers_used
shader_reg_maps* reg_maps,
semantic* semantics_in,
semantic* semantics_out,
- CONST DWORD* pToken);
+ CONST DWORD* pToken,
+ IWineD3DStateBlockImpl *stateBlock);
extern void shader_generate_glsl_declarations(
IWineD3DBaseShader *iface,
More information about the wine-cvs
mailing list