=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Add adapter_check_format() to adapter_ops.

Alexandre Julliard julliard at winehq.org
Thu Mar 28 18:35:12 CDT 2019


Module: wine
Branch: master
Commit: 2727dcb07f35ccce4096dbf0c1e119a5f99a7552
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2727dcb07f35ccce4096dbf0c1e119a5f99a7552

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Thu Mar 28 09:53:53 2019 +0100

wined3d: Add adapter_check_format() to adapter_ops.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/adapter_gl.c      | 24 +++++++++++++++++++++
 dlls/wined3d/directx.c         | 47 +++++++++++++++++++-----------------------
 dlls/wined3d/wined3d_private.h |  8 +++++++
 3 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 99073f4..a076a98 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4385,10 +4385,34 @@ static void adapter_gl_get_wined3d_caps(const struct wined3d_adapter *adapter, s
     caps->MaxAnisotropy = gl_info->limits.anisotropy;
 }
 
+static BOOL adapter_gl_check_format(const struct wined3d_adapter *adapter,
+        const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format,
+        const struct wined3d_format *ds_format)
+{
+    unsigned int i;
+
+    if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER)
+        return TRUE;
+
+    for (i = 0; i < adapter->cfg_count; ++i)
+    {
+        const struct wined3d_pixel_format *cfg = &adapter->cfgs[i];
+
+        if (wined3d_check_pixel_format_color(cfg, rt_format)
+                && wined3d_check_pixel_format_depth(cfg, ds_format))
+        {
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
 static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
 {
     wined3d_adapter_gl_create_context,
     adapter_gl_get_wined3d_caps,
+    adapter_gl_check_format,
 };
 
 static BOOL wined3d_adapter_gl_init(struct wined3d_adapter *adapter,
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index c978122..8e77138 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1277,7 +1277,7 @@ HRESULT CDECL wined3d_get_adapter_raster_status(const struct wined3d *wined3d, U
     return WINED3D_OK;
 }
 
-static BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg,
+BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg,
         const struct wined3d_format *format)
 {
     /* Float formats need FBOs. If FBOs are used this function isn't called */
@@ -1297,7 +1297,7 @@ static BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *
     return TRUE;
 }
 
-static BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg,
+BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg,
         const struct wined3d_format *format)
 {
     BOOL lockable = FALSE;
@@ -1331,6 +1331,7 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
         UINT adapter_idx, enum wined3d_device_type device_type, enum wined3d_format_id adapter_format_id,
         enum wined3d_format_id render_target_format_id, enum wined3d_format_id depth_stencil_format_id)
 {
+    const struct wined3d_format *adapter_format;
     const struct wined3d_format *rt_format;
     const struct wined3d_format *ds_format;
     const struct wined3d_adapter *adapter;
@@ -1344,6 +1345,8 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
         return WINED3DERR_INVALIDCALL;
 
     adapter = wined3d->adapters[adapter_idx];
+
+    adapter_format = wined3d_get_format(adapter, adapter_format_id, WINED3D_BIND_RENDER_TARGET);
     rt_format = wined3d_get_format(adapter, render_target_format_id, WINED3D_BIND_RENDER_TARGET);
     ds_format = wined3d_get_format(adapter, depth_stencil_format_id, WINED3D_BIND_DEPTH_STENCIL);
 
@@ -1358,33 +1361,17 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
         return WINED3DERR_NOTAVAILABLE;
     }
 
-    if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
+    if (adapter->adapter_ops->adapter_check_format(adapter, adapter_format, rt_format, ds_format))
     {
-        const struct wined3d_pixel_format *cfgs;
-        unsigned int cfg_count;
-        unsigned int i;
-
-        cfgs = adapter->cfgs;
-        cfg_count = adapter->cfg_count;
-        for (i = 0; i < cfg_count; ++i)
-        {
-            if (wined3d_check_pixel_format_color(&cfgs[i], rt_format)
-                    && wined3d_check_pixel_format_depth(&cfgs[i], ds_format))
-            {
-                TRACE("Formats match.\n");
-                return WINED3D_OK;
-            }
-        }
-
-        TRACE("Unsupported format pair: %s and %s.\n",
-                debug_d3dformat(render_target_format_id),
-                debug_d3dformat(depth_stencil_format_id));
-
-        return WINED3DERR_NOTAVAILABLE;
+        TRACE("Formats match.\n");
+        return WINED3D_OK;
     }
 
-    TRACE("Formats match.\n");
-    return WINED3D_OK;
+    TRACE("Unsupported format pair: %s and %s.\n",
+            debug_d3dformat(render_target_format_id),
+            debug_d3dformat(depth_stencil_format_id));
+
+    return WINED3DERR_NOTAVAILABLE;
 }
 
 HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3d, UINT adapter_idx,
@@ -2336,10 +2323,18 @@ static void adapter_no3d_get_wined3d_caps(const struct wined3d_adapter *adapter,
 {
 }
 
+static BOOL adapter_no3d_check_format(const struct wined3d_adapter *adapter,
+        const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format,
+        const struct wined3d_format *ds_format)
+{
+    return TRUE;
+}
+
 static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
 {
     wined3d_adapter_no3d_create_context,
     adapter_no3d_get_wined3d_caps,
+    adapter_no3d_check_format,
 };
 
 static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, unsigned int wined3d_creation_flags)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 22e7441..83fc09d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2680,6 +2680,9 @@ struct wined3d_adapter_ops
     BOOL (*adapter_create_context)(struct wined3d_context *context,
             struct wined3d_texture *target, const struct wined3d_format *ds_format);
     void (*adapter_get_wined3d_caps)(const struct wined3d_adapter *adapter, struct wined3d_caps *caps);
+    BOOL (*adapter_check_format)(const struct wined3d_adapter *adapter,
+            const struct wined3d_format *adapter_format, const struct wined3d_format *rt_format,
+            const struct wined3d_format *ds_format);
 };
 
 /* The adapter structure */
@@ -4721,4 +4724,9 @@ static inline void wined3d_not_from_cs(struct wined3d_cs *cs)
 /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
 #define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
 
+BOOL wined3d_check_pixel_format_color(const struct wined3d_pixel_format *cfg,
+        const struct wined3d_format *format) DECLSPEC_HIDDEN;
+BOOL wined3d_check_pixel_format_depth(const struct wined3d_pixel_format *cfg,
+        const struct wined3d_format *format) DECLSPEC_HIDDEN;
+
 #endif




More information about the wine-cvs mailing list