From: Marek Olšák <marek.ol...@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) { -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev