vk/formats: Document new meaning of anv_format::cpp
[mesa.git] / src / vulkan / meta.c
index f8b66b0b2fe1c702b828fd4f13fcceab19bfe160..2167d29da6a5c476c4ea46a9c0ace88735cd34d1 100644 (file)
@@ -145,28 +145,15 @@ anv_device_init_meta_clear_state(struct anv_device *device)
          .disable_viewport = true,
          .use_rectlist = true
       },
-      &device->clear_state.pipeline);
+      &device->meta_state.clear.pipeline);
 
    anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
-
-   anv_CreateDynamicRasterState((VkDevice) device,
-      &(VkDynamicRsStateCreateInfo) {
-         .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
-      },
-      &device->clear_state.rs_state);
-
-   anv_CreateDynamicColorBlendState((VkDevice) device,
-      &(VkDynamicCbStateCreateInfo) {
-         .sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
-      },
-      &device->clear_state.cb_state);
-
 }
 
 #define NUM_VB_USED 2
 struct anv_saved_state {
-   struct anv_bindings bindings;
-   struct anv_bindings *old_bindings;
+   struct anv_vertex_binding old_vertex_bindings[NUM_VB_USED];
+   struct anv_descriptor_set *old_descriptor_set0;
    struct anv_pipeline *old_pipeline;
    VkDynamicCbState cb_state;
 };
@@ -175,37 +162,24 @@ static void
 anv_cmd_buffer_save(struct anv_cmd_buffer *cmd_buffer,
                     struct anv_saved_state *state)
 {
-   state->old_bindings = cmd_buffer->bindings;
-   cmd_buffer->bindings = &state->bindings;
    state->old_pipeline = cmd_buffer->pipeline;
+   state->old_descriptor_set0 = cmd_buffer->descriptors[0].set;
+   memcpy(state->old_vertex_bindings, cmd_buffer->vertex_bindings,
+          sizeof(state->old_vertex_bindings));
 }
 
 static void
 anv_cmd_buffer_restore(struct anv_cmd_buffer *cmd_buffer,
                        const struct anv_saved_state *state)
 {
-   cmd_buffer->bindings = state->old_bindings;
    cmd_buffer->pipeline = state->old_pipeline;
+   cmd_buffer->descriptors[0].set = state->old_descriptor_set0;
+   memcpy(cmd_buffer->vertex_bindings, state->old_vertex_bindings,
+          sizeof(state->old_vertex_bindings));
 
    cmd_buffer->vb_dirty |= (1 << NUM_VB_USED) - 1;
-   cmd_buffer->dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY |
-                        ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY;
-}
-
-static void
-anv_cmd_buffer_copy_render_targets(struct anv_cmd_buffer *cmd_buffer,
-                                   struct anv_saved_state *state)
-{
-   struct anv_framebuffer *fb = cmd_buffer->framebuffer;
-   struct anv_bindings *old_bindings = state->old_bindings;
-   struct anv_bindings *bindings = cmd_buffer->bindings;
-
-   for (uint32_t i = 0; i < fb->color_attachment_count; i++) {
-      bindings->descriptors[VK_SHADER_STAGE_FRAGMENT].surfaces[i] =
-         old_bindings->descriptors[VK_SHADER_STAGE_FRAGMENT].surfaces[i];
-   }
-
-   cmd_buffer->dirty |= ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY;
+   cmd_buffer->dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY;
+   cmd_buffer->descriptors_dirty |= VK_SHADER_STAGE_VERTEX_BIT;
 }
 
 struct vue_header {
@@ -275,7 +249,6 @@ anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
    };
 
    anv_cmd_buffer_save(cmd_buffer, &saved_state);
-   anv_cmd_buffer_copy_render_targets(cmd_buffer, &saved_state);
 
    anv_CmdBindVertexBuffers((VkCmdBuffer) cmd_buffer, 0, 2,
       (VkBuffer[]) {
@@ -287,21 +260,32 @@ anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
          sizeof(vertex_data)
       });
 
-   if ((VkPipeline) cmd_buffer->pipeline != device->clear_state.pipeline)
+   if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.clear.pipeline)
       anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
-                          VK_PIPELINE_BIND_POINT_GRAPHICS, device->clear_state.pipeline);
+                          VK_PIPELINE_BIND_POINT_GRAPHICS,
+                          device->meta_state.clear.pipeline);
 
    /* We don't need anything here, only set if not already set. */
    if (cmd_buffer->rs_state == NULL)
       anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
                                     VK_STATE_BIND_POINT_RASTER,
-                                    device->clear_state.rs_state);
+                                    device->meta_state.shared.rs_state);
 
    if (cmd_buffer->vp_state == NULL)
       anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
                                     VK_STATE_BIND_POINT_VIEWPORT,
                                     cmd_buffer->framebuffer->vp_state);
 
+   if (cmd_buffer->ds_state == NULL)
+      anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
+                                    VK_STATE_BIND_POINT_DEPTH_STENCIL,
+                                    device->meta_state.shared.ds_state);
+
+   if (cmd_buffer->cb_state == NULL)
+      anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
+                                    VK_STATE_BIND_POINT_COLOR_BLEND,
+                                    device->meta_state.shared.cb_state);
+
    anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, pass->num_clear_layers);
 
    /* Restore API state */
@@ -425,17 +409,15 @@ anv_device_init_meta_blit_state(struct anv_device *device)
       }
    };
    anv_CreateDescriptorSetLayout((VkDevice) device, &ds_layout_info,
-                                 &device->blit_state.ds_layout);
+                                 &device->meta_state.blit.ds_layout);
 
-   VkPipelineLayoutCreateInfo pipeline_layout_info = {
-      .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
-      .descriptorSetCount = 1,
-      .pSetLayouts = &device->blit_state.ds_layout,
-   };
-
-   VkPipelineLayout pipeline_layout;
-   anv_CreatePipelineLayout((VkDevice) device, &pipeline_layout_info,
-                            &pipeline_layout);
+   anv_CreatePipelineLayout((VkDevice) device,
+      &(VkPipelineLayoutCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+         .descriptorSetCount = 1,
+         .pSetLayouts = &device->meta_state.blit.ds_layout,
+      },
+      &device->meta_state.blit.pipeline_layout);
 
    VkPipelineRsStateCreateInfo rs_create_info = {
       .sType = VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
@@ -461,7 +443,7 @@ anv_device_init_meta_blit_state(struct anv_device *device)
       .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
       .pNext = &cb_create_info,
       .flags = 0,
-      .layout = pipeline_layout,
+      .layout = device->meta_state.blit.pipeline_layout,
    };
 
    anv_pipeline_create((VkDevice) device, &pipeline_info,
@@ -472,16 +454,10 @@ anv_device_init_meta_blit_state(struct anv_device *device)
                           .disable_vs = true,
                           .use_rectlist = true
                        },
-                       &device->blit_state.pipeline);
+                       &device->meta_state.blit.pipeline);
 
    anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, vs);
    anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
-
-   anv_CreateDynamicRasterState((VkDevice) device,
-      &(VkDynamicRsStateCreateInfo) {
-         .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
-       },
-      &device->blit_state.rs_state);
 }
 
 static void
@@ -492,21 +468,25 @@ meta_prepare_blit(struct anv_cmd_buffer *cmd_buffer,
 
    anv_cmd_buffer_save(cmd_buffer, saved_state);
 
-   if ((VkPipeline) cmd_buffer->pipeline != device->blit_state.pipeline)
+   if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.blit.pipeline)
       anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
                           VK_PIPELINE_BIND_POINT_GRAPHICS,
-                          device->blit_state.pipeline);
+                          device->meta_state.blit.pipeline);
 
    /* We don't need anything here, only set if not already set. */
    if (cmd_buffer->rs_state == NULL)
       anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
                                     VK_STATE_BIND_POINT_RASTER,
-                                    device->blit_state.rs_state);
+                                    device->meta_state.shared.rs_state);
+   if (cmd_buffer->ds_state == NULL)
+      anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
+                                    VK_STATE_BIND_POINT_DEPTH_STENCIL,
+                                    device->meta_state.shared.ds_state);
 
    saved_state->cb_state = (VkDynamicCbState) cmd_buffer->cb_state;
    anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
                                  VK_STATE_BIND_POINT_COLOR_BLEND,
-                                 device->blit_state.cb_state);
+                                 device->meta_state.shared.cb_state);
 }
 
 struct blit_region {
@@ -593,7 +573,7 @@ meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
    VkDescriptorSet set;
    anv_AllocDescriptorSets((VkDevice) device, 0 /* pool */,
                            VK_DESCRIPTOR_SET_USAGE_ONE_SHOT,
-                           1, &device->blit_state.ds_layout, &set, &count);
+                           1, &device->meta_state.blit.ds_layout, &set, &count);
    anv_UpdateDescriptors((VkDevice) device, set, 1,
       (const void * []) {
          &(VkUpdateImages) {
@@ -665,6 +645,14 @@ meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
    anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, 1);
 
    anv_CmdEndRenderPass((VkCmdBuffer) cmd_buffer, pass);
+
+   /* At the point where we emit the draw call, all data from the
+    * descriptor sets, etc. has been used.  We are free to delete it.
+    */
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DESCRIPTOR_SET, set);
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_FRAMEBUFFER,
+                     (VkFramebuffer) fb);
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_RENDER_PASS, pass);
 }
 
 static void
@@ -774,6 +762,9 @@ do_buffer_copy(struct anv_cmd_buffer *cmd_buffer,
                   &dest_view,
                   (VkOffset3D) { 0, 0, 0 },
                   (VkExtent3D) { width, height, 1 });
+
+   anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) src_image);
+   anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) dest_image);
 }
 
 void anv_CmdCopyBuffer(
@@ -1067,6 +1058,8 @@ void anv_CmdCopyBufferToImage(
                      &dest_view,
                      pRegions[r].imageOffset,
                      pRegions[r].imageExtent);
+
+      anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) src_image);
    }
 
    meta_finish_blit(cmd_buffer, &saved_state);
@@ -1157,6 +1150,8 @@ void anv_CmdCopyImageToBuffer(
                      &dest_view,
                      (VkOffset3D) { 0, 0, 0 },
                      pRegions[r].imageExtent);
+
+      anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) dest_image);
    }
 
    meta_finish_blit(cmd_buffer, &saved_state);
@@ -1232,4 +1227,46 @@ anv_device_init_meta(struct anv_device *device)
 {
    anv_device_init_meta_clear_state(device);
    anv_device_init_meta_blit_state(device);
+
+   anv_CreateDynamicRasterState((VkDevice) device,
+      &(VkDynamicRsStateCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
+      },
+      &device->meta_state.shared.rs_state);
+
+   anv_CreateDynamicColorBlendState((VkDevice) device,
+      &(VkDynamicCbStateCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
+      },
+      &device->meta_state.shared.cb_state);
+
+   anv_CreateDynamicDepthStencilState((VkDevice) device,
+      &(VkDynamicDsStateCreateInfo) {
+         .sType = VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
+      },
+      &device->meta_state.shared.ds_state);
+}
+
+void
+anv_device_finish_meta(struct anv_device *device)
+{
+   /* Clear */
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE,
+                     device->meta_state.clear.pipeline);
+
+   /* Blit */
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE,
+                     device->meta_state.blit.pipeline);
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE_LAYOUT,
+                     device->meta_state.blit.pipeline_layout);
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
+                     device->meta_state.blit.ds_layout);
+
+   /* Shared */
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_RS_STATE,
+                     device->meta_state.shared.rs_state);
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_CB_STATE,
+                     device->meta_state.shared.cb_state);
+   anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_DS_STATE,
+                     device->meta_state.shared.ds_state);
 }