[PATCH 1/2] wined3d: Support AMD alpha to coverage state.
Paul Gofman
gofmanp at gmail.com
Mon Feb 10 03:41:52 CST 2020
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/d3d9/tests/visual.c | 2 +-
dlls/wined3d/glsl_shader.c | 2 ++
dlls/wined3d/state.c | 21 +++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 5 +++++
4 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 859f3e5f1f..b4991d4e5e 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -27100,7 +27100,7 @@ static void test_alpha_to_coverage(void)
colour = get_readback_color(&rb, 64, 64);
/* Nvidia is probably using some proprietary algorithm for averaging sample colour values. */
- todo_wine ok(color_match(colour, 0x9f404080, 1) || color_match(colour, 0x9f485cbc, 1) /* Nvidia */,
+ ok(color_match(colour, 0x9f404080, 1) || color_match(colour, 0x9f485cbc, 1) /* Nvidia */,
"Got unexpected colour %08x.\n", colour);
release_surface_readback(&rb);
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index cc7afe5165..d4bd0d25ca 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -12173,6 +12173,8 @@ static void glsl_vertex_pipe_pointsize(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id)
{
context->constant_update_mask |= WINED3D_SHADER_CONST_VS_POINTSIZE;
+
+ state_alpha_to_coverage(context, state, state_id);
}
static void glsl_vertex_pipe_pointscale(struct wined3d_context *context,
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 87e1ca4bac..97fab9cd40 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1507,6 +1507,25 @@ static void state_psizemin_arb(struct wined3d_context *context, const struct win
checkGLcall("glPointParameterfARB(...)");
}
+void state_alpha_to_coverage(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
+{
+ const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
+
+ if (!gl_info->supported[ARB_MULTISAMPLE])
+ return;
+
+ if (state->render_states[WINED3D_RS_POINTSIZE] == WINED3D_ALPHA_TO_COVERAGE_ENABLE)
+ {
+ gl_info->gl_ops.gl.p_glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
+ checkGLcall("glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE)");
+ }
+ else if (state->render_states[WINED3D_RS_POINTSIZE] == WINED3D_ALPHA_TO_COVERAGE_DISABLE)
+ {
+ gl_info->gl_ops.gl.p_glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
+ checkGLcall("glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE)");
+ }
+}
+
static void state_pscale(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
@@ -1532,6 +1551,8 @@ static void state_pscale(struct wined3d_context *context, const struct wined3d_s
gl_info->gl_ops.gl.p_glPointSize(max(pointsize, FLT_MIN));
checkGLcall("glPointSize(...);");
+
+ state_alpha_to_coverage(context, state, state_id);
}
static void state_debug_monitor(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 3b9b342441..8e595db65d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -76,6 +76,9 @@
#define WINED3D_MAX_DIRTY_REGION_COUNT 7
+#define WINED3D_ALPHA_TO_COVERAGE_ENABLE MAKEFOURCC('A','2','M','1')
+#define WINED3D_ALPHA_TO_COVERAGE_DISABLE MAKEFOURCC('A','2','M','0')
+
struct wined3d_fragment_pipe_ops;
struct wined3d_adapter;
struct wined3d_context;
@@ -4608,6 +4611,8 @@ void state_pointsprite(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
void state_shademode(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
+void state_alpha_to_coverage(struct wined3d_context *context,
+ const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
GLenum gl_primitive_type_from_d3d(enum wined3d_primitive_type primitive_type) DECLSPEC_HIDDEN;
enum wined3d_primitive_type d3d_primitive_type_from_gl(GLenum primitive_type) DECLSPEC_HIDDEN;
--
2.24.1
More information about the wine-devel
mailing list