@@ -410,6 +410,46 @@ sha1_update_descriptor_set_layout(struct mesa_sha1 *ctx,
410
410
* just multiple descriptor set layouts pasted together.
411
411
*/
412
412
413
+ void
414
+ tu_pipeline_layout_init (struct tu_pipeline_layout * layout )
415
+ {
416
+ unsigned dynamic_offset_size = 0 ;
417
+
418
+ for (uint32_t set = 0 ; set < layout -> num_sets ; set ++ ) {
419
+ assert (set < MAX_SETS );
420
+ layout -> set [set ].dynamic_offset_start = dynamic_offset_size ;
421
+
422
+ if (layout -> set [set ].layout )
423
+ dynamic_offset_size += layout -> set [set ].layout -> dynamic_offset_size ;
424
+ }
425
+
426
+ layout -> dynamic_offset_size = dynamic_offset_size ;
427
+
428
+ /* We only care about INDEPENDENT_SETS for dynamic-offset descriptors,
429
+ * where all the descriptors from all the sets are combined into one set
430
+ * and we have to provide the dynamic_offset_start dynamically with fast
431
+ * linking.
432
+ */
433
+ if (dynamic_offset_size == 0 ) {
434
+ layout -> independent_sets = false;
435
+ }
436
+
437
+ struct mesa_sha1 ctx ;
438
+ _mesa_sha1_init (& ctx );
439
+ for (unsigned s = 0 ; s < layout -> num_sets ; s ++ ) {
440
+ if (layout -> set [s ].layout )
441
+ sha1_update_descriptor_set_layout (& ctx , layout -> set [s ].layout );
442
+ _mesa_sha1_update (& ctx , & layout -> set [s ].dynamic_offset_start ,
443
+ sizeof (layout -> set [s ].dynamic_offset_start ));
444
+ }
445
+ _mesa_sha1_update (& ctx , & layout -> num_sets , sizeof (layout -> num_sets ));
446
+ _mesa_sha1_update (& ctx , & layout -> push_constant_size ,
447
+ sizeof (layout -> push_constant_size ));
448
+ _mesa_sha1_update (& ctx , & layout -> independent_sets ,
449
+ sizeof (layout -> independent_sets ));
450
+ _mesa_sha1_final (& ctx , layout -> sha1 );
451
+ }
452
+
413
453
VKAPI_ATTR VkResult VKAPI_CALL
414
454
tu_CreatePipelineLayout (VkDevice _device ,
415
455
const VkPipelineLayoutCreateInfo * pCreateInfo ,
@@ -428,23 +468,16 @@ tu_CreatePipelineLayout(VkDevice _device,
428
468
return vk_error (device , VK_ERROR_OUT_OF_HOST_MEMORY );
429
469
430
470
layout -> num_sets = pCreateInfo -> setLayoutCount ;
431
- layout -> dynamic_offset_size = 0 ;
432
-
433
- unsigned dynamic_offset_size = 0 ;
434
-
435
471
for (uint32_t set = 0 ; set < pCreateInfo -> setLayoutCount ; set ++ ) {
436
472
TU_FROM_HANDLE (tu_descriptor_set_layout , set_layout ,
437
473
pCreateInfo -> pSetLayouts [set ]);
438
474
439
475
assert (set < MAX_SETS );
440
476
layout -> set [set ].layout = set_layout ;
441
- layout -> set [set ].dynamic_offset_start = dynamic_offset_size ;
442
- vk_descriptor_set_layout_ref (& set_layout -> vk );
443
-
444
- dynamic_offset_size += set_layout -> dynamic_offset_size ;
477
+ if (set_layout )
478
+ vk_descriptor_set_layout_ref (& set_layout -> vk );
445
479
}
446
480
447
- layout -> dynamic_offset_size = dynamic_offset_size ;
448
481
layout -> push_constant_size = 0 ;
449
482
450
483
for (unsigned i = 0 ; i < pCreateInfo -> pushConstantRangeCount ; ++ i ) {
@@ -454,18 +487,10 @@ tu_CreatePipelineLayout(VkDevice _device,
454
487
}
455
488
456
489
layout -> push_constant_size = align (layout -> push_constant_size , 16 );
490
+ layout -> independent_sets =
491
+ pCreateInfo -> flags & VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT ;
457
492
458
- struct mesa_sha1 ctx ;
459
- _mesa_sha1_init (& ctx );
460
- for (unsigned s = 0 ; s < layout -> num_sets ; s ++ ) {
461
- sha1_update_descriptor_set_layout (& ctx , layout -> set [s ].layout );
462
- _mesa_sha1_update (& ctx , & layout -> set [s ].dynamic_offset_start ,
463
- sizeof (layout -> set [s ].dynamic_offset_start ));
464
- }
465
- _mesa_sha1_update (& ctx , & layout -> num_sets , sizeof (layout -> num_sets ));
466
- _mesa_sha1_update (& ctx , & layout -> push_constant_size ,
467
- sizeof (layout -> push_constant_size ));
468
- _mesa_sha1_final (& ctx , layout -> sha1 );
493
+ tu_pipeline_layout_init (layout );
469
494
470
495
* pPipelineLayout = tu_pipeline_layout_to_handle (layout );
471
496
@@ -483,8 +508,10 @@ tu_DestroyPipelineLayout(VkDevice _device,
483
508
if (!pipeline_layout )
484
509
return ;
485
510
486
- for (uint32_t i = 0 ; i < pipeline_layout -> num_sets ; i ++ )
487
- vk_descriptor_set_layout_unref (& device -> vk , & pipeline_layout -> set [i ].layout -> vk );
511
+ for (uint32_t i = 0 ; i < pipeline_layout -> num_sets ; i ++ ) {
512
+ if (pipeline_layout -> set [i ].layout )
513
+ vk_descriptor_set_layout_unref (& device -> vk , & pipeline_layout -> set [i ].layout -> vk );
514
+ }
488
515
489
516
vk_object_free (& device -> vk , pAllocator , pipeline_layout );
490
517
}
0 commit comments