Module: wine Branch: master Commit: 83c9e5243a663370296148471628a350ba9422c6 URL: https://source.winehq.org/git/wine.git/?a=commit;h=83c9e5243a663370296148471...
Author: Matteo Bruni mbruni@codeweavers.com Date: Mon May 20 18:49:53 2019 +0200
wined3d: Report WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS when possible.
Signed-off-by: Matteo Bruni mbruni@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 d471785..110771f 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 e0fd68f..b944b2f 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 39dd13a..49fa3a3 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 0fc5646..8451e9c 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;