turnip: move tile_load_ib/sysmem_clear_ib into draw_cs
Avoids having to calculate reserved sizes for substream cs, also matches what the blob does. Signed-off-by: Jonathan Marek <jonathan@marek.ca> Reviewed-by: Eric Anholt <eric@anholt.net> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3925> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3925>
This commit is contained in:
parent
a410e64b68
commit
0ee76b90d5
|
@ -1439,32 +1439,38 @@ tu_emit_sysmem_clear_attachment(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
|
|||
}
|
||||
|
||||
static void
|
||||
tu_cmd_prepare_sysmem_clear_ib(struct tu_cmd_buffer *cmd,
|
||||
const VkRenderPassBeginInfo *info)
|
||||
tu_emit_load_clear(struct tu_cmd_buffer *cmd,
|
||||
const VkRenderPassBeginInfo *info)
|
||||
{
|
||||
const struct tu_framebuffer *fb = cmd->state.framebuffer;
|
||||
const uint32_t blit_cmd_space = 25 + 66 * fb->layers + 17;
|
||||
const uint32_t clear_space =
|
||||
blit_cmd_space * cmd->state.pass->attachment_count + 5;
|
||||
struct tu_cs *cs = &cmd->draw_cs;
|
||||
|
||||
struct tu_cs sub_cs;
|
||||
tu_cond_exec_start(cs, CP_COND_EXEC_0_RENDER_MODE_GMEM);
|
||||
|
||||
VkResult result =
|
||||
tu_cs_begin_sub_stream(&cmd->sub_cs, clear_space, &sub_cs);
|
||||
if (result != VK_SUCCESS) {
|
||||
cmd->record_result = result;
|
||||
return;
|
||||
}
|
||||
tu6_emit_blit_scissor(cmd, cs, true);
|
||||
|
||||
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
|
||||
tu_emit_sysmem_clear_attachment(cmd, &sub_cs, i, info);
|
||||
tu6_emit_load_attachment(cmd, cs, i);
|
||||
|
||||
/* TODO: We shouldn't need this flush, but without it we'd have an empty IB
|
||||
* when nothing clears which we currently can't handle.
|
||||
tu6_emit_blit_scissor(cmd, cs, false);
|
||||
|
||||
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
|
||||
tu6_emit_clear_attachment(cmd, cs, i, info);
|
||||
|
||||
tu_cond_exec_end(cs);
|
||||
|
||||
/* invalidate because reading input attachments will cache GMEM and
|
||||
* the cache isn''t updated when GMEM is written
|
||||
* TODO: is there a no-cache bit for textures?
|
||||
*/
|
||||
tu6_emit_event_write(cmd, &sub_cs, PC_CCU_FLUSH_COLOR_TS, true);
|
||||
if (cmd->state.subpass->input_count)
|
||||
tu6_emit_event_write(cmd, cs, CACHE_INVALIDATE, false);
|
||||
|
||||
cmd->state.sysmem_clear_ib = tu_cs_end_sub_stream(&cmd->sub_cs, &sub_cs);
|
||||
tu_cond_exec_start(cs, CP_COND_EXEC_0_RENDER_MODE_SYSMEM);
|
||||
|
||||
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
|
||||
tu_emit_sysmem_clear_attachment(cmd, cs, i, info);
|
||||
|
||||
tu_cond_exec_end(cs);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1483,8 +1489,6 @@ tu6_sysmem_render_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
|
|||
|
||||
tu6_emit_bin_size(cs, 0, 0, 0xc00000); /* 0xc00000 = BYPASS? */
|
||||
|
||||
tu_cs_emit_ib(cs, &cmd->state.sysmem_clear_ib);
|
||||
|
||||
tu6_emit_lrz_flush(cmd, cs);
|
||||
|
||||
tu_cs_emit_pkt7(cs, CP_SET_MARKER, 1);
|
||||
|
@ -1605,7 +1609,6 @@ tu6_render_tile(struct tu_cmd_buffer *cmd,
|
|||
const struct tu_tile *tile)
|
||||
{
|
||||
tu6_emit_tile_select(cmd, cs, tile);
|
||||
tu_cs_emit_ib(cs, &cmd->state.tile_load_ib);
|
||||
|
||||
tu_cs_emit_call(cs, &cmd->draw_cs);
|
||||
cmd->wait_for_idle = true;
|
||||
|
@ -1678,44 +1681,6 @@ tu_cmd_render_sysmem(struct tu_cmd_buffer *cmd)
|
|||
tu6_sysmem_render_end(cmd, &cmd->cs);
|
||||
}
|
||||
|
||||
static void
|
||||
tu_cmd_prepare_tile_load_ib(struct tu_cmd_buffer *cmd,
|
||||
const VkRenderPassBeginInfo *info)
|
||||
{
|
||||
const uint32_t tile_load_space =
|
||||
2 * 3 /* blit_scissor */ +
|
||||
(20 /* load */ + 19 /* clear */) * cmd->state.pass->attachment_count +
|
||||
2 /* cache invalidate */;
|
||||
|
||||
struct tu_cs sub_cs;
|
||||
|
||||
VkResult result =
|
||||
tu_cs_begin_sub_stream(&cmd->sub_cs, tile_load_space, &sub_cs);
|
||||
if (result != VK_SUCCESS) {
|
||||
cmd->record_result = result;
|
||||
return;
|
||||
}
|
||||
|
||||
tu6_emit_blit_scissor(cmd, &sub_cs, true);
|
||||
|
||||
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
|
||||
tu6_emit_load_attachment(cmd, &sub_cs, i);
|
||||
|
||||
tu6_emit_blit_scissor(cmd, &sub_cs, false);
|
||||
|
||||
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
|
||||
tu6_emit_clear_attachment(cmd, &sub_cs, i, info);
|
||||
|
||||
/* invalidate because reading input attachments will cache GMEM and
|
||||
* the cache isn''t updated when GMEM is written
|
||||
* TODO: is there a no-cache bit for textures?
|
||||
*/
|
||||
if (cmd->state.subpass->input_count)
|
||||
tu6_emit_event_write(cmd, &sub_cs, CACHE_INVALIDATE, false);
|
||||
|
||||
cmd->state.tile_load_ib = tu_cs_end_sub_stream(&cmd->sub_cs, &sub_cs);
|
||||
}
|
||||
|
||||
static void
|
||||
tu_cmd_prepare_tile_store_ib(struct tu_cmd_buffer *cmd)
|
||||
{
|
||||
|
@ -2548,10 +2513,10 @@ tu_CmdBeginRenderPass(VkCommandBuffer commandBuffer,
|
|||
cmd->state.framebuffer = fb;
|
||||
|
||||
tu_cmd_update_tiling_config(cmd, &pRenderPassBegin->renderArea);
|
||||
tu_cmd_prepare_sysmem_clear_ib(cmd, pRenderPassBegin);
|
||||
tu_cmd_prepare_tile_load_ib(cmd, pRenderPassBegin);
|
||||
tu_cmd_prepare_tile_store_ib(cmd);
|
||||
|
||||
tu_emit_load_clear(cmd, pRenderPassBegin);
|
||||
|
||||
tu6_emit_zs(cmd, cmd->state.subpass, &cmd->draw_cs);
|
||||
tu6_emit_mrt(cmd, cmd->state.subpass, &cmd->draw_cs);
|
||||
tu6_emit_msaa(cmd, cmd->state.subpass, &cmd->draw_cs);
|
||||
|
|
|
@ -876,9 +876,7 @@ struct tu_cmd_state
|
|||
|
||||
struct tu_tiling_config tiling_config;
|
||||
|
||||
struct tu_cs_entry tile_load_ib;
|
||||
struct tu_cs_entry tile_store_ib;
|
||||
struct tu_cs_entry sysmem_clear_ib;
|
||||
};
|
||||
|
||||
struct tu_cmd_pool
|
||||
|
|
Loading…
Reference in New Issue