summarylogtreecommitdiffstats
path: root/0009-wined3d-Add-quirk-to-use-GL_CLIENT_STORAGE_BIT-for-m.patch
diff options
context:
space:
mode:
Diffstat (limited to '0009-wined3d-Add-quirk-to-use-GL_CLIENT_STORAGE_BIT-for-m.patch')
-rw-r--r--0009-wined3d-Add-quirk-to-use-GL_CLIENT_STORAGE_BIT-for-m.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/0009-wined3d-Add-quirk-to-use-GL_CLIENT_STORAGE_BIT-for-m.patch b/0009-wined3d-Add-quirk-to-use-GL_CLIENT_STORAGE_BIT-for-m.patch
new file mode 100644
index 000000000000..7d8bbb854e32
--- /dev/null
+++ b/0009-wined3d-Add-quirk-to-use-GL_CLIENT_STORAGE_BIT-for-m.patch
@@ -0,0 +1,96 @@
+From a2326162cf4fb5601c0f296bfd1294a493912bce Mon Sep 17 00:00:00 2001
+From: Andrew Comminos <andrew@comminos.com>
+Date: Thu, 15 Mar 2018 21:22:06 -0700
+Subject: [PATCH 9/9] wined3d: Add quirk to use GL_CLIENT_STORAGE_BIT for mesa.
+
+---
+ dlls/wined3d/buffer_heap.c | 15 ++++++++++++++-
+ dlls/wined3d/directx.c | 19 +++++++++++++++++++
+ dlls/wined3d/wined3d_private.h | 1 +
+ 3 files changed, 34 insertions(+), 1 deletion(-)
+
+diff --git a/dlls/wined3d/buffer_heap.c b/dlls/wined3d/buffer_heap.c
+index 899aad9612..9e8f2d799d 100644
+--- a/dlls/wined3d/buffer_heap.c
++++ b/dlls/wined3d/buffer_heap.c
+@@ -165,7 +165,20 @@ HRESULT wined3d_buffer_heap_create(struct wined3d_context *context, GLsizeiptr s
+ access_flags |= GL_MAP_READ_BIT;
+ }
+
+- storage_flags = GL_CLIENT_STORAGE_BIT | access_flags;
++ storage_flags = access_flags;
++ // FIXME(acomminos): So, about GL_CLIENT_STORAGE_BIT:
++ // - On NVIDIA, DMA CACHED memory is used when this flag is set. SYSTEM HEAP
++ // memory is used without it, which (in my testing) is much faster.
++ // - On Mesa, GTT is used when this flag is set. This is what we want- we
++ // upload to VRAM occur otherwise, which is unusably slow (on radeon).
++ //
++ // Thus, we're only going to set this on mesa for now.
++ // Hints are awful anyway.
++ if (gl_info->quirks & WINED3D_QUIRK_USE_CLIENT_STORAGE_BIT)
++ {
++ FIXME_(d3d_perf)("PBA: using GL_CLIENT_STORAGE_BIT quirk");
++ storage_flags |= GL_CLIENT_STORAGE_BIT;
++ }
+
+ GL_EXTCALL(glGenBuffers(1, &object->buffer_object));
+ checkGLcall("glGenBuffers");
+diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
+index 8789a501ec..f455ed54e1 100644
+--- a/dlls/wined3d/directx.c
++++ b/dlls/wined3d/directx.c
+@@ -947,6 +947,13 @@ 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_mesa(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)
++{
++ return gl_vendor == GL_VENDOR_MESA;
++}
++
+ 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.
+@@ -1084,6 +1091,13 @@ static void quirk_broken_viewport_subpixel_bits(struct wined3d_gl_info *gl_info)
+ }
+ }
+
++static void quirk_use_client_storage_bit(struct wined3d_gl_info *gl_info)
++{
++ // Using ARB_buffer_storage on Mesa requires the GL_CLIENT_STORAGE_BIT to be
++ // set to use GTT for immutable buffers on radeon (see PIPE_USAGE_STREAM).
++ gl_info->quirks |= WINED3D_QUIRK_USE_CLIENT_STORAGE_BIT;
++}
++
+ struct driver_quirk
+ {
+ BOOL (*match)(const struct wined3d_gl_info *gl_info, struct wined3d_caps_gl_ctx *ctx,
+@@ -1180,6 +1194,11 @@ static const struct driver_quirk quirk_table[] =
+ quirk_broken_viewport_subpixel_bits,
+ "Nvidia viewport subpixel bits bug"
+ },
++ {
++ match_mesa,
++ quirk_use_client_storage_bit,
++ "Use GL_CLIENT_STORAGE_BIT for persistent buffers on mesa",
++ },
+ };
+
+ /* Certain applications (Steam) complain if we report an outdated driver version. In general,
+diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
+index 63f004d57e..96715261b1 100644
+--- a/dlls/wined3d/wined3d_private.h
++++ b/dlls/wined3d/wined3d_private.h
+@@ -75,6 +75,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_USE_CLIENT_STORAGE_BIT 0x00000400
+
+ enum wined3d_ffp_idx
+ {
+--
+2.16.2
+