Henri Verbeet : wined3d: Allow swapchain sample counts to be overridden with a registry key.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 16 11:36:39 CDT 2016


Module: wine
Branch: master
Commit: 91f0b0010347fc501ba6c0ad7179dd23c9dfa142
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=91f0b0010347fc501ba6c0ad7179dd23c9dfa142

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar 15 16:55:08 2016 +0100

wined3d: Allow swapchain sample counts to be overridden with a registry key.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/swapchain.c       | 26 ++++++++++++++++++++++++++
 dlls/wined3d/wined3d_main.c    |  4 ++++
 dlls/wined3d/wined3d_private.h |  1 +
 3 files changed, 31 insertions(+)

diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 9f3a36b..3033773 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -814,6 +814,28 @@ static void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain)
     swapchain->render_to_fbo = TRUE;
 }
 
+static void wined3d_swapchain_apply_sample_count_override(const struct wined3d_swapchain *swapchain,
+        enum wined3d_format_id format_id, enum wined3d_multisample_type *type, DWORD *quality)
+{
+    const struct wined3d_gl_info *gl_info;
+    const struct wined3d_format *format;
+    enum wined3d_multisample_type t;
+
+    if (wined3d_settings.sample_count == ~0u)
+        return;
+
+    gl_info = &swapchain->device->adapter->gl_info;
+    if (!(format = wined3d_get_format(gl_info, format_id)))
+        return;
+
+    if ((t = min(wined3d_settings.sample_count, gl_info->limits.samples)))
+        while (!(format->multisample_types & 1u << (t - 1)))
+            ++t;
+    TRACE("Using sample count %u.\n", t);
+    *type = t;
+    *quality = 0;
+}
+
 static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3d_device *device,
         struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 {
@@ -878,6 +900,8 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
         }
     }
     swapchain->desc = *desc;
+    wined3d_swapchain_apply_sample_count_override(swapchain, swapchain->desc.backbuffer_format,
+            &swapchain->desc.multisample_type, &swapchain->desc.multisample_quality);
     swapchain_update_render_to_fbo(swapchain);
 
     TRACE("Creating front buffer.\n");
@@ -1277,6 +1301,8 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha
             swapchain, buffer_count, width, height, debug_d3dformat(format_id),
             multisample_type, multisample_quality);
 
+    wined3d_swapchain_apply_sample_count_override(swapchain, format_id, &multisample_type, &multisample_quality);
+
     if (buffer_count && buffer_count != swapchain->desc.backbuffer_count)
         FIXME("Cannot change the back buffer count yet.\n");
 
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 45e41ad..71dc180 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -80,6 +80,7 @@ struct wined3d_settings wined3d_settings =
     0,              /* The default of memory is set in init_driver_info */
     NULL,           /* No wine logo by default */
     TRUE,           /* Multisampling enabled by default. */
+    ~0u,            /* Don't force a specific sample count by default. */
     FALSE,          /* No strict draw ordering. */
     TRUE,           /* Don't try to render onscreen by default. */
     FALSE,          /* Don't range check relative addressing indices in float constants. */
@@ -291,6 +292,9 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
                 wined3d_settings.allow_multisampling = FALSE;
             }
         }
+        if (!get_config_key_dword(hkey, appkey, "SampleCount", &wined3d_settings.sample_count))
+            ERR_(winediag)("Forcing sample count to %u. This may not be compatible with all applications.\n",
+                    wined3d_settings.sample_count);
         if (!get_config_key(hkey, appkey, "StrictDrawOrdering", buffer, size)
                 && !strcmp(buffer,"enabled"))
         {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 23d8565..206cac5 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -288,6 +288,7 @@ struct wined3d_settings
     UINT64 emulated_textureram;
     char *logo;
     int allow_multisampling;
+    unsigned int sample_count;
     BOOL strict_draw_ordering;
     BOOL always_offscreen;
     BOOL check_float_constants;




More information about the wine-cvs mailing list