diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-05-12 14:00:44 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2020-05-12 14:05:09 +0300 |
commit | fce104514e0247c9b2165293b8395e11053a29ff (patch) | |
tree | 902b7ad751c0e02ed71232e08a5a9abdfb28f663 | |
parent | 2e7587bcafdf4125240dec57cddb12015192bee6 (diff) |
vkd3d: Add resource flags and barrier flags for RT.khr-raytracing
Unfortunately, D3D12 uses the UNORDERED_ACCESS state to overload
ray-tracing barriers.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
-rw-r--r-- | libs/vkd3d/command.c | 23 | ||||
-rw-r--r-- | libs/vkd3d/resource.c | 3 | ||||
-rw-r--r-- | libs/vkd3d/vkd3d_private.h | 7 |
3 files changed, 33 insertions, 0 deletions
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 600195d7..d1cf74bf 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -2291,7 +2291,11 @@ static void vk_access_and_stage_flags_from_d3d12_resource_state(const struct d3d } if (vk_queue_flags & VK_QUEUE_COMPUTE_BIT) + { queue_shader_stages |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + if (device->device_info.ray_tracing_features.rayTracing) + queue_shader_stages |= VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR; + } if (state_mask == D3D12_RESOURCE_STATE_COMMON) { @@ -2332,6 +2336,25 @@ static void vk_access_and_stage_flags_from_d3d12_resource_state(const struct d3d case D3D12_RESOURCE_STATE_UNORDERED_ACCESS: *stages |= queue_shader_stages; *access |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; + + if (vk_queue_flags & VK_QUEUE_COMPUTE_BIT) + { + /* It is somewhat unclear which stages correspond to scratch memory read/write. + * Just be conservative for now. */ + if (resource && d3d12_resource_is_acceleration_structure(resource)) + { + *stages |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR; + *access |= VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | + VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR; + } + else + { + /* Dupe for now, this should be the scratch memory path. */ + *stages |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR; + *access |= VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | + VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR; + } + } break; case D3D12_RESOURCE_STATE_DEPTH_WRITE: diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 0455f1bf..18c1aedc 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -929,6 +929,9 @@ HRESULT vkd3d_create_buffer(struct d3d12_device *device, if (device->device_info.buffer_device_address_features.bufferDeviceAddress) buffer_info.usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR; + + if (device->device_info.ray_tracing_features.rayTracing) + buffer_info.usage |= VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR; } if (!(desc->Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE)) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index b70735df..6a97f618 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -517,6 +517,13 @@ static inline bool d3d12_resource_is_buffer(const struct d3d12_resource *resourc return resource->desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER; } +static inline bool d3d12_resource_is_acceleration_structure(const struct d3d12_resource *resource) +{ + /* Acceleration structures must always be in this state from creation and can never leave or enter it. + * All synchronization happens via UAV barriers. */ + return resource->initial_state == D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE; +} + static inline bool d3d12_resource_is_texture(const struct d3d12_resource *resource) { return resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER; |