libs/vkd3d: GPU virtual address for texture resources is always 0.

This commit is contained in:
Józef Kucia 2016-10-24 13:20:09 +02:00
parent a5fbcb28f0
commit eea8617b9b
4 changed files with 26 additions and 8 deletions

View File

@ -1538,8 +1538,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(ID3D12Graphics
vk_procs = &list->device->vk_procs; vk_procs = &list->device->vk_procs;
assert(dst_resource_impl->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER); assert(d3d12_resource_is_buffer(dst_resource_impl));
assert(src_resource_impl->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER); assert(d3d12_resource_is_buffer(src_resource_impl));
buffer_copy.srcOffset = src_offset; buffer_copy.srcOffset = src_offset;
buffer_copy.dstOffset = dst_offset; buffer_copy.dstOffset = dst_offset;
@ -1836,7 +1836,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, src_stage_mask, dst_stage_mask, 0, VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, src_stage_mask, dst_stage_mask, 0,
1, &vk_barrier, 0, NULL, 0, NULL)); 1, &vk_barrier, 0, NULL, 0, NULL));
} }
else if (resource->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) else if (d3d12_resource_is_buffer(resource))
{ {
VkBufferMemoryBarrier vk_barrier; VkBufferMemoryBarrier vk_barrier;

View File

@ -279,7 +279,7 @@ static HRESULT vkd3d_allocate_buffer_memory(struct d3d12_resource *resource, str
VkResult vr; VkResult vr;
HRESULT hr; HRESULT hr;
assert(resource->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER); assert(d3d12_resource_is_buffer(resource));
VK_CALL(vkGetBufferMemoryRequirements(device->vk_device, resource->u.vk_buffer, &memory_requirements)); VK_CALL(vkGetBufferMemoryRequirements(device->vk_device, resource->u.vk_buffer, &memory_requirements));
if (FAILED(hr = vkd3d_allocate_device_memory(device, heap_properties, heap_flags, if (FAILED(hr = vkd3d_allocate_device_memory(device, heap_properties, heap_flags,
@ -471,7 +471,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_Map(ID3D12Resource *iface, UINT
return E_INVALIDARG; return E_INVALIDARG;
} }
if (resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER) if (!d3d12_resource_is_buffer(resource))
{ {
/* Textures seem to be mappable only on UMA adapters. */ /* Textures seem to be mappable only on UMA adapters. */
FIXME("Not implemented for textures.\n"); FIXME("Not implemented for textures.\n");
@ -515,7 +515,7 @@ static void STDMETHODCALLTYPE d3d12_resource_Unmap(ID3D12Resource *iface, UINT s
device = resource->device; device = resource->device;
vk_procs = &device->vk_procs; vk_procs = &device->vk_procs;
if (resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER) if (!d3d12_resource_is_buffer(resource))
{ {
FIXME("Not implemented for textures.\n"); FIXME("Not implemented for textures.\n");
return; return;
@ -552,6 +552,12 @@ static D3D12_GPU_VIRTUAL_ADDRESS STDMETHODCALLTYPE d3d12_resource_GetGPUVirtualA
TRACE("iface %p.\n", iface); TRACE("iface %p.\n", iface);
if (!d3d12_resource_is_buffer(resource))
{
WARN("GPU virtual address for textures is always 0.\n");
return 0;
}
return resource->u.gpu_address; return resource->u.gpu_address;
} }
@ -631,7 +637,7 @@ static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, st
resource->desc = *desc; resource->desc = *desc;
if (desc->Dimension != D3D12_RESOURCE_DIMENSION_BUFFER if (!d3d12_resource_is_buffer(resource)
&& (heap_properties->Type == D3D12_HEAP_TYPE_UPLOAD || heap_properties->Type == D3D12_HEAP_TYPE_READBACK)) && (heap_properties->Type == D3D12_HEAP_TYPE_UPLOAD || heap_properties->Type == D3D12_HEAP_TYPE_READBACK))
{ {
WARN("Texture cannot be created on a UPLOAD/READBACK heap.\n"); WARN("Texture cannot be created on a UPLOAD/READBACK heap.\n");
@ -655,7 +661,7 @@ static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, st
return E_INVALIDARG; return E_INVALIDARG;
} }
if (optimized_clear_value && desc->Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) if (optimized_clear_value && d3d12_resource_is_buffer(resource))
{ {
WARN("Optimized clear value must be NULL for buffers.\n"); WARN("Optimized clear value must be NULL for buffers.\n");
return E_INVALIDARG; return E_INVALIDARG;

View File

@ -138,6 +138,11 @@ struct d3d12_resource
struct d3d12_device *device; struct d3d12_device *device;
}; };
static inline bool d3d12_resource_is_buffer(const struct d3d12_resource *resource)
{
return resource->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER;
}
HRESULT d3d12_committed_resource_create(struct d3d12_device *device, HRESULT d3d12_committed_resource_create(struct d3d12_device *device,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags, const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state, const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,

View File

@ -844,6 +844,7 @@ static void test_create_command_queue(void)
static void test_create_committed_resource(void) static void test_create_committed_resource(void)
{ {
D3D12_GPU_VIRTUAL_ADDRESS gpu_address;
D3D12_HEAP_PROPERTIES heap_properties; D3D12_HEAP_PROPERTIES heap_properties;
D3D12_RESOURCE_DESC resource_desc; D3D12_RESOURCE_DESC resource_desc;
ID3D12Device *device, *tmp_device; ID3D12Device *device, *tmp_device;
@ -898,6 +899,9 @@ static void test_create_committed_resource(void)
check_interface(resource, &IID_ID3D12Pageable, TRUE); check_interface(resource, &IID_ID3D12Pageable, TRUE);
check_interface(resource, &IID_ID3D12Resource, TRUE); check_interface(resource, &IID_ID3D12Resource, TRUE);
gpu_address = ID3D12Resource_GetGPUVirtualAddress(resource);
ok(!gpu_address, "Got unexpected GPU virtual address %#"PRIx64".\n", gpu_address);
refcount = ID3D12Resource_Release(resource); refcount = ID3D12Resource_Release(resource);
ok(!refcount, "ID3D12Resource has %u references left.\n", (unsigned int)refcount); ok(!refcount, "ID3D12Resource has %u references left.\n", (unsigned int)refcount);
@ -953,6 +957,9 @@ static void test_create_committed_resource(void)
check_interface(resource, &IID_ID3D12Pageable, TRUE); check_interface(resource, &IID_ID3D12Pageable, TRUE);
check_interface(resource, &IID_ID3D12Resource, TRUE); check_interface(resource, &IID_ID3D12Resource, TRUE);
gpu_address = ID3D12Resource_GetGPUVirtualAddress(resource);
ok(gpu_address, "Got unexpected GPU virtual address %#"PRIx64".\n", gpu_address);
refcount = ID3D12Resource_Release(resource); refcount = ID3D12Resource_Release(resource);
ok(!refcount, "ID3D12Resource has %u references left.\n", (unsigned int)refcount); ok(!refcount, "ID3D12Resource has %u references left.\n", (unsigned int)refcount);