This fixes stay lines in World of Tanks' GameFace UI parts. The Metal backend doesn't have an offset like this either.
Signed-off-by: Stefan Dösinger stefan@codeweavers.com
---
Other than fixing the todo_wine in test_fractional_viewport, this also fixes a failure in d3d11's test_depth_bias that happens when viewport_array is not supported.
I am not entirely sure what the -1 / 64 in get_projection_matrix was meant for. AFAIU get_projection_matrix isn't called for d3d10+, so the path will be entered for d3d9 when we have ARB_CLIP_CONTROL. In this case we don't need to account for the half pixel offset (hence not setting it to 63/64), and I also don't see a reason to nudge for filling rules in the proj matrix and not by adjusting the values in viewport_miscpart_cc. --- dlls/d3d11/tests/d3d11.c | 1 - dlls/wined3d/state.c | 2 +- dlls/wined3d/utils.c | 2 +- dlls/wined3d/wined3d_private.h | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 6073fae26d9..1f797da1646 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -28153,7 +28153,6 @@ static void test_fractional_viewports(void) ok(compare_float(v->x, expected.x, 0) && compare_float(v->y, expected.y, 0), "Got fragcoord {%.8e, %.8e}, expected {%.8e, %.8e} at (%u, %u), offset %.8e.\n", v->x, v->y, expected.x, expected.y, x, y, viewport_offsets[i]); - todo_wine ok(compare_float(v->z, expected.z, 2) && compare_float(v->w, expected.w, 2), "Got texcoord {%.8e, %.8e}, expected {%.8e, %.8e} at (%u, %u), offset %.8e.\n", v->z, v->w, expected.z, expected.w, x, y, viewport_offsets[i]); diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 8316269afcf..b94c04a79b4 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -4233,7 +4233,7 @@ static void viewport_miscpart_cc(struct wined3d_context *context, const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info; /* See get_projection_matrix() in utils.c for a discussion about those values. */ float pixel_center_offset = context->d3d_info->wined3d_creation_flags - & WINED3D_PIXEL_CENTER_INTEGER ? 63.0f / 128.0f : -1.0f / 128.0f; + & WINED3D_PIXEL_CENTER_INTEGER ? 63.0f / 128.0f : 0.0f; struct wined3d_viewport vp[WINED3D_MAX_VIEWPORTS]; GLdouble depth_ranges[2 * WINED3D_MAX_VIEWPORTS]; GLfloat viewports[4 * WINED3D_MAX_VIEWPORTS]; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 4019dd4d812..69c6f073e96 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5555,7 +5555,7 @@ void get_projection_matrix(const struct wined3d_context *context, const struct w if (!clip_control && d3d_info->wined3d_creation_flags & WINED3D_PIXEL_CENTER_INTEGER) center_offset = 63.0f / 64.0f; else - center_offset = -1.0f / 64.0f; + center_offset = 0.0f;
if (context->last_was_rhw) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 86eae149306..0bf9e01ba42 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -5662,7 +5662,7 @@ static inline void shader_get_position_fixup(const struct wined3d_context *conte if (context->d3d_info->wined3d_creation_flags & WINED3D_PIXEL_CENTER_INTEGER) center_offset = 63.0f / 64.0f; else - center_offset = -1.0f / 64.0f; + center_offset = 0.0f;
for (i = 0; i < fixup_count; ++i) {