As per vkd3d-proton commit 72d9b322, E_INVALIDARG should be returned to indicate the type of failure.
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- tests/d3d12.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/tests/d3d12.c b/tests/d3d12.c index 3a1a72a8..03bae895 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -2286,6 +2286,13 @@ static void test_create_placed_resource(void) &IID_ID3D12Resource, (void **)&resource); ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+ /* Buffer + offset too large for the heap. */ + hr = ID3D12Device_CreatePlacedResource(device, heap, heap_desc.SizeInBytes, + &resource_desc, D3D12_RESOURCE_STATE_COMMON, NULL, + &IID_ID3D12Resource, (void **)&resource); + todo + ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + ID3D12Heap_Release(heap);
for (i = 0; i < ARRAY_SIZE(invalid_buffer_desc_tests); ++i)
Otherwise vkBindBufferMemory() or vkBindImageMemory() will fail, which can result in a generic E_FAIL.
Based on a vkd3d-proton patch by Samuel Pitoiset which fixes a GPU hang with Cyberpunk 2077.
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/resource.c | 7 +++++++ tests/d3d12.c | 1 - 2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 3faa6794..1ca23a90 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -1911,6 +1911,13 @@ static HRESULT vkd3d_bind_heap_memory(struct d3d12_device *device, heap_offset = align(heap_offset, requirements.alignment); }
+ if (heap_offset > heap->desc.SizeInBytes || requirements.size > heap->desc.SizeInBytes - heap_offset) + { + ERR("Heap too small for the resource (offset %"PRIu64", resource size %"PRIu64", heap size %"PRIu64".\n", + heap_offset, requirements.size, heap->desc.SizeInBytes); + return E_INVALIDARG; + } + if (heap_offset % requirements.alignment) { FIXME("Invalid heap offset %#"PRIx64" (alignment %#"PRIx64").\n", diff --git a/tests/d3d12.c b/tests/d3d12.c index 03bae895..0e0f2b8d 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -2290,7 +2290,6 @@ static void test_create_placed_resource(void) hr = ID3D12Device_CreatePlacedResource(device, heap, heap_desc.SizeInBytes, &resource_desc, D3D12_RESOURCE_STATE_COMMON, NULL, &IID_ID3D12Resource, (void **)&resource); - todo ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
ID3D12Heap_Release(heap);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com