Henri Verbeet : wined3d: Introduce a Vulkan based adapter implementation.

Alexandre Julliard julliard at winehq.org
Mon Apr 1 16:32:03 CDT 2019


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Apr  1 17:38:26 2019 +0430

wined3d: Introduce a Vulkan based adapter implementation.

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

---

 dlls/wined3d/Makefile.in       |   1 +
 dlls/wined3d/adapter_vk.c      | 105 +++++++++++++++++++++++++++++++++++++++++
 dlls/wined3d/directx.c         |   3 ++
 dlls/wined3d/utils.c           |   5 ++
 dlls/wined3d/wined3d_main.c    |  27 +++++++----
 dlls/wined3d/wined3d_private.h |  24 +++++++++-
 6 files changed, 156 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in
index 39fed38..7ebd010 100644
--- a/dlls/wined3d/Makefile.in
+++ b/dlls/wined3d/Makefile.in
@@ -4,6 +4,7 @@ IMPORTS   = opengl32 user32 gdi32 advapi32
 
 C_SRCS = \
 	adapter_gl.c \
+	adapter_vk.c \
 	arb_program_shader.c \
 	ati_fragment_shader.c \
 	buffer.c \
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
new file mode 100644
index 0000000..e2c940d
--- /dev/null
+++ b/dlls/wined3d/adapter_vk.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2018 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+#include "wined3d_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+
+static void adapter_vk_destroy(struct wined3d_adapter *adapter)
+{
+    wined3d_adapter_cleanup(adapter);
+    heap_free(adapter);
+}
+
+static BOOL adapter_vk_create_context(struct wined3d_context *context,
+        struct wined3d_texture *target, const struct wined3d_format *ds_format)
+{
+    return TRUE;
+}
+
+static void adapter_vk_get_wined3d_caps(const struct wined3d_adapter *adapter, struct wined3d_caps *caps)
+{
+}
+
+static BOOL adapter_vk_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_vk_ops =
+{
+    adapter_vk_destroy,
+    adapter_vk_create_context,
+    adapter_vk_get_wined3d_caps,
+    adapter_vk_check_format,
+};
+
+static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
+        unsigned int ordinal, unsigned int wined3d_creation_flags)
+{
+    const struct wined3d_gpu_description *gpu_description;
+    struct wined3d_adapter *adapter = &adapter_vk->a;
+
+    TRACE("adapter_vk %p, ordinal %u, wined3d_creation_flags %#x.\n",
+            adapter_vk, ordinal, wined3d_creation_flags);
+
+    if (!wined3d_adapter_init(adapter, ordinal))
+        return FALSE;
+
+    if (!(gpu_description = wined3d_get_gpu_description(HW_VENDOR_AMD, CARD_AMD_RADEON_RX_VEGA)))
+    {
+        ERR("Failed to get GPU description.\n");
+        return FALSE;
+    }
+    wined3d_driver_info_init(&adapter->driver_info, gpu_description, wined3d_settings.emulated_textureram);
+
+    if (!wined3d_adapter_vk_init_format_info(adapter))
+        return FALSE;
+
+    adapter->vertex_pipe = &none_vertex_pipe;
+    adapter->fragment_pipe = &none_fragment_pipe;
+    adapter->shader_backend = &none_shader_backend;
+    adapter->adapter_ops = &wined3d_adapter_vk_ops;
+
+    adapter->d3d_info.wined3d_creation_flags = wined3d_creation_flags;
+
+    return TRUE;
+}
+
+struct wined3d_adapter *wined3d_adapter_vk_create(unsigned int ordinal,
+        unsigned int wined3d_creation_flags)
+{
+    struct wined3d_adapter_vk *adapter_vk;
+
+    if (!(adapter_vk = heap_alloc_zero(sizeof(*adapter_vk))))
+        return NULL;
+
+    if (!wined3d_adapter_vk_init(adapter_vk, ordinal, wined3d_creation_flags))
+    {
+        heap_free(adapter_vk);
+        return NULL;
+    }
+
+    TRACE("Created adapter %p.\n", adapter_vk);
+
+    return &adapter_vk->a;
+}
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 83fa47a..49e56e0 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2314,6 +2314,9 @@ static struct wined3d_adapter *wined3d_adapter_create(unsigned int ordinal, DWOR
     if (wined3d_creation_flags & WINED3D_NO3D)
         return wined3d_adapter_no3d_create(ordinal, wined3d_creation_flags);
 
+    if (wined3d_settings.renderer == WINED3D_RENDERER_VULKAN)
+        return wined3d_adapter_vk_create(ordinal, wined3d_creation_flags);
+
     return wined3d_adapter_gl_create(ordinal, wined3d_creation_flags);
 }
 
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index a242283..be76dbb 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -4067,6 +4067,11 @@ fail:
     return FALSE;
 }
 
+BOOL wined3d_adapter_vk_init_format_info(struct wined3d_adapter *adapter)
+{
+    return wined3d_adapter_init_format_info(adapter, sizeof(struct wined3d_format));
+}
+
 const struct wined3d_format *wined3d_get_format(const struct wined3d_adapter *adapter,
         enum wined3d_format_id format_id, unsigned int bind_flags)
 {
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 5ca58ae..d2e4978 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -89,7 +89,7 @@ struct wined3d_settings wined3d_settings =
     ~0U,            /* No GS shader model limit by default. */
     ~0U,            /* No PS shader model limit by default. */
     ~0u,            /* No CS shader model limit by default. */
-    FALSE,          /* 3D support enabled by default. */
+    WINED3D_RENDERER_AUTO,
     WINED3D_SHADER_BACKEND_AUTO,
 };
 
@@ -104,11 +104,10 @@ struct wined3d * CDECL wined3d_create(DWORD flags)
         return NULL;
     }
 
-    if (wined3d_settings.no_3d)
+    if (wined3d_settings.renderer == WINED3D_RENDERER_NO3D)
         flags |= WINED3D_NO3D;
 
-    hr = wined3d_init(object, flags);
-    if (FAILED(hr))
+    if (FAILED(hr = wined3d_init(object, flags)))
     {
         WARN("Failed to initialize wined3d object, hr %#x.\n", hr);
         heap_free(object);
@@ -327,12 +326,24 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
             TRACE("Limiting PS shader model to %u.\n", wined3d_settings.max_sm_ps);
         if (!get_config_key_dword(hkey, appkey, "MaxShaderModelCS", &wined3d_settings.max_sm_cs))
             TRACE("Limiting CS shader model to %u.\n", wined3d_settings.max_sm_cs);
-        if ((!get_config_key(hkey, appkey, "renderer", buffer, size)
+        if (!get_config_key(hkey, appkey, "renderer", buffer, size)
                 || !get_config_key(hkey, appkey, "DirectDrawRenderer", buffer, size))
-                && !strcmp(buffer, "gdi"))
         {
-            TRACE("Disabling 3D support.\n");
-            wined3d_settings.no_3d = TRUE;
+            if (!strcmp(buffer, "vulkan"))
+            {
+                ERR_(winediag)("Using the Vulkan renderer.\n");
+                wined3d_settings.renderer = WINED3D_RENDERER_VULKAN;
+            }
+            else if (!strcmp(buffer, "gl"))
+            {
+                ERR_(winediag)("Using the OpenGL renderer.\n");
+                wined3d_settings.renderer = WINED3D_RENDERER_OPENGL;
+            }
+            else if (!strcmp(buffer, "gdi") || !strcmp(buffer, "no3d"))
+            {
+                ERR_(winediag)("Disabling 3D support.\n");
+                wined3d_settings.renderer = WINED3D_RENDERER_NO3D;
+            }
         }
     }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f482bb9..5a455ed 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -379,6 +379,14 @@ static inline void wined3d_pause(void)
 #define PCI_VENDOR_NONE 0xffff /* e.g. 0x8086 for Intel and 0x10de for Nvidia */
 #define PCI_DEVICE_NONE 0xffff /* e.g. 0x14f for a Geforce6200 */
 
+enum wined3d_renderer
+{
+    WINED3D_RENDERER_AUTO,
+    WINED3D_RENDERER_VULKAN,
+    WINED3D_RENDERER_OPENGL,
+    WINED3D_RENDERER_NO3D,
+};
+
 enum wined3d_shader_backend
 {
     WINED3D_SHADER_BACKEND_AUTO,
@@ -409,7 +417,7 @@ struct wined3d_settings
     unsigned int max_sm_gs;
     unsigned int max_sm_ps;
     unsigned int max_sm_cs;
-    BOOL no_3d;
+    enum wined3d_renderer renderer;
     enum wined3d_shader_backend shader_backend;
 };
 
@@ -2741,6 +2749,19 @@ struct wined3d_adapter *wined3d_adapter_gl_create(unsigned int ordinal, unsigned
 BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
         struct wined3d_texture *target, const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
 
+struct wined3d_adapter_vk
+{
+    struct wined3d_adapter a;
+};
+
+static inline struct wined3d_adapter_vk *wined3d_adapter_vk(struct wined3d_adapter *adapter)
+{
+    return CONTAINING_RECORD(adapter, struct wined3d_adapter_vk, a);
+}
+
+struct wined3d_adapter *wined3d_adapter_vk_create(unsigned int ordinal,
+        unsigned int wined3d_creation_flags) DECLSPEC_HIDDEN;
+
 struct wined3d_caps_gl_ctx
 {
     HDC dc;
@@ -2757,6 +2778,7 @@ struct wined3d_caps_gl_ctx
 BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter,
         struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
 BOOL wined3d_adapter_no3d_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
+BOOL wined3d_adapter_vk_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
 UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;
 
 BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits(struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list