wined3d: Add quirk for Nvidia viewport subpixel bits bug.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0d6b6ec33d
commit
6823abd521
|
@ -914,6 +914,17 @@ static BOOL match_broken_arb_fog(const struct wined3d_gl_info *gl_info, struct w
|
||||||
return data[0] != 0x00ff0000 || data[3] != 0x0000ff00;
|
return data[0] != 0x00ff0000 || data[3] != 0x0000ff00;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL match_broken_viewport_subpixel_bits(const struct wined3d_gl_info *gl_info,
|
||||||
|
struct wined3d_caps_gl_ctx *ctx, const char *gl_renderer, enum wined3d_gl_vendor gl_vendor,
|
||||||
|
enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
|
||||||
|
{
|
||||||
|
if (!gl_info->supported[ARB_VIEWPORT_ARRAY])
|
||||||
|
return FALSE;
|
||||||
|
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
|
||||||
|
return FALSE;
|
||||||
|
return !wined3d_caps_gl_ctx_test_viewport_subpixel_bits(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
|
static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
|
||||||
{
|
{
|
||||||
/* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
|
/* MacOS needs uniforms for relative addressing offsets. This can accumulate to quite a few uniforms.
|
||||||
|
@ -1042,6 +1053,17 @@ static void quirk_broken_arb_fog(struct wined3d_gl_info *gl_info)
|
||||||
gl_info->quirks |= WINED3D_QUIRK_BROKEN_ARB_FOG;
|
gl_info->quirks |= WINED3D_QUIRK_BROKEN_ARB_FOG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void quirk_broken_viewport_subpixel_bits(struct wined3d_gl_info *gl_info)
|
||||||
|
{
|
||||||
|
TRACE("Disabling ARB_viewport_array.\n");
|
||||||
|
gl_info->supported[ARB_VIEWPORT_ARRAY] = FALSE;
|
||||||
|
if (gl_info->supported[ARB_CLIP_CONTROL])
|
||||||
|
{
|
||||||
|
TRACE("Disabling ARB_clip_control.\n");
|
||||||
|
gl_info->supported[ARB_CLIP_CONTROL] = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct driver_quirk
|
struct driver_quirk
|
||||||
{
|
{
|
||||||
BOOL (*match)(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
|
BOOL (*match)(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
|
||||||
|
@ -1133,6 +1155,11 @@ static const struct driver_quirk quirk_table[] =
|
||||||
quirk_broken_arb_fog,
|
quirk_broken_arb_fog,
|
||||||
"ARBfp fogstart == fogend workaround"
|
"ARBfp fogstart == fogend workaround"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
match_broken_viewport_subpixel_bits,
|
||||||
|
quirk_broken_viewport_subpixel_bits,
|
||||||
|
"Nvidia viewport subpixel bits bug"
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Certain applications (Steam) complain if we report an outdated driver version. In general,
|
/* Certain applications (Steam) complain if we report an outdated driver version. In general,
|
||||||
|
|
|
@ -3509,6 +3509,53 @@ fail:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits(struct wined3d_caps_gl_ctx *ctx)
|
||||||
|
{
|
||||||
|
static const struct wined3d_color red = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
const struct wined3d_gl_info *gl_info = ctx->gl_info;
|
||||||
|
static const float offset = -63.0f / 128.0f;
|
||||||
|
GLuint texture, fbo;
|
||||||
|
DWORD readback[4];
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
gl_info->gl_ops.gl.p_glGenTextures(1, &texture);
|
||||||
|
gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
|
gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ARRAY_SIZE(readback), 1, 0,
|
||||||
|
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
|
||||||
|
gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
|
||||||
|
gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
||||||
|
gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
||||||
|
GL_TEXTURE_2D, texture, 0);
|
||||||
|
checkGLcall("create resources");
|
||||||
|
|
||||||
|
gl_info->gl_ops.gl.p_glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
GL_EXTCALL(glViewportIndexedf(0, offset, offset, 4.0f, 1.0f));
|
||||||
|
draw_test_quad(ctx, NULL, &red);
|
||||||
|
checkGLcall("draw");
|
||||||
|
|
||||||
|
gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0,
|
||||||
|
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, readback);
|
||||||
|
checkGLcall("readback");
|
||||||
|
|
||||||
|
TRACE("Readback colors are 0x%08x, 0x%08x, 0x%08x, 0x%08x.\n",
|
||||||
|
readback[0], readback[1], readback[2], readback[3]);
|
||||||
|
|
||||||
|
gl_info->gl_ops.gl.p_glDeleteTextures(1, &texture);
|
||||||
|
gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
|
||||||
|
gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
checkGLcall("delete resources");
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(readback); ++i)
|
||||||
|
{
|
||||||
|
if (readback[i] != 0xffff0000)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
float wined3d_adapter_find_polyoffset_scale(struct wined3d_caps_gl_ctx *ctx, GLenum format)
|
float wined3d_adapter_find_polyoffset_scale(struct wined3d_caps_gl_ctx *ctx, GLenum format)
|
||||||
{
|
{
|
||||||
const struct wined3d_gl_info *gl_info = ctx->gl_info;
|
const struct wined3d_gl_info *gl_info = ctx->gl_info;
|
||||||
|
|
|
@ -2354,6 +2354,8 @@ BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter,
|
||||||
struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
|
struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
|
||||||
UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;
|
UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits(struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
void install_gl_compat_wrapper(struct wined3d_gl_info *gl_info, enum wined3d_gl_extension ext) DECLSPEC_HIDDEN;
|
void install_gl_compat_wrapper(struct wined3d_gl_info *gl_info, enum wined3d_gl_extension ext) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
enum projection_types
|
enum projection_types
|
||||||
|
|
Loading…
Reference in New Issue