anv/cmd_buffer: Don't call set_subpass in a secondary

Initially, we had intended set_subpass to be an interesting function that
did whatever (presumably a lot) setup we needed for a subpass.  In reality,
it just sets a pointer and a dirty bit and then emits depth and stencil
state.  When we call BeginCommandBuffer on a secondary, there's no point in
setting depth and stencil state since it will already be set by the
primary.  Instead, the only thing we need to do at the start of a secondary
is set the subpass pointer and the dirty bit.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
Jason Ekstrand
2016-10-05 16:51:02 -07:00
parent fe4e276b02
commit b548fdbed5
4 changed files with 3 additions and 48 deletions

View File

@@ -406,11 +406,10 @@ VkResult anv_BeginCommandBuffer(
anv_framebuffer_from_handle(pBeginInfo->pInheritanceInfo->framebuffer);
cmd_buffer->state.pass =
anv_render_pass_from_handle(pBeginInfo->pInheritanceInfo->renderPass);
struct anv_subpass *subpass =
cmd_buffer->state.subpass =
&cmd_buffer->state.pass->subpasses[pBeginInfo->pInheritanceInfo->subpass];
anv_cmd_buffer_set_subpass(cmd_buffer, subpass);
cmd_buffer->state.dirty |= ANV_CMD_DIRTY_RENDER_TARGETS;
}
return VK_SUCCESS;
@@ -1050,41 +1049,6 @@ anv_cmd_buffer_merge_dynamic(struct anv_cmd_buffer *cmd_buffer,
return state;
}
/**
* @brief Setup the command buffer for recording commands inside the given
* subpass.
*
* This does not record all commands needed for starting the subpass.
* Starting the subpass may require additional commands.
*
* Note that vkCmdBeginRenderPass, vkCmdNextSubpass, and vkBeginCommandBuffer
* with VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, all setup the
* command buffer for recording commands for some subpass. But only the first
* two, vkCmdBeginRenderPass and vkCmdNextSubpass, can start a subpass.
*/
void
anv_cmd_buffer_set_subpass(struct anv_cmd_buffer *cmd_buffer,
struct anv_subpass *subpass)
{
switch (cmd_buffer->device->info.gen) {
case 7:
if (cmd_buffer->device->info.is_haswell) {
gen75_cmd_buffer_set_subpass(cmd_buffer, subpass);
} else {
gen7_cmd_buffer_set_subpass(cmd_buffer, subpass);
}
break;
case 8:
gen8_cmd_buffer_set_subpass(cmd_buffer, subpass);
break;
case 9:
gen9_cmd_buffer_set_subpass(cmd_buffer, subpass);
break;
default:
unreachable("unsupported gen\n");
}
}
struct anv_state
anv_cmd_buffer_push_constants(struct anv_cmd_buffer *cmd_buffer,
gl_shader_stage stage)

View File

@@ -36,9 +36,6 @@ struct anv_state
genX(cmd_buffer_alloc_null_surface_state)(struct anv_cmd_buffer *cmd_buffer,
struct anv_framebuffer *fb);
void genX(cmd_buffer_set_subpass)(struct anv_cmd_buffer *cmd_buffer,
struct anv_subpass *subpass);
void genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer);
void genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer);

View File

@@ -1394,9 +1394,6 @@ void anv_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer);
void anv_cmd_state_setup_attachments(struct anv_cmd_buffer *cmd_buffer,
const VkRenderPassBeginInfo *info);
void anv_cmd_buffer_set_subpass(struct anv_cmd_buffer *cmd_buffer,
struct anv_subpass *subpass);
struct anv_state
anv_cmd_buffer_push_constants(struct anv_cmd_buffer *cmd_buffer,
gl_shader_stage stage);

View File

@@ -1296,10 +1296,7 @@ cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CLEAR_PARAMS), cp);
}
/**
* @see anv_cmd_buffer_set_subpass()
*/
void
static void
genX(cmd_buffer_set_subpass)(struct anv_cmd_buffer *cmd_buffer,
struct anv_subpass *subpass)
{