From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/d3d9/tests/visual.c | 10 +++---- dlls/wined3d/glsl_shader.c | 50 +++----------------------------- dlls/wined3d/shader.c | 52 ++-------------------------------- dlls/wined3d/wined3d_private.h | 9 ++---- 4 files changed, 13 insertions(+), 108 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 7ea2d0e0d59..8a35c4b379a 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -28665,7 +28665,6 @@ static void test_texture_transform_flags(void) D3DTEXTURETRANSFORMFLAGS flags = flags_tests[i]; float texcoords[4], expect[4]; DWORD ret_flags; - bool equal;
if ((flags & D3DTTFF_PROJECTED) && vs_mode == VS_MODE_RHW && (ps_mode == PS_MODE_FFP || ps_mode == PS_MODE_PS1)) @@ -28827,11 +28826,10 @@ static void test_texture_transform_flags(void) colour = get_readback_vec4(&rb, 0, 0); /* We use point filtering, but we might have sampled the * neighbouring texel. */ - equal = fabsf(colour->x - expect[0]) <= 0.006f && fabsf(colour->y - expect[1]) <= 0.006f - && colour->z == expect[2] && colour->w == expect[3]; -todo_wine_if ((vs_mode == VS_MODE_VS && ps_mode == PS_MODE_FFP && flags == (D3DTTFF_PROJECTED | D3DTTFF_COUNT3)) - || ((vs_mode == VS_MODE_FFP || vs_mode == VS_MODE_FFP_NORMAL) && !equal)) - ok(equal, "Expected colour {%.8e, %.8e, %.8e, %.8e}; got {%.8e, %.8e, %.8e, %.8e}.\n", +todo_wine_if ((vs_mode == VS_MODE_VS && ps_mode == PS_MODE_FFP && flags == (D3DTTFF_PROJECTED | D3DTTFF_COUNT3))) + ok(fabsf(colour->x - expect[0]) <= 0.006f && fabsf(colour->y - expect[1]) <= 0.006f + && colour->z == expect[2] && colour->w == expect[3], + "Expected colour {%.8e, %.8e, %.8e, %.8e}; got {%.8e, %.8e, %.8e, %.8e}.\n", expect[0], expect[1], expect[2], expect[3], colour->x, colour->y, colour->z, colour->w); release_surface_readback(&rb);
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 93abadc6f6b..193badacfb0 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -5364,29 +5364,11 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
if (shader_version < WINED3D_SHADER_VERSION(1,4)) { - DWORD flags = (priv->cur_ps_args->tex_transform >> resource_idx * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) - & WINED3D_PSARGS_TEXTRANSFORM_MASK; - /* Projected cube textures don't make a lot of sense, the resulting coordinates stay the same. */ - if (flags & WINED3D_PSARGS_PROJECTED && resource_type != WINED3D_SHADER_RESOURCE_TEXTURE_CUBE) + if ((priv->cur_ps_args->projected & (1u << resource_idx)) && resource_type != WINED3D_SHADER_RESOURCE_TEXTURE_CUBE) { sample_flags |= WINED3D_GLSL_SAMPLE_PROJECTED; - switch (flags & ~WINED3D_PSARGS_PROJECTED) - { - case WINED3D_TTFF_COUNT1: - FIXME("WINED3D_TTFF_PROJECTED with WINED3D_TTFF_COUNT1?\n"); - break; - case WINED3D_TTFF_COUNT2: - mask = WINED3DSP_WRITEMASK_1; - break; - case WINED3D_TTFF_COUNT3: - mask = WINED3DSP_WRITEMASK_2; - break; - case WINED3D_TTFF_COUNT4: - case WINED3D_TTFF_DISABLE: - mask = WINED3DSP_WRITEMASK_3; - break; - } + mask = WINED3DSP_WRITEMASK_3; } } else if (shader_version < WINED3D_SHADER_VERSION(2,0)) @@ -6756,12 +6738,9 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins) struct glsl_src_param coord_param; unsigned int sampler_idx; DWORD mask; - DWORD flags; char coord_mask[6];
sampler_idx = ins->dst[0].reg.idx[0].offset; - flags = (priv->cur_ps_args->tex_transform >> sampler_idx * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) - & WINED3D_PSARGS_TEXTRANSFORM_MASK;
/* Dependent read, not valid with conditional NP2 */ shader_glsl_get_sample_function(ins->ctx, sampler_idx, sampler_idx, 0, &sample_function); @@ -6771,29 +6750,8 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
/* With projected textures, texbem only divides the static texture coord, * not the displacement, so we can't let GL handle this. */ - if (flags & WINED3D_PSARGS_PROJECTED) - { - DWORD div_mask=0; - char coord_div_mask[3]; - switch (flags & ~WINED3D_PSARGS_PROJECTED) - { - case WINED3D_TTFF_COUNT1: - FIXME("WINED3D_TTFF_PROJECTED with WINED3D_TTFF_COUNT1?\n"); - break; - case WINED3D_TTFF_COUNT2: - div_mask = WINED3DSP_WRITEMASK_1; - break; - case WINED3D_TTFF_COUNT3: - div_mask = WINED3DSP_WRITEMASK_2; - break; - case WINED3D_TTFF_COUNT4: - case WINED3D_TTFF_DISABLE: - div_mask = WINED3DSP_WRITEMASK_3; - break; - } - shader_glsl_write_mask_to_str(div_mask, coord_div_mask); - shader_addline(ins->ctx->buffer, "T%u%s /= T%u%s;\n", sampler_idx, coord_mask, sampler_idx, coord_div_mask); - } + if (priv->cur_ps_args->projected & (1u << sampler_idx)) + shader_addline(ins->ctx->buffer, "T%u%s /= T%u.w;\n", sampler_idx, coord_mask, sampler_idx);
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1, &coord_param);
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index a8245ce59d3..3d7d546b9de 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2863,7 +2863,6 @@ void find_gs_compile_args(const struct wined3d_state *state, const struct wined3 void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, BOOL position_transformed, struct ps_compile_args *args, const struct wined3d_context *context) { - const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX]; const struct wined3d_d3d_info *d3d_info = context->d3d_info; struct wined3d_shader_resource_view *view; struct wined3d_texture *texture; @@ -2885,55 +2884,8 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3 { for (i = 0; i < shader->limits->sampler; ++i) { - uint32_t flags = state->extra_ps_args.texture_transform_flags[i]; - - if (flags & WINED3D_TTFF_PROJECTED) - { - uint32_t tex_transform = flags & ~WINED3D_TTFF_PROJECTED; - - if (!vs || vs->is_ffp_vs) - { - enum wined3d_shader_resource_type resource_type = shader->reg_maps.resource_info[i].type; - unsigned int j; - unsigned int index = state->extra_ps_args.texcoord_index[i]; - uint32_t max_valid = WINED3D_TTFF_COUNT4; - - for (j = 0; j < state->vertex_declaration->element_count; ++j) - { - struct wined3d_vertex_declaration_element *element = - &state->vertex_declaration->elements[j]; - - if (element->usage == WINED3D_DECL_USAGE_TEXCOORD - && element->usage_idx == index) - { - max_valid = element->format->component_count; - break; - } - } - if (!tex_transform || tex_transform > max_valid) - { - WARN("Fixing up projected texture transform flags from %#x to %#x.\n", - tex_transform, max_valid); - tex_transform = max_valid; - } - if ((resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_1D && tex_transform > WINED3D_TTFF_COUNT1) - || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2D - && tex_transform > WINED3D_TTFF_COUNT2) - || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_3D - && tex_transform > WINED3D_TTFF_COUNT3)) - tex_transform |= WINED3D_PSARGS_PROJECTED; - else - { - WARN("Application requested projected texture with unsuitable texture coordinates.\n"); - WARN("(texture unit %u, transform flags %#x, sampler type %u).\n", - i, tex_transform, resource_type); - } - } - else - tex_transform = WINED3D_TTFF_COUNT4 | WINED3D_PSARGS_PROJECTED; - - args->tex_transform |= tex_transform << i * WINED3D_PSARGS_TEXTRANSFORM_SHIFT; - } + if (state->extra_ps_args.texture_transform_flags[i] & WINED3D_TTFF_PROJECTED) + args->projected |= (1u << i); } } if (shader->reg_maps.shader_version.major == 1 diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 275ed80b43d..d3ab5b646f4 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1458,9 +1458,6 @@ enum wined3d_ffp_ps_fog_mode * into the shader code */
-#define WINED3D_PSARGS_PROJECTED (1u << 3) -#define WINED3D_PSARGS_TEXTRANSFORM_SHIFT 4 -#define WINED3D_PSARGS_TEXTRANSFORM_MASK 0xfu #define WINED3D_PSARGS_TEXTYPE_SHIFT 2 #define WINED3D_PSARGS_TEXTYPE_MASK 0x3u
@@ -1479,16 +1476,16 @@ struct ps_compile_args enum wined3d_vertex_processing_mode vp_mode; enum wined3d_ffp_ps_fog_mode fog; DWORD tex_types; /* ps 1 - 3, 16 textures */ - WORD tex_transform; /* ps 1.0-1.3, 4 textures */ - WORD srgb_correction; WORD shadow; /* WINED3D_MAX_FRAGMENT_SAMPLERS, 16 */ WORD texcoords_initialized; /* WINED3D_MAX_FFP_TEXTURES, 8 */ + DWORD srgb_correction : 1; DWORD pointsprite : 1; DWORD flatshading : 1; DWORD alpha_test_func : 3; DWORD rt_alpha_swizzle : 8; /* WINED3D_MAX_RENDER_TARGETS, 8 */ DWORD dual_source_blend : 1; - DWORD padding : 18; + DWORD projected : 4; + DWORD padding : 13; };
enum fog_src_type