wined3d: Properly check if input/output varyings are used.
This commit is contained in:
parent
375780a5a8
commit
a1dedbdf58
|
@ -2993,20 +2993,23 @@ static void pshader_glsl_dp2add(const struct wined3d_shader_instruction *ins)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pshader_glsl_input_pack(SHADER_BUFFER *buffer, const struct wined3d_shader_semantic *semantics_in,
|
static void pshader_glsl_input_pack(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer,
|
||||||
IWineD3DPixelShader *iface, enum vertexprocessing_mode vertexprocessing)
|
const struct wined3d_shader_semantic *semantics_in, const struct shader_reg_maps *reg_maps,
|
||||||
|
enum vertexprocessing_mode vertexprocessing)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface;
|
IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface;
|
||||||
|
|
||||||
for (i = 0; i < MAX_REG_INPUT; ++i)
|
for (i = 0; i < MAX_REG_INPUT; ++i)
|
||||||
{
|
{
|
||||||
DWORD usage_token = semantics_in[i].usage;
|
DWORD usage_token;
|
||||||
DWORD usage, usage_idx;
|
DWORD usage, usage_idx;
|
||||||
char reg_mask[6];
|
char reg_mask[6];
|
||||||
|
|
||||||
/* Uninitialized */
|
/* Unused */
|
||||||
if (!usage_token) continue;
|
if (!reg_maps->packed_input[i]) continue;
|
||||||
|
|
||||||
|
usage_token = semantics_in[i].usage;
|
||||||
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
||||||
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
||||||
shader_glsl_get_write_mask(semantics_in[i].reg.token, reg_mask);
|
shader_glsl_get_write_mask(semantics_in[i].reg.token, reg_mask);
|
||||||
|
@ -3091,8 +3094,9 @@ static void delete_glsl_program_entry(struct shader_glsl_priv *priv, const WineD
|
||||||
HeapFree(GetProcessHeap(), 0, entry);
|
HeapFree(GetProcessHeap(), 0, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_ps3_input(SHADER_BUFFER *buffer, const struct wined3d_shader_semantic *semantics_in,
|
static void handle_ps3_input(SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_info, const DWORD *map,
|
||||||
const struct wined3d_shader_semantic *semantics_out, const WineD3D_GL_Info *gl_info, const DWORD *map)
|
const struct wined3d_shader_semantic *semantics_in, const struct shader_reg_maps *reg_maps_in,
|
||||||
|
const struct wined3d_shader_semantic *semantics_out, const struct shader_reg_maps *reg_maps_out)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
DWORD usage_token, usage_token_out;
|
DWORD usage_token, usage_token_out;
|
||||||
|
@ -3112,8 +3116,7 @@ static void handle_ps3_input(SHADER_BUFFER *buffer, const struct wined3d_shader_
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < MAX_REG_INPUT; i++) {
|
for(i = 0; i < MAX_REG_INPUT; i++) {
|
||||||
usage_token = semantics_in[i].usage;
|
if (!reg_maps_in->packed_input[i]) continue;
|
||||||
if (!usage_token) continue;
|
|
||||||
|
|
||||||
in_idx = map[i];
|
in_idx = map[i];
|
||||||
if (in_idx >= (in_count + 2)) {
|
if (in_idx >= (in_count + 2)) {
|
||||||
|
@ -3134,6 +3137,7 @@ static void handle_ps3_input(SHADER_BUFFER *buffer, const struct wined3d_shader_
|
||||||
sprintf(destination, "IN[%u]", in_idx);
|
sprintf(destination, "IN[%u]", in_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usage_token = semantics_in[i].usage;
|
||||||
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
||||||
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
||||||
set[map[i]] = shader_glsl_get_write_mask(semantics_in[i].reg.token, reg_mask);
|
set[map[i]] = shader_glsl_get_write_mask(semantics_in[i].reg.token, reg_mask);
|
||||||
|
@ -3174,9 +3178,9 @@ static void handle_ps3_input(SHADER_BUFFER *buffer, const struct wined3d_shader_
|
||||||
} else {
|
} else {
|
||||||
BOOL found = FALSE;
|
BOOL found = FALSE;
|
||||||
for(j = 0; j < MAX_REG_OUTPUT; j++) {
|
for(j = 0; j < MAX_REG_OUTPUT; j++) {
|
||||||
usage_token_out = semantics_out[j].usage;
|
if (!reg_maps_out->packed_output[j]) continue;
|
||||||
if (!usage_token_out) continue;
|
|
||||||
|
|
||||||
|
usage_token_out = semantics_out[j].usage;
|
||||||
usage_out = (usage_token_out & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
usage_out = (usage_token_out & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
||||||
usage_idx_out = (usage_token_out & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
usage_idx_out = (usage_token_out & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
||||||
shader_glsl_get_write_mask(semantics_out[j].reg.token, reg_mask_out);
|
shader_glsl_get_write_mask(semantics_out[j].reg.token, reg_mask_out);
|
||||||
|
@ -3283,9 +3287,9 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs
|
||||||
|
|
||||||
shader_addline(&buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT);
|
shader_addline(&buffer, "void order_ps_input(in vec4 OUT[%u]) {\n", MAX_REG_OUTPUT);
|
||||||
for(i = 0; i < MAX_REG_OUTPUT; i++) {
|
for(i = 0; i < MAX_REG_OUTPUT; i++) {
|
||||||
usage_token = semantics_out[i].usage;
|
if (!vs->baseShader.reg_maps.packed_output[i]) continue;
|
||||||
if (!usage_token) continue;
|
|
||||||
|
|
||||||
|
usage_token = semantics_out[i].usage;
|
||||||
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
||||||
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
||||||
writemask = shader_glsl_get_write_mask(semantics_out[i].reg.token, reg_mask);
|
writemask = shader_glsl_get_write_mask(semantics_out[i].reg.token, reg_mask);
|
||||||
|
@ -3338,9 +3342,9 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs
|
||||||
|
|
||||||
/* First, sort out position and point size. Those are not passed to the pixel shader */
|
/* First, sort out position and point size. Those are not passed to the pixel shader */
|
||||||
for(i = 0; i < MAX_REG_OUTPUT; i++) {
|
for(i = 0; i < MAX_REG_OUTPUT; i++) {
|
||||||
usage_token = semantics_out[i].usage;
|
if (!vs->baseShader.reg_maps.packed_output[i]) continue;
|
||||||
if (!usage_token) continue;
|
|
||||||
|
|
||||||
|
usage_token = semantics_out[i].usage;
|
||||||
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
||||||
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
||||||
shader_glsl_get_write_mask(semantics_out[i].reg.token, reg_mask);
|
shader_glsl_get_write_mask(semantics_out[i].reg.token, reg_mask);
|
||||||
|
@ -3360,7 +3364,8 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then, fix the pixel shader input */
|
/* Then, fix the pixel shader input */
|
||||||
handle_ps3_input(&buffer, semantics_in, semantics_out, gl_info, ps->input_reg_map);
|
handle_ps3_input(&buffer, gl_info, ps->input_reg_map,
|
||||||
|
semantics_in, &ps->baseShader.reg_maps, semantics_out, &vs->baseShader.reg_maps);
|
||||||
|
|
||||||
shader_addline(&buffer, "}\n");
|
shader_addline(&buffer, "}\n");
|
||||||
} else if(ps_major >= 3 && vs_major < 3) {
|
} else if(ps_major >= 3 && vs_major < 3) {
|
||||||
|
@ -3372,7 +3377,7 @@ static GLhandleARB generate_param_reorder_function(IWineD3DVertexShader *vertexs
|
||||||
* point size, but we depend on the optimizers kindness to find out that the pixel shader doesn't
|
* point size, but we depend on the optimizers kindness to find out that the pixel shader doesn't
|
||||||
* read gl_TexCoord and gl_ColorX, otherwise we'll run out of varyings
|
* read gl_TexCoord and gl_ColorX, otherwise we'll run out of varyings
|
||||||
*/
|
*/
|
||||||
handle_ps3_input(&buffer, semantics_in, NULL, gl_info, ps->input_reg_map);
|
handle_ps3_input(&buffer, gl_info, ps->input_reg_map, semantics_in, &ps->baseShader.reg_maps, NULL, NULL);
|
||||||
shader_addline(&buffer, "}\n");
|
shader_addline(&buffer, "}\n");
|
||||||
} else {
|
} else {
|
||||||
ERR("Unexpected vertex and pixel shader version condition: vs: %d, ps: %d\n", vs_major, ps_major);
|
ERR("Unexpected vertex and pixel shader version condition: vs: %d, ps: %d\n", vs_major, ps_major);
|
||||||
|
@ -3967,7 +3972,7 @@ static GLuint shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BU
|
||||||
|
|
||||||
/* Pack 3.0 inputs */
|
/* Pack 3.0 inputs */
|
||||||
if (reg_maps->shader_version >= WINED3DPS_VERSION(3,0) && args->vp_mode != vertexshader) {
|
if (reg_maps->shader_version >= WINED3DPS_VERSION(3,0) && args->vp_mode != vertexshader) {
|
||||||
pshader_glsl_input_pack(buffer, This->semantics_in, iface, args->vp_mode);
|
pshader_glsl_input_pack(iface, buffer, This->semantics_in, reg_maps, args->vp_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Base Shader Body */
|
/* Base Shader Body */
|
||||||
|
|
|
@ -209,11 +209,16 @@ BOOL vshader_get_input(
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < MAX_ATTRIBS; i++) {
|
for (i = 0; i < MAX_ATTRIBS; i++) {
|
||||||
DWORD usage_token = This->semantics_in[i].usage;
|
DWORD usage_token, usage, usage_idx;
|
||||||
DWORD usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
|
||||||
DWORD usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
|
||||||
|
|
||||||
if (usage_token && match_usage(usage, usage_idx, usage_req, usage_idx_req)) {
|
if (!This->baseShader.reg_maps.attributes[i]) continue;
|
||||||
|
|
||||||
|
usage_token = This->semantics_in[i].usage;
|
||||||
|
usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT;
|
||||||
|
usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT;
|
||||||
|
|
||||||
|
if (match_usage(usage, usage_idx, usage_req, usage_idx_req))
|
||||||
|
{
|
||||||
*regnum = i;
|
*regnum = i;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue