WIP: Partially upgrade to vulkan v0.221.0
[mesa.git] / src / vulkan / anv_cmd_buffer.c
index 49bb298a1884a84469fcee08fb9ef073e5ae66b6..ae33822b63322b302f240977efea374ef4add6f1 100644 (file)
@@ -123,6 +123,7 @@ anv_cmd_state_init(struct anv_cmd_state *state)
    state->pipeline = NULL;
    state->restart_index = UINT32_MAX;
    state->dynamic = default_dynamic_state;
+   state->need_query_wa = true;
 
    state->gen7.index_buffer = NULL;
 }
@@ -297,7 +298,11 @@ VkResult anv_BeginCommandBuffer(
 
    cmd_buffer->usage_flags = pBeginInfo->flags;
 
-   if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
+   assert(cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY ||
+          !(cmd_buffer->usage_flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT));
+
+   if (cmd_buffer->usage_flags &
+       VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
       cmd_buffer->state.framebuffer =
          anv_framebuffer_from_handle(pBeginInfo->framebuffer);
       cmd_buffer->state.pass =
@@ -372,13 +377,14 @@ void anv_CmdBindPipeline(
 
 void anv_CmdSetViewport(
     VkCommandBuffer                             commandBuffer,
+    uint32_t                                    firstViewport,
     uint32_t                                    viewportCount,
     const VkViewport*                           pViewports)
 {
    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
 
    cmd_buffer->state.dynamic.viewport.count = viewportCount;
-   memcpy(cmd_buffer->state.dynamic.viewport.viewports,
+   memcpy(cmd_buffer->state.dynamic.viewport.viewports + firstViewport,
           pViewports, viewportCount * sizeof(*pViewports));
 
    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_VIEWPORT;
@@ -386,13 +392,14 @@ void anv_CmdSetViewport(
 
 void anv_CmdSetScissor(
     VkCommandBuffer                             commandBuffer,
+    uint32_t                                    firstScissor,
     uint32_t                                    scissorCount,
     const VkRect2D*                             pScissors)
 {
    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
 
    cmd_buffer->state.dynamic.scissor.count = scissorCount;
-   memcpy(cmd_buffer->state.dynamic.scissor.scissors,
+   memcpy(cmd_buffer->state.dynamic.scissor.scissors + firstScissor,
           pScissors, scissorCount * sizeof(*pScissors));
 
    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_SCISSOR;
@@ -553,7 +560,7 @@ void anv_CmdBindDescriptorSets(
 
 void anv_CmdBindVertexBuffers(
     VkCommandBuffer                             commandBuffer,
-    uint32_t                                    startBinding,
+    uint32_t                                    firstBinding,
     uint32_t                                    bindingCount,
     const VkBuffer*                             pBuffers,
     const VkDeviceSize*                         pOffsets)
@@ -564,11 +571,11 @@ void anv_CmdBindVertexBuffers(
    /* We have to defer setting up vertex buffer since we need the buffer
     * stride from the pipeline. */
 
-   assert(startBinding + bindingCount < MAX_VBS);
+   assert(firstBinding + bindingCount < MAX_VBS);
    for (uint32_t i = 0; i < bindingCount; i++) {
-      vb[startBinding + i].buffer = anv_buffer_from_handle(pBuffers[i]);
-      vb[startBinding + i].offset = pOffsets[i];
-      cmd_buffer->state.vb_dirty |= 1 << (startBinding + i);
+      vb[firstBinding + i].buffer = anv_buffer_from_handle(pBuffers[i]);
+      vb[firstBinding + i].offset = pOffsets[i];
+      cmd_buffer->state.vb_dirty |= 1 << (firstBinding + i);
    }
 }
 
@@ -636,8 +643,10 @@ anv_cmd_buffer_emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
     * targets. */
    uint32_t surface_count = layout ? layout->stage[stage].surface_count : 0;
 
-   if (color_count + surface_count == 0)
+   if (color_count + surface_count == 0) {
+      *bt_state = (struct anv_state) { 0, };
       return VK_SUCCESS;
+   }
 
    *bt_state = anv_cmd_buffer_alloc_binding_table(cmd_buffer,
                                                   bias + surface_count,
@@ -651,6 +660,7 @@ anv_cmd_buffer_emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       const struct anv_image_view *iview =
          fb->attachments[subpass->color_attachments[a]];
 
+      assert(iview->color_rt_surface_state.alloc_size);
       bt_map[a] = iview->color_rt_surface_state.offset + state_offset;
       add_surface_state_reloc(cmd_buffer, iview->color_rt_surface_state,
                               iview->bo, iview->offset);
@@ -710,12 +720,14 @@ anv_cmd_buffer_emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
       case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
          surface_state = desc->image_view->nonrt_surface_state;
+         assert(surface_state.alloc_size);
          bo = desc->image_view->bo;
          bo_offset = desc->image_view->offset;
          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;
 
@@ -734,12 +746,14 @@ anv_cmd_buffer_emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
       case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
       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;
          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;
 
@@ -781,8 +795,10 @@ anv_cmd_buffer_emit_samplers(struct anv_cmd_buffer *cmd_buffer,
       layout = cmd_buffer->state.pipeline->layout;
 
    sampler_count = layout ? layout->stage[stage].sampler_count : 0;
-   if (sampler_count == 0)
+   if (sampler_count == 0) {
+      *state = (struct anv_state) { 0, };
       return VK_SUCCESS;
+   }
 
    uint32_t size = sampler_count * 16;
    *state = anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, size, 32);