struct tu_cs *cs,
VkFormat vk_format,
VkImageAspectFlags clear_mask,
- const VkClearValue *value,
uint32_t a,
bool separate_ds)
{
const struct tu_image_view *iview = cmd->state.attachments[a];
const uint32_t clear_views = cmd->state.pass->attachments[a].clear_views;
const struct blit_ops *ops = &r2d_ops;
+ const VkClearValue *value = &cmd->state.clear_values[a];
if (cmd->state.pass->attachments[a].samples > 1)
ops = &r3d_ops;
void
tu_clear_sysmem_attachment(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
- uint32_t a,
- const VkClearValue *value)
+ uint32_t a)
{
const struct tu_render_pass_attachment *attachment =
&cmd->state.pass->attachments[a];
if (attachment->format == VK_FORMAT_D32_SFLOAT_S8_UINT) {
if (attachment->clear_mask & VK_IMAGE_ASPECT_DEPTH_BIT) {
clear_sysmem_attachment(cmd, cs, VK_FORMAT_D32_SFLOAT, VK_IMAGE_ASPECT_COLOR_BIT,
- value, a, true);
+ a, true);
}
if (attachment->clear_mask & VK_IMAGE_ASPECT_STENCIL_BIT) {
clear_sysmem_attachment(cmd, cs, VK_FORMAT_S8_UINT, VK_IMAGE_ASPECT_COLOR_BIT,
- value, a, true);
+ a, true);
}
} else {
clear_sysmem_attachment(cmd, cs, attachment->format, attachment->clear_mask,
- value, a, false);
+ a, false);
}
/* The spec doesn't explicitly say, but presumably the initial renderpass
void
tu_clear_gmem_attachment(struct tu_cmd_buffer *cmd,
struct tu_cs *cs,
- uint32_t a,
- const VkClearValue *value)
+ uint32_t a)
{
const struct tu_render_pass_attachment *attachment =
&cmd->state.pass->attachments[a];
tu_emit_clear_gmem_attachment(cmd, cs, a, 0, cmd->state.framebuffer->layers,
attachment->clear_views,
- attachment->clear_mask, value);
+ attachment->clear_mask,
+ &cmd->state.clear_values[a]);
}
static void
static void
-tu_emit_renderpass_begin(struct tu_cmd_buffer *cmd,
- const VkClearValue *clear_values)
+tu_emit_renderpass_begin(struct tu_cmd_buffer *cmd)
{
struct tu_cs *cs = &cmd->draw_cs;
tu6_emit_blit_scissor(cmd, cs, false);
for (uint32_t i = 0; i < cmd->state.pass->attachment_count; ++i)
- tu_clear_gmem_attachment(cmd, cs, i, &clear_values[i]);
+ tu_clear_gmem_attachment(cmd, cs, i);
tu_cond_exec_end(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_clear_sysmem_attachment(cmd, cs, i, &clear_values[i]);
+ tu_clear_sysmem_attachment(cmd, cs, i);
tu_cond_exec_end(cs);
cmd_buffer->state.subpass = NULL;
cmd_buffer->state.framebuffer = NULL;
cmd_buffer->state.attachments = NULL;
+ cmd_buffer->state.clear_values = NULL;
cmd_buffer->state.gmem_layout = TU_GMEM_LAYOUT_COUNT; /* invalid value to prevent looking up gmem offsets */
memset(&cmd_buffer->state.rp, 0, sizeof(cmd_buffer->state.rp));
cmd->state.framebuffer = fb;
cmd->state.render_area = pRenderPassBegin->renderArea;
- cmd->state.attachments = (const struct tu_image_view **)
- vk_alloc(&cmd->vk.pool->alloc, pass->attachment_count *
- sizeof(cmd->state.attachments[0]), 8,
- VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
-
- if (!cmd->state.attachments) {
+ VK_MULTIALLOC(ma);
+ vk_multialloc_add(&ma, &cmd->state.attachments,
+ const struct tu_image_view *, pass->attachment_count);
+ vk_multialloc_add(&ma, &cmd->state.clear_values, VkClearValue,
+ pRenderPassBegin->clearValueCount);
+ if (!vk_multialloc_alloc(&ma, &cmd->vk.pool->alloc,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT)) {
vk_command_buffer_set_error(&cmd->vk, VK_ERROR_OUT_OF_HOST_MEMORY);
return;
}
tu_image_view_from_handle(pAttachmentInfo->pAttachments[i]) :
cmd->state.framebuffer->attachments[i].attachment;
}
+ for (unsigned i = 0; i < pRenderPassBegin->clearValueCount; i++)
+ cmd->state.clear_values[i] = pRenderPassBegin->pClearValues[i];
+
tu_choose_gmem_layout(cmd);
trace_start_render_pass(&cmd->trace, &cmd->cs, cmd->state.framebuffer,
if (pass->subpasses[0].feedback_invalidate)
cmd->state.renderpass_cache.flush_bits |= TU_CMD_FLAG_CACHE_INVALIDATE;
- tu_lrz_begin_renderpass(cmd, pRenderPassBegin->pClearValues);
+ tu_lrz_begin_renderpass(cmd);
cmd->trace_renderpass_start = u_trace_end_iterator(&cmd->trace);
- tu_emit_renderpass_begin(cmd, pRenderPassBegin->pClearValues);
+ tu_emit_renderpass_begin(cmd);
tu_emit_subpass_begin(cmd);
if (pass->has_fdm)
const VkRenderingInfo *pRenderingInfo)
{
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
- VkClearValue clear_values[2 * (MAX_RTS + 1)];
tu_setup_dynamic_render_pass(cmd, pRenderingInfo);
tu_setup_dynamic_framebuffer(cmd, pRenderingInfo);
cmd->state.render_area = pRenderingInfo->renderArea;
cmd->state.attachments = cmd->dynamic_attachments;
+ cmd->state.clear_values = cmd->dynamic_clear_values;
for (unsigned i = 0; i < pRenderingInfo->colorAttachmentCount; i++) {
uint32_t a = cmd->dynamic_subpass.color_attachments[i].attachment;
if (!pRenderingInfo->pColorAttachments[i].imageView)
continue;
+ cmd->state.clear_values[a] =
+ pRenderingInfo->pColorAttachments[i].clearValue;
+
TU_FROM_HANDLE(tu_image_view, view,
pRenderingInfo->pColorAttachments[i].imageView);
cmd->state.attachments[a] = view;
- clear_values[a] = pRenderingInfo->pColorAttachments[i].clearValue;
a = cmd->dynamic_subpass.resolve_attachments[i].attachment;
if (a != VK_ATTACHMENT_UNUSED) {
TU_FROM_HANDLE(tu_image_view, view, common_info->imageView);
cmd->state.attachments[a] = view;
if (pRenderingInfo->pDepthAttachment) {
- clear_values[a].depthStencil.depth =
+ cmd->state.clear_values[a].depthStencil.depth =
pRenderingInfo->pDepthAttachment->clearValue.depthStencil.depth;
}
if (pRenderingInfo->pStencilAttachment) {
- clear_values[a].depthStencil.stencil =
+ cmd->state.clear_values[a].depthStencil.stencil =
pRenderingInfo->pStencilAttachment->clearValue.depthStencil.stencil;
}
cmd->state.lrz.valid = false;
} else {
if (resuming)
- tu_lrz_begin_resumed_renderpass(cmd, clear_values);
+ tu_lrz_begin_resumed_renderpass(cmd);
else
- tu_lrz_begin_renderpass(cmd, clear_values);
+ tu_lrz_begin_renderpass(cmd);
}
}
if (!resuming) {
- tu_emit_renderpass_begin(cmd, clear_values);
+ tu_emit_renderpass_begin(cmd);
tu_emit_subpass_begin(cmd);
}
* lrz etc.
*/
void
-tu_lrz_begin_resumed_renderpass(struct tu_cmd_buffer *cmd,
- const VkClearValue *clear_values)
+tu_lrz_begin_resumed_renderpass(struct tu_cmd_buffer *cmd)
{
/* Track LRZ valid state */
memset(&cmd->state.lrz, 0, sizeof(cmd->state.lrz));
const struct tu_render_pass_attachment *att = &cmd->state.pass->attachments[a];
tu_lrz_init_state(cmd, att, cmd->state.attachments[a]);
if (att->clear_mask & (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT)) {
- VkClearValue clear = clear_values[a];
+ VkClearValue clear = cmd->state.clear_values[a];
cmd->state.lrz.depth_clear_value = clear;
cmd->state.lrz.fast_clear = cmd->state.lrz.fast_clear &&
(clear.depthStencil.depth == 0.f ||
}
void
-tu_lrz_begin_renderpass(struct tu_cmd_buffer *cmd,
- const VkClearValue *clear_values)
+tu_lrz_begin_renderpass(struct tu_cmd_buffer *cmd)
{
const struct tu_render_pass *pass = cmd->state.pass;
}
/* Track LRZ valid state */
- tu_lrz_begin_resumed_renderpass(cmd, clear_values);
+ tu_lrz_begin_resumed_renderpass(cmd);
if (!cmd->state.lrz.valid) {
tu6_emit_lrz_buffer(&cmd->cs, NULL);