radv: re-apply "Optimize rebinding the same descriptor set."
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 2 Aug 2019 07:56:32 +0000 (09:56 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 2 Aug 2019 07:56:55 +0000 (09:56 +0200)
This makes it cheaper to just change the dynamic offsets with
the same descriptor sets.

This optimization has been reverted a while back because of
random GPU hangs on GFX9, no it looks fine, at least CTS no longer
hangs on GFX9 and it doesn't hang on GFX10 as well.

It fixes a performance problem with Wolfenstein Youngblood.

Suggested-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
src/amd/vulkan/radv_cmd_buffer.c

index da373d39fdd30c8c6b7ce4cfcb5cbfacdc717dc5..b5c1476ed2290371b1cc29d303952f492a3c8d74 100644 (file)
@@ -3350,7 +3350,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;