Skip to content

Commit

Permalink
vkd3d-utils: Remove it.
Browse files Browse the repository at this point in the history
With recent improvements, vkd3d-utils is no longer meaningful and we can
export a single .so on Linux.

Remove all exports of the semi-public vkd3d_* APIs and only export the
D3D12 entry points.

On Linux, libvkd3d-proton-d3d12.so is exported rather than libd3d12.so
as that would easily conflict with e.g. WSL. Follow similar logic as
DXVK here.

Tests link against the d3d12 exports now, and make use of the extension
interface to query Vulkan handles, etc instead of relying on
vkd3d-utils.

Signed-off-by: Hans-Kristian Arntzen <[email protected]>
  • Loading branch information
HansKristian-Work committed Nov 28, 2022
1 parent 1474978 commit 065f2fc
Show file tree
Hide file tree
Showing 25 changed files with 149 additions and 589 deletions.
1 change: 0 additions & 1 deletion demos/demo_xcb.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

#define VK_USE_PLATFORM_XCB_KHR
#include <vkd3d.h>
#include <vkd3d_utils.h>
#include <vkd3d_sonames.h>
#include <vkd3d_swapchain_factory.h>
#include <xcb/xcb_event.h>
Expand Down
4 changes: 1 addition & 3 deletions demos/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ if vkd3d_platform != 'windows'
lib_m,
lib_xcb,
lib_xcbkeysyms,

vkd3d_dep,
vkd3d_utils_dep,
lib_d3d12
]
else
demo_vkd3d_deps += [
Expand Down
109 changes: 22 additions & 87 deletions include/vkd3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,24 +37,6 @@
#define VKD3D_MIN_API_VERSION VK_API_VERSION_1_1
#define VKD3D_MAX_API_VERSION VK_API_VERSION_1_1

#if defined(__GNUC__)
# define DECLSPEC_VISIBLE __attribute__((visibility("default")))
#else
# define DECLSPEC_VISIBLE
#endif

#if defined(_WIN32) && !defined(VKD3D_BUILD_STANDALONE_D3D12)
# ifdef VKD3D_EXPORTS
# define VKD3D_EXPORT __declspec(dllexport)
# else
# define VKD3D_EXPORT __declspec(dllimport)
# endif
#elif defined(__GNUC__)
# define VKD3D_EXPORT DECLSPEC_VISIBLE
#else
# define VKD3D_EXPORT
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
Expand Down Expand Up @@ -137,88 +119,41 @@ struct vkd3d_image_resource_create_info
D3D12_RESOURCE_STATES present_state;
};

#ifndef VKD3D_NO_PROTOTYPES

VKD3D_EXPORT HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info,
struct vkd3d_instance **instance);
VKD3D_EXPORT ULONG vkd3d_instance_decref(struct vkd3d_instance *instance);
VKD3D_EXPORT VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance);
VKD3D_EXPORT ULONG vkd3d_instance_incref(struct vkd3d_instance *instance);

VKD3D_EXPORT HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info,
REFIID iid, void **device);
VKD3D_EXPORT IUnknown *vkd3d_get_device_parent(ID3D12Device *device);
VKD3D_EXPORT VkDevice vkd3d_get_vk_device(ID3D12Device *device);
VKD3D_EXPORT VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device);
VKD3D_EXPORT struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device);

VKD3D_EXPORT uint32_t vkd3d_get_vk_queue_family_index(ID3D12CommandQueue *queue);
VKD3D_EXPORT VkQueue vkd3d_acquire_vk_queue(ID3D12CommandQueue *queue);
VKD3D_EXPORT void vkd3d_release_vk_queue(ID3D12CommandQueue *queue);
VKD3D_EXPORT void vkd3d_enqueue_initial_transition(ID3D12CommandQueue *queue, ID3D12Resource *resource);

VKD3D_EXPORT HRESULT vkd3d_create_image_resource(ID3D12Device *device,
const struct vkd3d_image_resource_create_info *create_info, ID3D12Resource **resource);
VKD3D_EXPORT ULONG vkd3d_resource_decref(ID3D12Resource *resource);
VKD3D_EXPORT ULONG vkd3d_resource_incref(ID3D12Resource *resource);

VKD3D_EXPORT HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
D3D_ROOT_SIGNATURE_VERSION version, ID3DBlob **blob, ID3DBlob **error_blob);
VKD3D_EXPORT HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer);

VKD3D_EXPORT VkFormat vkd3d_get_vk_format(DXGI_FORMAT format);

/* 1.1 */
VKD3D_EXPORT DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format);

/* 1.2 */
VKD3D_EXPORT HRESULT vkd3d_serialize_versioned_root_signature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
ID3DBlob **blob, ID3DBlob **error_blob);
VKD3D_EXPORT HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer);

#endif /* VKD3D_NO_PROTOTYPES */

/*
* Function pointer typedefs for vkd3d functions.
*/
typedef HRESULT (*PFN_vkd3d_create_instance)(const struct vkd3d_instance_create_info *create_info,
HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info,
struct vkd3d_instance **instance);
typedef ULONG (*PFN_vkd3d_instance_decref)(struct vkd3d_instance *instance);
typedef VkInstance (*PFN_vkd3d_instance_get_vk_instance)(struct vkd3d_instance *instance);
typedef ULONG (*PFN_vkd3d_instance_incref)(struct vkd3d_instance *instance);
ULONG vkd3d_instance_decref(struct vkd3d_instance *instance);
VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance);
ULONG vkd3d_instance_incref(struct vkd3d_instance *instance);

typedef HRESULT (*PFN_vkd3d_create_device)(const struct vkd3d_device_create_info *create_info,
HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info,
REFIID iid, void **device);
typedef IUnknown * (*PFN_vkd3d_get_device_parent)(ID3D12Device *device);
typedef VkDevice (*PFN_vkd3d_get_vk_device)(ID3D12Device *device);
typedef VkPhysicalDevice (*PFN_vkd3d_get_vk_physical_device)(ID3D12Device *device);
typedef struct vkd3d_instance * (*PFN_vkd3d_instance_from_device)(ID3D12Device *device);
IUnknown *vkd3d_get_device_parent(ID3D12Device *device);
VkDevice vkd3d_get_vk_device(ID3D12Device *device);
VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device);
struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device);

typedef uint32_t (*PFN_vkd3d_get_vk_queue_family_index)(ID3D12CommandQueue *queue);
typedef VkQueue (*PFN_vkd3d_acquire_vk_queue)(ID3D12CommandQueue *queue);
typedef void (*PFN_vkd3d_release_vk_queue)(ID3D12CommandQueue *queue);
uint32_t vkd3d_get_vk_queue_family_index(ID3D12CommandQueue *queue);
VkQueue vkd3d_acquire_vk_queue(ID3D12CommandQueue *queue);
void vkd3d_release_vk_queue(ID3D12CommandQueue *queue);
void vkd3d_enqueue_initial_transition(ID3D12CommandQueue *queue, ID3D12Resource *resource);

typedef HRESULT (*PFN_vkd3d_create_image_resource)(ID3D12Device *device,
HRESULT vkd3d_create_image_resource(ID3D12Device *device,
const struct vkd3d_image_resource_create_info *create_info, ID3D12Resource **resource);
typedef ULONG (*PFN_vkd3d_resource_decref)(ID3D12Resource *resource);
typedef ULONG (*PFN_vkd3d_resource_incref)(ID3D12Resource *resource);
ULONG vkd3d_resource_decref(ID3D12Resource *resource);
ULONG vkd3d_resource_incref(ID3D12Resource *resource);

typedef HRESULT (*PFN_vkd3d_serialize_root_signature)(const D3D12_ROOT_SIGNATURE_DESC *desc,
HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
D3D_ROOT_SIGNATURE_VERSION version, ID3DBlob **blob, ID3DBlob **error_blob);
typedef HRESULT (*PFN_vkd3d_create_root_signature_deserializer)(const void *data, SIZE_T data_size,
HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer);

typedef VkFormat (*PFN_vkd3d_get_vk_format)(DXGI_FORMAT format);
VkFormat vkd3d_get_vk_format(DXGI_FORMAT format);

/* 1.1 */
typedef DXGI_FORMAT (*PFN_vkd3d_get_dxgi_format)(VkFormat format);
DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format);

/* 1.2 */
typedef HRESULT (*PFN_vkd3d_serialize_versioned_root_signature)(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
HRESULT vkd3d_serialize_versioned_root_signature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
ID3DBlob **blob, ID3DBlob **error_blob);
typedef HRESULT (*PFN_vkd3d_create_versioned_root_signature_deserializer)(const void *data, SIZE_T data_size,
HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer);

#ifdef __cplusplus
Expand Down
65 changes: 0 additions & 65 deletions include/vkd3d_utils.h

This file was deleted.

60 changes: 53 additions & 7 deletions libs/d3d12/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@
#define VKD3D_DBG_CHANNEL VKD3D_DBG_CHANNEL_API

#define VK_NO_PROTOTYPES
#ifdef _WIN32
#include "vkd3d_win32.h"
#endif
#include "vkd3d_sonames.h"
#include "vkd3d.h"
#include "vkd3d_atomic.h"
#include "vkd3d_debug.h"
#include "vkd3d_threads.h"
Expand All @@ -32,24 +36,44 @@
*/
#if defined(_MSC_VER)
#define DLLEXPORT
#else
#elif defined(__MINGW32__)
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __attribute__((visibility("default")))
#include <dlfcn.h>
#endif

static pthread_once_t library_once = PTHREAD_ONCE_INIT;

#ifdef _WIN32
static HMODULE vulkan_module = NULL;
#else
static void *vulkan_module = NULL;
#endif

static void load_vulkan_once(void)
{
if (!vulkan_module)
vulkan_module = LoadLibraryA("vulkan-1.dll");
{
#ifdef _WIN32
vulkan_module = LoadLibraryA(SONAME_LIBVULKAN);
#else
vulkan_module = dlopen(SONAME_LIBVULKAN, RTLD_LAZY);
#endif
}
}

static PFN_vkGetInstanceProcAddr load_vulkan(void)
{
pthread_once(&library_once, load_vulkan_once);
if (vulkan_module)
{
#ifdef _WIN32
return (void *)GetProcAddress(vulkan_module, "vkGetInstanceProcAddr");
#else
return (PFN_vkGetInstanceProcAddr)dlsym(vulkan_module, "vkGetInstanceProcAddr");
#endif
}
else
return NULL;
}
Expand All @@ -71,6 +95,7 @@ HRESULT WINAPI DLLEXPORT D3D12EnableExperimentalFeatures(UINT feature_count,
return E_NOINTERFACE;
}

#ifdef _WIN32
static HRESULT d3d12_get_adapter(IDXGIAdapter **dxgi_adapter, IUnknown *adapter)
{
IDXGIFactory4 *factory = NULL;
Expand Down Expand Up @@ -200,26 +225,35 @@ static VkPhysicalDevice d3d12_find_physical_device(struct vkd3d_instance *instan
free(vk_physical_devices);
return vk_physical_device;
}
#endif

HRESULT WINAPI DLLEXPORT D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_feature_level,
REFIID iid, void **device)
{
struct vkd3d_instance_create_info instance_create_info;
PFN_vkGetInstanceProcAddr pfn_vkGetInstanceProcAddr;
struct vkd3d_device_create_info device_create_info;
struct DXGI_ADAPTER_DESC adapter_desc;
struct vkd3d_instance *instance;
IDXGIAdapter *dxgi_adapter;
HRESULT hr;

#ifdef _WIN32
struct DXGI_ADAPTER_DESC adapter_desc;
IDXGIAdapter *dxgi_adapter;
#endif

static const char * const instance_extensions[] =
{
VK_KHR_SURFACE_EXTENSION_NAME,
#ifdef _WIN32
VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
#else
"VK_KHR_xcb_surface",
#endif
};
static const char * const device_extensions[] =
{
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME,
};

TRACE("adapter %p, minimum_feature_level %#x, iid %s, device %p.\n",
Expand All @@ -231,6 +265,7 @@ HRESULT WINAPI DLLEXPORT D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL
return E_FAIL;
}

#ifdef _WIN32
if (FAILED(hr = d3d12_get_adapter(&dxgi_adapter, adapter)))
return hr;

Expand All @@ -239,10 +274,15 @@ HRESULT WINAPI DLLEXPORT D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL
WARN("Failed to get adapter desc, hr %#x.\n", hr);
goto done;
}
#else
if (adapter)
FIXME("Ignoring adapter.\n");
#endif

memset(&instance_create_info, 0, sizeof(instance_create_info));
instance_create_info.pfn_vkGetInstanceProcAddr = pfn_vkGetInstanceProcAddr;
instance_create_info.instance_extensions = instance_extensions;
instance_create_info.instance_extension_count = ARRAYSIZE(instance_extensions);
instance_create_info.instance_extension_count = ARRAY_SIZE(instance_extensions);
instance_create_info.optional_instance_extensions = NULL;
instance_create_info.optional_instance_extension_count = 0;

Expand All @@ -252,23 +292,29 @@ HRESULT WINAPI DLLEXPORT D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL
goto done;
}

memset(&device_create_info, 0, sizeof(device_create_info));
device_create_info.minimum_feature_level = minimum_feature_level;
device_create_info.instance = instance;
device_create_info.instance_create_info = NULL;
device_create_info.vk_physical_device = d3d12_find_physical_device(instance, pfn_vkGetInstanceProcAddr, &adapter_desc);
device_create_info.device_extensions = device_extensions;
device_create_info.device_extension_count = ARRAYSIZE(device_extensions);
device_create_info.device_extension_count = ARRAY_SIZE(device_extensions);
device_create_info.optional_device_extensions = NULL;
device_create_info.optional_device_extension_count = 0;

#ifdef _WIN32
device_create_info.vk_physical_device = d3d12_find_physical_device(instance, pfn_vkGetInstanceProcAddr, &adapter_desc);
device_create_info.parent = (IUnknown *)dxgi_adapter;
memcpy(&device_create_info.adapter_luid, &adapter_desc.AdapterLuid, VK_LUID_SIZE);
#endif

hr = vkd3d_create_device(&device_create_info, iid, device);

vkd3d_instance_decref(instance);

done:
#ifdef _WIN32
IDXGIAdapter_Release(dxgi_adapter);
#endif
return hr;
}

Expand Down
Loading

0 comments on commit 065f2fc

Please sign in to comment.