[PATCH 3/3] wined3d: Emulate fractional viewports when viewport_array is not supported.
Stefan Dösinger
stefan at codeweavers.com
Thu Aug 5 12:56:58 CDT 2021
This allows test_fractional_viewports to pass regardless of GL capabilies.
I don't think we can get rid of WINED3D_PIXEL_CENTER_INTEGER (and add +0.5
in the client libs) due to vpos in d3d9 shaders.
Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
I am a bit surprised it works as well as it does. AFAIU there are still some
shortcomings with this emulation, e.g. test that combines test_depth_bias
with test_fractional_viewports would presumably fail.
---
dlls/wined3d/adapter_gl.c | 1 +
dlls/wined3d/adapter_vk.c | 1 +
dlls/wined3d/wined3d_private.h | 13 ++++++++++---
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 902b9620f30..7f3d2512676 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -5129,6 +5129,7 @@ static void wined3d_adapter_gl_init_d3d_info(struct wined3d_adapter_gl *adapter_
d3d_info->clip_control = !!gl_info->supported[ARB_CLIP_CONTROL];
d3d_info->full_ffp_varyings = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_FULL_FFP_VARYINGS);
d3d_info->scaled_resolve = !!gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE_BLIT_SCALED];
+ d3d_info->subpixel_viewport = !!gl_info->supported[ARB_VIEWPORT_ARRAY];
d3d_info->feature_level = feature_level_from_caps(gl_info, &shader_caps, &fragment_caps);
if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index c7da02865ea..31f2b677b5f 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -2172,6 +2172,7 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_
d3d_info->full_ffp_varyings = !!(shader_caps.wined3d_caps & WINED3D_SHADER_CAP_FULL_FFP_VARYINGS);
d3d_info->scaled_resolve = false;
d3d_info->feature_level = feature_level_from_caps(&shader_caps);
+ d3d_info->subpixel_viewport = true;
d3d_info->multisample_draw_location = WINED3D_LOCATION_TEXTURE_RGB;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0bf9e01ba42..6976ef90904 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -239,6 +239,7 @@ struct wined3d_d3d_info
uint32_t clip_control : 1;
uint32_t full_ffp_varyings : 1;
uint32_t scaled_resolve : 1;
+ uint32_t subpixel_viewport : 1;
enum wined3d_feature_level feature_level;
DWORD multisample_draw_location;
@@ -5656,7 +5657,7 @@ static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg)
static inline void shader_get_position_fixup(const struct wined3d_context *context,
const struct wined3d_state *state, unsigned int fixup_count, float *position_fixup)
{
- float center_offset;
+ float center_offset, x = 0.0f, y = 0.0f;
unsigned int i;
if (context->d3d_info->wined3d_creation_flags & WINED3D_PIXEL_CENTER_INTEGER)
@@ -5668,8 +5669,14 @@ static inline void shader_get_position_fixup(const struct wined3d_context *conte
{
position_fixup[4 * i ] = 1.0f;
position_fixup[4 * i + 1] = 1.0f;
- position_fixup[4 * i + 2] = center_offset / state->viewports[i].width;
- position_fixup[4 * i + 3] = -center_offset / state->viewports[i].height;
+ if (!context->d3d_info->subpixel_viewport)
+ {
+ double dummy;
+ x = modf(state->viewports[i].x, &dummy) * 2.0f;
+ y = modf(state->viewports[i].y, &dummy) * 2.0f;
+ }
+ position_fixup[4 * i + 2] = (center_offset + x) / state->viewports[i].width;
+ position_fixup[4 * i + 3] = -(center_offset + y) / state->viewports[i].height;
if (context->render_offscreen)
{
--
2.31.1
More information about the wine-devel
mailing list