mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
1098 lines
50 KiB
Diff
1098 lines
50 KiB
Diff
From 08931d59f470aef0def6f683a1dc25f8546c78e2 Mon Sep 17 00:00:00 2001
|
|
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
|
Date: Thu, 24 Aug 2023 08:49:26 +1000
|
|
Subject: [PATCH] Updated vkd3d to 622311da8e87c60110329044e29b88dd524e28e7.
|
|
|
|
---
|
|
libs/vkd3d/include/vkd3d_shader.h | 2 +
|
|
libs/vkd3d/include/vkd3d_windows.h | 1 +
|
|
.../libs/vkd3d-shader/vkd3d_shader_main.c | 58 +++--
|
|
.../libs/vkd3d-shader/vkd3d_shader_private.h | 3 +
|
|
libs/vkd3d/libs/vkd3d/device.c | 225 ++++++++++--------
|
|
libs/vkd3d/libs/vkd3d/resource.c | 59 +++--
|
|
libs/vkd3d/libs/vkd3d/state.c | 4 +-
|
|
libs/vkd3d/libs/vkd3d/vkd3d_main.c | 4 +-
|
|
libs/vkd3d/libs/vkd3d/vkd3d_private.h | 22 +-
|
|
9 files changed, 236 insertions(+), 142 deletions(-)
|
|
|
|
diff --git a/libs/vkd3d/include/vkd3d_shader.h b/libs/vkd3d/include/vkd3d_shader.h
|
|
index e98aad4fe95..cfe54dbff53 100644
|
|
--- a/libs/vkd3d/include/vkd3d_shader.h
|
|
+++ b/libs/vkd3d/include/vkd3d_shader.h
|
|
@@ -1339,6 +1339,8 @@ enum vkd3d_shader_descriptor_info_flag
|
|
/** The descriptor is a UAV resource, on which the shader performs
|
|
* atomic ops. \since 1.6 */
|
|
VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS = 0x00000008,
|
|
+ /** The descriptor is a raw (byte-addressed) buffer. \since 1.9 */
|
|
+ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_RAW_BUFFER = 0x00000010,
|
|
|
|
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_DESCRIPTOR_INFO_FLAG),
|
|
};
|
|
diff --git a/libs/vkd3d/include/vkd3d_windows.h b/libs/vkd3d/include/vkd3d_windows.h
|
|
index 002ff667cbc..2daa74e92eb 100644
|
|
--- a/libs/vkd3d/include/vkd3d_windows.h
|
|
+++ b/libs/vkd3d/include/vkd3d_windows.h
|
|
@@ -64,6 +64,7 @@ typedef int HRESULT;
|
|
|
|
# define DXGI_ERROR_NOT_FOUND _HRESULT_TYPEDEF_(0x887a0002)
|
|
# define DXGI_ERROR_MORE_DATA _HRESULT_TYPEDEF_(0x887a0003)
|
|
+# define DXGI_ERROR_UNSUPPORTED _HRESULT_TYPEDEF_(0x887a0004)
|
|
|
|
# define D3DERR_INVALIDCALL _HRESULT_TYPEDEF_(0x8876086c)
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
|
|
index c777bad2206..2bc8613f2ef 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
|
|
@@ -755,10 +755,10 @@ static void vkd3d_shader_scan_record_uav_atomic_op(struct vkd3d_shader_scan_cont
|
|
vkd3d_shader_scan_add_uav_flag(context, reg, VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS);
|
|
}
|
|
|
|
-static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context,
|
|
+static struct vkd3d_shader_descriptor_info1 *vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *context,
|
|
enum vkd3d_shader_descriptor_type type, const struct vkd3d_shader_register *reg,
|
|
const struct vkd3d_shader_register_range *range, enum vkd3d_shader_resource_type resource_type,
|
|
- enum vkd3d_shader_resource_data_type resource_data_type, unsigned int flags)
|
|
+ enum vkd3d_shader_resource_data_type resource_data_type)
|
|
{
|
|
struct vkd3d_shader_scan_descriptor_info1 *info = context->scan_descriptor_info;
|
|
struct vkd3d_shader_descriptor_info1 *d;
|
|
@@ -767,56 +767,61 @@ static bool vkd3d_shader_scan_add_descriptor(struct vkd3d_shader_scan_context *c
|
|
info->descriptor_count + 1, sizeof(*info->descriptors)))
|
|
{
|
|
ERR("Failed to allocate descriptor info.\n");
|
|
- return false;
|
|
+ return NULL;
|
|
}
|
|
|
|
d = &info->descriptors[info->descriptor_count];
|
|
+ memset(d, 0, sizeof(*d));
|
|
d->type = type;
|
|
d->register_id = reg->idx[0].offset;
|
|
d->register_space = range->space;
|
|
d->register_index = range->first;
|
|
d->resource_type = resource_type;
|
|
d->resource_data_type = resource_data_type;
|
|
- d->flags = flags;
|
|
d->count = (range->last == ~0u) ? ~0u : range->last - range->first + 1;
|
|
++info->descriptor_count;
|
|
|
|
- return true;
|
|
+ return d;
|
|
}
|
|
|
|
static void vkd3d_shader_scan_constant_buffer_declaration(struct vkd3d_shader_scan_context *context,
|
|
const struct vkd3d_shader_instruction *instruction)
|
|
{
|
|
const struct vkd3d_shader_constant_buffer *cb = &instruction->declaration.cb;
|
|
+ struct vkd3d_shader_descriptor_info1 *d;
|
|
|
|
if (!context->scan_descriptor_info)
|
|
return;
|
|
|
|
- vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, &cb->src.reg, &cb->range,
|
|
- VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0);
|
|
+ if (!(d = vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV,
|
|
+ &cb->src.reg, &cb->range, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT)))
|
|
+ return;
|
|
+ d->buffer_size = cb->size * 16;
|
|
}
|
|
|
|
static void vkd3d_shader_scan_sampler_declaration(struct vkd3d_shader_scan_context *context,
|
|
const struct vkd3d_shader_instruction *instruction)
|
|
{
|
|
const struct vkd3d_shader_sampler *sampler = &instruction->declaration.sampler;
|
|
- unsigned int flags;
|
|
+ struct vkd3d_shader_descriptor_info1 *d;
|
|
|
|
if (!context->scan_descriptor_info)
|
|
return;
|
|
|
|
+ if (!(d = vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER,
|
|
+ &sampler->src.reg, &sampler->range, VKD3D_SHADER_RESOURCE_NONE, VKD3D_SHADER_RESOURCE_DATA_UINT)))
|
|
+ return;
|
|
+
|
|
if (instruction->flags & VKD3DSI_SAMPLER_COMPARISON_MODE)
|
|
- flags = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE;
|
|
- else
|
|
- flags = 0;
|
|
- vkd3d_shader_scan_add_descriptor(context, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, &sampler->src.reg, &sampler->range,
|
|
- VKD3D_SHADER_RESOURCE_NONE, VKD3D_SHADER_RESOURCE_DATA_UINT, flags);
|
|
+ d->flags |= VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE;
|
|
}
|
|
|
|
static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context,
|
|
const struct vkd3d_shader_resource *resource, enum vkd3d_shader_resource_type resource_type,
|
|
- enum vkd3d_shader_resource_data_type resource_data_type)
|
|
+ enum vkd3d_shader_resource_data_type resource_data_type,
|
|
+ unsigned int sample_count, unsigned int structure_stride, bool raw)
|
|
{
|
|
+ struct vkd3d_shader_descriptor_info1 *d;
|
|
enum vkd3d_shader_descriptor_type type;
|
|
|
|
if (!context->scan_descriptor_info)
|
|
@@ -826,8 +831,13 @@ static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_cont
|
|
type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV;
|
|
else
|
|
type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV;
|
|
- vkd3d_shader_scan_add_descriptor(context, type, &resource->reg.reg, &resource->range,
|
|
- resource_type, resource_data_type, 0);
|
|
+ if (!(d = vkd3d_shader_scan_add_descriptor(context, type, &resource->reg.reg,
|
|
+ &resource->range, resource_type, resource_data_type)))
|
|
+ return;
|
|
+ d->sample_count = sample_count;
|
|
+ d->structure_stride = structure_stride;
|
|
+ if (raw)
|
|
+ d->flags |= VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_RAW_BUFFER;
|
|
}
|
|
|
|
static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_scan_context *context,
|
|
@@ -886,7 +896,7 @@ static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_sca
|
|
}
|
|
|
|
vkd3d_shader_scan_resource_declaration(context, &semantic->resource,
|
|
- semantic->resource_type, resource_data_type);
|
|
+ semantic->resource_type, resource_data_type, semantic->sample_count, 0, false);
|
|
}
|
|
|
|
static void vkd3d_shader_scan_error(struct vkd3d_shader_scan_context *context,
|
|
@@ -920,12 +930,13 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte
|
|
case VKD3DSIH_DCL_RESOURCE_RAW:
|
|
case VKD3DSIH_DCL_UAV_RAW:
|
|
vkd3d_shader_scan_resource_declaration(context, &instruction->declaration.raw_resource.resource,
|
|
- VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
|
|
+ VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0, 0, true);
|
|
break;
|
|
case VKD3DSIH_DCL_RESOURCE_STRUCTURED:
|
|
case VKD3DSIH_DCL_UAV_STRUCTURED:
|
|
vkd3d_shader_scan_resource_declaration(context, &instruction->declaration.structured_resource.resource,
|
|
- VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT);
|
|
+ VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0,
|
|
+ instruction->declaration.structured_resource.byte_stride, false);
|
|
break;
|
|
case VKD3DSIH_IF:
|
|
cf_info = vkd3d_shader_scan_push_cf_info(context);
|
|
@@ -1150,12 +1161,17 @@ static int scan_with_parser(const struct vkd3d_shader_compile_info *compile_info
|
|
|
|
for (i = 0; i < ARRAY_SIZE(parser->shader_desc.flat_constant_count); ++i)
|
|
{
|
|
+ unsigned int size = parser->shader_desc.flat_constant_count[i].external;
|
|
struct vkd3d_shader_register_range range = {.space = 0, .first = i, .last = i};
|
|
struct vkd3d_shader_register reg = {.idx[0].offset = i, .idx_count = 1};
|
|
+ struct vkd3d_shader_descriptor_info1 *d;
|
|
|
|
if (parser->shader_desc.flat_constant_count[i].external)
|
|
- vkd3d_shader_scan_add_descriptor(&context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, ®,
|
|
- &range, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT, 0);
|
|
+ {
|
|
+ if ((d = vkd3d_shader_scan_add_descriptor(&context, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV, ®,
|
|
+ &range, VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT)))
|
|
+ d->buffer_size = size * 16;
|
|
+ }
|
|
}
|
|
|
|
if (!ret && signature_info)
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
|
index c719085e11f..bf925a44690 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
|
@@ -1122,6 +1122,9 @@ struct vkd3d_shader_descriptor_info1
|
|
enum vkd3d_shader_resource_type resource_type;
|
|
enum vkd3d_shader_resource_data_type resource_data_type;
|
|
unsigned int flags;
|
|
+ unsigned int sample_count;
|
|
+ unsigned int buffer_size;
|
|
+ unsigned int structure_stride;
|
|
unsigned int count;
|
|
};
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d/device.c b/libs/vkd3d/libs/vkd3d/device.c
|
|
index a2e1f13dec3..c33061073a3 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/device.c
|
|
+++ b/libs/vkd3d/libs/vkd3d/device.c
|
|
@@ -2435,34 +2435,39 @@ static void device_init_descriptor_pool_sizes(struct d3d12_device *device)
|
|
|
|
static void vkd3d_desc_object_cache_init(struct vkd3d_desc_object_cache *cache, size_t size)
|
|
{
|
|
- cache->head = NULL;
|
|
+ memset(cache, 0, sizeof(*cache));
|
|
cache->size = size;
|
|
}
|
|
|
|
static void vkd3d_desc_object_cache_cleanup(struct vkd3d_desc_object_cache *cache)
|
|
{
|
|
union d3d12_desc_object u;
|
|
+ unsigned int i;
|
|
void *next;
|
|
|
|
- for (u.object = cache->head; u.object; u.object = next)
|
|
+ for (i = 0; i < ARRAY_SIZE(cache->heads); ++i)
|
|
{
|
|
- next = u.header->next;
|
|
- vkd3d_free(u.object);
|
|
+ for (u.object = cache->heads[i].head; u.object; u.object = next)
|
|
+ {
|
|
+ next = u.header->next;
|
|
+ vkd3d_free(u.object);
|
|
+ }
|
|
}
|
|
}
|
|
|
|
/* ID3D12Device */
|
|
-static inline struct d3d12_device *impl_from_ID3D12Device(ID3D12Device *iface)
|
|
+static inline struct d3d12_device *impl_from_ID3D12Device1(ID3D12Device1 *iface)
|
|
{
|
|
- return CONTAINING_RECORD(iface, struct d3d12_device, ID3D12Device_iface);
|
|
+ return CONTAINING_RECORD(iface, struct d3d12_device, ID3D12Device1_iface);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_QueryInterface(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_QueryInterface(ID3D12Device1 *iface,
|
|
REFIID riid, void **object)
|
|
{
|
|
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
|
|
|
- if (IsEqualGUID(riid, &IID_ID3D12Device)
|
|
+ if (IsEqualGUID(riid, &IID_ID3D12Device1)
|
|
+ || IsEqualGUID(riid, &IID_ID3D12Device)
|
|
|| IsEqualGUID(riid, &IID_ID3D12Object)
|
|
|| IsEqualGUID(riid, &IID_IUnknown))
|
|
{
|
|
@@ -2477,9 +2482,9 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_QueryInterface(ID3D12Device *iface
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
-static ULONG STDMETHODCALLTYPE d3d12_device_AddRef(ID3D12Device *iface)
|
|
+static ULONG STDMETHODCALLTYPE d3d12_device_AddRef(ID3D12Device1 *iface)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
ULONG refcount = InterlockedIncrement(&device->refcount);
|
|
|
|
TRACE("%p increasing refcount to %u.\n", device, refcount);
|
|
@@ -2487,9 +2492,9 @@ static ULONG STDMETHODCALLTYPE d3d12_device_AddRef(ID3D12Device *iface)
|
|
return refcount;
|
|
}
|
|
|
|
-static ULONG STDMETHODCALLTYPE d3d12_device_Release(ID3D12Device *iface)
|
|
+static ULONG STDMETHODCALLTYPE d3d12_device_Release(ID3D12Device1 *iface)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
ULONG refcount = InterlockedDecrement(&device->refcount);
|
|
|
|
TRACE("%p decreasing refcount to %u.\n", device, refcount);
|
|
@@ -2523,10 +2528,10 @@ static ULONG STDMETHODCALLTYPE d3d12_device_Release(ID3D12Device *iface)
|
|
return refcount;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_GetPrivateData(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_GetPrivateData(ID3D12Device1 *iface,
|
|
REFGUID guid, UINT *data_size, void *data)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, guid %s, data_size %p, data %p.\n",
|
|
iface, debugstr_guid(guid), data_size, data);
|
|
@@ -2534,10 +2539,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_GetPrivateData(ID3D12Device *iface
|
|
return vkd3d_get_private_data(&device->private_store, guid, data_size, data);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateData(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateData(ID3D12Device1 *iface,
|
|
REFGUID guid, UINT data_size, const void *data)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, guid %s, data_size %u, data %p.\n",
|
|
iface, debugstr_guid(guid), data_size, data);
|
|
@@ -2545,19 +2550,19 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateData(ID3D12Device *iface
|
|
return vkd3d_set_private_data(&device->private_store, guid, data_size, data);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateDataInterface(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_SetPrivateDataInterface(ID3D12Device1 *iface,
|
|
REFGUID guid, const IUnknown *data)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, guid %s, data %p.\n", iface, debugstr_guid(guid), data);
|
|
|
|
return vkd3d_set_private_data_interface(&device->private_store, guid, data);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_SetName(ID3D12Device *iface, const WCHAR *name)
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_SetName(ID3D12Device1 *iface, const WCHAR *name)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, name %s.\n", iface, debugstr_w(name, device->wchar_size));
|
|
|
|
@@ -2565,17 +2570,17 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_SetName(ID3D12Device *iface, const
|
|
VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, name);
|
|
}
|
|
|
|
-static UINT STDMETHODCALLTYPE d3d12_device_GetNodeCount(ID3D12Device *iface)
|
|
+static UINT STDMETHODCALLTYPE d3d12_device_GetNodeCount(ID3D12Device1 *iface)
|
|
{
|
|
TRACE("iface %p.\n", iface);
|
|
|
|
return 1;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandQueue(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandQueue(ID3D12Device1 *iface,
|
|
const D3D12_COMMAND_QUEUE_DESC *desc, REFIID riid, void **command_queue)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_command_queue *object;
|
|
HRESULT hr;
|
|
|
|
@@ -2589,10 +2594,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandQueue(ID3D12Device *i
|
|
riid, command_queue);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandAllocator(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandAllocator(ID3D12Device1 *iface,
|
|
D3D12_COMMAND_LIST_TYPE type, REFIID riid, void **command_allocator)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_command_allocator *object;
|
|
HRESULT hr;
|
|
|
|
@@ -2606,10 +2611,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandAllocator(ID3D12Devic
|
|
riid, command_allocator);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateGraphicsPipelineState(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateGraphicsPipelineState(ID3D12Device1 *iface,
|
|
const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc, REFIID riid, void **pipeline_state)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_pipeline_state *object;
|
|
HRESULT hr;
|
|
|
|
@@ -2623,10 +2628,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateGraphicsPipelineState(ID3D12
|
|
&IID_ID3D12PipelineState, riid, pipeline_state);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateComputePipelineState(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateComputePipelineState(ID3D12Device1 *iface,
|
|
const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc, REFIID riid, void **pipeline_state)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_pipeline_state *object;
|
|
HRESULT hr;
|
|
|
|
@@ -2640,11 +2645,11 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateComputePipelineState(ID3D12D
|
|
&IID_ID3D12PipelineState, riid, pipeline_state);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandList(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandList(ID3D12Device1 *iface,
|
|
UINT node_mask, D3D12_COMMAND_LIST_TYPE type, ID3D12CommandAllocator *command_allocator,
|
|
ID3D12PipelineState *initial_pipeline_state, REFIID riid, void **command_list)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_command_list *object;
|
|
HRESULT hr;
|
|
|
|
@@ -2767,10 +2772,10 @@ bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent)
|
|
return true;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device1 *iface,
|
|
D3D12_FEATURE feature, void *feature_data, UINT feature_data_size)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, feature %#x, feature_data %p, feature_data_size %u.\n",
|
|
iface, feature, feature_data, feature_data_size);
|
|
@@ -3269,10 +3274,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device *
|
|
}
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateDescriptorHeap(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateDescriptorHeap(ID3D12Device1 *iface,
|
|
const D3D12_DESCRIPTOR_HEAP_DESC *desc, REFIID riid, void **descriptor_heap)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_descriptor_heap *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3286,7 +3291,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateDescriptorHeap(ID3D12Device
|
|
&IID_ID3D12DescriptorHeap, riid, descriptor_heap);
|
|
}
|
|
|
|
-static UINT STDMETHODCALLTYPE d3d12_device_GetDescriptorHandleIncrementSize(ID3D12Device *iface,
|
|
+static UINT STDMETHODCALLTYPE d3d12_device_GetDescriptorHandleIncrementSize(ID3D12Device1 *iface,
|
|
D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type)
|
|
{
|
|
TRACE("iface %p, descriptor_heap_type %#x.\n", iface, descriptor_heap_type);
|
|
@@ -3309,11 +3314,11 @@ static UINT STDMETHODCALLTYPE d3d12_device_GetDescriptorHandleIncrementSize(ID3D
|
|
}
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateRootSignature(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateRootSignature(ID3D12Device1 *iface,
|
|
UINT node_mask, const void *bytecode, SIZE_T bytecode_length,
|
|
REFIID riid, void **root_signature)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_root_signature *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3329,10 +3334,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateRootSignature(ID3D12Device *
|
|
&IID_ID3D12RootSignature, riid, root_signature);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CreateConstantBufferView(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CreateConstantBufferView(ID3D12Device1 *iface,
|
|
const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc, D3D12_CPU_DESCRIPTOR_HANDLE descriptor)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_desc tmp = {0};
|
|
|
|
TRACE("iface %p, desc %p, descriptor %#lx.\n", iface, desc, descriptor.ptr);
|
|
@@ -3341,11 +3346,11 @@ static void STDMETHODCALLTYPE d3d12_device_CreateConstantBufferView(ID3D12Device
|
|
d3d12_desc_write_atomic(d3d12_desc_from_cpu_handle(descriptor), &tmp, device);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CreateShaderResourceView(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CreateShaderResourceView(ID3D12Device1 *iface,
|
|
ID3D12Resource *resource, const D3D12_SHADER_RESOURCE_VIEW_DESC *desc,
|
|
D3D12_CPU_DESCRIPTOR_HANDLE descriptor)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_desc tmp = {0};
|
|
|
|
TRACE("iface %p, resource %p, desc %p, descriptor %#lx.\n",
|
|
@@ -3355,11 +3360,11 @@ static void STDMETHODCALLTYPE d3d12_device_CreateShaderResourceView(ID3D12Device
|
|
d3d12_desc_write_atomic(d3d12_desc_from_cpu_handle(descriptor), &tmp, device);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CreateUnorderedAccessView(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CreateUnorderedAccessView(ID3D12Device1 *iface,
|
|
ID3D12Resource *resource, ID3D12Resource *counter_resource,
|
|
const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc, D3D12_CPU_DESCRIPTOR_HANDLE descriptor)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_desc tmp = {0};
|
|
|
|
TRACE("iface %p, resource %p, counter_resource %p, desc %p, descriptor %#lx.\n",
|
|
@@ -3370,7 +3375,7 @@ static void STDMETHODCALLTYPE d3d12_device_CreateUnorderedAccessView(ID3D12Devic
|
|
d3d12_desc_write_atomic(d3d12_desc_from_cpu_handle(descriptor), &tmp, device);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CreateRenderTargetView(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CreateRenderTargetView(ID3D12Device1 *iface,
|
|
ID3D12Resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc,
|
|
D3D12_CPU_DESCRIPTOR_HANDLE descriptor)
|
|
{
|
|
@@ -3378,10 +3383,10 @@ static void STDMETHODCALLTYPE d3d12_device_CreateRenderTargetView(ID3D12Device *
|
|
iface, resource, desc, descriptor.ptr);
|
|
|
|
d3d12_rtv_desc_create_rtv(d3d12_rtv_desc_from_cpu_handle(descriptor),
|
|
- impl_from_ID3D12Device(iface), unsafe_impl_from_ID3D12Resource(resource), desc);
|
|
+ impl_from_ID3D12Device1(iface), unsafe_impl_from_ID3D12Resource(resource), desc);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CreateDepthStencilView(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CreateDepthStencilView(ID3D12Device1 *iface,
|
|
ID3D12Resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc,
|
|
D3D12_CPU_DESCRIPTOR_HANDLE descriptor)
|
|
{
|
|
@@ -3389,13 +3394,13 @@ static void STDMETHODCALLTYPE d3d12_device_CreateDepthStencilView(ID3D12Device *
|
|
iface, resource, desc, descriptor.ptr);
|
|
|
|
d3d12_dsv_desc_create_dsv(d3d12_dsv_desc_from_cpu_handle(descriptor),
|
|
- impl_from_ID3D12Device(iface), unsafe_impl_from_ID3D12Resource(resource), desc);
|
|
+ impl_from_ID3D12Device1(iface), unsafe_impl_from_ID3D12Resource(resource), desc);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CreateSampler(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CreateSampler(ID3D12Device1 *iface,
|
|
const D3D12_SAMPLER_DESC *desc, D3D12_CPU_DESCRIPTOR_HANDLE descriptor)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_desc tmp = {0};
|
|
|
|
TRACE("iface %p, desc %p, descriptor %#lx.\n", iface, desc, descriptor.ptr);
|
|
@@ -3404,14 +3409,14 @@ static void STDMETHODCALLTYPE d3d12_device_CreateSampler(ID3D12Device *iface,
|
|
d3d12_desc_write_atomic(d3d12_desc_from_cpu_handle(descriptor), &tmp, device);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CopyDescriptors(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CopyDescriptors(ID3D12Device1 *iface,
|
|
UINT dst_descriptor_range_count, const D3D12_CPU_DESCRIPTOR_HANDLE *dst_descriptor_range_offsets,
|
|
const UINT *dst_descriptor_range_sizes,
|
|
UINT src_descriptor_range_count, const D3D12_CPU_DESCRIPTOR_HANDLE *src_descriptor_range_offsets,
|
|
const UINT *src_descriptor_range_sizes,
|
|
D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
unsigned int dst_range_idx, dst_idx, src_range_idx, src_idx;
|
|
unsigned int dst_range_size, src_range_size;
|
|
struct d3d12_descriptor_heap *dst_heap;
|
|
@@ -3467,7 +3472,7 @@ static void STDMETHODCALLTYPE d3d12_device_CopyDescriptors(ID3D12Device *iface,
|
|
}
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_CopyDescriptorsSimple(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_CopyDescriptorsSimple(ID3D12Device1 *iface,
|
|
UINT descriptor_count, const D3D12_CPU_DESCRIPTOR_HANDLE dst_descriptor_range_offset,
|
|
const D3D12_CPU_DESCRIPTOR_HANDLE src_descriptor_range_offset,
|
|
D3D12_DESCRIPTOR_HEAP_TYPE descriptor_heap_type)
|
|
@@ -3482,10 +3487,10 @@ static void STDMETHODCALLTYPE d3d12_device_CopyDescriptorsSimple(ID3D12Device *i
|
|
}
|
|
|
|
static D3D12_RESOURCE_ALLOCATION_INFO * STDMETHODCALLTYPE d3d12_device_GetResourceAllocationInfo(
|
|
- ID3D12Device *iface, D3D12_RESOURCE_ALLOCATION_INFO *info, UINT visible_mask,
|
|
+ ID3D12Device1 *iface, D3D12_RESOURCE_ALLOCATION_INFO *info, UINT visible_mask,
|
|
UINT count, const D3D12_RESOURCE_DESC *resource_descs)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
const D3D12_RESOURCE_DESC *desc;
|
|
uint64_t requested_alignment;
|
|
|
|
@@ -3558,10 +3563,10 @@ invalid:
|
|
return info;
|
|
}
|
|
|
|
-static D3D12_HEAP_PROPERTIES * STDMETHODCALLTYPE d3d12_device_GetCustomHeapProperties(ID3D12Device *iface,
|
|
+static D3D12_HEAP_PROPERTIES * STDMETHODCALLTYPE d3d12_device_GetCustomHeapProperties(ID3D12Device1 *iface,
|
|
D3D12_HEAP_PROPERTIES *heap_properties, UINT node_mask, D3D12_HEAP_TYPE heap_type)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
bool coherent;
|
|
|
|
TRACE("iface %p, heap_properties %p, node_mask 0x%08x, heap_type %#x.\n",
|
|
@@ -3601,12 +3606,12 @@ static D3D12_HEAP_PROPERTIES * STDMETHODCALLTYPE d3d12_device_GetCustomHeapPrope
|
|
return heap_properties;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommittedResource(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommittedResource(ID3D12Device1 *iface,
|
|
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
|
|
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,
|
|
const D3D12_CLEAR_VALUE *optimized_clear_value, REFIID iid, void **resource)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_resource *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3625,10 +3630,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommittedResource(ID3D12Devi
|
|
return return_interface(&object->ID3D12Resource_iface, &IID_ID3D12Resource, iid, resource);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateHeap(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateHeap(ID3D12Device1 *iface,
|
|
const D3D12_HEAP_DESC *desc, REFIID iid, void **heap)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_heap *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3644,12 +3649,12 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateHeap(ID3D12Device *iface,
|
|
return return_interface(&object->ID3D12Heap_iface, &IID_ID3D12Heap, iid, heap);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePlacedResource(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePlacedResource(ID3D12Device1 *iface,
|
|
ID3D12Heap *heap, UINT64 heap_offset,
|
|
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,
|
|
const D3D12_CLEAR_VALUE *optimized_clear_value, REFIID iid, void **resource)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_heap *heap_object;
|
|
struct d3d12_resource *object;
|
|
HRESULT hr;
|
|
@@ -3668,11 +3673,11 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePlacedResource(ID3D12Device
|
|
return return_interface(&object->ID3D12Resource_iface, &IID_ID3D12Resource, iid, resource);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateReservedResource(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateReservedResource(ID3D12Device1 *iface,
|
|
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,
|
|
const D3D12_CLEAR_VALUE *optimized_clear_value, REFIID iid, void **resource)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_resource *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3686,11 +3691,11 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateReservedResource(ID3D12Devic
|
|
return return_interface(&object->ID3D12Resource_iface, &IID_ID3D12Resource, iid, resource);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateSharedHandle(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateSharedHandle(ID3D12Device1 *iface,
|
|
ID3D12DeviceChild *object, const SECURITY_ATTRIBUTES *attributes, DWORD access,
|
|
const WCHAR *name, HANDLE *handle)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
FIXME("iface %p, object %p, attributes %p, access %#x, name %s, handle %p stub!\n",
|
|
iface, object, attributes, access, debugstr_w(name, device->wchar_size), handle);
|
|
@@ -3698,7 +3703,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateSharedHandle(ID3D12Device *i
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_OpenSharedHandle(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_OpenSharedHandle(ID3D12Device1 *iface,
|
|
HANDLE handle, REFIID riid, void **object)
|
|
{
|
|
FIXME("iface %p, handle %p, riid %s, object %p stub!\n",
|
|
@@ -3707,10 +3712,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_OpenSharedHandle(ID3D12Device *ifa
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_OpenSharedHandleByName(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_OpenSharedHandleByName(ID3D12Device1 *iface,
|
|
const WCHAR *name, DWORD access, HANDLE *handle)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
FIXME("iface %p, name %s, access %#x, handle %p stub!\n",
|
|
iface, debugstr_w(name, device->wchar_size), access, handle);
|
|
@@ -3718,7 +3723,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_OpenSharedHandleByName(ID3D12Devic
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_MakeResident(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_MakeResident(ID3D12Device1 *iface,
|
|
UINT object_count, ID3D12Pageable * const *objects)
|
|
{
|
|
FIXME_ONCE("iface %p, object_count %u, objects %p stub!\n",
|
|
@@ -3727,7 +3732,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_MakeResident(ID3D12Device *iface,
|
|
return S_OK;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_Evict(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_Evict(ID3D12Device1 *iface,
|
|
UINT object_count, ID3D12Pageable * const *objects)
|
|
{
|
|
FIXME_ONCE("iface %p, object_count %u, objects %p stub!\n",
|
|
@@ -3736,10 +3741,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_Evict(ID3D12Device *iface,
|
|
return S_OK;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateFence(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateFence(ID3D12Device1 *iface,
|
|
UINT64 initial_value, D3D12_FENCE_FLAGS flags, REFIID riid, void **fence)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_fence *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3752,21 +3757,21 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateFence(ID3D12Device *iface,
|
|
return return_interface(&object->ID3D12Fence1_iface, &IID_ID3D12Fence1, riid, fence);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_GetDeviceRemovedReason(ID3D12Device *iface)
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_GetDeviceRemovedReason(ID3D12Device1 *iface)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p.\n", iface);
|
|
|
|
return device->removed_reason;
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device1 *iface,
|
|
const D3D12_RESOURCE_DESC *desc, UINT first_sub_resource, UINT sub_resource_count,
|
|
UINT64 base_offset, D3D12_PLACED_SUBRESOURCE_FOOTPRINT *layouts,
|
|
UINT *row_counts, UINT64 *row_sizes, UINT64 *total_bytes)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
unsigned int i, sub_resource_idx, miplevel_idx, row_count, row_size, row_pitch;
|
|
unsigned int width, height, depth, plane_count, sub_resources_per_plane;
|
|
@@ -3846,10 +3851,10 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i
|
|
*total_bytes = total;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateQueryHeap(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateQueryHeap(ID3D12Device1 *iface,
|
|
const D3D12_QUERY_HEAP_DESC *desc, REFIID iid, void **heap)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_query_heap *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3862,18 +3867,18 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateQueryHeap(ID3D12Device *ifac
|
|
return return_interface(&object->ID3D12QueryHeap_iface, &IID_ID3D12QueryHeap, iid, heap);
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_SetStablePowerState(ID3D12Device *iface, BOOL enable)
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_SetStablePowerState(ID3D12Device1 *iface, BOOL enable)
|
|
{
|
|
FIXME("iface %p, enable %#x stub!\n", iface, enable);
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
-static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandSignature(ID3D12Device *iface,
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandSignature(ID3D12Device1 *iface,
|
|
const D3D12_COMMAND_SIGNATURE_DESC *desc, ID3D12RootSignature *root_signature,
|
|
REFIID iid, void **command_signature)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
struct d3d12_command_signature *object;
|
|
HRESULT hr;
|
|
|
|
@@ -3887,14 +3892,14 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateCommandSignature(ID3D12Devic
|
|
&IID_ID3D12CommandSignature, iid, command_signature);
|
|
}
|
|
|
|
-static void STDMETHODCALLTYPE d3d12_device_GetResourceTiling(ID3D12Device *iface,
|
|
+static void STDMETHODCALLTYPE d3d12_device_GetResourceTiling(ID3D12Device1 *iface,
|
|
ID3D12Resource *resource, UINT *total_tile_count,
|
|
D3D12_PACKED_MIP_INFO *packed_mip_info, D3D12_TILE_SHAPE *standard_tile_shape,
|
|
UINT *sub_resource_tiling_count, UINT first_sub_resource_tiling,
|
|
D3D12_SUBRESOURCE_TILING *sub_resource_tilings)
|
|
{
|
|
const struct d3d12_resource *resource_impl = impl_from_ID3D12Resource(resource);
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, resource %p, total_tile_count %p, packed_mip_info %p, "
|
|
"standard_title_shape %p, sub_resource_tiling_count %p, "
|
|
@@ -3907,9 +3912,9 @@ static void STDMETHODCALLTYPE d3d12_device_GetResourceTiling(ID3D12Device *iface
|
|
sub_resource_tiling_count, first_sub_resource_tiling, sub_resource_tilings);
|
|
}
|
|
|
|
-static LUID * STDMETHODCALLTYPE d3d12_device_GetAdapterLuid(ID3D12Device *iface, LUID *luid)
|
|
+static LUID * STDMETHODCALLTYPE d3d12_device_GetAdapterLuid(ID3D12Device1 *iface, LUID *luid)
|
|
{
|
|
- struct d3d12_device *device = impl_from_ID3D12Device(iface);
|
|
+ struct d3d12_device *device = impl_from_ID3D12Device1(iface);
|
|
|
|
TRACE("iface %p, luid %p.\n", iface, luid);
|
|
|
|
@@ -3918,7 +3923,33 @@ static LUID * STDMETHODCALLTYPE d3d12_device_GetAdapterLuid(ID3D12Device *iface,
|
|
return luid;
|
|
}
|
|
|
|
-static const struct ID3D12DeviceVtbl d3d12_device_vtbl =
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePipelineLibrary(ID3D12Device1 *iface,
|
|
+ const void *blob, SIZE_T blob_size, REFIID iid, void **lib)
|
|
+{
|
|
+ FIXME("iface %p, blob %p, blob_size %lu, iid %s, lib %p stub!\n", iface, blob, blob_size, debugstr_guid(iid), lib);
|
|
+
|
|
+ return DXGI_ERROR_UNSUPPORTED;
|
|
+}
|
|
+
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_SetEventOnMultipleFenceCompletion(ID3D12Device1 *iface,
|
|
+ ID3D12Fence *const *fences, const UINT64 *values, UINT fence_count,
|
|
+ D3D12_MULTIPLE_FENCE_WAIT_FLAGS flags, HANDLE event)
|
|
+{
|
|
+ FIXME("iface %p, fences %p, values %p, fence_count %u, flags %#x, event %p stub!\n",
|
|
+ iface, fences, values, fence_count, flags, event);
|
|
+
|
|
+ return E_NOTIMPL;
|
|
+}
|
|
+
|
|
+static HRESULT STDMETHODCALLTYPE d3d12_device_SetResidencyPriority(ID3D12Device1 *iface,
|
|
+ UINT object_count, ID3D12Pageable *const *objects, const D3D12_RESIDENCY_PRIORITY *priorities)
|
|
+{
|
|
+ FIXME_ONCE("iface %p, object_count %u, objects %p, priorities %p stub!\n", iface, object_count, objects, priorities);
|
|
+
|
|
+ return S_OK;
|
|
+}
|
|
+
|
|
+static const struct ID3D12Device1Vtbl d3d12_device_vtbl =
|
|
{
|
|
/* IUnknown methods */
|
|
d3d12_device_QueryInterface,
|
|
@@ -3967,14 +3998,18 @@ static const struct ID3D12DeviceVtbl d3d12_device_vtbl =
|
|
d3d12_device_CreateCommandSignature,
|
|
d3d12_device_GetResourceTiling,
|
|
d3d12_device_GetAdapterLuid,
|
|
+ /* ID3D12Device1 methods */
|
|
+ d3d12_device_CreatePipelineLibrary,
|
|
+ d3d12_device_SetEventOnMultipleFenceCompletion,
|
|
+ d3d12_device_SetResidencyPriority,
|
|
};
|
|
|
|
-struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface)
|
|
+struct d3d12_device *unsafe_impl_from_ID3D12Device1(ID3D12Device1 *iface)
|
|
{
|
|
if (!iface)
|
|
return NULL;
|
|
assert(iface->lpVtbl == &d3d12_device_vtbl);
|
|
- return impl_from_ID3D12Device(iface);
|
|
+ return impl_from_ID3D12Device1(iface);
|
|
}
|
|
|
|
static HRESULT d3d12_device_init(struct d3d12_device *device,
|
|
@@ -3983,7 +4018,7 @@ static HRESULT d3d12_device_init(struct d3d12_device *device,
|
|
const struct vkd3d_vk_device_procs *vk_procs;
|
|
HRESULT hr;
|
|
|
|
- device->ID3D12Device_iface.lpVtbl = &d3d12_device_vtbl;
|
|
+ device->ID3D12Device1_iface.lpVtbl = &d3d12_device_vtbl;
|
|
device->refcount = 1;
|
|
|
|
vkd3d_instance_incref(device->vkd3d_instance = instance);
|
|
@@ -4180,28 +4215,28 @@ HRESULT vkd3d_join_thread(struct vkd3d_instance *instance, union vkd3d_thread_ha
|
|
|
|
IUnknown *vkd3d_get_device_parent(ID3D12Device *device)
|
|
{
|
|
- struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
|
|
+ struct d3d12_device *d3d12_device = impl_from_ID3D12Device1((ID3D12Device1 *)device);
|
|
|
|
return d3d12_device->parent;
|
|
}
|
|
|
|
VkDevice vkd3d_get_vk_device(ID3D12Device *device)
|
|
{
|
|
- struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
|
|
+ struct d3d12_device *d3d12_device = impl_from_ID3D12Device1((ID3D12Device1 *)device);
|
|
|
|
return d3d12_device->vk_device;
|
|
}
|
|
|
|
VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device)
|
|
{
|
|
- struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
|
|
+ struct d3d12_device *d3d12_device = impl_from_ID3D12Device1((ID3D12Device1 *)device);
|
|
|
|
return d3d12_device->vk_physical_device;
|
|
}
|
|
|
|
struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device)
|
|
{
|
|
- struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
|
|
+ struct d3d12_device *d3d12_device = impl_from_ID3D12Device1((ID3D12Device1 *)device);
|
|
|
|
return d3d12_device->vkd3d_instance;
|
|
}
|
|
diff --git a/libs/vkd3d/libs/vkd3d/resource.c b/libs/vkd3d/libs/vkd3d/resource.c
|
|
index cd3856c2937..f3842958d96 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/resource.c
|
|
+++ b/libs/vkd3d/libs/vkd3d/resource.c
|
|
@@ -2220,7 +2220,7 @@ HRESULT d3d12_reserved_resource_create(struct d3d12_device *device,
|
|
HRESULT vkd3d_create_image_resource(ID3D12Device *device,
|
|
const struct vkd3d_image_resource_create_info *create_info, ID3D12Resource **resource)
|
|
{
|
|
- struct d3d12_device *d3d12_device = unsafe_impl_from_ID3D12Device(device);
|
|
+ struct d3d12_device *d3d12_device = unsafe_impl_from_ID3D12Device1((ID3D12Device1 *)device);
|
|
struct d3d12_resource *object;
|
|
HRESULT hr;
|
|
|
|
@@ -2282,38 +2282,67 @@ ULONG vkd3d_resource_decref(ID3D12Resource *resource)
|
|
return d3d12_resource_decref(impl_from_ID3D12Resource(resource));
|
|
}
|
|
|
|
-/* Objects are cached so that vkd3d_view_incref() can safely check the refcount
|
|
- * of an object freed by another thread. */
|
|
+#define HEAD_INDEX_MASK (ARRAY_SIZE(cache->heads) - 1)
|
|
+
|
|
+/* Objects are cached so that vkd3d_view_incref() can safely check the refcount of an
|
|
+ * object freed by another thread. This could be implemented as a single atomic linked
|
|
+ * list, but it requires handling the ABA problem, which brings issues with cross-platform
|
|
+ * support, compiler support, and non-universal x86-64 support for 128-bit CAS. */
|
|
static void *vkd3d_desc_object_cache_get(struct vkd3d_desc_object_cache *cache)
|
|
{
|
|
union d3d12_desc_object u;
|
|
- void *next;
|
|
+ unsigned int i;
|
|
|
|
- do
|
|
+ STATIC_ASSERT(!(ARRAY_SIZE(cache->heads) & HEAD_INDEX_MASK));
|
|
+
|
|
+ i = (vkd3d_atomic_increment(&cache->next_index)) & HEAD_INDEX_MASK;
|
|
+ for (;;)
|
|
{
|
|
- u.object = cache->head;
|
|
- if (!u.object)
|
|
+ if (vkd3d_atomic_compare_exchange(&cache->heads[i].spinlock, 0, 1))
|
|
+ {
|
|
+ if ((u.object = cache->heads[i].head))
|
|
+ {
|
|
+ vkd3d_atomic_decrement(&cache->free_count);
|
|
+ cache->heads[i].head = u.header->next;
|
|
+ vkd3d_atomic_exchange(&cache->heads[i].spinlock, 0);
|
|
+ return u.object;
|
|
+ }
|
|
+ vkd3d_atomic_exchange(&cache->heads[i].spinlock, 0);
|
|
+ }
|
|
+ /* Keeping a free count avoids uncertainty over when this loop should terminate,
|
|
+ * which could result in excess allocations gradually increasing without limit. */
|
|
+ if (cache->free_count < ARRAY_SIZE(cache->heads))
|
|
return vkd3d_malloc(cache->size);
|
|
- next = u.header->next;
|
|
- }
|
|
- while (!vkd3d_atomic_compare_exchange_pointer(&cache->head, u.object, next));
|
|
|
|
- return u.object;
|
|
+ i = (i + 1) & HEAD_INDEX_MASK;
|
|
+ }
|
|
}
|
|
|
|
static void vkd3d_desc_object_cache_push(struct vkd3d_desc_object_cache *cache, void *object)
|
|
{
|
|
union d3d12_desc_object u = {object};
|
|
+ unsigned int i;
|
|
void *head;
|
|
|
|
- do
|
|
+ /* Using the same index as above may result in a somewhat uneven distribution,
|
|
+ * but the main objective is to avoid costly spinlock contention. */
|
|
+ i = (vkd3d_atomic_increment(&cache->next_index)) & HEAD_INDEX_MASK;
|
|
+ for (;;)
|
|
{
|
|
- head = cache->head;
|
|
- u.header->next = head;
|
|
+ if (vkd3d_atomic_compare_exchange(&cache->heads[i].spinlock, 0, 1))
|
|
+ break;
|
|
+ i = (i + 1) & HEAD_INDEX_MASK;
|
|
}
|
|
- while (!vkd3d_atomic_compare_exchange_pointer(&cache->head, head, u.object));
|
|
+
|
|
+ head = cache->heads[i].head;
|
|
+ u.header->next = head;
|
|
+ cache->heads[i].head = u.object;
|
|
+ vkd3d_atomic_exchange(&cache->heads[i].spinlock, 0);
|
|
+ vkd3d_atomic_increment(&cache->free_count);
|
|
}
|
|
|
|
+#undef HEAD_INDEX_MASK
|
|
+
|
|
static struct vkd3d_cbuffer_desc *vkd3d_cbuffer_desc_create(struct d3d12_device *device)
|
|
{
|
|
struct vkd3d_cbuffer_desc *desc;
|
|
diff --git a/libs/vkd3d/libs/vkd3d/state.c b/libs/vkd3d/libs/vkd3d/state.c
|
|
index 2d8138245d8..7ae46c862cc 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/state.c
|
|
+++ b/libs/vkd3d/libs/vkd3d/state.c
|
|
@@ -375,8 +375,8 @@ static HRESULT d3d12_root_signature_info_count_descriptors(struct d3d12_root_sig
|
|
|
|
if (unbounded && range->OffsetInDescriptorsFromTableStart == D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
|
|
{
|
|
- WARN("An unbounded range with offset D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND occurs after "
|
|
- "another unbounded range.\n");
|
|
+ WARN("A range with offset D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND occurs after "
|
|
+ "an unbounded range.\n");
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
|
|
index 88301fbb313..159560afd8e 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/vkd3d_main.c
|
|
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
|
|
@@ -71,11 +71,11 @@ HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info,
|
|
|
|
if (!device)
|
|
{
|
|
- ID3D12Device_Release(&object->ID3D12Device_iface);
|
|
+ ID3D12Device_Release(&object->ID3D12Device1_iface);
|
|
return S_FALSE;
|
|
}
|
|
|
|
- return return_interface(&object->ID3D12Device_iface, &IID_ID3D12Device, iid, device);
|
|
+ return return_interface(&object->ID3D12Device1_iface, &IID_ID3D12Device, iid, device);
|
|
}
|
|
|
|
/* ID3D12RootSignatureDeserializer */
|
|
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
|
|
index 4bd6812b16e..a18287b4cd4 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/vkd3d_private.h
|
|
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
|
|
@@ -1690,9 +1690,17 @@ struct vkd3d_uav_clear_state
|
|
HRESULT vkd3d_uav_clear_state_init(struct vkd3d_uav_clear_state *state, struct d3d12_device *device);
|
|
void vkd3d_uav_clear_state_cleanup(struct vkd3d_uav_clear_state *state, struct d3d12_device *device);
|
|
|
|
+struct desc_object_cache_head
|
|
+{
|
|
+ void *head;
|
|
+ unsigned int spinlock;
|
|
+};
|
|
+
|
|
struct vkd3d_desc_object_cache
|
|
{
|
|
- void * volatile head;
|
|
+ struct desc_object_cache_head heads[16];
|
|
+ unsigned int next_index;
|
|
+ unsigned int free_count;
|
|
size_t size;
|
|
};
|
|
|
|
@@ -1701,7 +1709,7 @@ struct vkd3d_desc_object_cache
|
|
/* ID3D12Device */
|
|
struct d3d12_device
|
|
{
|
|
- ID3D12Device ID3D12Device_iface;
|
|
+ ID3D12Device1 ID3D12Device1_iface;
|
|
LONG refcount;
|
|
|
|
VkDevice vk_device;
|
|
@@ -1767,27 +1775,27 @@ struct vkd3d_queue *d3d12_device_get_vkd3d_queue(struct d3d12_device *device, D3
|
|
bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent);
|
|
void d3d12_device_mark_as_removed(struct d3d12_device *device, HRESULT reason,
|
|
const char *message, ...) VKD3D_PRINTF_FUNC(3, 4);
|
|
-struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface);
|
|
+struct d3d12_device *unsafe_impl_from_ID3D12Device1(ID3D12Device1 *iface);
|
|
|
|
static inline HRESULT d3d12_device_query_interface(struct d3d12_device *device, REFIID iid, void **object)
|
|
{
|
|
- return ID3D12Device_QueryInterface(&device->ID3D12Device_iface, iid, object);
|
|
+ return ID3D12Device1_QueryInterface(&device->ID3D12Device1_iface, iid, object);
|
|
}
|
|
|
|
static inline ULONG d3d12_device_add_ref(struct d3d12_device *device)
|
|
{
|
|
- return ID3D12Device_AddRef(&device->ID3D12Device_iface);
|
|
+ return ID3D12Device1_AddRef(&device->ID3D12Device1_iface);
|
|
}
|
|
|
|
static inline ULONG d3d12_device_release(struct d3d12_device *device)
|
|
{
|
|
- return ID3D12Device_Release(&device->ID3D12Device_iface);
|
|
+ return ID3D12Device1_Release(&device->ID3D12Device1_iface);
|
|
}
|
|
|
|
static inline unsigned int d3d12_device_get_descriptor_handle_increment_size(struct d3d12_device *device,
|
|
D3D12_DESCRIPTOR_HEAP_TYPE descriptor_type)
|
|
{
|
|
- return ID3D12Device_GetDescriptorHandleIncrementSize(&device->ID3D12Device_iface, descriptor_type);
|
|
+ return ID3D12Device1_GetDescriptorHandleIncrementSize(&device->ID3D12Device1_iface, descriptor_type);
|
|
}
|
|
|
|
/* utils */
|
|
--
|
|
2.40.1
|
|
|