[PATCH 3/5] wined3d: Add a real implementation of wined3d_check_device_multisample_type().

Matteo Bruni mbruni at codeweavers.com
Mon Dec 14 16:37:55 CST 2015


Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
This (and the tests) can be deferred if deemed too dangerous for code
freeze.
Otherwise it can instead be merged with the previous patch.

 dlls/wined3d/directx.c         | 46 +++++++++++++++++++++++++++++++-----------
 dlls/wined3d/utils.c           | 13 +++++++++++-
 dlls/wined3d/wined3d_private.h |  3 +++
 3 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e022e19..3f3a6b2 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4403,6 +4403,7 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
         enum wined3d_multisample_type multisample_type, DWORD *quality_levels)
 {
     const struct wined3d_gl_info *gl_info;
+    HRESULT hr = WINED3D_OK;
 
     TRACE("wined3d %p, adapter_idx %u, device_type %s, surface_format %s,\n"
             "windowed %#x, multisample_type %#x, quality_levels %p.\n",
@@ -4411,29 +4412,50 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
 
     if (adapter_idx >= wined3d->adapter_count)
         return WINED3DERR_INVALIDCALL;
+    if (surface_format_id == WINED3DFMT_UNKNOWN)
+        return WINED3DERR_INVALIDCALL;
+    if (multisample_type < WINED3D_MULTISAMPLE_NONE || multisample_type > WINED3D_MULTISAMPLE_16_SAMPLES)
+        return WINED3DERR_INVALIDCALL;
 
     gl_info = &wined3d->adapters[adapter_idx].gl_info;
 
-    /* FIXME: Make use of ARB_internalformat_query2 NUM_SAMPLE_COUNTS and
-     * SAMPLES queries to give sensible results. */
     if (multisample_type > gl_info->limits.samples)
+        hr = WINED3DERR_NOTAVAILABLE;
+
+    if (SUCCEEDED(hr))
     {
-        TRACE("Returning not supported.\n");
-        if (quality_levels)
-            *quality_levels = 0;
+        const struct wined3d_format *format = wined3d_get_format(gl_info, surface_format_id);
+        unsigned int i;
 
-        return WINED3DERR_NOTAVAILABLE;
+        hr = WINED3DERR_NOTAVAILABLE;
+        for (i = 0; i < format->multisample_types_count; ++i)
+        {
+            if (format->multisample_types[i] == multisample_type)
+            {
+                hr = WINED3D_OK;
+                break;
+            }
+        }
     }
 
-    if (quality_levels)
+    if (SUCCEEDED(hr) || multisample_type == WINED3D_MULTISAMPLE_NONE
+            || multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
     {
-        if (multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
-            *quality_levels = wined3d_log2i(gl_info->limits.samples);
-        else
-            *quality_levels = 1;
+        if (quality_levels)
+        {
+            if (multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE)
+                *quality_levels = wined3d_log2i(gl_info->limits.samples);
+            else
+                *quality_levels = 1;
+        }
+        return WINED3D_OK;
     }
 
-    return WINED3D_OK;
+    TRACE("Returning not supported.\n");
+    if (quality_levels)
+        *quality_levels = 0;
+
+    return hr;
 }
 
 /* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 4406067..ac528c6 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2127,7 +2127,7 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
     struct fragment_caps fragment_caps;
     struct shader_caps shader_caps;
     BOOL srgb_write;
-    unsigned int i;
+    unsigned int i, j;
 
     adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
     adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
@@ -2207,6 +2207,12 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
                 else if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
                     format->glInternal = format->glGammaInternal;
             }
+
+            GL_EXTCALL(glGetInternalformativ(GL_TEXTURE_2D, format->glInternal, GL_NUM_SAMPLE_COUNTS,
+                    1, &format->multisample_types_count));
+            format->multisample_types_count = min(format->multisample_types_count, MAX_MULTISAMPLE_TYPES);
+            GL_EXTCALL(glGetInternalformativ(GL_TEXTURE_2D, format->glInternal, GL_SAMPLES,
+                    format->multisample_types_count, format->multisample_types));
         }
         else
         {
@@ -2244,6 +2250,11 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
                 format->flags[WINED3D_GL_RES_TYPE_TEX_CUBE] &= ~WINED3DFMT_FLAG_TEXTURE;
                 format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] &= ~WINED3DFMT_FLAG_TEXTURE;
             }
+
+            format->multisample_types_count = wined3d_log2i(gl_info->limits.samples);
+            format->multisample_types_count = min(format->multisample_types_count, MAX_MULTISAMPLE_TYPES);
+            for (j = 1; j <= format->multisample_types_count; ++j)
+                format->multisample_types[j] = 1 << j;
         }
 
         /* Texture conversion stuff */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 70857c9..f798f1d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -185,6 +185,7 @@ void wined3d_rb_free(void *ptr) DECLSPEC_HIDDEN;
 #define MAX_SAMPLER_OBJECTS         16
 #define MAX_SHADER_RESOURCE_VIEWS   128
 #define MAX_VERTEX_BLENDS           4
+#define MAX_MULTISAMPLE_TYPES       8
 
 struct min_lookup
 {
@@ -3242,6 +3243,8 @@ struct wined3d_format
     GLint glFormat;
     GLint glType;
     UINT  conv_byte_count;
+    GLint multisample_types_count;
+    GLint multisample_types[MAX_MULTISAMPLE_TYPES];
     unsigned int flags[WINED3D_GL_RES_TYPE_COUNT];
     struct wined3d_rational height_scale;
     struct color_fixup_desc color_fixup;
-- 
2.4.10




More information about the wine-patches mailing list