[PATCH 5/5] wined3d: Report WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS when possible.
Matteo Bruni
mbruni at codeweavers.com
Mon May 20 11:49:53 CDT 2019
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
Might help with bug 47010.
dlls/wined3d/adapter_gl.c | 55 ++++++++++++++++++++++++++++++++++
dlls/wined3d/adapter_vk.c | 5 ++--
dlls/wined3d/directx.c | 1 -
dlls/wined3d/wined3d_private.h | 1 +
4 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index d471785d8d8..110771f8ea9 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -834,6 +834,49 @@ static BOOL match_broken_viewport_subpixel_bits(const struct wined3d_gl_info *gl
return !wined3d_caps_gl_ctx_test_viewport_subpixel_bits(ctx);
}
+static BOOL match_no_independent_bit_depths(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)
+{
+ GLuint tex[2], fbo;
+ GLenum status;
+
+ /* ARB_framebuffer_object allows implementation-dependent internal format
+ * restrictions. The EXT extension explicitly calls out an error in the
+ * relevant case. */
+ if (!gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
+ return TRUE;
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+ return TRUE;
+
+ gl_info->gl_ops.gl.p_glGenTextures(2, tex);
+
+ gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex[0]);
+ gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 1, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
+
+ gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex[1]);
+ gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 4, 1, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);
+ gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
+
+ gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
+ gl_info->fbo_ops.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
+ gl_info->fbo_ops.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[0], 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tex[1], 0);
+
+ status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
+
+ gl_info->fbo_ops.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
+ gl_info->gl_ops.gl.p_glDeleteTextures(2, tex);
+ checkGLcall("testing multiple framebuffer attachments with different bit depths");
+
+ return status != GL_FRAMEBUFFER_COMPLETE;
+}
+
static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info)
{
/* MacOS needs uniforms for relative addressing offsets. This can
@@ -988,6 +1031,11 @@ static void quirk_broken_viewport_subpixel_bits(struct wined3d_gl_info *gl_info)
}
}
+static void quirk_no_independent_bit_depths(struct wined3d_gl_info *gl_info)
+{
+ gl_info->quirks |= WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS;
+}
+
static const struct wined3d_gpu_description *query_gpu_description(const struct wined3d_gl_info *gl_info,
UINT64 *vram_bytes)
{
@@ -1119,6 +1167,11 @@ static void fixup_extensions(struct wined3d_gl_info *gl_info, struct wined3d_cap
quirk_broken_viewport_subpixel_bits,
"NVIDIA viewport subpixel bits bug"
},
+ {
+ match_no_independent_bit_depths,
+ quirk_no_independent_bit_depths,
+ "No support for MRT with independent bit depths"
+ },
};
for (i = 0; i < ARRAY_SIZE(quirk_table); ++i)
@@ -4354,6 +4407,8 @@ static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, s
caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
if (gl_info->supported[ARB_FRAMEBUFFER_SRGB])
caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT;
+ if (~gl_info->quirks & WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS)
+ caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS;
if (gl_info->supported[ARB_SAMPLER_OBJECTS] || gl_info->supported[EXT_TEXTURE_LOD_BIAS])
caps->RasterCaps |= WINED3DPRASTERCAPS_MIPMAPLODBIAS;
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index e0fd68fa9cb..b944b2fb32a 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -333,9 +333,10 @@ static void adapter_vk_get_wined3d_caps(const struct wined3d_adapter *adapter, s
caps->Caps2 |= WINED3DCAPS2_CANGENMIPMAP;
caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_BLENDOP
- | WINED3DPMISCCAPS_SEPARATEALPHABLEND
| WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS
- | WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT;
+ | WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
+ | WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT
+ | WINED3DPMISCCAPS_SEPARATEALPHABLEND;
caps->RasterCaps |= WINED3DPRASTERCAPS_MIPMAPLODBIAS;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 39dd13a9292..49fa3a35f74 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1826,7 +1826,6 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, unsigned in
/* TODO:
WINED3DPMISCCAPS_NULLREFERENCE
WINED3DPMISCCAPS_FOGANDSPECULARALPHA
- WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
WINED3DPMISCCAPS_FOGVERTEXCLAMPED */
caps->RasterCaps = WINED3DPRASTERCAPS_DITHER |
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0fc56462b0c..8451e9c2892 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -72,6 +72,7 @@
#define WINED3D_QUIRK_INFO_LOG_SPAM 0x00000080
#define WINED3D_QUIRK_LIMITED_TEX_FILTERING 0x00000100
#define WINED3D_QUIRK_BROKEN_ARB_FOG 0x00000200
+#define WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS 0x00000400
struct fragment_pipeline;
struct wined3d_adapter;
--
2.21.0
More information about the wine-devel
mailing list