radv: Dirty all descriptors sets when changing the pipeline.
[mesa.git] / src / amd / vulkan / radv_meta.c
index 3155f07f6abb251dbb46388893bc7b761cf8db90..263181a57f2f0b4b922255517ed099808c1227bf 100644 (file)
 #include <pwd.h>
 #include <sys/stat.h>
 
-void
+static void
 radv_meta_save_novertex(struct radv_meta_saved_state *state,
               const struct radv_cmd_buffer *cmd_buffer,
               uint32_t dynamic_mask)
 {
        state->old_pipeline = cmd_buffer->state.pipeline;
+       state->old_descriptor_set0 = cmd_buffer->state.descriptors[0];
 
        state->dynamic_mask = dynamic_mask;
        radv_dynamic_state_copy(&state->dynamic, &cmd_buffer->state.dynamic,
@@ -45,26 +46,14 @@ radv_meta_save_novertex(struct radv_meta_saved_state *state,
        state->vertex_saved = false;
 }
 
-void
-radv_meta_save(struct radv_meta_saved_state *state,
-              const struct radv_cmd_buffer *cmd_buffer,
-              uint32_t dynamic_mask)
-{
-       radv_meta_save_novertex(state, cmd_buffer, dynamic_mask);
-       state->old_descriptor_set0 = cmd_buffer->state.descriptors[0];
-       memcpy(state->old_vertex_bindings, cmd_buffer->state.vertex_bindings,
-              sizeof(state->old_vertex_bindings));
-       state->vertex_saved = true;
-}
-
 void
 radv_meta_restore(const struct radv_meta_saved_state *state,
                  struct radv_cmd_buffer *cmd_buffer)
 {
-       cmd_buffer->state.pipeline = state->old_pipeline;
+       radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_GRAPHICS,
+                            radv_pipeline_to_handle(state->old_pipeline));
+       cmd_buffer->state.descriptors[0] = state->old_descriptor_set0;
        if (state->vertex_saved) {
-               cmd_buffer->state.descriptors[0] = state->old_descriptor_set0;
-               cmd_buffer->state.descriptors_dirty |= (1u << 0);
                memcpy(cmd_buffer->state.vertex_bindings, state->old_vertex_bindings,
                       sizeof(state->old_vertex_bindings));
                cmd_buffer->state.vb_dirty |= (1 << RADV_META_VERTEX_BINDING_COUNT) - 1;
@@ -125,7 +114,6 @@ radv_meta_restore_compute(const struct radv_meta_saved_compute_state *state,
                             radv_pipeline_to_handle(state->old_pipeline));
 
        cmd_buffer->state.descriptors[0] = state->old_descriptor_set0;
-       cmd_buffer->state.descriptors_dirty |= (1u << 0);
 
        if (push_constant_size) {
                memcpy(cmd_buffer->push_constants, state->push_constants, push_constant_size);
@@ -350,8 +338,14 @@ radv_device_init_meta(struct radv_device *device)
        result = radv_device_init_meta_resolve_compute_state(device);
        if (result != VK_SUCCESS)
                goto fail_resolve_compute;
+
+       result = radv_device_init_meta_resolve_fragment_state(device);
+       if (result != VK_SUCCESS)
+               goto fail_resolve_fragment;
        return VK_SUCCESS;
 
+fail_resolve_fragment:
+       radv_device_finish_meta_resolve_compute_state(device);
 fail_resolve_compute:
        radv_device_finish_meta_fast_clear_flush_state(device);
 fail_fast_clear:
@@ -388,6 +382,7 @@ radv_device_finish_meta(struct radv_device *device)
        radv_device_finish_meta_buffer_state(device);
        radv_device_finish_meta_fast_clear_flush_state(device);
        radv_device_finish_meta_resolve_compute_state(device);
+       radv_device_finish_meta_resolve_fragment_state(device);
 
        radv_store_meta_pipeline(device);
        radv_pipeline_cache_finish(&device->meta_state.cache);
@@ -398,17 +393,6 @@ radv_device_finish_meta(struct radv_device *device)
  * reset and any scissors disabled. The rest of the dynamic state
  * should have no effect.
  */
-void
-radv_meta_save_graphics_reset_vport_scissor(struct radv_meta_saved_state *saved_state,
-                                           struct radv_cmd_buffer *cmd_buffer)
-{
-       uint32_t dirty_state = (1 << VK_DYNAMIC_STATE_VIEWPORT) | (1 << VK_DYNAMIC_STATE_SCISSOR);
-       radv_meta_save(saved_state, cmd_buffer, dirty_state);
-       cmd_buffer->state.dynamic.viewport.count = 0;
-       cmd_buffer->state.dynamic.scissor.count = 0;
-       cmd_buffer->state.dirty |= dirty_state;
-}
-
 void
 radv_meta_save_graphics_reset_vport_scissor_novertex(struct radv_meta_saved_state *saved_state,
                                                     struct radv_cmd_buffer *cmd_buffer)
@@ -468,7 +452,7 @@ radv_meta_build_nir_vs_generate_vertices(void)
        nir_variable *v_position;
 
        nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, NULL);
-       b.shader->info->name = ralloc_strdup(b.shader, "meta_vs_gen_verts");
+       b.shader->info.name = ralloc_strdup(b.shader, "meta_vs_gen_verts");
 
        nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b);
 
@@ -487,7 +471,7 @@ radv_meta_build_nir_fs_noop(void)
        nir_builder b;
 
        nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL);
-       b.shader->info->name = ralloc_asprintf(b.shader,
+       b.shader->info.name = ralloc_asprintf(b.shader,
                                               "meta_noop_fs");
 
        return b.shader;