diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 0db42bbe..64cea8f7 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -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 | diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 5165d7d4..3e57109a 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -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;