wined3d: Find the correct sampler type for < 2.0 pshaders.
This commit is contained in:
parent
252a0a76d4
commit
760456dc7f
|
@ -621,8 +621,10 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* arg) {
|
||||||
|
|
||||||
char reg_dest[40];
|
char reg_dest[40];
|
||||||
char reg_coord[40];
|
char reg_coord[40];
|
||||||
|
const char *tex_type;
|
||||||
DWORD reg_dest_code;
|
DWORD reg_dest_code;
|
||||||
DWORD reg_sampler_code;
|
DWORD reg_sampler_code;
|
||||||
|
DWORD sampler_type;
|
||||||
|
|
||||||
/* All versions have a destination register */
|
/* All versions have a destination register */
|
||||||
reg_dest_code = dst & D3DSP_REGNUM_MASK;
|
reg_dest_code = dst & D3DSP_REGNUM_MASK;
|
||||||
|
@ -642,12 +644,35 @@ void pshader_hw_tex(SHADER_OPCODE_ARG* arg) {
|
||||||
else
|
else
|
||||||
reg_sampler_code = src[1] & D3DSP_REGNUM_MASK;
|
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) {
|
if(This->wineD3DDevice->stateBlock->textureState[reg_sampler_code][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED) {
|
||||||
shader_addline(buffer, "TXP %s, %s, texture[%lu], 2D;\n",
|
shader_addline(buffer, "TXP %s, %s, texture[%lu], %s;\n",
|
||||||
reg_dest, reg_coord, reg_sampler_code);
|
reg_dest, reg_coord, reg_sampler_code, tex_type);
|
||||||
} else {
|
} else {
|
||||||
shader_addline(buffer, "TEX %s, %s, texture[%lu], 2D;\n",
|
shader_addline(buffer, "TEX %s, %s, texture[%lu], %s;\n",
|
||||||
reg_dest, reg_coord, reg_sampler_code);
|
reg_dest, reg_coord, reg_sampler_code, tex_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,8 @@ HRESULT shader_get_registers_used(
|
||||||
shader_reg_maps* reg_maps,
|
shader_reg_maps* reg_maps,
|
||||||
semantic* semantics_in,
|
semantic* semantics_in,
|
||||||
semantic* semantics_out,
|
semantic* semantics_out,
|
||||||
CONST DWORD* pToken) {
|
CONST DWORD* pToken,
|
||||||
|
IWineD3DStateBlockImpl *stateBlock) {
|
||||||
|
|
||||||
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
|
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface;
|
||||||
|
|
||||||
|
@ -299,7 +300,34 @@ HRESULT shader_get_registers_used(
|
||||||
|
|
||||||
/* Fake sampler usage, only set reserved bit and ttype */
|
/* Fake sampler usage, only set reserved bit and ttype */
|
||||||
DWORD sampler_code = *pToken & D3DSP_REGNUM_MASK;
|
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 &&
|
} else if (D3DSHADER_VERSION_MAJOR(This->baseShader.hex_version) == 1 &&
|
||||||
(D3DSIO_TEXM3x3SPEC == curOpcode->opcode ||
|
(D3DSIO_TEXM3x3SPEC == curOpcode->opcode ||
|
||||||
|
|
|
@ -917,8 +917,6 @@ inline static VOID IWineD3DPixelShaderImpl_GenerateShader(
|
||||||
static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, CONST DWORD *pFunction) {
|
static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, CONST DWORD *pFunction) {
|
||||||
|
|
||||||
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
|
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
|
||||||
HRESULT hr;
|
|
||||||
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
|
|
||||||
|
|
||||||
TRACE("(%p) : pFunction %p\n", iface, pFunction);
|
TRACE("(%p) : pFunction %p\n", iface, pFunction);
|
||||||
|
|
||||||
|
@ -931,13 +929,6 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i
|
||||||
list_init(&This->baseShader.constantsB);
|
list_init(&This->baseShader.constantsB);
|
||||||
list_init(&This->baseShader.constantsI);
|
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;
|
This->baseShader.shader_mode = wined3d_settings.ps_selected_mode;
|
||||||
|
|
||||||
TRACE("(%p) : Copying the function\n", This);
|
TRACE("(%p) : Copying the function\n", This);
|
||||||
|
@ -955,6 +946,8 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i
|
||||||
static HRESULT WINAPI IWineD3DPixelShaderImpl_CompileShader(IWineD3DPixelShader *iface) {
|
static HRESULT WINAPI IWineD3DPixelShaderImpl_CompileShader(IWineD3DPixelShader *iface) {
|
||||||
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
|
IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface;
|
||||||
CONST DWORD *function = This->baseShader.function;
|
CONST DWORD *function = This->baseShader.function;
|
||||||
|
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p) : function %p\n", iface, function);
|
TRACE("(%p) : function %p\n", iface, function);
|
||||||
|
|
||||||
|
@ -967,6 +960,13 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_CompileShader(IWineD3DPixelShader
|
||||||
return WINED3D_OK;
|
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 */
|
/* Generate the HW shader */
|
||||||
TRACE("(%p) : Generating hardware program\n", This);
|
TRACE("(%p) : Generating hardware program\n", This);
|
||||||
IWineD3DPixelShaderImpl_GenerateShader(iface, &This->baseShader.reg_maps, function);
|
IWineD3DPixelShaderImpl_GenerateShader(iface, &This->baseShader.reg_maps, function);
|
||||||
|
|
|
@ -1183,7 +1183,7 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
|
||||||
/* Second pass: figure out registers used, semantics, etc.. */
|
/* Second pass: figure out registers used, semantics, etc.. */
|
||||||
memset(reg_maps, 0, sizeof(shader_reg_maps));
|
memset(reg_maps, 0, sizeof(shader_reg_maps));
|
||||||
hr = shader_get_registers_used((IWineD3DBaseShader*) This, 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;
|
if (hr != WINED3D_OK) return hr;
|
||||||
|
|
||||||
This->baseShader.shader_mode = wined3d_settings.vs_selected_mode;
|
This->baseShader.shader_mode = wined3d_settings.vs_selected_mode;
|
||||||
|
|
|
@ -1599,7 +1599,8 @@ extern HRESULT shader_get_registers_used(
|
||||||
shader_reg_maps* reg_maps,
|
shader_reg_maps* reg_maps,
|
||||||
semantic* semantics_in,
|
semantic* semantics_in,
|
||||||
semantic* semantics_out,
|
semantic* semantics_out,
|
||||||
CONST DWORD* pToken);
|
CONST DWORD* pToken,
|
||||||
|
IWineD3DStateBlockImpl *stateBlock);
|
||||||
|
|
||||||
extern void shader_generate_glsl_declarations(
|
extern void shader_generate_glsl_declarations(
|
||||||
IWineD3DBaseShader *iface,
|
IWineD3DBaseShader *iface,
|
||||||
|
|
Loading…
Reference in New Issue