vkd3d: Store set layout array in root signature.

With RTPSOs we might have to create static sampler sets for local root
signatures. In this case we will have to create a compatible pipeline
layout which is equal to global pipeline layout, except for an extra
set.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-08-24 15:50:52 +02:00
parent ac9d98b2b4
commit b661c9b8ba
2 changed files with 11 additions and 7 deletions

View File

@ -1102,7 +1102,6 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
{
const VkPhysicalDeviceProperties *vk_device_properties = &device->device_info.properties2.properties;
const struct vkd3d_bindless_state *bindless_state = &device->bindless_state;
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
struct vkd3d_descriptor_set_context context;
struct d3d12_root_signature_info info;
unsigned int i;
@ -1143,7 +1142,7 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
return hr;
for (i = 0; i < bindless_state->set_count; i++)
set_layouts[context.vk_set++] = bindless_state->set_info[i].vk_set_layout;
root_signature->set_layouts[context.vk_set++] = bindless_state->set_info[i].vk_set_layout;
if (FAILED(hr = d3d12_root_signature_init_static_samplers(root_signature, desc,
&context, &root_signature->vk_sampler_descriptor_layout)))
@ -1152,7 +1151,7 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
if (root_signature->vk_sampler_descriptor_layout)
{
assert(context.vk_set < VKD3D_MAX_DESCRIPTOR_SETS);
set_layouts[context.vk_set] = root_signature->vk_sampler_descriptor_layout;
root_signature->set_layouts[context.vk_set] = root_signature->vk_sampler_descriptor_layout;
root_signature->sampler_descriptor_set = context.vk_set;
context.vk_binding = 0;
@ -1192,7 +1191,7 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
if (root_signature->vk_root_descriptor_layout)
{
assert(context.vk_set < VKD3D_MAX_DESCRIPTOR_SETS);
set_layouts[context.vk_set] = root_signature->vk_root_descriptor_layout;
root_signature->set_layouts[context.vk_set] = root_signature->vk_root_descriptor_layout;
root_signature->root_descriptor_set = context.vk_set;
context.vk_binding = 0;
@ -1215,14 +1214,16 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
* For graphics we can generally rely on visibility mask, but not so for compute and raygen,
* since they use ALL visibility. */
root_signature->num_set_layouts = context.vk_set;
if (FAILED(hr = vkd3d_create_pipeline_layout_for_stage_mask(
device, context.vk_set, set_layouts,
device, root_signature->num_set_layouts, root_signature->set_layouts,
&root_signature->push_constant_range,
VK_SHADER_STAGE_ALL_GRAPHICS, &root_signature->graphics)))
return hr;
if (FAILED(hr = vkd3d_create_pipeline_layout_for_stage_mask(
device, context.vk_set, set_layouts,
device, root_signature->num_set_layouts, root_signature->set_layouts,
&root_signature->push_constant_range,
VK_SHADER_STAGE_COMPUTE_BIT, &root_signature->compute)))
return hr;
@ -1230,7 +1231,7 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
if (d3d12_device_supports_ray_tracing_tier_1_0(device))
{
if (FAILED(hr = vkd3d_create_pipeline_layout_for_stage_mask(
device, context.vk_set, set_layouts,
device, root_signature->num_set_layouts, root_signature->set_layouts,
&root_signature->push_constant_range,
VK_SHADER_STAGE_RAYGEN_BIT_KHR |
VK_SHADER_STAGE_MISS_BIT_KHR |

View File

@ -1334,6 +1334,9 @@ struct d3d12_root_signature
struct vkd3d_shader_descriptor_binding descriptor_qa_global_info;
#endif
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
uint32_t num_set_layouts;
uint32_t descriptor_table_offset;
uint32_t descriptor_table_count;