radv: Optimize rebinding the same descriptor set.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 16 Sep 2018 00:17:32 +0000 (02:17 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 16 Sep 2018 10:50:19 +0000 (12:50 +0200)
This makes it cheaper to just change the dynamic offsets with
the same descriptor sets.

Suggested-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/amd/vulkan/radv_cmd_buffer.c

index d492456..2f16832 100644 (file)
@@ -2464,7 +2464,13 @@ void radv_CmdBindDescriptorSets(
        for (unsigned i = 0; i < descriptorSetCount; ++i) {
                unsigned idx = i + firstSet;
                RADV_FROM_HANDLE(radv_descriptor_set, set, pDescriptorSets[i]);
-               radv_bind_descriptor_set(cmd_buffer, pipelineBindPoint, set, idx);
+
+               /* If the set is already bound we only need to update the
+                * (potentially changed) dynamic offsets. */
+               if (descriptors_state->sets[idx] != set ||
+                   !(descriptors_state->valid & (1u << idx))) {
+                       radv_bind_descriptor_set(cmd_buffer, pipelineBindPoint, set, idx);
+               }
 
                for(unsigned j = 0; j < set->layout->dynamic_offset_count; ++j, ++dyn_idx) {
                        unsigned idx = j + layout->set[i + firstSet].dynamic_offset_start;