diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 639c88192d1..f42a4acef99 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -794,7 +794,7 @@ anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer, assert(!set->pool || !set->pool->host_only); struct anv_descriptor_set_layout *set_layout = - layout->set[set_index].layout; + layout ? layout->set[set_index].layout: set->layout; anv_cmd_buffer_maybe_dirty_descriptor_mode( cmd_buffer, @@ -1481,7 +1481,13 @@ anv_cmd_buffer_save_state(struct anv_cmd_buffer *cmd_buffer, state->pipeline = pipe_state->pipeline; if (state->flags & ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_0) - state->descriptor_set = pipe_state->descriptors[0]; + state->descriptor_set[0] = pipe_state->descriptors[0]; + + if (state->flags & ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_ALL) { + for (uint32_t i = 0; i < MAX_SETS; i++) { + state->descriptor_set[i] = pipe_state->descriptors[i]; + } + } if (state->flags & ANV_CMD_SAVED_STATE_PUSH_CONSTANTS) { memcpy(state->push_constants, pipe_state->push_constants.client_data, @@ -1510,14 +1516,27 @@ anv_cmd_buffer_restore_state(struct anv_cmd_buffer *cmd_buffer, } if (state->flags & ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_0) { - if (state->descriptor_set) { + if (state->descriptor_set[0]) { anv_cmd_buffer_bind_descriptor_set(cmd_buffer, bind_point, NULL, 0, - state->descriptor_set, NULL, NULL); + state->descriptor_set[0], NULL, + NULL); } else { pipe_state->descriptors[0] = NULL; } } + if (state->flags & ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_ALL) { + for (uint32_t i = 0; i < MAX_SETS; i++) { + if (state->descriptor_set[i]) { + anv_cmd_buffer_bind_descriptor_set(cmd_buffer, bind_point, NULL, i, + state->descriptor_set[i], NULL, + NULL); + } else { + pipe_state->descriptors[i] = NULL; + } + } + } + if (state->flags & ANV_CMD_SAVED_STATE_PUSH_CONSTANTS) { VkPushConstantsInfoKHR push_info = { .sType = VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index e7d4f1688a5..3c820e607da 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -4427,14 +4427,15 @@ anv_cmd_buffer_get_view_count(struct anv_cmd_buffer *cmd_buffer) enum anv_cmd_saved_state_flags { ANV_CMD_SAVED_STATE_COMPUTE_PIPELINE = BITFIELD_BIT(0), ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_0 = BITFIELD_BIT(1), - ANV_CMD_SAVED_STATE_PUSH_CONSTANTS = BITFIELD_BIT(2), + ANV_CMD_SAVED_STATE_DESCRIPTOR_SET_ALL = BITFIELD_BIT(2), + ANV_CMD_SAVED_STATE_PUSH_CONSTANTS = BITFIELD_BIT(3), }; struct anv_cmd_saved_state { uint32_t flags; struct anv_pipeline *pipeline; - struct anv_descriptor_set *descriptor_set; + struct anv_descriptor_set *descriptor_set[MAX_SETS]; uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE]; };