From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/hud/hud_context.c | 37 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-)
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index aa63171..15ca471 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -90,20 +90,21 @@ 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; bool has_srgb; }; #ifdef PIPE_OS_UNIX static void signal_visible_handler(int sig, siginfo_t *siginfo, void *context) { huds_visible = !huds_visible; @@ -449,29 +450,27 @@ hud_pane_draw_colored_objects(struct hud_context *hud, i++; } /* draw the line strips */ LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) { hud_draw_graph_line_strip(hud, gr, pane->inner_x1, pane->inner_y2, pane->yscale); } } static void -hud_alloc_vertices(struct hud_context *hud, struct vertex_queue *v, - unsigned num_vertices, unsigned stride) +hud_prepare_vertices(struct hud_context *hud, struct vertex_queue *v, + unsigned num_vertices, unsigned stride) { v->num_vertices = 0; v->max_num_vertices = num_vertices; v->vbuf.stride = stride; - u_upload_alloc(hud->pipe->stream_uploader, 0, v->vbuf.stride * v->max_num_vertices, - 16, &v->vbuf.buffer_offset, &v->vbuf.buffer, - (void**)&v->vertices); + v->buffer_size = stride * num_vertices; } /** * Draw the HUD to the texture \p tex. * The texture is usually the back buffer being displayed. */ void hud_draw(struct hud_context *hud, struct pipe_resource *tex) { struct cso_context *cso = hud->cso; @@ -556,23 +555,45 @@ hud_draw(struct hud_context *hud, struct pipe_resource *tex) cso_set_geometry_shader_handle(cso, NULL); cso_set_vertex_shader_handle(cso, hud->vs); cso_set_vertex_elements(cso, 2, hud->velems); 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_alloc_vertices(hud, &hud->bg, 16 * 256, 2 * sizeof(float)); - hud_alloc_vertices(hud, &hud->whitelines, 4 * 256, 2 * sizeof(float)); - hud_alloc_vertices(hud, &hud->text, 16 * 1024, 4 * sizeof(float)); + 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)); + + /* 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, + 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); + + 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); /* 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) { -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev