[Mesa-dev] [PATCH 2/2] gallium/hud: don't use user vertex buffers

Nicolai Hähnle nhaehnle at gmail.com
Mon Feb 13 15:42:11 UTC 2017


Both patches:

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 12.02.2017 00:25, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>  src/gallium/auxiliary/hud/hud_context.c | 26 +++++++++++++++++++-------
>  1 file changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c
> index 15ca471..9de260c 100644
> --- a/src/gallium/auxiliary/hud/hud_context.c
> +++ b/src/gallium/auxiliary/hud/hud_context.c
> @@ -91,59 +91,63 @@ struct hud_context {
>     unsigned fb_width, fb_height;
>
>     /* vertices for text and background drawing are accumulated here and then
>      * drawn all at once */
>     struct vertex_queue {
>        float *vertices;
>        struct pipe_vertex_buffer vbuf;
>        unsigned max_num_vertices;
>        unsigned num_vertices;
>        unsigned buffer_size;
> -   } text, bg, whitelines;
> +   } text, bg, whitelines, color_prims;
>
>     bool has_srgb;
>  };
>
>  #ifdef PIPE_OS_UNIX
>  static void
>  signal_visible_handler(int sig, siginfo_t *siginfo, void *context)
>  {
>     huds_visible = !huds_visible;
>  }
>  #endif
>
>  static void
>  hud_draw_colored_prims(struct hud_context *hud, unsigned prim,
>                         float *buffer, unsigned num_vertices,
>                         float r, float g, float b, float a,
>                         int xoffset, int yoffset, float yscale)
>  {
>     struct cso_context *cso = hud->cso;
> -   struct pipe_vertex_buffer vbuffer = {0};
> +   unsigned size = num_vertices * hud->color_prims.vbuf.stride;
> +
> +   assert(size <= hud->color_prims.buffer_size);
> +   memcpy(hud->color_prims.vertices, buffer, size);
>
>     hud->constants.color[0] = r;
>     hud->constants.color[1] = g;
>     hud->constants.color[2] = b;
>     hud->constants.color[3] = a;
>     hud->constants.translate[0] = (float) xoffset;
>     hud->constants.translate[1] = (float) yoffset;
>     hud->constants.scale[0] = 1;
>     hud->constants.scale[1] = yscale;
>     cso_set_constant_buffer(cso, PIPE_SHADER_VERTEX, 0, &hud->constbuf);
>
> -   vbuffer.user_buffer = buffer;
> -   vbuffer.stride = 2 * sizeof(float);
> -
>     cso_set_vertex_buffers(cso, cso_get_aux_vertex_buffer_slot(cso),
> -                          1, &vbuffer);
> +                          1, &hud->color_prims.vbuf);
>     cso_set_fragment_shader_handle(hud->cso, hud->fs_color);
>     cso_draw_arrays(cso, prim, 0, num_vertices);
> +
> +   hud->color_prims.vertices += size / sizeof(float);
> +   hud->color_prims.vbuf.buffer_offset += size;
> +   hud->color_prims.buffer_size -= size;
>  }
>
>  static void
>  hud_draw_colored_quad(struct hud_context *hud, unsigned prim,
>                        unsigned x1, unsigned y1, unsigned x2, unsigned y2,
>                        float r, float g, float b, float a)
>  {
>     float buffer[] = {
>        (float) x1, (float) y1,
>        (float) x1, (float) y2,
> @@ -558,43 +562,51 @@ hud_draw(struct hud_context *hud, struct pipe_resource *tex)
>     cso_set_render_condition(cso, NULL, FALSE, 0);
>     cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1,
>                           &hud->font_sampler_view);
>     cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, sampler_states);
>     cso_set_constant_buffer(cso, PIPE_SHADER_VERTEX, 0, &hud->constbuf);
>
>     /* prepare vertex buffers */
>     hud_prepare_vertices(hud, &hud->bg, 16 * 256, 2 * sizeof(float));
>     hud_prepare_vertices(hud, &hud->whitelines, 4 * 256, 2 * sizeof(float));
>     hud_prepare_vertices(hud, &hud->text, 16 * 1024, 4 * sizeof(float));
> +   hud_prepare_vertices(hud, &hud->color_prims, 32 * 1024, 2 * sizeof(float));
>
>     /* Allocate everything once and divide the storage into 3 portions
>      * manually, because u_upload_alloc can unmap memory from previous calls.
>      */
>     u_upload_alloc(hud->pipe->stream_uploader, 0,
>                    hud->bg.buffer_size +
>                    hud->whitelines.buffer_size +
> -                  hud->text.buffer_size,
> +                  hud->text.buffer_size +
> +                  hud->color_prims.buffer_size,
>                    16, &hud->bg.vbuf.buffer_offset, &hud->bg.vbuf.buffer,
>                    (void**)&hud->bg.vertices);
>     pipe_resource_reference(&hud->whitelines.vbuf.buffer, hud->bg.vbuf.buffer);
>     pipe_resource_reference(&hud->text.vbuf.buffer, hud->bg.vbuf.buffer);
> +   pipe_resource_reference(&hud->color_prims.vbuf.buffer, hud->bg.vbuf.buffer);
>
>     hud->whitelines.vbuf.buffer_offset = hud->bg.vbuf.buffer_offset +
>                                          hud->bg.buffer_size;
>     hud->whitelines.vertices = hud->bg.vertices +
>                                hud->bg.buffer_size / sizeof(float);
>
>     hud->text.vbuf.buffer_offset = hud->whitelines.vbuf.buffer_offset +
>                                    hud->whitelines.buffer_size;
>     hud->text.vertices = hud->whitelines.vertices +
>                          hud->whitelines.buffer_size / sizeof(float);
>
> +   hud->color_prims.vbuf.buffer_offset = hud->text.vbuf.buffer_offset +
> +                                         hud->text.buffer_size;
> +   hud->color_prims.vertices = hud->text.vertices +
> +                               hud->text.buffer_size / sizeof(float);
> +
>     /* prepare all graphs */
>     hud_batch_query_update(hud->batch_query);
>
>     LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) {
>        LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
>           gr->query_new_value(gr);
>        }
>
>        if (pane->sort_items) {
>           LIST_FOR_EACH_ENTRY_SAFE(gr, next, &pane->graph_list, head) {
>



More information about the mesa-dev mailing list