WineD3D: Sample from the correct source when using older pixel
shaders
Stefan Dösinger
stefan at codeweavers.com
Sat Aug 26 17:07:01 CDT 2006
Am Samstag 26 August 2006 23:31 schrieb Stefan Dösinger:
> Pre 2.0 pixel shaders do not contain a tag for the texture type to sample
> from. Wine had 2D textures hardcoded, this patch checks the bound texture
> type to decide from which texture to sample from. For >= 2.0 shaders the
> shader tag is still used.
Use this patch instead, it also adds the block for sampling 1D textures to
glsl, as it does for ARB
-------------- next part --------------
From nobody Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Sun Aug 27 00:03:34 2006 +0200
Subject: [PATCH] Coalescing 94b525de74dd4b8d2b5f1ffdcf4abf2f6be6ab2d and 470be1ba4e646f299e3d134c4b11dfcead3c9b9a
First commit:
Coalescing 26c12e9b8954b15aca2223e3528e969a83e70bc6 and 91d1a95895c54aba6260a22d3fbfe34658311d7c
First commit:
WineD3D: Sample from the right texture type
Second commit:
add 1D textures to glsl
Second commit:
forgot an 1D line
---
dlls/wined3d/arb_program_shader.c | 36 +++++++++++++++++--
dlls/wined3d/glsl_shader.c | 71 +++++++++++++++++++++++++++++++++++--
2 files changed, 99 insertions(+), 8 deletions(-)
7aef1a179888fb610aca367ac8ca94d5266e5648
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e3c21e3..ccf7ca3 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -621,6 +621,7 @@ 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;
@@ -642,12 +643,39 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* a
else
reg_sampler_code = src[1] & D3DSP_REGNUM_MASK;
+ if(!This->wineD3DDevice->stateBlock->textures[reg_sampler_code]) {
+ FIXME("No texture bound to stage used by the shader\n");
+ tex_type = "2D";
+ } else {
+ switch(IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[reg_sampler_code])) {
+ case GL_TEXTURE_1D:
+ tex_type = "1D";
+ break;
+
+ case GL_TEXTURE_2D:
+ tex_type = "2D";
+ break;
+
+ case GL_TEXTURE_3D:
+ tex_type = "3D";
+ break;
+
+ case GLTEXTURECUBEMAP:
+ tex_type = "CUBE";
+ break;
+
+ default:
+ ERR("Unexpected texture type %d\n", IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[reg_sampler_code]));
+ 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/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 257b9e5..50b58f3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -379,7 +379,38 @@ void shader_generate_glsl_declarations(
for (i = 0; i < This->baseShader.limits.sampler; i++) {
if (reg_maps->samplers[i]) {
- DWORD stype = reg_maps->samplers[i] & WINED3DSP_TEXTURETYPE_MASK;
+ DWORD stype;
+ if (pshader && This->baseShader.hex_version < D3DPS_VERSION(2,0)) {
+ IWineD3DPixelShaderImpl *pshaderImpl = (IWineD3DPixelShaderImpl *) This;
+ if(!pshaderImpl->wineD3DDevice->stateBlock->textures[i]) {
+ FIXME("No texture bound to stage %d used for shader\n", i);
+ stype = WINED3DSTT_2D;
+ } else {
+ switch(IWineD3DBaseTexture_GetTextureDimensions(pshaderImpl->wineD3DDevice->stateBlock->textures[i])) {
+ case GL_TEXTURE_1D:
+ stype = WINED3DSTT_1D;
+ break;
+
+ case GL_TEXTURE_2D:
+ stype = WINED3DSTT_2D;
+ break;
+
+ case GL_TEXTURE_3D:
+ stype = WINED3DSTT_VOLUME;
+ break;
+
+ case GLTEXTURECUBEMAP:
+ stype = WINED3DSTT_CUBE;
+ break;
+
+ default:
+ stype = WINED3DSTT_2D;
+ ERR("Unexpected texture type %d\n", IWineD3DBaseTexture_GetTextureDimensions(pshaderImpl->wineD3DDevice->stateBlock->textures[i]));
+ }
+ }
+ } else {
+ stype = reg_maps->samplers[i] & WINED3DSP_TEXTURETYPE_MASK;
+ }
switch (stype) {
case WINED3DSTT_1D:
@@ -1370,16 +1401,45 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG*
if (hex_version < D3DPS_VERSION(2,0)) {
sprintf(sampler_str, "Psampler%lu", reg_dest_code);
sampler_code = reg_dest_code;
- }
+ if(!This->wineD3DDevice->stateBlock->textures[sampler_code]) {
+ FIXME("No texture bound to stage used by the shader\n");
+ sampler_type = WINED3DSTT_2D;
+ } else {
+ switch(IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[sampler_code])) {
+ case GL_TEXTURE_1D:
+ sampler_type = WINED3DSTT_1D;
+ break;
+
+ case GL_TEXTURE_2D:
+ sampler_type = WINED3DSTT_2D;
+ break;
+
+ case GL_TEXTURE_3D:
+ sampler_type = WINED3DSTT_VOLUME;
+ break;
+
+ case GLTEXTURECUBEMAP:
+ sampler_type = WINED3DSTT_CUBE;
+ break;
+
+ default:
+ sampler_type = WINED3DSTT_2D;
+ ERR("Unexpected texture type %d\n", IWineD3DBaseTexture_GetTextureDimensions(This->wineD3DDevice->stateBlock->textures[sampler_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] & D3DSP_REGNUM_MASK;
- }
+ sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
+ }
- sampler_type = arg->reg_maps->samplers[sampler_code] & WINED3DSP_TEXTURETYPE_MASK;
if(This->wineD3DDevice->stateBlock->textureState[sampler_code][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED) {
switch(sampler_type) {
+ case WINED3DSTT_1D:
+ shader_addline(buffer, "%s = texture1DProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
+ break;
case WINED3DSTT_2D:
shader_addline(buffer, "%s = texture2DProj(%s, %s);\n", dst_str, sampler_str, coord_reg);
break;
@@ -1397,6 +1457,9 @@ void pshader_glsl_tex(SHADER_OPCODE_ARG*
} else {
switch(sampler_type) {
+ case WINED3DSTT_1D:
+ shader_addline(buffer, "%s = texture1D(%s, %s.s);\n", dst_str, sampler_str, coord_reg);
+ break;
case WINED3DSTT_2D:
shader_addline(buffer, "%s = texture2D(%s, %s.st);\n", dst_str, sampler_str, coord_reg);
break;
--
1.2.4
More information about the wine-patches
mailing list