Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- 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(-) create mode 100644 dlls/wined3d/adapter_vk.c
diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in index 39fed381d97..7ebd0106502 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 00000000000..e2c940dae9d --- /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 83fa47a779b..49e56e0c847 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 a2422839e04..be76dbbfc1a 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 5ca58ae2403..d2e4978ee79 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 f482bb92189..5a455edb0c2 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;