Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2020-05-12 14:00:44 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2020-05-12 14:05:09 +0300
commitfce104514e0247c9b2165293b8395e11053a29ff (patch)
tree902b7ad751c0e02ed71232e08a5a9abdfb28f663
parent2e7587bcafdf4125240dec57cddb12015192bee6 (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.c23
-rw-r--r--libs/vkd3d/resource.c3
-rw-r--r--libs/vkd3d/vkd3d_private.h7
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;