From: Connor Abbott Date: Tue, 21 Jul 2020 12:36:53 +0000 (+0200) Subject: tu: Fix empty blit scissor case X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;ds=inline;h=7ad962bf89f4f310a7dfb3dd1416c9dd24b31f43;p=mesa.git tu: Fix empty blit scissor case With vertexPipelineStoresAndAtomics enabled, fixes: dEQP-VK.tessellation.invariance.one_minus_tess_coord_component.quads_fractional_even_spacing_cw_point_mode dEQP-VK.tessellation.invariance.tess_coord_component_range.triangles_fractional_even_spacing_ccw_point_mode Part-of: --- diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index d786a4589a9..03266c2287e 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -433,7 +433,19 @@ tu6_emit_render_cntl(struct tu_cmd_buffer *cmd, static void tu6_emit_blit_scissor(struct tu_cmd_buffer *cmd, struct tu_cs *cs, bool align) { + const VkRect2D *render_area = &cmd->state.render_area; + + /* Avoid assertion fails with an empty render area at (0, 0) where the + * subtraction below wraps around. Empty render areas should be forced to + * the sysmem path by use_sysmem_rendering(). It's not even clear whether + * an empty scissor here works, and the blob seems to force sysmem too as + * it sets something wrong (non-empty) for the scissor. + */ + if (render_area->extent.width == 0 || + render_area->extent.height == 0) + return; + uint32_t x1 = render_area->offset.x; uint32_t y1 = render_area->offset.y; uint32_t x2 = x1 + render_area->extent.width - 1; @@ -571,6 +583,11 @@ use_sysmem_rendering(struct tu_cmd_buffer *cmd) if (cmd->state.framebuffer->layers > 1) return true; + /* Use sysmem for empty render areas */ + if (cmd->state.render_area.extent.width == 0 || + cmd->state.render_area.extent.height == 0) + return true; + if (cmd->has_tess) return true;