From b8cd48e8e8f02f023c964d39329a66757591467e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 21 Jul 2025 13:56:50 -0400 Subject: [PATCH] gallium: always upload cbuf0 when cap is set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Part-of: --- src/gallium/auxiliary/hud/hud_context.c | 8 ++++---- src/gallium/auxiliary/postprocess/pp_mlaa.c | 4 ++-- src/gallium/auxiliary/util/u_inlines.h | 21 +++++++++++++++++++++ src/mesa/state_tracker/st_atom_constbuf.c | 1 + src/mesa/state_tracker/st_cb_clear.c | 3 +-- src/mesa/state_tracker/st_draw_hw_select.c | 4 ++-- src/mesa/state_tracker/st_pbo.c | 5 +---- src/mesa/state_tracker/st_pbo_compute.c | 2 +- 8 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index 972daef738a..03b0c3a74e3 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -106,7 +106,7 @@ hud_draw_colored_prims(struct hud_context *hud, unsigned prim, hud->constants.translate[1] = (float) (yoffset * hud_scale); hud->constants.scale[0] = hud_scale; hud->constants.scale[1] = yscale * hud_scale; - pipe->set_constant_buffer(pipe, MESA_SHADER_VERTEX, 0, false, &hud->constbuf); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_VERTEX, &hud->constbuf); u_upload_data(hud->pipe->stream_uploader, 0, num_vertices * 2 * sizeof(float), 16, buffer, @@ -580,7 +580,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) pipe->set_sampler_views(pipe, MESA_SHADER_FRAGMENT, 0, 1, 0, &hud->font_sampler_view); cso_set_samplers(cso, MESA_SHADER_FRAGMENT, 1, sampler_states); - pipe->set_constant_buffer(pipe, MESA_SHADER_VERTEX, 0, false, &hud->constbuf); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_VERTEX, &hud->constbuf); /* draw accumulated vertices for background quads */ cso_set_blend(cso, &hud->alpha_blend); @@ -596,7 +596,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) hud->constants.scale[0] = hud_scale; hud->constants.scale[1] = hud_scale; - pipe->set_constant_buffer(pipe, MESA_SHADER_VERTEX, 0, false, &hud->constbuf); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_VERTEX, &hud->constbuf); cso_set_vertex_buffers(cso, 1, true, &hud->bg.vbuf); cso_draw_arrays(cso, MESA_PRIM_QUADS, 0, hud->bg.num_vertices); @@ -632,7 +632,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) hud->constants.translate[1] = 0; hud->constants.scale[0] = hud_scale; hud->constants.scale[1] = hud_scale; - pipe->set_constant_buffer(pipe, MESA_SHADER_VERTEX, 0, false, &hud->constbuf); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_VERTEX, &hud->constbuf); if (hud->whitelines.num_vertices) { cso_set_vertex_shader_handle(cso, hud->vs_color); diff --git a/src/gallium/auxiliary/postprocess/pp_mlaa.c b/src/gallium/auxiliary/postprocess/pp_mlaa.c index 0803104e11d..166a66ef82f 100644 --- a/src/gallium/auxiliary/postprocess/pp_mlaa.c +++ b/src/gallium/auxiliary/postprocess/pp_mlaa.c @@ -104,8 +104,8 @@ pp_jimenezmlaa_run(struct pp_queue_t *ppq, struct pipe_resource *in, cb.user_buffer = constants; struct pipe_context *pipe = ppq->p->pipe; - pipe->set_constant_buffer(pipe, MESA_SHADER_VERTEX, 0, false, &cb); - pipe->set_constant_buffer(pipe, MESA_SHADER_FRAGMENT, 0, false, &cb); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_VERTEX, &cb); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_FRAGMENT, &cb); mstencil.stencil[0].enabled = 1; mstencil.stencil[0].valuemask = mstencil.stencil[0].writemask = ~0; diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h index 42f820f57b1..80dcb58382a 100644 --- a/src/gallium/auxiliary/util/u_inlines.h +++ b/src/gallium/auxiliary/util/u_inlines.h @@ -38,6 +38,7 @@ #include "util/u_debug_describe.h" #include "util/u_debug_refcnt.h" #include "util/u_atomic.h" +#include "util/u_upload_mgr.h" #include "util/box.h" #include "util/u_math.h" @@ -691,6 +692,26 @@ pipe_set_constant_buffer(struct pipe_context *pipe, } } +static inline void +pipe_upload_constant_buffer0(struct pipe_context *pipe, mesa_shader_stage stage, struct pipe_constant_buffer *cb) +{ + struct pipe_constant_buffer cbuf = *cb; + cbuf.buffer = NULL; + const unsigned alignment = MAX2(pipe->screen->caps.constant_buffer_offset_alignment, 64); + void *ptr; + + if (pipe->screen->caps.prefer_real_buffer_in_constbuf0) { + u_upload_alloc(pipe->const_uploader, 0, cbuf.buffer_size, + alignment, &cbuf.buffer_offset, &cbuf.buffer, (void**)&ptr); + memcpy(ptr, cbuf.user_buffer, cbuf.buffer_size); + cbuf.user_buffer = NULL; + + u_upload_unmap(pipe->const_uploader); + pipe->set_constant_buffer(pipe, stage, 0, true, &cbuf); + } else { + pipe->set_constant_buffer(pipe, stage, 0, false, cb); + } +} /** * Get the polygon offset enable/disable flag for the given polygon fill mode. diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c index a10953dc531..0dbfb6e836e 100644 --- a/src/mesa/state_tracker/st_atom_constbuf.c +++ b/src/mesa/state_tracker/st_atom_constbuf.c @@ -118,6 +118,7 @@ st_upload_constants(struct st_context *st, struct gl_program *prog, mesa_shader_ cb.buffer_offset = 0; cb.buffer_size = paramBytes; + /* this path cannot be used with select/feedback draws */ if (st->prefer_real_buffer_in_constbuf0) { struct pipe_context *pipe = st->pipe; uint32_t *ptr; diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index 8f8a8cb7062..7d54c9cc09b 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -113,8 +113,7 @@ set_clearcolor_fs(struct st_context *st, union pipe_color_union *color) .user_buffer = color->f, .buffer_size = 4 * sizeof(float), }; - st->pipe->set_constant_buffer(st->pipe, MESA_SHADER_FRAGMENT, 0, - false, &cb); + pipe_upload_constant_buffer0(st->pipe, MESA_SHADER_FRAGMENT, &cb); if (!st->clear.fs) { st->clear.fs = st_nir_make_clearcolor_shader(st); diff --git a/src/mesa/state_tracker/st_draw_hw_select.c b/src/mesa/state_tracker/st_draw_hw_select.c index ba7524a9335..dd42c0e5cd8 100644 --- a/src/mesa/state_tracker/st_draw_hw_select.c +++ b/src/mesa/state_tracker/st_draw_hw_select.c @@ -691,14 +691,14 @@ st_draw_hw_select_prepare_common(struct gl_context *ctx) cb.buffer_size = sizeof(consts) - (MAX_CLIP_PLANES - num_planes) * 4 * sizeof(float); struct pipe_context *pipe = st->pipe; - pipe->set_constant_buffer(pipe, MESA_SHADER_GEOMETRY, 0, false, &cb); + pipe_upload_constant_buffer0(pipe, MESA_SHADER_GEOMETRY, &cb); struct pipe_shader_buffer buffer; memset(&buffer, 0, sizeof(buffer)); buffer.buffer = ctx->Select.Result->buffer; buffer.buffer_size = MAX_NAME_STACK_RESULT_NUM * 3 * sizeof(int); - pipe->set_shader_buffers(pipe, MESA_SHADER_GEOMETRY, 0, 1, &buffer, 0x1); + pipe->set_shader_buffers(st->pipe, MESA_SHADER_GEOMETRY, 0, 1, &buffer, 0x1); return true; } diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c index bec8ccb344e..3c50114d7d8 100644 --- a/src/mesa/state_tracker/st_pbo.c +++ b/src/mesa/state_tracker/st_pbo.c @@ -188,7 +188,6 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr, unsigned surface_width, unsigned surface_height) { struct cso_context *cso = st->cso_context; - struct pipe_context *pipe = st->pipe; /* Setup vertex and geometry shaders */ if (!st->pbo.vs) { @@ -260,9 +259,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr, cb.buffer_offset = 0; cb.buffer_size = sizeof(addr->constants); - pipe->set_constant_buffer(pipe, MESA_SHADER_FRAGMENT, 0, false, &cb); - - pipe_resource_reference(&cb.buffer, NULL); + pipe_upload_constant_buffer0(st->pipe, MESA_SHADER_FRAGMENT, &cb); } /* Rasterizer state */ diff --git a/src/mesa/state_tracker/st_pbo_compute.c b/src/mesa/state_tracker/st_pbo_compute.c index 95d19ca333f..7ec6bd0d72c 100644 --- a/src/mesa/state_tracker/st_pbo_compute.c +++ b/src/mesa/state_tracker/st_pbo_compute.c @@ -1004,7 +1004,7 @@ download_texture_compute(struct st_context *st, assert(cs); struct cso_context *cso = st->cso_context; - pipe->set_constant_buffer(pipe, MESA_SHADER_COMPUTE, 0, false, &cb); + pipe_upload_constant_buffer0(st->pipe, MESA_SHADER_COMPUTE, &cb); cso_save_compute_state(cso, CSO_BIT_COMPUTE_SHADER | CSO_BIT_COMPUTE_SAMPLERS); cso_set_compute_shader_handle(cso, cs);