panvk/jm: Fix depth clipping with small viewport depth range

Same as 7ca01506c9 ("panvk: hack to improve depth clipping with
small viewport depth range") but applied to the JM backend.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Benjamin Lee <benjamin.lee@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32905>
This commit is contained in:
Boris Brezillon
2025-01-06 18:21:53 +01:00
committed by Marge Bot
parent 3b6f0ce032
commit 9ba38350de
3 changed files with 24 additions and 24 deletions

View File

@@ -2691,8 +2691,6 @@ dEQP-VK.draw.renderpass.indexed_draw.draw_instanced_indexed_triangle_list_offset
dEQP-VK.draw.renderpass.indexed_draw.draw_instanced_indexed_triangle_list_with_alloc_offset,Fail
dEQP-VK.draw.renderpass.indexed_draw.draw_instanced_indexed_triangle_strip_with_alloc_offset,Fail
dEQP-VK.draw.renderpass.inverted_depth_ranges.nodepthclamp_deltazero,Fail
dEQP-VK.memory.pipeline_barrier.host_write_index_buffer.1024,Fail
dEQP-VK.memory.pipeline_barrier.host_write_index_buffer.1048576,Fail
dEQP-VK.memory.pipeline_barrier.host_write_index_buffer.65536,Fail
@@ -2779,7 +2777,6 @@ dEQP-VK.draw.dynamic_rendering.complete_secondary_cmd_buff.indexed_draw.draw_ins
dEQP-VK.draw.dynamic_rendering.complete_secondary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_offset_negative_large_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.complete_secondary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.complete_secondary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.complete_secondary_cmd_buff.inverted_depth_ranges.nodepthclamp_deltazero,Fail
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_indexed_triangle_list_offset_minus_one_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_indexed_triangle_list_offset_minus_one_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_indexed_triangle_list_offset_negative_large_with_alloc_offset,Fail
@@ -2804,7 +2801,6 @@ dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_inst
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_offset_negative_large_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.partial_secondary_cmd_buff.inverted_depth_ranges.nodepthclamp_deltazero,Fail
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_indexed_triangle_list_offset_minus_one_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_indexed_triangle_list_offset_minus_one_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_indexed_triangle_list_offset_negative_large_with_alloc_offset,Fail
@@ -2829,7 +2825,6 @@ dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_instanced_inde
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_offset_negative_large_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.indexed_draw.draw_instanced_indexed_triangle_strip_with_bind_offset_with_alloc_offset,Fail
dEQP-VK.draw.dynamic_rendering.primary_cmd_buff.inverted_depth_ranges.nodepthclamp_deltazero,Fail
dEQP-VK.rasterization.rasterization_order_attachment_access.depth.samples_1.multi_draw_barriers,Crash
dEQP-VK.rasterization.rasterization_order_attachment_access.stencil.samples_1.multi_draw_barriers,Crash

View File

@@ -631,12 +631,18 @@ panvk_draw_prepare_attributes(struct panvk_cmd_buffer *cmdbuf,
}
static void
panvk_emit_viewport(const struct vk_viewport_state *vp, void *vpd)
panvk_emit_viewport(struct panvk_cmd_buffer *cmdbuf, void *vpd)
{
assert(vp->viewport_count == 1);
const struct vk_viewport_state *vp = &cmdbuf->vk.dynamic_graphics_state.vp;
if (vp->viewport_count < 1)
return;
struct panvk_graphics_sysvals *sysvals = &cmdbuf->state.gfx.sysvals;
const VkViewport *viewport = &vp->viewports[0];
const VkRect2D *scissor = &vp->scissors[0];
float minz = sysvals->viewport.offset.z;
float maxz = minz + sysvals->viewport.scale.z;
/* The spec says "width must be greater than 0.0" */
assert(viewport->width >= 0);
@@ -663,16 +669,13 @@ panvk_emit_viewport(const struct vk_viewport_state *vp, void *vpd)
miny = CLAMP(miny, 0, UINT16_MAX);
maxy = CLAMP(maxy, 0, UINT16_MAX);
assert(viewport->minDepth >= 0.0f && viewport->minDepth <= 1.0f);
assert(viewport->maxDepth >= 0.0f && viewport->maxDepth <= 1.0f);
pan_pack(vpd, VIEWPORT, cfg) {
cfg.scissor_minimum_x = minx;
cfg.scissor_minimum_y = miny;
cfg.scissor_maximum_x = maxx;
cfg.scissor_maximum_y = maxy;
cfg.minimum_z = MIN2(viewport->minDepth, viewport->maxDepth);
cfg.maximum_z = MAX2(viewport->minDepth, viewport->maxDepth);
cfg.minimum_z = MIN2(minz, maxz);
cfg.maximum_z = MAX2(minz, maxz);
}
}
@@ -685,16 +688,14 @@ panvk_draw_prepare_viewport(struct panvk_cmd_buffer *cmdbuf,
* As a result, we define an empty one.
*/
if (!cmdbuf->state.gfx.vpd || dyn_gfx_state_dirty(cmdbuf, VP_VIEWPORTS) ||
dyn_gfx_state_dirty(cmdbuf, VP_SCISSORS)) {
dyn_gfx_state_dirty(cmdbuf, VP_SCISSORS) ||
dyn_gfx_state_dirty(cmdbuf, RS_DEPTH_CLIP_ENABLE) ||
dyn_gfx_state_dirty(cmdbuf, RS_DEPTH_CLAMP_ENABLE)) {
struct panfrost_ptr vp = panvk_cmd_alloc_desc(cmdbuf, VIEWPORT);
if (!vp.gpu)
return VK_ERROR_OUT_OF_DEVICE_MEMORY;
const struct vk_viewport_state *vps =
&cmdbuf->vk.dynamic_graphics_state.vp;
if (vps->viewport_count > 0)
panvk_emit_viewport(vps, vp.cpu);
panvk_emit_viewport(cmdbuf, vp.cpu);
cmdbuf->state.gfx.vpd = vp.gpu;
}
@@ -1231,10 +1232,6 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw)
if (result != VK_SUCCESS)
return;
result = panvk_draw_prepare_viewport(cmdbuf, draw);
if (result != VK_SUCCESS)
return;
batch->tlsinfo.tls.size = MAX3(vs->info.tls_size, fs ? fs->info.tls_size : 0,
batch->tlsinfo.tls.size);
@@ -1260,6 +1257,16 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw)
panvk_per_arch(cmd_prepare_draw_sysvals)(cmdbuf, &draw->info);
/* Viewport emission requires up-to-date {scale,offset}.z for min/max Z,
* so we need to call it after calling cmd_prepare_draw_sysvals(), but
* viewports are the same for all layers, so we only emit when layer_id=0.
*/
if (i == 0) {
result = panvk_draw_prepare_viewport(cmdbuf, draw);
if (result != VK_SUCCESS)
return;
}
result = panvk_per_arch(cmd_prepare_push_uniforms)(
cmdbuf, cmdbuf->state.gfx.vs.shader);
if (result != VK_SUCCESS)

View File

@@ -606,7 +606,6 @@ panvk_per_arch(cmd_prepare_draw_sysvals)(struct panvk_cmd_buffer *cmdbuf,
set_gfx_sysval(cmdbuf, dirty_sysvals, viewport.offset.z,
viewport->minDepth);
#if PAN_ARCH >= 9
/* Doing the viewport transform in the vertex shader and then depth
* clipping with the viewport depth range gets a similar result to
* clipping in clip-space, but loses precision when the viewport depth
@@ -643,7 +642,6 @@ panvk_per_arch(cmd_prepare_draw_sysvals)(struct panvk_cmd_buffer *cmdbuf,
set_gfx_sysval(cmdbuf, dirty_sysvals, viewport.offset.z,
CLAMP(z_offset, 0.0f, 1.0f));
}
#endif
}
const struct panvk_shader *vs = cmdbuf->state.gfx.vs.shader;