wined3d: Support WINED3D_BLIT_OP_COLOR_BLIT_CKEY in the GLSL blitter.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45874
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Henri Verbeet 2019-01-11 21:01:09 +03:30 committed by Alexandre Julliard
parent 061121b81a
commit bb0063af39
1 changed files with 37 additions and 8 deletions

View File

@ -7659,6 +7659,14 @@ static void shader_glsl_generate_alpha_test(struct wined3d_string_buffer *buffer
shader_addline(buffer, " discard;\n");
}
static void shader_glsl_generate_colour_key_test(struct wined3d_string_buffer *buffer,
const char *colour, const char *colour_key_low, const char *colour_key_high)
{
shader_addline(buffer, "if (all(greaterThanEqual(%s, %s)) && all(lessThan(%s, %s)))\n",
colour, colour_key_low, colour, colour_key_high);
shader_addline(buffer, " discard;\n");
}
static void shader_glsl_enable_extensions(struct wined3d_string_buffer *buffer,
const struct wined3d_gl_info *gl_info)
{
@ -9952,10 +9960,7 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
}
if (settings->color_key_enabled)
{
shader_addline(buffer, "if (all(greaterThanEqual(tex0, color_key[0])) && all(lessThan(tex0, color_key[1])))\n");
shader_addline(buffer, " discard;\n");
}
shader_glsl_generate_colour_key_test(buffer, "tex0", "color_key[0]", "color_key[1]");
shader_addline(buffer, "ret = ffp_varying_diffuse;\n");
@ -12499,7 +12504,7 @@ struct glsl_blitter_args
{
GLenum texture_type;
struct color_fixup_desc fixup;
unsigned short padding;
unsigned short use_colour_key;
};
struct glsl_blitter_program
@ -12573,6 +12578,8 @@ static void glsl_blitter_generate_p8_shader(struct wined3d_string_buffer *buffer
shader_addline(buffer, " index = (index * 255.0 + 0.5) / 256.0;\n");
shader_addline(buffer, " %s = texture%s(sampler_palette, index);\n",
output, needs_legacy_glsl_syntax(gl_info) ? "1D" : "");
if (args->use_colour_key)
shader_glsl_generate_colour_key_test(buffer, output, "colour_key.low", "colour_key.high");
shader_addline(buffer, "}\n");
}
@ -12866,6 +12873,8 @@ static void glsl_blitter_generate_yuv_shader(struct wined3d_string_buffer *buffe
shader_addline(buffer, " %s.x = luminance + chroma.x * yuv_coef.x;\n", output);
shader_addline(buffer, " %s.y = luminance + chroma.y * yuv_coef.y + chroma.x * yuv_coef.z;\n", output);
shader_addline(buffer, " %s.z = luminance + chroma.y * yuv_coef.w;\n", output);
if (args->use_colour_key)
shader_glsl_generate_colour_key_test(buffer, output, "colour_key.low", "colour_key.high");
shader_addline(buffer, "}\n");
}
@ -12878,6 +12887,8 @@ static void glsl_blitter_generate_plain_shader(struct wined3d_string_buffer *buf
shader_addline(buffer, " %s = texture%s(sampler, out_texcoord.%s);\n",
output, needs_legacy_glsl_syntax(gl_info) ? tex_type : "", swizzle);
shader_glsl_color_correction_ext(buffer, output, WINED3DSP_WRITEMASK_ALL, args->fixup);
if (args->use_colour_key)
shader_glsl_generate_colour_key_test(buffer, output, "colour_key.low", "colour_key.high");
shader_addline(buffer, "}\n");
}
@ -12947,6 +12958,12 @@ static GLuint glsl_blitter_generate_program(struct wined3d_glsl_blitter *blitter
string_buffer_clear(buffer);
shader_glsl_add_version_declaration(buffer, gl_info);
shader_addline(buffer, "uniform sampler%s sampler;\n", tex_type);
if (args->use_colour_key)
{
shader_addline(buffer, "uniform struct\n{\n");
shader_addline(buffer, " vec4 low, high;\n");
shader_addline(buffer, "} colour_key;\n");
}
declare_in_varying(gl_info, buffer, FALSE, "vec3 out_texcoord;\n");
/* TODO: Declare the out variable with the correct type (and put it in the
* blitter args). */
@ -13041,7 +13058,7 @@ static void glsl_blitter_upload_palette(struct wined3d_glsl_blitter *blitter,
/* Context activation is done by the caller. */
static struct glsl_blitter_program *glsl_blitter_get_program(struct wined3d_glsl_blitter *blitter,
struct wined3d_context *context, const struct wined3d_texture_gl *texture_gl)
struct wined3d_context *context, const struct wined3d_texture_gl *texture_gl, BOOL use_colour_key)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
struct glsl_blitter_program *program;
@ -13051,6 +13068,7 @@ static struct glsl_blitter_program *glsl_blitter_get_program(struct wined3d_glsl
memset(&args, 0, sizeof(args));
args.texture_type = texture_gl->target;
args.fixup = texture_gl->t.resource.format->color_fixup;
args.use_colour_key = use_colour_key;
if ((entry = wine_rb_get(&blitter->programs, &args)))
return WINE_RB_ENTRY_VALUE(entry, struct glsl_blitter_program, entry);
@ -13098,7 +13116,7 @@ static BOOL glsl_blitter_supported(enum wined3d_blit_op blit_op, const struct wi
blit_op = WINED3D_BLIT_OP_COLOR_BLIT;
}
if (blit_op != WINED3D_BLIT_OP_COLOR_BLIT)
if (blit_op != WINED3D_BLIT_OP_COLOR_BLIT && blit_op != WINED3D_BLIT_OP_COLOR_BLIT_CKEY)
{
TRACE("Unsupported blit_op %#x.\n", blit_op);
return FALSE;
@ -13266,7 +13284,8 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
context_invalidate_state(context, STATE_FRAMEBUFFER);
}
if (!(program = glsl_blitter_get_program(glsl_blitter, context, src_texture_gl)))
if (!(program = glsl_blitter_get_program(glsl_blitter, context, src_texture_gl,
op == WINED3D_BLIT_OP_COLOR_BLIT_CKEY)))
{
ERR("Failed to get blitter program.\n");
return dst_location;
@ -13291,6 +13310,16 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
default:
break;
}
if (op == WINED3D_BLIT_OP_COLOR_BLIT_CKEY)
{
struct wined3d_color float_key[2];
wined3d_format_get_float_color_key(src_texture->resource.format, colour_key, float_key);
location = GL_EXTCALL(glGetUniformLocation(program->id, "colour_key.low"));
GL_EXTCALL(glUniform4fv(location, 1, &float_key[0].r));
location = GL_EXTCALL(glGetUniformLocation(program->id, "colour_key.high"));
GL_EXTCALL(glUniform4fv(location, 1, &float_key[1].r));
}
context_draw_shaded_quad(context, src_texture_gl, src_sub_resource_idx, src_rect, dst_rect, filter);
GL_EXTCALL(glUseProgram(0));