From 4d17f8d10a98401a7df29dd2eb1495ba05eeda05 Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Fri, 4 Apr 2025 14:58:56 +0200 Subject: [PATCH] r600: fallback to util_blitter_draw_rectangle when required This is the backport of dc293ffe507 ("radeonsi: fallback to util_blitter_draw_rectangle"). This change was tested on rv770, palm and cayman. Here is the test fixed: spec/ext_framebuffer_blit/fbo-blit-check-limits: fail pass Cc: mesa-stable Signed-off-by: Patrick Lerda Part-of: --- src/gallium/drivers/r600/r600_pipe_common.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c index 827eca36911..e3868bc7ad9 100644 --- a/src/gallium/drivers/r600/r600_pipe_common.c +++ b/src/gallium/drivers/r600/r600_pipe_common.c @@ -115,13 +115,26 @@ void r600_draw_rectangle(struct blitter_context *blitter, enum blitter_attrib_type type, const struct blitter_attrib *attrib) { - struct r600_common_context *rctx = - (struct r600_common_context*)util_blitter_get_pipe(blitter); + struct r600_context *cctx = + (struct r600_context*)util_blitter_get_pipe(blitter); + struct r600_common_context *rctx = &cctx->b; struct pipe_viewport_state viewport; struct pipe_resource *buf = NULL; unsigned offset = 0; float *vb; + if (unlikely(MAX2(abs(x1), abs(x2)) > INT16_MAX || + MAX2(abs(y1), abs(y2)) > INT16_MAX)) { + /* Fallback when coordinates can't fit in int16. */ + util_blitter_save_vertex_elements(cctx->blitter, + cctx->vertex_fetch_shader.cso); + util_blitter_draw_rectangle(blitter, vertex_elements_cso, get_vs, + x1, y1, x2, y2, + depth, num_instances, + type, attrib); + return; + } + rctx->b.bind_vertex_elements_state(&rctx->b, vertex_elements_cso); rctx->b.bind_vs_state(&rctx->b, get_vs(blitter));