From 8d7b913e4e089cc8b0b800cbcf80737d0be0a0f7 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 22 Oct 2013 16:47:38 -0600 Subject: svga: remove user-space vertex/index buffer code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gallium vbuf module, which we've been using for some time now, takes care of uploading user-space vertex/index data into real buffers. The upload code in the svga driver was unused. Reviewed-by: José Fonseca --- src/gallium/drivers/svga/svga_context.c | 34 +---- src/gallium/drivers/svga/svga_context.h | 3 - src/gallium/drivers/svga/svga_draw.c | 16 +-- src/gallium/drivers/svga/svga_draw.h | 6 +- src/gallium/drivers/svga/svga_draw_elements.c | 27 +--- src/gallium/drivers/svga/svga_pipe_draw.c | 186 -------------------------- 6 files changed, 13 insertions(+), 259 deletions(-) diff --git a/src/gallium/drivers/svga/svga_context.c b/src/gallium/drivers/svga/svga_context.c index 7147d5a8f8..83afe796f4 100644 --- a/src/gallium/drivers/svga/svga_context.c +++ b/src/gallium/drivers/svga/svga_context.c @@ -30,7 +30,6 @@ #include "pipe/p_screen.h" #include "util/u_memory.h" #include "util/u_bitmask.h" -#include "util/u_upload_mgr.h" #include "svga_context.h" #include "svga_screen.h" @@ -69,9 +68,6 @@ static void svga_destroy( struct pipe_context *pipe ) svga_destroy_swtnl( svga ); - u_upload_destroy( svga->upload_vb ); - u_upload_destroy( svga->upload_ib ); - util_bitmask_destroy( svga->vs_bm ); util_bitmask_destroy( svga->fs_bm ); @@ -136,23 +132,7 @@ struct pipe_context *svga_context_create( struct pipe_screen *screen, if (svga->vs_bm == NULL) goto no_vs_bm; - svga->upload_ib = u_upload_create( &svga->pipe, - 32 * 1024, - 16, - PIPE_BIND_INDEX_BUFFER ); - if (svga->upload_ib == NULL) - goto no_upload_ib; - - svga->upload_vb = u_upload_create( &svga->pipe, - 128 * 1024, - 16, - PIPE_BIND_VERTEX_BUFFER ); - if (svga->upload_vb == NULL) - goto no_upload_vb; - - svga->hwtnl = svga_hwtnl_create( svga, - svga->upload_ib, - svga->swc ); + svga->hwtnl = svga_hwtnl_create(svga); if (svga->hwtnl == NULL) goto no_hwtnl; @@ -184,10 +164,6 @@ no_state: no_swtnl: svga_hwtnl_destroy( svga->hwtnl ); no_hwtnl: - u_upload_destroy( svga->upload_vb ); -no_upload_vb: - u_upload_destroy( svga->upload_ib ); -no_upload_ib: util_bitmask_destroy( svga->vs_bm ); no_vs_bm: util_bitmask_destroy( svga->fs_bm ); @@ -208,14 +184,6 @@ void svga_context_flush( struct svga_context *svga, svga->curr.nr_fbs = 0; - /* Flush the upload managers to ensure recycling of upload buffers - * without throttling. This should really be conditioned on - * pipe_buffer_map_range not supporting PIPE_TRANSFER_UNSYNCHRONIZED. - */ - - u_upload_flush(svga->upload_vb); - u_upload_flush(svga->upload_ib); - /* Ensure that texture dma uploads are processed * before submitting commands. */ diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h index 517102d604..284ee2db4a 100644 --- a/src/gallium/drivers/svga/svga_context.h +++ b/src/gallium/drivers/svga/svga_context.h @@ -53,7 +53,6 @@ struct draw_fragment_shader; struct svga_shader_result; struct SVGACmdMemory; struct util_bitmask; -struct u_upload_mgr; struct svga_shader @@ -367,8 +366,6 @@ struct svga_context unsigned texture_samplers:1; } rebind; - struct u_upload_mgr *upload_ib; - struct u_upload_mgr *upload_vb; struct svga_hwtnl *hwtnl; /** The occlusion query currently in progress */ diff --git a/src/gallium/drivers/svga/svga_draw.c b/src/gallium/drivers/svga/svga_draw.c index c0596ddacb..a380334e90 100644 --- a/src/gallium/drivers/svga/svga_draw.c +++ b/src/gallium/drivers/svga/svga_draw.c @@ -42,18 +42,16 @@ #include "svga_cmd.h" -struct svga_hwtnl *svga_hwtnl_create( struct svga_context *svga, - struct u_upload_mgr *upload_ib, - struct svga_winsys_context *swc ) +struct svga_hwtnl * +svga_hwtnl_create(struct svga_context *svga) { struct svga_hwtnl *hwtnl = CALLOC_STRUCT(svga_hwtnl); if (hwtnl == NULL) goto fail; hwtnl->svga = svga; - hwtnl->upload_ib = upload_ib; - hwtnl->cmd.swc = swc; + hwtnl->cmd.swc = svga->swc; return hwtnl; @@ -177,10 +175,8 @@ svga_hwtnl_flush( struct svga_hwtnl *hwtnl ) SVGA3dPrimitiveRange *prim; unsigned i; - /* Unmap upload manager vertex buffers */ - u_upload_unmap(svga->upload_vb); - for (i = 0; i < hwtnl->cmd.vdecl_count; i++) { + assert(!svga_buffer_is_user_buffer(hwtnl->cmd.vdecl_vb[i])); handle = svga_buffer_handle(svga, hwtnl->cmd.vdecl_vb[i]); if (handle == NULL) return PIPE_ERROR_OUT_OF_MEMORY; @@ -188,11 +184,9 @@ svga_hwtnl_flush( struct svga_hwtnl *hwtnl ) vb_handle[i] = handle; } - /* Unmap upload manager index buffers */ - u_upload_unmap(svga->upload_ib); - for (i = 0; i < hwtnl->cmd.prim_count; i++) { if (hwtnl->cmd.prim_ib[i]) { + assert(!svga_buffer_is_user_buffer(hwtnl->cmd.prim_ib[i])); handle = svga_buffer_handle(svga, hwtnl->cmd.prim_ib[i]); if (handle == NULL) return PIPE_ERROR_OUT_OF_MEMORY; diff --git a/src/gallium/drivers/svga/svga_draw.h b/src/gallium/drivers/svga/svga_draw.h index 31bea52438..1db79cd91c 100644 --- a/src/gallium/drivers/svga/svga_draw.h +++ b/src/gallium/drivers/svga/svga_draw.h @@ -35,11 +35,9 @@ struct svga_winsys_context; struct svga_screen; struct svga_context; struct pipe_resource; -struct u_upload_mgr; -struct svga_hwtnl *svga_hwtnl_create( struct svga_context *svga, - struct u_upload_mgr *upload_ib, - struct svga_winsys_context *swc ); +struct svga_hwtnl * +svga_hwtnl_create(struct svga_context *svga); void svga_hwtnl_destroy( struct svga_hwtnl *hwtnl ); diff --git a/src/gallium/drivers/svga/svga_draw_elements.c b/src/gallium/drivers/svga/svga_draw_elements.c index f0815b144a..c52ca2d91e 100644 --- a/src/gallium/drivers/svga/svga_draw_elements.c +++ b/src/gallium/drivers/svga/svga_draw_elements.c @@ -24,7 +24,6 @@ **********************************************************/ #include "util/u_inlines.h" -#include "util/u_upload_mgr.h" #include "indices/u_indices.h" #include "svga_cmd.h" @@ -117,27 +116,11 @@ svga_hwtnl_simple_draw_range_elements( struct svga_hwtnl *hwtnl, if (hw_count == 0) goto done; - if (index_buffer && - svga_buffer_is_user_buffer(index_buffer)) - { - assert( index_buffer->width0 >= index_offset + count * index_size ); - - ret = u_upload_buffer( hwtnl->upload_ib, - 0, - index_offset, - count * index_size, - index_buffer, - &index_offset, - &upload_buffer); - if (ret != PIPE_OK) - goto done; - - /* Don't need to worry about refcounting index_buffer as this is - * just a stack variable without a counted reference of its own. - * The caller holds the reference. - */ - index_buffer = upload_buffer; - } + /* We should never see user-space buffers in the driver. The vbuf + * module should have converted them into real buffers. + */ + if (index_buffer) + assert(!svga_buffer_is_user_buffer(index_buffer)); range.primType = hw_prim; range.primitiveCount = hw_count; diff --git a/src/gallium/drivers/svga/svga_pipe_draw.c b/src/gallium/drivers/svga/svga_pipe_draw.c index f0da170453..87f6b3d712 100644 --- a/src/gallium/drivers/svga/svga_pipe_draw.c +++ b/src/gallium/drivers/svga/svga_pipe_draw.c @@ -28,7 +28,6 @@ #include "util/u_inlines.h" #include "util/u_prim.h" #include "util/u_time.h" -#include "util/u_upload_mgr.h" #include "indices/u_indices.h" #include "svga_hw_reg.h" @@ -42,179 +41,6 @@ #include "svga_resource_buffer.h" -/** - * Determine the ranges to upload for the user-buffers referenced - * by the next draw command. - * - * TODO: It might be beneficial to support multiple ranges. In that case, - * the struct svga_buffer::uploaded member should be made an array or a - * list, since we need to account for the possibility that different ranges - * may be uploaded to different hardware buffers chosen by the utility - * upload manager. - */ -static void -svga_user_buffer_range(struct svga_context *svga, - unsigned start, - unsigned count, - unsigned instance_count) -{ - const struct pipe_vertex_element *ve = svga->curr.velems->velem; - unsigned i; - - /* - * Release old uploaded range (if not done already) and - * initialize new ranges. - */ - - for (i=0; i < svga->curr.velems->count; i++) { - struct pipe_vertex_buffer *vb = - &svga->curr.vb[ve[i].vertex_buffer_index]; - - if (vb->buffer && svga_buffer_is_user_buffer(vb->buffer)) { - struct svga_buffer *buffer = svga_buffer(vb->buffer); - - pipe_resource_reference(&buffer->uploaded.buffer, NULL); - buffer->uploaded.start = ~0; - buffer->uploaded.end = 0; - } - } - - for (i=0; i < svga->curr.velems->count; i++) { - struct pipe_vertex_buffer *vb = - &svga->curr.vb[ve[i].vertex_buffer_index]; - - if (vb->buffer && svga_buffer_is_user_buffer(vb->buffer)) { - struct svga_buffer *buffer = svga_buffer(vb->buffer); - unsigned first, size; - unsigned instance_div = ve[i].instance_divisor; - unsigned elemSize = util_format_get_blocksize(ve[i].src_format); - - svga->dirty |= SVGA_NEW_VBUFFER; - - if (instance_div) { - first = ve[i].src_offset; - count = (instance_count + instance_div - 1) / instance_div; - size = vb->stride * (count - 1) + elemSize; - } else { - first = vb->stride * start + ve[i].src_offset; - size = vb->stride * (count - 1) + elemSize; - } - - buffer->uploaded.start = MIN2(buffer->uploaded.start, first); - buffer->uploaded.end = MAX2(buffer->uploaded.end, first + size); - } - } -} - - -/** - * svga_upload_user_buffers - upload parts of user buffers - * - * This function streams a part of a user buffer to hw and fills - * svga_buffer::uploaded with information on the upload. - */ -static int -svga_upload_user_buffers(struct svga_context *svga, - unsigned start, - unsigned count, - unsigned instance_count) -{ - const struct pipe_vertex_element *ve = svga->curr.velems->velem; - unsigned i; - int ret; - - svga_user_buffer_range(svga, start, count, instance_count); - - for (i=0; i < svga->curr.velems->count; i++) { - struct pipe_vertex_buffer *vb = - &svga->curr.vb[ve[i].vertex_buffer_index]; - - if (vb->buffer && svga_buffer_is_user_buffer(vb->buffer)) { - struct svga_buffer *buffer = svga_buffer(vb->buffer); - - /* - * Check if already uploaded. Otherwise go ahead and upload. - */ - - if (buffer->uploaded.buffer) - continue; - - ret = u_upload_buffer( svga->upload_vb, - 0, - buffer->uploaded.start, - buffer->uploaded.end - buffer->uploaded.start, - &buffer->b.b, - &buffer->uploaded.offset, - &buffer->uploaded.buffer); - - if (ret) - return ret; - - if (0) - debug_printf("%s: %d: orig buf %p upl buf %p ofs %d sofs %d" - " sz %d\n", - __FUNCTION__, - i, - buffer, - buffer->uploaded.buffer, - buffer->uploaded.offset, - buffer->uploaded.start, - buffer->uploaded.end - buffer->uploaded.start); - - vb->buffer_offset = buffer->uploaded.offset; - } - } - - return PIPE_OK; -} - - -/** - * svga_release_user_upl_buffers - release uploaded parts of user buffers - * - * This function releases the hw copy of the uploaded fraction of the - * user-buffer. It's important to do this as soon as all draw calls - * affecting the uploaded fraction are issued, as this allows for - * efficient reuse of the hardware surface backing the uploaded fraction. - * - * svga_buffer::source_offset is set to 0, and svga_buffer::uploaded::buffer - * is set to 0. - */ -static void -svga_release_user_upl_buffers(struct svga_context *svga) -{ - unsigned i; - unsigned nr; - - nr = svga->curr.num_vertex_buffers; - - for (i = 0; i < nr; ++i) { - struct pipe_vertex_buffer *vb = &svga->curr.vb[i]; - - if (vb->buffer && svga_buffer_is_user_buffer(vb->buffer)) { - struct svga_buffer *buffer = svga_buffer(vb->buffer); - - /* The buffer_offset is relative to the uploaded buffer. - * Since we're discarding that buffer we need to reset this offset - * so it's not inadvertantly applied to a subsequent draw. - * - * XXX a root problem here is that the svga->curr.vb[] information - * is getting set both by gallium API calls and by code in - * svga_upload_user_buffers(). We should instead have two copies - * of the vertex buffer information and choose between as needed. - */ - vb->buffer_offset = 0; - - buffer->uploaded.start = ~0; - buffer->uploaded.end = 0; - if (buffer->uploaded.buffer) - pipe_resource_reference(&buffer->uploaded.buffer, NULL); - } - } -} - - - static enum pipe_error retry_draw_range_elements( struct svga_context *svga, struct pipe_resource *index_buffer, @@ -237,11 +63,6 @@ retry_draw_range_elements( struct svga_context *svga, svga->curr.rast->templ.flatshade, svga->curr.rast->templ.flatshade_first ); - ret = svga_upload_user_buffers( svga, min_index + index_bias, - max_index - min_index + 1, instance_count ); - if (ret != PIPE_OK) - goto retry; - ret = svga_update_state( svga, SVGA_STATE_HW_DRAW ); if (ret != PIPE_OK) goto retry; @@ -288,11 +109,6 @@ retry_draw_arrays( struct svga_context *svga, svga->curr.rast->templ.flatshade, svga->curr.rast->templ.flatshade_first ); - ret = svga_upload_user_buffers( svga, start, count, instance_count ); - - if (ret != PIPE_OK) - goto retry; - ret = svga_update_state( svga, SVGA_STATE_HW_DRAW ); if (ret != PIPE_OK) goto retry; @@ -409,8 +225,6 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) /* XXX: Silence warnings, do something sensible here? */ (void)ret; - svga_release_user_upl_buffers( svga ); - if (SVGA_DEBUG & DEBUG_FLUSH) { svga_hwtnl_flush_retry( svga ); svga_context_flush(svga, NULL); -- cgit v1.2.3