From: Austin English <austinenglish@gmail.com>
Subject: wined3d: Allow to specify multisampling AA quality levels via registry
Message-Id: <CACC5Q1e=AzW9=BerfSnSrwgmSq5jODPPKTwdjZ3Q5BcSNV+3Ag@mail.gmail.com>
Date: Sat, 26 Dec 2015 23:48:37 -0600

For https://bugs.winehq.org/show_bug.cgi?id=12652

-- 
-Austin

From f5f0eca8f43abaae0d5bd7986650dcaff305232f Mon Sep 17 00:00:00 2001
From: Austin English <austinenglish@gmail.com>
Date: Sat, 26 Dec 2015 23:41:51 -0600
Subject: [PATCH] wined3d: Allow to specify multisampling AA quality levels via registry

Signed-off-by: Austin English <austinenglish@gmail.com>
---
 dlls/wined3d/directx.c         | 10 +++++++++-
 dlls/wined3d/wined3d_main.c    | 12 ++++++++++++
 dlls/wined3d/wined3d_private.h |  1 +
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 4b4209a..c4f2683 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4425,8 +4425,16 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
 
     if (quality_levels)
     {
-        if (multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
+        if (wined3d_settings.msaa_quality_levels)
+        {
+            *quality_levels = wined3d_settings.msaa_quality_levels;
+            TRACE("Overriding MSAA quality levels to %i\n", wined3d_settings.msaa_quality_levels);
+        }
+        else if (multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
+        {
             *quality_levels = gl_info->limits.samples;
+            FIXME("Setting quality_levels to %d\n", *quality_levels);
+        }
         else
             *quality_levels = 1;
     }
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 0543d97..38a9ff5 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -86,6 +86,7 @@ struct wined3d_settings wined3d_settings =
     ~0U,            /* No GS shader model limit by default. */
     ~0U,            /* No PS shader model limit by default. */
     FALSE,          /* 3D support enabled by default. */
+    0,              /* Override the WINED3D_MULTISAMPLE_NON_MASKABLE limit */
 };
 
 struct wined3d * CDECL wined3d_create(DWORD flags)
@@ -290,6 +291,17 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
                 wined3d_settings.allow_multisampling = FALSE;
             }
         }
+        if (!get_config_key(hkey, appkey, "MultisamplingAAQualityLevels", buffer, size))
+        {
+            int quality_levels = atoi(buffer);
+            if (quality_levels > 0)
+            {
+                wined3d_settings.msaa_quality_levels = quality_levels;
+                TRACE("Setting MultisamplingAAQualityLevels to %i\n", quality_levels);
+            }
+            else
+                ERR("MultisamplingAAQualityLevels is %i but must be >0\n", quality_levels);
+        }
         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 53ef63e..0c23bbb 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -282,6 +282,7 @@ struct wined3d_settings
     unsigned int max_sm_gs;
     unsigned int max_sm_ps;
     BOOL no_3d;
+    unsigned int msaa_quality_levels;
 };
 
 extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;

-- 
2.6.4