@@ -851,6 +851,7 @@ bool reshade::d3d12::device_impl::create_pipeline(api::pipeline_layout layout, u
851
851
uint32_t max_attribute_size = 2 * sizeof (float ); // Default triangle attributes
852
852
uint32_t max_recursion_depth = 1 ;
853
853
api::pipeline_flags flags = api::pipeline_flags::none;
854
+ bool ray_tracing = false ;
854
855
855
856
for (uint32_t i = 0 ; i < subobject_count; ++i)
856
857
{
@@ -986,14 +987,17 @@ bool reshade::d3d12::device_impl::create_pipeline(api::pipeline_layout layout, u
986
987
case api::pipeline_subobject_type::max_payload_size:
987
988
assert (subobjects[i].count == 1 );
988
989
max_payload_size = *static_cast <const uint32_t *>(subobjects[i].data );
990
+ ray_tracing = true ;
989
991
break ;
990
992
case api::pipeline_subobject_type::max_attribute_size:
991
993
assert (subobjects[i].count == 1 );
992
994
max_attribute_size = *static_cast <const uint32_t *>(subobjects[i].data );
995
+ ray_tracing = true ;
993
996
break ;
994
997
case api::pipeline_subobject_type::max_recursion_depth:
995
998
assert (subobjects[i].count == 1 );
996
999
max_recursion_depth = *static_cast <const uint32_t *>(subobjects[i].data );
1000
+ ray_tracing = true ;
997
1001
break ;
998
1002
case api::pipeline_subobject_type::flags:
999
1003
assert (subobjects[i].count == 1 );
@@ -1005,7 +1009,7 @@ bool reshade::d3d12::device_impl::create_pipeline(api::pipeline_layout layout, u
1005
1009
}
1006
1010
}
1007
1011
1008
- if (!raygen_desc.empty () || !shader_groups.empty ())
1012
+ if (ray_tracing || !raygen_desc.empty () || !shader_groups.empty ())
1009
1013
{
1010
1014
com_ptr<ID3D12Device5> device5;
1011
1015
if (SUCCEEDED (_orig->QueryInterface (&device5)))
@@ -1316,7 +1320,7 @@ void reshade::d3d12::device_impl::destroy_pipeline(api::pipeline pipeline)
1316
1320
reinterpret_cast <IUnknown *>(pipeline.handle )->Release ();
1317
1321
}
1318
1322
1319
- bool reshade::d3d12::device_impl::create_pipeline_layout (uint32_t param_count, const api::pipeline_layout_param *params, api::pipeline_layout *out_layout)
1323
+ bool reshade::d3d12::device_impl::create_pipeline_layout (uint32_t param_count, const api::pipeline_layout_param *params, api::pipeline_layout *out_layout, D3D12_ROOT_SIGNATURE_FLAGS flags )
1320
1324
{
1321
1325
*out_layout = { 0 };
1322
1326
@@ -1470,29 +1474,34 @@ bool reshade::d3d12::device_impl::create_pipeline_layout(uint32_t param_count, c
1470
1474
internal_desc.pParameters = internal_params.data ();
1471
1475
internal_desc.NumStaticSamplers = static_cast <uint32_t >(internal_static_samplers.size ());
1472
1476
internal_desc.pStaticSamplers = internal_static_samplers.data ();
1473
- internal_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
1474
-
1475
- if ((global_visibility_mask & api::shader_stage::vertex) == 0 )
1476
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_VERTEX_SHADER_ROOT_ACCESS;
1477
- if ((global_visibility_mask & api::shader_stage::hull) == 0 )
1478
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS;
1479
- if ((global_visibility_mask & api::shader_stage::domain) == 0 )
1480
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS;
1481
- if ((global_visibility_mask & api::shader_stage::geometry) == 0 )
1482
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
1483
- if ((global_visibility_mask & api::shader_stage::pixel) == 0 )
1484
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS;
1485
- if ((global_visibility_mask & api::shader_stage::amplification) == 0 )
1486
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_AMPLIFICATION_SHADER_ROOT_ACCESS;
1487
- if ((global_visibility_mask & api::shader_stage::mesh) == 0 )
1488
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_MESH_SHADER_ROOT_ACCESS;
1489
-
1490
- if (std::pair<D3D12_FEATURE_DATA_SHADER_MODEL, D3D12_FEATURE_DATA_D3D12_OPTIONS> options = { { D3D_SHADER_MODEL_6_6 }, {} };
1491
- SUCCEEDED (_orig->CheckFeatureSupport (D3D12_FEATURE_SHADER_MODEL, &options.first , sizeof (options.first ))) &&
1492
- SUCCEEDED (_orig->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS, &options.second , sizeof (options.second ))) &&
1493
- options.first .HighestShaderModel >= D3D_SHADER_MODEL_6_6 &&
1494
- options.second .ResourceBindingTier >= D3D12_RESOURCE_BINDING_TIER_3)
1495
- internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED | D3D12_ROOT_SIGNATURE_FLAG_SAMPLER_HEAP_DIRECTLY_INDEXED;
1477
+ internal_desc.Flags = flags;
1478
+
1479
+ if (flags == D3D12_ROOT_SIGNATURE_FLAG_NONE)
1480
+ {
1481
+ internal_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
1482
+
1483
+ if ((global_visibility_mask & api::shader_stage::vertex) == 0 )
1484
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_VERTEX_SHADER_ROOT_ACCESS;
1485
+ if ((global_visibility_mask & api::shader_stage::hull) == 0 )
1486
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS;
1487
+ if ((global_visibility_mask & api::shader_stage::domain) == 0 )
1488
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS;
1489
+ if ((global_visibility_mask & api::shader_stage::geometry) == 0 )
1490
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
1491
+ if ((global_visibility_mask & api::shader_stage::pixel) == 0 )
1492
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS;
1493
+ if ((global_visibility_mask & api::shader_stage::amplification) == 0 )
1494
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_AMPLIFICATION_SHADER_ROOT_ACCESS;
1495
+ if ((global_visibility_mask & api::shader_stage::mesh) == 0 )
1496
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_DENY_MESH_SHADER_ROOT_ACCESS;
1497
+
1498
+ if (std::pair<D3D12_FEATURE_DATA_SHADER_MODEL, D3D12_FEATURE_DATA_D3D12_OPTIONS> options = { { D3D_SHADER_MODEL_6_6 }, {} };
1499
+ SUCCEEDED (_orig->CheckFeatureSupport (D3D12_FEATURE_SHADER_MODEL, &options.first , sizeof (options.first ))) &&
1500
+ SUCCEEDED (_orig->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS, &options.second , sizeof (options.second ))) &&
1501
+ options.first .HighestShaderModel >= D3D_SHADER_MODEL_6_6 &&
1502
+ options.second .ResourceBindingTier >= D3D12_RESOURCE_BINDING_TIER_3)
1503
+ internal_desc.Flags |= D3D12_ROOT_SIGNATURE_FLAG_CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED | D3D12_ROOT_SIGNATURE_FLAG_SAMPLER_HEAP_DIRECTLY_INDEXED;
1504
+ }
1496
1505
1497
1506
com_ptr<ID3DBlob> signature_blob, error_blob;
1498
1507
com_ptr<ID3D12RootSignature> signature;
@@ -1532,6 +1541,10 @@ bool reshade::d3d12::device_impl::create_pipeline_layout(uint32_t param_count, c
1532
1541
return false ;
1533
1542
}
1534
1543
}
1544
+ bool reshade::d3d12::device_impl::create_pipeline_layout (uint32_t param_count, const api::pipeline_layout_param *params, api::pipeline_layout *out_layout)
1545
+ {
1546
+ return create_pipeline_layout (param_count, params, out_layout, D3D12_ROOT_SIGNATURE_FLAG_NONE);
1547
+ }
1535
1548
void reshade::d3d12::device_impl::destroy_pipeline_layout (api::pipeline_layout layout)
1536
1549
{
1537
1550
if (layout == 0 )
0 commit comments