panvk: Add support for VK_KHR_multiview on v7
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34832>
This commit is contained in:
@@ -153,19 +153,26 @@ panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf)
|
||||
return;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < batch->fb.layer_count; i++) {
|
||||
uint32_t view_mask = cmdbuf->state.gfx.render.view_mask;
|
||||
assert(view_mask == 0 || util_bitcount(view_mask) <= batch->fb.layer_count);
|
||||
uint32_t enabled_layer_count = view_mask ?
|
||||
util_bitcount(view_mask) :
|
||||
batch->fb.layer_count;
|
||||
|
||||
for (uint32_t i = 0; i < enabled_layer_count; i++) {
|
||||
uint32_t layer_id = (view_mask != 0) ? u_bit_scan(&view_mask) : i;
|
||||
VkResult result;
|
||||
|
||||
uint64_t fbd = batch->fb.desc.gpu + (batch->fb.desc_stride * i);
|
||||
uint64_t fbd = batch->fb.desc.gpu + (batch->fb.desc_stride * layer_id);
|
||||
|
||||
result = panvk_per_arch(cmd_prepare_tiler_context)(cmdbuf, i);
|
||||
result = panvk_per_arch(cmd_prepare_tiler_context)(cmdbuf, layer_id);
|
||||
if (result != VK_SUCCESS)
|
||||
break;
|
||||
|
||||
fbd |= GENX(pan_emit_fbd)(
|
||||
&cmdbuf->state.gfx.render.fb.info, i, &batch->tlsinfo,
|
||||
&cmdbuf->state.gfx.render.fb.info, layer_id, &batch->tlsinfo,
|
||||
&batch->tiler.ctx,
|
||||
batch->fb.desc.cpu + (batch->fb.desc_stride * i));
|
||||
batch->fb.desc.cpu + (batch->fb.desc_stride * layer_id));
|
||||
|
||||
result = panvk_cmd_prepare_fragment_job(cmdbuf, fbd);
|
||||
if (result != VK_SUCCESS)
|
||||
|
||||
@@ -1308,14 +1308,21 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw)
|
||||
if (result != VK_SUCCESS)
|
||||
return;
|
||||
|
||||
for (uint32_t i = 0; i < layer_count; i++) {
|
||||
draw->info.layer_id = i;
|
||||
|
||||
uint32_t view_mask = cmdbuf->state.gfx.render.view_mask;
|
||||
assert(view_mask == 0 || util_bitcount(view_mask) <= batch->fb.layer_count);
|
||||
uint32_t enabled_layer_count = view_mask ?
|
||||
util_bitcount(view_mask) :
|
||||
cmdbuf->state.gfx.render.layer_count;
|
||||
|
||||
for (uint32_t i = 0; i < enabled_layer_count; i++) {
|
||||
result = panvk_draw_prepare_varyings(cmdbuf, draw);
|
||||
if (result != VK_SUCCESS)
|
||||
return;
|
||||
|
||||
if (i > 0) {
|
||||
cmdbuf->state.gfx.sysvals.layer_id = i;
|
||||
draw->info.layer_id = (view_mask != 0) ? u_bit_scan(&view_mask) : i;
|
||||
if (draw->info.layer_id > 0) {
|
||||
cmdbuf->state.gfx.sysvals.layer_id = draw->info.layer_id;
|
||||
gfx_state_set_dirty(cmdbuf, FS_PUSH_UNIFORMS);
|
||||
}
|
||||
|
||||
|
||||
@@ -201,9 +201,6 @@ panvk_per_arch(CmdClearAttachments)(VkCommandBuffer commandBuffer,
|
||||
.depth_attachment_format = cmdbuf->state.gfx.render.z_attachment.fmt,
|
||||
.stencil_attachment_format = cmdbuf->state.gfx.render.s_attachment.fmt,
|
||||
};
|
||||
/* Multiview is not supported pre-v10 */
|
||||
assert(cmdbuf->state.gfx.render.view_mask == 0 || PAN_ARCH >= 10);
|
||||
|
||||
for (uint32_t i = 0; i < render.color_attachment_count; i++) {
|
||||
render.color_attachment_formats[i] =
|
||||
cmdbuf->state.gfx.render.color_attachments.fmts[i];
|
||||
|
||||
@@ -116,6 +116,13 @@ panvk_lower_sysvals(nir_builder *b, nir_instr *instr, void *data)
|
||||
assert(b->shader->info.stage == MESA_SHADER_FRAGMENT);
|
||||
val = load_sysval(b, graphics, bit_size, layer_id);
|
||||
break;
|
||||
case nir_intrinsic_load_view_index:
|
||||
assert(b->shader->info.stage != MESA_SHADER_COMPUTE);
|
||||
if (ctx->state->rp->view_mask == 0)
|
||||
val = nir_imm_zero(b, 1, 32);
|
||||
else
|
||||
val = load_sysval(b, graphics, bit_size, layer_id);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case nir_intrinsic_load_draw_id:
|
||||
|
||||
Reference in New Issue
Block a user