From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- libs/vkd3d/device.c | 16 +++++++++++++--- libs/vkd3d/resource.c | 8 ++++++-- libs/vkd3d/vkd3d_private.h | 2 +- tests/d3d12.c | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index ea07b761a..3e17400a7 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -3645,7 +3645,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateHeap(ID3D12Device5 *iface, TRACE("iface %p, desc %p, iid %s, heap %p.\n", iface, desc, debugstr_guid(iid), heap);
- if (FAILED(hr = d3d12_heap_create(device, desc, NULL, &object))) + if (FAILED(hr = d3d12_heap_create(device, desc, NULL, NULL, &object))) { *heap = NULL; return hr; @@ -4024,10 +4024,20 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateHeap1(ID3D12Device5 *iface, const D3D12_HEAP_DESC *desc, ID3D12ProtectedResourceSession *protected_session, REFIID iid, void **heap) { - FIXME("iface %p, desc %p, protected_session %p, iid %s, heap %p stub!\n", + struct d3d12_device *device = impl_from_ID3D12Device5(iface); + struct d3d12_heap *object; + HRESULT hr; + + TRACE("iface %p, desc %p, protected_session %p, iid %s, heap %p.\n", iface, desc, protected_session, debugstr_guid(iid), heap);
- return E_NOTIMPL; + if (FAILED(hr = d3d12_heap_create(device, desc, NULL, protected_session, &object))) + { + *heap = NULL; + return hr; + } + + return return_interface(&object->ID3D12Heap_iface, &IID_ID3D12Heap, iid, heap); }
static HRESULT STDMETHODCALLTYPE d3d12_device_CreateReservedResource1(ID3D12Device5 *iface, diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 14fb24a9c..ad1d2d666 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -574,11 +574,15 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap, }
HRESULT d3d12_heap_create(struct d3d12_device *device, const D3D12_HEAP_DESC *desc, - const struct d3d12_resource *resource, struct d3d12_heap **heap) + const struct d3d12_resource *resource, ID3D12ProtectedResourceSession *protected_session, + struct d3d12_heap **heap) { struct d3d12_heap *object; HRESULT hr;
+ if (protected_session) + FIXME("Protected session is not supported.\n"); + if (!(object = vkd3d_malloc(sizeof(*object)))) return E_OUTOFMEMORY;
@@ -2064,7 +2068,7 @@ static HRESULT vkd3d_allocate_resource_memory( heap_desc.Properties = *heap_properties; heap_desc.Alignment = 0; heap_desc.Flags = heap_flags; - if (SUCCEEDED(hr = d3d12_heap_create(device, &heap_desc, resource, &resource->heap))) + if (SUCCEEDED(hr = d3d12_heap_create(device, &heap_desc, resource, NULL, &resource->heap))) resource->flags |= VKD3D_RESOURCE_DEDICATED_HEAP; return hr; } diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 9e2daae26..625a43125 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -682,7 +682,7 @@ struct d3d12_heap };
HRESULT d3d12_heap_create(struct d3d12_device *device, const D3D12_HEAP_DESC *desc, - const struct d3d12_resource *resource, struct d3d12_heap **heap); + const struct d3d12_resource *resource, ID3D12ProtectedResourceSession *protected_session, struct d3d12_heap **heap); struct d3d12_heap *unsafe_impl_from_ID3D12Heap(ID3D12Heap *iface);
#define VKD3D_RESOURCE_PUBLIC_FLAGS \ diff --git a/tests/d3d12.c b/tests/d3d12.c index d61309e91..3fa9ec4e6 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -1849,6 +1849,7 @@ static void test_create_heap(void) ID3D12Device *device, *tmp_device; bool is_pool_L1_supported; HRESULT hr, expected_hr; + ID3D12Device4 *device4; unsigned int i, j; ID3D12Heap *heap; ULONG refcount; @@ -2063,6 +2064,21 @@ static void test_create_heap(void) vkd3d_test_pop_context(); }
+ if (SUCCEEDED(ID3D12Device_QueryInterface(device, &IID_ID3D12Device4, (void **)&device4))) + { + desc.SizeInBytes = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + memset(&desc.Properties, 0, sizeof(desc.Properties)); + desc.Properties.Type = D3D12_HEAP_TYPE_DEFAULT; + desc.Alignment = 0; + desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES; + hr = ID3D12Device4_CreateHeap1(device4, &desc, NULL, &IID_ID3D12Heap, (void **)&heap); + ok(hr == S_OK, "Failed to create heap, hr %#x.\n", hr); + + ID3D12Heap_Release(heap); + + ID3D12Device4_Release(device4); + } + done: refcount = ID3D12Device_Release(device); ok(!refcount, "ID3D12Device has %u references left.\n", (unsigned int)refcount);