From 58615cd5dc9faf24183d6a7e95c743b23cd6a853 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 12 Mar 2021 11:15:27 +0100 Subject: [PATCH] vkd3d: Allow devices with recursion of 1 to be accepted. We can fail RTPSOs later if they for whatever reason use recursion. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/device.c | 5 +++-- libs/vkd3d/raytracing_pipeline.c | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 4e3a1a78..86a651ec 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -4454,9 +4454,10 @@ static D3D12_RAYTRACING_TIER d3d12_device_determine_ray_tracing_tier(struct d3d1 * but Vulkan is essentially specced to match DXR directly. */ info->ray_tracing_pipeline_properties.shaderGroupHandleSize == D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES && info->ray_tracing_pipeline_properties.shaderGroupBaseAlignment <= D3D12_RAYTRACING_SHADER_TABLE_BYTE_ALIGNMENT && - info->ray_tracing_pipeline_properties.shaderGroupHandleAlignment <= D3D12_RAYTRACING_SHADER_RECORD_BYTE_ALIGNMENT && - info->ray_tracing_pipeline_properties.maxRayRecursionDepth >= D3D12_RAYTRACING_MAX_DECLARABLE_TRACE_RECURSION_DEPTH) + info->ray_tracing_pipeline_properties.shaderGroupHandleAlignment <= D3D12_RAYTRACING_SHADER_RECORD_BYTE_ALIGNMENT) { + /* DXR has 31 ray depth min-spec, but no content uses that. We will instead pass through implementations + * which only expose 1 level of recursion and fail PSO compiles if they actually exceed device limits. */ supports_vbo_formats = true; for (i = 0; i < ARRAY_SIZE(required_vbo_formats); i++) { diff --git a/libs/vkd3d/raytracing_pipeline.c b/libs/vkd3d/raytracing_pipeline.c index 6ba1f422..acd979e9 100644 --- a/libs/vkd3d/raytracing_pipeline.c +++ b/libs/vkd3d/raytracing_pipeline.c @@ -813,6 +813,17 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob pipeline_create_info.pDynamicState = &dynamic_state; pipeline_create_info.maxPipelineRayRecursionDepth = data->pipeline_config->MaxTraceRecursionDepth; + if (data->pipeline_config->MaxTraceRecursionDepth > + object->device->device_info.ray_tracing_pipeline_properties.maxRayRecursionDepth) + { + /* We cannot do anything about this, since we let sub-minspec devices through, + * and this content actually tries to use recursion. */ + ERR("MaxTraceRecursionDepth %u exceeds device limit of %u.\n", + data->pipeline_config->MaxTraceRecursionDepth, + object->device->device_info.ray_tracing_pipeline_properties.maxRayRecursionDepth); + return E_INVALIDARG; + } + dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; dynamic_state.pNext = NULL; dynamic_state.flags = 0;