X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_resource_buffer.c;h=271d0787abb58fc22cb18743d02f7d07da24f463;hb=3b1ce49bc1e5aff87805b0bab255885c84bf5052;hp=9ecb97509c21f364e8f7a671637a9fe2b8fe0238;hpb=79e343b36a729afb8086b99e4bf15d8c444887c1;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_resource_buffer.c b/src/gallium/drivers/svga/svga_resource_buffer.c index 9ecb97509c2..271d0787abb 100644 --- a/src/gallium/drivers/svga/svga_resource_buffer.c +++ b/src/gallium/drivers/svga/svga_resource_buffer.c @@ -29,7 +29,6 @@ #include "pipe/p_defines.h" #include "util/u_inlines.h" #include "os/os_thread.h" -#include "os/os_time.h" #include "util/u_math.h" #include "util/u_memory.h" #include "util/u_resource.h" @@ -77,44 +76,66 @@ svga_buffer_transfer_map(struct pipe_context *pipe, struct svga_screen *ss = svga_screen(pipe->screen); struct svga_buffer *sbuf = svga_buffer(resource); struct pipe_transfer *transfer; - uint8_t *map; - int64_t begin = os_time_get(); + uint8_t *map = NULL; + int64_t begin = svga_get_time(svga); + + SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_BUFFERTRANSFERMAP); assert(box->y == 0); assert(box->z == 0); assert(box->height == 1); assert(box->depth == 1); - transfer = CALLOC_STRUCT(pipe_transfer); + transfer = MALLOC_STRUCT(pipe_transfer); if (!transfer) { - return NULL; + goto done; } transfer->resource = resource; transfer->level = level; transfer->usage = usage; transfer->box = *box; + transfer->stride = 0; + transfer->layer_stride = 0; + + if (usage & PIPE_TRANSFER_WRITE) { + /* If we write to the buffer for any reason, free any saved translated + * vertices. + */ + pipe_resource_reference(&sbuf->translated_indices.buffer, NULL); + } if ((usage & PIPE_TRANSFER_READ) && sbuf->dirty) { - /* Only need to test for vgpu10 since only vgpu10 features (streamout, - * buffer copy) can modify buffers on the device. + enum pipe_error ret; + + /* Host-side buffers can only be dirtied with vgpu10 features + * (streamout and buffer copy). */ - if (svga_have_vgpu10(svga)) { - enum pipe_error ret; - assert(sbuf->handle); - ret = SVGA3D_vgpu10_ReadbackSubResource(svga->swc, sbuf->handle, 0); - if (ret != PIPE_OK) { - svga_context_flush(svga, NULL); - ret = SVGA3D_vgpu10_ReadbackSubResource(svga->swc, sbuf->handle, 0); - assert(ret == PIPE_OK); - } + assert(svga_have_vgpu10(svga)); - svga->hud.num_readbacks++; + if (!sbuf->user) { + (void) svga_buffer_handle(svga, resource); + } + if (sbuf->dma.pending > 0) { + svga_buffer_upload_flush(svga, sbuf); svga_context_finish(svga); + } - sbuf->dirty = FALSE; + assert(sbuf->handle); + + ret = SVGA3D_vgpu10_ReadbackSubResource(svga->swc, sbuf->handle, 0); + if (ret != PIPE_OK) { + svga_context_flush(svga, NULL); + ret = SVGA3D_vgpu10_ReadbackSubResource(svga->swc, sbuf->handle, 0); + assert(ret == PIPE_OK); } + + svga->hud.num_readbacks++; + + svga_context_finish(svga); + + sbuf->dirty = FALSE; } if (usage & PIPE_TRANSFER_WRITE) { @@ -191,7 +212,7 @@ svga_buffer_transfer_map(struct pipe_context *pipe, */ FREE(transfer); - return NULL; + goto done; } svga_context_flush(svga, NULL); @@ -218,7 +239,7 @@ svga_buffer_transfer_map(struct pipe_context *pipe, sbuf->swbuf = align_malloc(sbuf->b.b.width0, 16); if (!sbuf->swbuf) { FREE(transfer); - return NULL; + goto done; } } } @@ -253,8 +274,10 @@ svga_buffer_transfer_map(struct pipe_context *pipe, FREE(transfer); } - svga->hud.map_buffer_time += (os_time_get() - begin); + svga->hud.map_buffer_time += (svga_get_time(svga) - begin); +done: + SVGA_STATS_TIME_POP(svga_sws(svga)); return map; } @@ -273,9 +296,9 @@ svga_buffer_transfer_flush_region( struct pipe_context *pipe, assert(transfer->usage & PIPE_TRANSFER_WRITE); assert(transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT); - pipe_mutex_lock(ss->swc_mutex); + mtx_lock(&ss->swc_mutex); svga_buffer_add_range(sbuf, offset, offset + length); - pipe_mutex_unlock(ss->swc_mutex); + mtx_unlock(&ss->swc_mutex); } @@ -287,7 +310,9 @@ svga_buffer_transfer_unmap( struct pipe_context *pipe, struct svga_context *svga = svga_context(pipe); struct svga_buffer *sbuf = svga_buffer(transfer->resource); - pipe_mutex_lock(ss->swc_mutex); + SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_BUFFERTRANSFERUNMAP); + + mtx_lock(&ss->swc_mutex); assert(sbuf->map.count); if (sbuf->map.count) { @@ -295,6 +320,9 @@ svga_buffer_transfer_unmap( struct pipe_context *pipe, } if (svga_buffer_has_hw_storage(sbuf)) { + /* Note: we may wind up flushing here and unmapping other buffers + * which leads to recursively locking ss->swc_mutex. + */ svga_buffer_hw_storage_unmap(svga, sbuf); } @@ -314,8 +342,9 @@ svga_buffer_transfer_unmap( struct pipe_context *pipe, } } - pipe_mutex_unlock(ss->swc_mutex); + mtx_unlock(&ss->swc_mutex); FREE(transfer); + SVGA_STATS_TIME_POP(svga_sws(svga)); } @@ -342,6 +371,8 @@ svga_buffer_destroy( struct pipe_screen *screen, if (sbuf->swbuf && !sbuf->user) align_free(sbuf->swbuf); + pipe_resource_reference(&sbuf->translated_indices.buffer, NULL); + ss->hud.total_resource_bytes -= sbuf->size; assert(ss->hud.num_resources > 0); if (ss->hud.num_resources > 0) @@ -358,7 +389,6 @@ struct u_resource_vtbl svga_buffer_vtbl = svga_buffer_transfer_map, /* transfer_map */ svga_buffer_transfer_flush_region, /* transfer_flush_region */ svga_buffer_transfer_unmap, /* transfer_unmap */ - u_default_transfer_inline_write /* transfer_inline_write */ }; @@ -370,6 +400,8 @@ svga_buffer_create(struct pipe_screen *screen, struct svga_screen *ss = svga_screen(screen); struct svga_buffer *sbuf; + SVGA_STATS_TIME_PUSH(ss->sws, SVGA_STATS_TIME_CREATEBUFFER); + sbuf = CALLOC_STRUCT(svga_buffer); if (!sbuf) goto error1; @@ -426,12 +458,14 @@ svga_buffer_create(struct pipe_screen *screen, ss->hud.total_resource_bytes += sbuf->size; ss->hud.num_resources++; + SVGA_STATS_TIME_POP(ss->sws); return &sbuf->b.b; error2: FREE(sbuf); error1: + SVGA_STATS_TIME_POP(ss->sws); return NULL; }