lavapipe: beef up LVP_POISON_MEMORY
this makes lavapipe behave more like a tiler and completely annihilate any existing data for DONTCARE load/store ops Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21847>
This commit is contained in:

committed by
Marge Bot

parent
d4a2c0fcaa
commit
8b38c4f43c
@@ -66,7 +66,9 @@ struct lvp_render_attachment {
|
|||||||
VkResolveModeFlags resolve_mode;
|
VkResolveModeFlags resolve_mode;
|
||||||
struct lvp_image_view *resolve_imgv;
|
struct lvp_image_view *resolve_imgv;
|
||||||
VkAttachmentLoadOp load_op;
|
VkAttachmentLoadOp load_op;
|
||||||
|
VkAttachmentStoreOp store_op;
|
||||||
VkClearValue clear_value;
|
VkClearValue clear_value;
|
||||||
|
bool read_only;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rendering_state {
|
struct rendering_state {
|
||||||
@@ -91,6 +93,7 @@ struct rendering_state {
|
|||||||
bool ib_dirty;
|
bool ib_dirty;
|
||||||
bool sample_mask_dirty;
|
bool sample_mask_dirty;
|
||||||
bool min_samples_dirty;
|
bool min_samples_dirty;
|
||||||
|
bool poison_mem;
|
||||||
struct pipe_draw_indirect_info indirect_info;
|
struct pipe_draw_indirect_info indirect_info;
|
||||||
struct pipe_draw_info info;
|
struct pipe_draw_info info;
|
||||||
|
|
||||||
@@ -1794,7 +1797,7 @@ att_needs_replicate(const struct rendering_state *state, const struct lvp_image_
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void render_att_init(struct lvp_render_attachment* att,
|
static void render_att_init(struct lvp_render_attachment* att,
|
||||||
const VkRenderingAttachmentInfo *vk_att)
|
const VkRenderingAttachmentInfo *vk_att, bool poison_mem, bool stencil)
|
||||||
{
|
{
|
||||||
if (vk_att == NULL || vk_att->imageView == VK_NULL_HANDLE) {
|
if (vk_att == NULL || vk_att->imageView == VK_NULL_HANDLE) {
|
||||||
*att = (struct lvp_render_attachment) {
|
*att = (struct lvp_render_attachment) {
|
||||||
@@ -1806,8 +1809,26 @@ static void render_att_init(struct lvp_render_attachment* att,
|
|||||||
*att = (struct lvp_render_attachment) {
|
*att = (struct lvp_render_attachment) {
|
||||||
.imgv = lvp_image_view_from_handle(vk_att->imageView),
|
.imgv = lvp_image_view_from_handle(vk_att->imageView),
|
||||||
.load_op = vk_att->loadOp,
|
.load_op = vk_att->loadOp,
|
||||||
|
.store_op = vk_att->storeOp,
|
||||||
.clear_value = vk_att->clearValue,
|
.clear_value = vk_att->clearValue,
|
||||||
};
|
};
|
||||||
|
if (util_format_is_depth_or_stencil(att->imgv->pformat)) {
|
||||||
|
if (stencil)
|
||||||
|
att->read_only = vk_att->imageLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL ||
|
||||||
|
vk_att->imageLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL;
|
||||||
|
else
|
||||||
|
att->read_only = vk_att->imageLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL ||
|
||||||
|
vk_att->imageLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL;
|
||||||
|
}
|
||||||
|
if (poison_mem && !att->read_only && att->load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) {
|
||||||
|
att->load_op = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
|
if (util_format_is_depth_or_stencil(att->imgv->pformat)) {
|
||||||
|
att->clear_value.depthStencil.depth = 0.12351251;
|
||||||
|
att->clear_value.depthStencil.stencil = rand() % UINT8_MAX;
|
||||||
|
} else {
|
||||||
|
memset(att->clear_value.color.uint32, rand() % UINT8_MAX, sizeof(att->clear_value.color.uint32));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (vk_att->resolveImageView && vk_att->resolveMode) {
|
if (vk_att->resolveImageView && vk_att->resolveMode) {
|
||||||
att->resolve_imgv = lvp_image_view_from_handle(vk_att->resolveImageView);
|
att->resolve_imgv = lvp_image_view_from_handle(vk_att->resolveImageView);
|
||||||
@@ -1847,7 +1868,7 @@ static void handle_begin_rendering(struct vk_cmd_queue_entry *cmd,
|
|||||||
state->color_att_count = info->colorAttachmentCount;
|
state->color_att_count = info->colorAttachmentCount;
|
||||||
state->color_att = realloc(state->color_att, sizeof(*state->color_att) * state->color_att_count);
|
state->color_att = realloc(state->color_att, sizeof(*state->color_att) * state->color_att_count);
|
||||||
for (unsigned i = 0; i < info->colorAttachmentCount; i++) {
|
for (unsigned i = 0; i < info->colorAttachmentCount; i++) {
|
||||||
render_att_init(&state->color_att[i], &info->pColorAttachments[i]);
|
render_att_init(&state->color_att[i], &info->pColorAttachments[i], state->poison_mem, false);
|
||||||
if (state->color_att[i].imgv) {
|
if (state->color_att[i].imgv) {
|
||||||
struct lvp_image_view *imgv = state->color_att[i].imgv;
|
struct lvp_image_view *imgv = state->color_att[i].imgv;
|
||||||
add_img_view_surface(state, imgv,
|
add_img_view_surface(state, imgv,
|
||||||
@@ -1864,8 +1885,8 @@ static void handle_begin_rendering(struct vk_cmd_queue_entry *cmd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render_att_init(&state->depth_att, info->pDepthAttachment);
|
render_att_init(&state->depth_att, info->pDepthAttachment, state->poison_mem, false);
|
||||||
render_att_init(&state->stencil_att, info->pStencilAttachment);
|
render_att_init(&state->stencil_att, info->pStencilAttachment, state->poison_mem, true);
|
||||||
if (state->depth_att.imgv || state->stencil_att.imgv) {
|
if (state->depth_att.imgv || state->stencil_att.imgv) {
|
||||||
assert(state->depth_att.imgv == NULL ||
|
assert(state->depth_att.imgv == NULL ||
|
||||||
state->stencil_att.imgv == NULL ||
|
state->stencil_att.imgv == NULL ||
|
||||||
@@ -1907,8 +1928,55 @@ static void handle_begin_rendering(struct vk_cmd_queue_entry *cmd,
|
|||||||
static void handle_end_rendering(struct vk_cmd_queue_entry *cmd,
|
static void handle_end_rendering(struct vk_cmd_queue_entry *cmd,
|
||||||
struct rendering_state *state)
|
struct rendering_state *state)
|
||||||
{
|
{
|
||||||
if (!state->suspending)
|
if (state->suspending)
|
||||||
render_resolve(state);
|
return;
|
||||||
|
render_resolve(state);
|
||||||
|
if (!state->poison_mem)
|
||||||
|
return;
|
||||||
|
union pipe_color_union color_clear_val;
|
||||||
|
memset(color_clear_val.ui, rand() % UINT8_MAX, sizeof(color_clear_val.ui));
|
||||||
|
for (unsigned i = 0; i < state->framebuffer.nr_cbufs; i++) {
|
||||||
|
if (state->color_att[i].imgv && state->color_att[i].store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE) {
|
||||||
|
if (state->info.view_mask) {
|
||||||
|
u_foreach_bit(i, state->info.view_mask)
|
||||||
|
clear_attachment_layers(state, state->color_att[i].imgv, &state->render_area,
|
||||||
|
i, 1, 0, 0, 0, &color_clear_val);
|
||||||
|
} else {
|
||||||
|
state->pctx->clear_render_target(state->pctx,
|
||||||
|
state->color_att[i].imgv->surface,
|
||||||
|
&color_clear_val,
|
||||||
|
state->render_area.offset.x,
|
||||||
|
state->render_area.offset.y,
|
||||||
|
state->render_area.extent.width,
|
||||||
|
state->render_area.extent.height,
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint32_t ds_clear_flags = 0;
|
||||||
|
if (state->depth_att.imgv && !state->depth_att.read_only && state->depth_att.store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE)
|
||||||
|
ds_clear_flags |= PIPE_CLEAR_DEPTH;
|
||||||
|
if (state->stencil_att.imgv && !state->stencil_att.read_only && state->stencil_att.store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE)
|
||||||
|
ds_clear_flags |= PIPE_CLEAR_STENCIL;
|
||||||
|
double dclear_val = 0.2389234;
|
||||||
|
uint32_t sclear_val = rand() % UINT8_MAX;
|
||||||
|
if (ds_clear_flags) {
|
||||||
|
if (state->info.view_mask) {
|
||||||
|
u_foreach_bit(i, state->info.view_mask)
|
||||||
|
clear_attachment_layers(state, state->ds_imgv, &state->render_area,
|
||||||
|
i, 1, ds_clear_flags, dclear_val, sclear_val, NULL);
|
||||||
|
} else {
|
||||||
|
state->pctx->clear_depth_stencil(state->pctx,
|
||||||
|
state->ds_imgv->surface,
|
||||||
|
ds_clear_flags,
|
||||||
|
dclear_val, sclear_val,
|
||||||
|
state->render_area.offset.x,
|
||||||
|
state->render_area.offset.y,
|
||||||
|
state->render_area.extent.width,
|
||||||
|
state->render_area.extent.height,
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_draw(struct vk_cmd_queue_entry *cmd,
|
static void handle_draw(struct vk_cmd_queue_entry *cmd,
|
||||||
@@ -4341,6 +4409,7 @@ VkResult lvp_execute_cmds(struct lvp_device *device,
|
|||||||
state->sample_mask_dirty = true;
|
state->sample_mask_dirty = true;
|
||||||
state->min_samples_dirty = true;
|
state->min_samples_dirty = true;
|
||||||
state->sample_mask = UINT32_MAX;
|
state->sample_mask = UINT32_MAX;
|
||||||
|
state->poison_mem = device->poison_mem;
|
||||||
for (enum pipe_shader_type s = PIPE_SHADER_VERTEX; s < PIPE_SHADER_TYPES; s++) {
|
for (enum pipe_shader_type s = PIPE_SHADER_VERTEX; s < PIPE_SHADER_TYPES; s++) {
|
||||||
for (unsigned i = 0; i < ARRAY_SIZE(state->cso_ss_ptr[s]); i++)
|
for (unsigned i = 0; i < ARRAY_SIZE(state->cso_ss_ptr[s]); i++)
|
||||||
state->cso_ss_ptr[s][i] = &state->ss[s][i];
|
state->cso_ss_ptr[s][i] = &state->ss[s][i];
|
||||||
|
Reference in New Issue
Block a user