On Mon, 10 Feb 2020 at 20:41, Paul Gofman <gofmanp(a)gmail.com> wrote:
-static void state_blend_object(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) +void state_atoc(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { Why the rename? This is still the handler for blend state objects.
+ else + { + if (context->amd_atoc_enabled + && state->render_states[WINED3D_RS_POINTSIZE] != WINED3D_ALPHA_TO_COVERAGE_DISABLE) + return; + + if (state->render_states[WINED3D_RS_POINTSIZE] == WINED3D_ALPHA_TO_COVERAGE_ENABLE) + { + alpha_to_coverage = TRUE; + context->amd_atoc_enabled = 1; + } + else + { + alpha_to_coverage = FALSE; + context->amd_atoc_enabled = 0; + } + } Does this imply that the current alpha to coverage state is supposed to stick as long as WINED3D_RS_POINTSIZE isn't set to either WINED3D_ALPHA_TO_COVERAGE_ENABLE or WINED3D_ALPHA_TO_COVERAGE_DISABLE? (And likewise that setting either of those shouldn't change the current point size?) If that's the case, you can't handle this here; d3d9 state is only flushed to wined3d on draws, so you'd miss intermediate states.
@@ -1532,6 +1549,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_atoc(context, state, state_id); } We'd typically guard that by "!isStateDirty(context, STATE_BLEND)", and perhaps a check on the value of WINED3D_RS_POINTSIZE.