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