wine/dlls/winevulkan/vulkan_private.h
Georg Lehmann 28d75542b7 winevulkan: Implement VK_EXT_debug_report.
Messages from the driver/layers won't be reported twice.
Messages during instance creation by the host loader won't be reported,
since the information is partly wrong and the windows loader reports the
correct information.
Other messages by the loader will be reported twice if lunarg's vulkan-1.dll
is used. This shouldn't be a problem because the messages are just used
for logging/debugging.

Needed for Quake2RTX.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49813
Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
Signed-off-by: Liam Middlebrook <lmiddlebrook@nvidia.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
2020-10-29 11:04:12 +01:00

226 lines
6.1 KiB
C

/* Wine Vulkan ICD private data structures
*
* Copyright 2017 Roderick Colenbrander
*
* 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
*/
#ifndef __WINE_VULKAN_PRIVATE_H
#define __WINE_VULKAN_PRIVATE_H
/* Perform vulkan struct conversion on 32-bit x86 platforms. */
#if defined(__i386__)
#define USE_STRUCT_CONVERSION
#endif
#include "wine/debug.h"
#include "wine/heap.h"
#include "wine/list.h"
#define VK_NO_PROTOTYPES
#include "wine/vulkan.h"
#include "wine/vulkan_driver.h"
#include "vulkan_thunks.h"
/* Magic value defined by Vulkan ICD / Loader spec */
#define VULKAN_ICD_MAGIC_VALUE 0x01CDC0DE
#define WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR 0x00000001
#define WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT 0x00000002
#define WINEVULKAN_QUIRK_IGNORE_EXPLICIT_LAYERS 0x00000004
struct vulkan_func
{
const char *name;
void *func;
};
/* Base 'class' for our Vulkan dispatchable objects such as VkDevice and VkInstance.
* This structure MUST be the first element of a dispatchable object as the ICD
* loader depends on it. For now only contains loader_magic, but over time more common
* functionality is expected.
*/
struct wine_vk_base
{
/* Special section in each dispatchable object for use by the ICD loader for
* storing dispatch tables. The start contains a magical value '0x01CDC0DE'.
*/
UINT_PTR loader_magic;
};
/* Some extensions have callbacks for those we need to be able to
* get the wine wrapper for a native handle
*/
struct wine_vk_mapping
{
struct list link;
uint64_t native_handle;
uint64_t wine_wrapped_handle;
};
struct VkCommandBuffer_T
{
struct wine_vk_base base;
struct VkDevice_T *device; /* parent */
VkCommandBuffer command_buffer; /* native command buffer */
struct list pool_link;
struct wine_vk_mapping mapping;
};
struct VkDevice_T
{
struct wine_vk_base base;
struct vulkan_device_funcs funcs;
struct VkPhysicalDevice_T *phys_dev; /* parent */
VkDevice device; /* native device */
struct VkQueue_T **queues;
uint32_t max_queue_families;
unsigned int quirks;
struct wine_vk_mapping mapping;
};
struct wine_debug_utils_messenger;
struct wine_debug_report_callback
{
struct VkInstance_T *instance; /* parent */
VkDebugReportCallbackEXT debug_callback; /* native callback object */
/* application callback + data */
PFN_vkDebugReportCallbackEXT user_callback;
void *user_data;
struct wine_vk_mapping mapping;
};
struct VkInstance_T
{
struct wine_vk_base base;
struct vulkan_instance_funcs funcs;
VkInstance instance; /* native instance */
/* We cache devices as we need to wrap them as they are
* dispatchable objects.
*/
struct VkPhysicalDevice_T **phys_devs;
uint32_t phys_dev_count;
VkBool32 enable_wrapper_list;
struct list wrappers;
SRWLOCK wrapper_lock;
struct wine_debug_utils_messenger *utils_messengers;
uint32_t utils_messenger_count;
struct wine_debug_report_callback default_callback;
unsigned int quirks;
struct wine_vk_mapping mapping;
};
struct VkPhysicalDevice_T
{
struct wine_vk_base base;
struct VkInstance_T *instance; /* parent */
VkPhysicalDevice phys_dev; /* native physical device */
VkExtensionProperties *extensions;
uint32_t extension_count;
struct wine_vk_mapping mapping;
};
struct VkQueue_T
{
struct wine_vk_base base;
struct VkDevice_T *device; /* parent */
VkQueue queue; /* native queue */
VkDeviceQueueCreateFlags flags;
struct wine_vk_mapping mapping;
};
struct wine_cmd_pool
{
VkCommandPool command_pool;
struct list command_buffers;
struct wine_vk_mapping mapping;
};
static inline struct wine_cmd_pool *wine_cmd_pool_from_handle(VkCommandPool handle)
{
return (struct wine_cmd_pool *)(uintptr_t)handle;
}
static inline VkCommandPool wine_cmd_pool_to_handle(struct wine_cmd_pool *cmd_pool)
{
return (VkCommandPool)(uintptr_t)cmd_pool;
}
struct wine_debug_utils_messenger
{
struct VkInstance_T *instance; /* parent */
VkDebugUtilsMessengerEXT debug_messenger; /* native messenger */
/* application callback + data */
PFN_vkDebugUtilsMessengerCallbackEXT user_callback;
void *user_data;
struct wine_vk_mapping mapping;
};
static inline struct wine_debug_utils_messenger *wine_debug_utils_messenger_from_handle(
VkDebugUtilsMessengerEXT handle)
{
return (struct wine_debug_utils_messenger *)(uintptr_t)handle;
}
static inline VkDebugUtilsMessengerEXT wine_debug_utils_messenger_to_handle(
struct wine_debug_utils_messenger *debug_messenger)
{
return (VkDebugUtilsMessengerEXT)(uintptr_t)debug_messenger;
}
static inline struct wine_debug_report_callback *wine_debug_report_callback_from_handle(
VkDebugReportCallbackEXT handle)
{
return (struct wine_debug_report_callback *)(uintptr_t)handle;
}
static inline VkDebugReportCallbackEXT wine_debug_report_callback_to_handle(
struct wine_debug_report_callback *debug_messenger)
{
return (VkDebugReportCallbackEXT)(uintptr_t)debug_messenger;
}
void *wine_vk_get_device_proc_addr(const char *name) DECLSPEC_HIDDEN;
void *wine_vk_get_instance_proc_addr(const char *name) DECLSPEC_HIDDEN;
BOOL wine_vk_device_extension_supported(const char *name) DECLSPEC_HIDDEN;
BOOL wine_vk_instance_extension_supported(const char *name) DECLSPEC_HIDDEN;
BOOL wine_vk_is_type_wrapped(VkObjectType type) DECLSPEC_HIDDEN;
uint64_t wine_vk_unwrap_handle(VkObjectType type, uint64_t handle) DECLSPEC_HIDDEN;
#endif /* __WINE_VULKAN_PRIVATE_H */