anv/cmd_buffer: Refactor surface state relocation handling
[mesa.git] / src / intel / vulkan / genX_cmd_buffer.c
index 29762f8ead7b2c8894f3a86f2594b618a80b193d..3a2782c8c9f48fdd592efcc3cb3cdf2e8a749f76 100644 (file)
@@ -151,6 +151,29 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer)
    }
 }
 
+static void
+add_surface_state_reloc(struct anv_cmd_buffer *cmd_buffer,
+                        struct anv_state state,
+                        struct anv_bo *bo, uint32_t offset)
+{
+   const struct isl_device *isl_dev = &cmd_buffer->device->isl_dev;
+
+   anv_reloc_list_add(&cmd_buffer->surface_relocs, &cmd_buffer->pool->alloc,
+                      state.offset + isl_dev->ss.addr_offset, bo, offset);
+}
+
+static void
+add_image_view_relocs(struct anv_cmd_buffer *cmd_buffer,
+                      const struct anv_image_view *iview,
+                      struct anv_state state)
+{
+   const struct isl_device *isl_dev = &cmd_buffer->device->isl_dev;
+
+   anv_reloc_list_add(&cmd_buffer->surface_relocs, &cmd_buffer->pool->alloc,
+                      state.offset + isl_dev->ss.addr_offset,
+                      iview->bo, iview->offset);
+}
+
 /**
  * Setup anv_cmd_state::attachments for vkCmdBeginRenderPass.
  */
@@ -180,18 +203,19 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
    }
 
    bool need_null_state = false;
-   for (uint32_t s = 0; s < pass->subpass_count; ++s) {
-      if (pass->subpasses[s].color_count == 0) {
-         need_null_state = true;
-         break;
-      }
-   }
-
-   unsigned num_states = need_null_state;
+   unsigned num_states = 0;
    for (uint32_t i = 0; i < pass->attachment_count; ++i) {
-      if (vk_format_is_color(pass->attachments[i].format))
+      if (vk_format_is_color(pass->attachments[i].format)) {
          num_states++;
+      } else {
+         /* We need a null state for any depth-stencil-only subpasses.
+          * Importantly, this includes depth/stencil clears so we create one
+          * whenever we have depth or stencil
+          */
+         need_null_state = true;
+      }
    }
+   num_states += need_null_state;
 
    const uint32_t ss_stride = align_u32(isl_dev->ss.size, isl_dev->ss.align);
    state->render_pass_states =
@@ -277,8 +301,8 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
                                 .view = &view,
                                 .mocs = cmd_buffer->device->default_mocs);
 
-            anv_cmd_buffer_add_surface_state_reloc(cmd_buffer,
-               state->attachments[i].color_rt_state, iview->bo, iview->offset);
+            add_image_view_relocs(cmd_buffer, iview,
+                                  state->attachments[i].color_rt_state);
          }
       }
 
@@ -319,12 +343,11 @@ genX(BeginCommandBuffer)(
 
    if (cmd_buffer->usage_flags &
        VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
-      cmd_buffer->state.framebuffer =
-         anv_framebuffer_from_handle(pBeginInfo->pInheritanceInfo->framebuffer);
       cmd_buffer->state.pass =
          anv_render_pass_from_handle(pBeginInfo->pInheritanceInfo->renderPass);
       cmd_buffer->state.subpass =
          &cmd_buffer->state.pass->subpasses[pBeginInfo->pInheritanceInfo->subpass];
+      cmd_buffer->state.framebuffer = NULL;
 
       genX(cmd_buffer_setup_attachments)(cmd_buffer, cmd_buffer->state.pass,
                                          NULL, NULL);
@@ -827,8 +850,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
                                     format, bo_offset, 12, 1);
 
       bt_map[0] = surface_state.offset + state_offset;
-      anv_cmd_buffer_add_surface_state_reloc(cmd_buffer, surface_state,
-                                             bo, bo_offset);
+      add_surface_state_reloc(cmd_buffer, surface_state, bo, bo_offset);
    }
 
    if (map->surface_count == 0)
@@ -848,8 +870,6 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       struct anv_pipeline_binding *binding = &map->surface_to_descriptor[s];
 
       struct anv_state surface_state;
-      struct anv_bo *bo;
-      uint32_t bo_offset;
 
       if (binding->set == ANV_DESCRIPTOR_SET_COLOR_ATTACHMENTS) {
          /* Color attachment binding */
@@ -881,15 +901,13 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
          surface_state = desc->image_view->sampler_surface_state;
          assert(surface_state.alloc_size);
-         bo = desc->image_view->bo;
-         bo_offset = desc->image_view->offset;
+         add_image_view_relocs(cmd_buffer, desc->image_view, surface_state);
          break;
 
       case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: {
          surface_state = desc->image_view->storage_surface_state;
          assert(surface_state.alloc_size);
-         bo = desc->image_view->bo;
-         bo_offset = desc->image_view->offset;
+         add_image_view_relocs(cmd_buffer, desc->image_view, surface_state);
 
          struct brw_image_param *image_param =
             &cmd_buffer->state.push_constants[stage]->images[image++];
@@ -906,15 +924,17 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
          surface_state = desc->buffer_view->surface_state;
          assert(surface_state.alloc_size);
-         bo = desc->buffer_view->bo;
-         bo_offset = desc->buffer_view->offset;
+         add_surface_state_reloc(cmd_buffer, surface_state,
+                                 desc->buffer_view->bo,
+                                 desc->buffer_view->offset);
          break;
 
       case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
          surface_state = desc->buffer_view->storage_surface_state;
          assert(surface_state.alloc_size);
-         bo = desc->buffer_view->bo;
-         bo_offset = desc->buffer_view->offset;
+         add_surface_state_reloc(cmd_buffer, surface_state,
+                                 desc->buffer_view->bo,
+                                 desc->buffer_view->offset);
 
          struct brw_image_param *image_param =
             &cmd_buffer->state.push_constants[stage]->images[image++];
@@ -929,8 +949,6 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       }
 
       bt_map[bias + s] = surface_state.offset + state_offset;
-      anv_cmd_buffer_add_surface_state_reloc(cmd_buffer, surface_state,
-                                             bo, bo_offset);
    }
    assert(image == map->image_count);