From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/hud/hud_context.c | 168 +++++++++++++---------- src/gallium/auxiliary/hud/hud_context.h | 2 +- src/gallium/state_trackers/dri/dri_drawable.c | 2 +- src/gallium/state_trackers/glx/xlib/xm_api.c | 2 +- src/gallium/state_trackers/nine/swapchain9.c | 2 +- src/gallium/state_trackers/wgl/stw_framebuffer.c | 2 +- 6 files changed, 99 insertions(+), 79 deletions(-)
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index ed2e849..83b3204 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -421,32 +421,31 @@ hud_prepare_vertices(struct hud_context *hud, struct vertex_queue *v, v->num_vertices = 0; v->max_num_vertices = num_vertices; v->vbuf.stride = stride; 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) +static void +hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) { struct cso_context *cso = hud->cso; struct pipe_context *pipe = hud->pipe; struct pipe_framebuffer_state fb; struct pipe_surface surf_templ, *surf; struct pipe_viewport_state viewport; const struct pipe_sampler_state *sampler_states[] = { &hud->font_sampler_state }; struct hud_pane *pane; - struct hud_graph *gr, *next; if (!huds_visible) return; hud->fb_width = tex->width0; hud->fb_height = tex->height0; hud->constants.two_div_fb_width = 2.0f / hud->fb_width; hud->constants.two_div_fb_height = 2.0f / hud->fb_height; cso_save_state(cso, (CSO_BIT_FRAMEBUFFER | @@ -512,90 +511,20 @@ hud_draw(struct hud_context *hud, struct pipe_resource *tex) cso_set_tesseval_shader_handle(cso, NULL); 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_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->color_prims.buffer_size, - 16, &hud->bg.vbuf.buffer_offset, &hud->bg.vbuf.buffer.resource, - (void**)&hud->bg.vertices); - if (!hud->bg.vertices) { - goto out; - } - - pipe_resource_reference(&hud->whitelines.vbuf.buffer.resource, hud->bg.vbuf.buffer.resource); - pipe_resource_reference(&hud->text.vbuf.buffer.resource, hud->bg.vbuf.buffer.resource); - pipe_resource_reference(&hud->color_prims.vbuf.buffer.resource, hud->bg.vbuf.buffer.resource); - - 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) { - /* ignore the last one */ - if (&gr->head == pane->graph_list.prev) - continue; - - /* This is an incremental bubble sort, because we only do one pass - * per frame. It will eventually reach an equilibrium. - */ - if (gr->current_value < - LIST_ENTRY(struct hud_graph, next, head)->current_value) { - LIST_DEL(&gr->head); - LIST_ADD(&gr->head, &next->head); - } - } - } - - hud_pane_accumulate_vertices(hud, pane); - } - - /* unmap the uploader's vertex buffer before drawing */ - u_upload_unmap(pipe->stream_uploader); - /* draw accumulated vertices for background quads */ cso_set_blend(cso, &hud->alpha_blend); cso_set_fragment_shader_handle(hud->cso, hud->fs_color); if (hud->bg.num_vertices) { hud->constants.color[0] = 0; hud->constants.color[1] = 0; hud->constants.color[2] = 0; hud->constants.color[3] = 0.666f; hud->constants.translate[0] = 0; @@ -641,37 +570,128 @@ hud_draw(struct hud_context *hud, struct pipe_resource *tex) } pipe_resource_reference(&hud->text.vbuf.buffer.resource, NULL); /* draw the rest */ cso_set_rasterizer(cso, &hud->rasterizer_aa_lines); LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) { if (pane) hud_pane_draw_colored_objects(hud, pane); } -out: cso_restore_state(cso); cso_restore_constant_buffer_slot0(cso, PIPE_SHADER_VERTEX); pipe_surface_reference(&surf, NULL); +} + +static void +hud_start_queries(struct hud_context *hud) +{ + struct hud_pane *pane; + struct hud_graph *gr; /* Start queries. */ hud_batch_query_begin(hud->batch_query); LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) { LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) { if (gr->begin_query) gr->begin_query(gr); } } } +/* Stop queries, query results, and record vertices for charts. */ +static void +hud_stop_queries(struct hud_context *hud) +{ + struct hud_pane *pane; + struct hud_graph *gr, *next; + + /* 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->color_prims.buffer_size, + 16, &hud->bg.vbuf.buffer_offset, &hud->bg.vbuf.buffer.resource, + (void**)&hud->bg.vertices); + if (!hud->bg.vertices) + return; + + pipe_resource_reference(&hud->whitelines.vbuf.buffer.resource, hud->bg.vbuf.buffer.resource); + pipe_resource_reference(&hud->text.vbuf.buffer.resource, hud->bg.vbuf.buffer.resource); + pipe_resource_reference(&hud->color_prims.vbuf.buffer.resource, hud->bg.vbuf.buffer.resource); + + 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) { + /* ignore the last one */ + if (&gr->head == pane->graph_list.prev) + continue; + + /* This is an incremental bubble sort, because we only do one pass + * per frame. It will eventually reach an equilibrium. + */ + if (gr->current_value < + LIST_ENTRY(struct hud_graph, next, head)->current_value) { + LIST_DEL(&gr->head); + LIST_ADD(&gr->head, &next->head); + } + } + } + + hud_pane_accumulate_vertices(hud, pane); + } + + /* unmap the uploader's vertex buffer before drawing */ + u_upload_unmap(hud->pipe->stream_uploader); +} + +void +hud_run(struct hud_context *hud, struct pipe_resource *tex) +{ + hud_stop_queries(hud); + hud_draw_results(hud, tex); + hud_start_queries(hud); +} + static void fixup_bytes(enum pipe_driver_query_type type, int position, uint64_t *exp10) { if (type == PIPE_DRIVER_QUERY_TYPE_BYTES && position % 3 == 0) *exp10 = (*exp10 / 1000) * 1024; } /** * Set the maximum value for the Y axis of the graph. * This scales the graph accordingly. diff --git a/src/gallium/auxiliary/hud/hud_context.h b/src/gallium/auxiliary/hud/hud_context.h index 5a7e13b..deb60ef 100644 --- a/src/gallium/auxiliary/hud/hud_context.h +++ b/src/gallium/auxiliary/hud/hud_context.h @@ -34,17 +34,17 @@ struct pipe_context; struct pipe_resource; struct util_queue_monitoring; struct hud_context * hud_create(struct pipe_context *pipe, struct cso_context *cso); void hud_destroy(struct hud_context *hud); void -hud_draw(struct hud_context *hud, struct pipe_resource *tex); +hud_run(struct hud_context *hud, struct pipe_resource *tex); void hud_add_queue_for_monitoring(struct hud_context *hud, struct util_queue_monitoring *queue_info); #endif diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index d586b75..53dbfd7 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -512,21 +512,21 @@ dri_flush(__DRIcontext *cPriv, drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]) { swap_msaa_buffers = TRUE; } /* FRONT_LEFT is resolved in drawable->flush_frontbuffer. */ } dri_postprocessing(ctx, drawable, ST_ATTACHMENT_BACK_LEFT); if (ctx->hud) { - hud_draw(ctx->hud, drawable->textures[ST_ATTACHMENT_BACK_LEFT]); + hud_run(ctx->hud, drawable->textures[ST_ATTACHMENT_BACK_LEFT]); } pipe->flush_resource(pipe, drawable->textures[ST_ATTACHMENT_BACK_LEFT]); if (pipe->invalidate_resource && (flags & __DRI2_FLUSH_INVALIDATE_ANCILLARY)) { if (drawable->textures[ST_ATTACHMENT_DEPTH_STENCIL]) pipe->invalidate_resource(pipe, drawable->textures[ST_ATTACHMENT_DEPTH_STENCIL]); if (drawable->msaa_textures[ST_ATTACHMENT_DEPTH_STENCIL]) pipe->invalidate_resource(pipe, drawable->msaa_textures[ST_ATTACHMENT_DEPTH_STENCIL]); diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c index 828253b..74b5975 100644 --- a/src/gallium/state_trackers/glx/xlib/xm_api.c +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c @@ -1350,21 +1350,21 @@ XMesaContext XMesaGetCurrentContext( void ) */ PUBLIC void XMesaSwapBuffers( XMesaBuffer b ) { XMesaContext xmctx = XMesaGetCurrentContext(); /* Need to draw HUD before flushing */ if (xmctx && xmctx->hud) { struct pipe_resource *back = xmesa_get_framebuffer_resource(b->stfb, ST_ATTACHMENT_BACK_LEFT); - hud_draw(xmctx->hud, back); + hud_run(xmctx->hud, back); } if (xmctx && xmctx->xm_buffer == b) { xmctx->st->flush( xmctx->st, ST_FLUSH_FRONT, NULL); } xmesa_swap_st_framebuffer(b->stfb); } diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c index 9815acf..096d582 100644 --- a/src/gallium/state_trackers/nine/swapchain9.c +++ b/src/gallium/state_trackers/nine/swapchain9.c @@ -599,21 +599,21 @@ handle_draw_cursor_and_hud( struct NineSwapChain9 *This, struct pipe_resource *r blit.dst.box.x, blit.dst.box.y); blit.alpha_blend = TRUE; pipe = NineDevice9_GetPipe(This->base.device); pipe->blit(pipe, &blit); } if (device->hud && resource) { /* Implicit use of context pipe */ (void)NineDevice9_GetPipe(This->base.device); - hud_draw(device->hud, resource); /* XXX: no offset */ + hud_run(device->hud, resource); /* XXX: no offset */ /* HUD doesn't clobber stipple */ nine_state_restore_non_cso(device); } } struct end_present_struct { struct pipe_screen *screen; struct pipe_fence_handle *fence_to_wait; ID3DPresent *present; D3DWindowBuffer *present_handle; diff --git a/src/gallium/state_trackers/wgl/stw_framebuffer.c b/src/gallium/state_trackers/wgl/stw_framebuffer.c index 7348ea3..47e76c6 100644 --- a/src/gallium/state_trackers/wgl/stw_framebuffer.c +++ b/src/gallium/state_trackers/wgl/stw_framebuffer.c @@ -634,21 +634,21 @@ DrvSwapBuffers(HDC hdc) return TRUE; } ctx = stw_current_context(); if (ctx) { if (ctx->hud) { /* Display the HUD */ struct pipe_resource *back = stw_get_framebuffer_resource(fb->stfb, ST_ATTACHMENT_BACK_LEFT); if (back) { - hud_draw(ctx->hud, back); + hud_run(ctx->hud, back); } } if (ctx->current_framebuffer == fb) { /* flush current context */ ctx->st->flush(ctx->st, ST_FLUSH_END_OF_FRAME, NULL); } } if (stw_dev->swap_interval != 0) { -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev