@@ -515,42 +515,47 @@ static void vulkan_draw_triangles(vk_t *vk, const struct vk_draw_triangles *call
515515
516516 /* Upload descriptors */
517517 {
518- VkDescriptorSet set ;
519- /* Upload UBO */
520- struct vk_buffer_range range ;
521- float * mvp_data_ptr = NULL ;
518+ VkImageView call_view = call -> texture ? call -> texture -> view : VK_NULL_HANDLE ;
522519
523- if (!vulkan_buffer_chain_alloc (vk -> context , & vk -> chain -> ubo ,
524- call -> uniform_size , & range ))
525- return ;
520+ /* Check if we can skip descriptor work */
521+ if ( call_view != vk -> tracker .view
522+ || call -> sampler != vk -> tracker .sampler
523+ || call -> uniform_size > sizeof (vk -> tracker .mvp )
524+ || memcmp (call -> uniform , & vk -> tracker .mvp , call -> uniform_size ) != 0 )
525+ {
526+ VkDescriptorSet set ;
527+ struct vk_buffer_range range ;
526528
527- memcpy (range .data , call -> uniform , call -> uniform_size );
529+ if (!vulkan_buffer_chain_alloc (vk -> context , & vk -> chain -> ubo ,
530+ call -> uniform_size , & range ))
531+ return ;
528532
529- set = vulkan_descriptor_manager_alloc (
530- vk -> context -> device ,
531- & vk -> chain -> descriptor_manager );
533+ memcpy (range .data , call -> uniform , call -> uniform_size );
532534
533- vulkan_write_quad_descriptors (
534- vk -> context -> device ,
535- set ,
536- range .buffer ,
537- range .offset ,
538- call -> uniform_size ,
539- call -> texture ,
540- call -> sampler );
535+ set = vulkan_descriptor_manager_alloc (
536+ vk -> context -> device ,
537+ & vk -> chain -> descriptor_manager );
541538
542- vkCmdBindDescriptorSets (vk -> cmd ,
543- VK_PIPELINE_BIND_POINT_GRAPHICS ,
544- vk -> pipelines .layout , 0 ,
545- 1 , & set , 0 , NULL );
539+ vulkan_write_quad_descriptors (
540+ vk -> context -> device ,
541+ set ,
542+ range .buffer ,
543+ range .offset ,
544+ call -> uniform_size ,
545+ call -> texture ,
546+ call -> sampler );
546547
547- vk -> tracker .view = VK_NULL_HANDLE ;
548- vk -> tracker .sampler = VK_NULL_HANDLE ;
549- for (
550- mvp_data_ptr = & vk -> tracker .mvp .data [0 ]
551- ; mvp_data_ptr < vk -> tracker .mvp .data + 16
552- ; mvp_data_ptr ++ )
553- * mvp_data_ptr = 0.0f ;
548+ vkCmdBindDescriptorSets (vk -> cmd ,
549+ VK_PIPELINE_BIND_POINT_GRAPHICS ,
550+ vk -> pipelines .layout , 0 ,
551+ 1 , & set , 0 , NULL );
552+
553+ /* Update tracker with what we just bound */
554+ vk -> tracker .view = call_view ;
555+ vk -> tracker .sampler = call -> sampler ;
556+ if (call -> uniform_size <= sizeof (vk -> tracker .mvp ))
557+ memcpy (& vk -> tracker .mvp , call -> uniform , call -> uniform_size );
558+ }
554559 }
555560
556561 /* VBO is already uploaded. */
@@ -4391,19 +4396,12 @@ static void vulkan_draw_quad(vk_t *vk, const struct vk_draw_quad *quad)
43914396 VkDescriptorSet set ;
43924397 struct vk_buffer_range range ;
43934398
4394- if (!vulkan_buffer_chain_alloc (vk -> context , & vk -> chain -> ubo ,
4395- sizeof (* quad -> mvp ), & range ))
4396- return ;
4397-
43984399 if (
43994400 (memcmp (quad -> mvp ,
4400- & vk -> tracker .mvp , sizeof (* quad -> mvp )) = = 0 )
4401+ & vk -> tracker .mvp , sizeof (* quad -> mvp )) ! = 0 )
44014402 || quad -> texture -> view != vk -> tracker .view
44024403 || quad -> sampler != vk -> tracker .sampler )
44034404 {
4404- /* Upload UBO */
4405- struct vk_buffer_range range ;
4406-
44074405 if (!vulkan_buffer_chain_alloc (vk -> context , & vk -> chain -> ubo ,
44084406 sizeof (* quad -> mvp ), & range ))
44094407 return ;
@@ -4665,7 +4663,7 @@ static bool vulkan_frame(void *data, const void *frame,
46654663 uint64_t frame_count ,
46664664 unsigned pitch , const char * msg , video_frame_info_t * video_info )
46674665{
4668- int i , j , k ;
4666+ int j , k ;
46694667 VkSubmitInfo submit_info ;
46704668 VkClearValue clear_color ;
46714669 VkRenderPassBeginInfo rp_info ;
@@ -4759,10 +4757,6 @@ static bool vulkan_frame(void *data, const void *frame,
47594757 vk -> tracker .scissor .extent .height = 0 ;
47604758 vk -> flags &= ~VK_FLAG_TRACKER_USE_SCISSOR ;
47614759 vk -> tracker .pipeline = VK_NULL_HANDLE ;
4762- vk -> tracker .view = VK_NULL_HANDLE ;
4763- vk -> tracker .sampler = VK_NULL_HANDLE ;
4764- for (i = 0 ; i < 16 ; i ++ )
4765- vk -> tracker .mvp .data [i ] = 0.0f ;
47664760
47674761 waits_for_semaphores =
47684762 (vk -> flags & VK_FLAG_HW_ENABLE )
0 commit comments