For patches 2-6: Reviewed-by: Marek Olšák <marek.ol...@amd.com>
For patch 1, you'll have to decide whether atomicity is necessary, but at least p_atomic_read and p_atomic_set shouldn't be used on intptr_t. Marek On Tue, Sep 27, 2016 at 8:21 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote: > From: Nicolai Hähnle <nicolai.haeh...@amd.com> > > --- > src/gallium/drivers/virgl/virgl_buffer.c | 4 ++-- > src/gallium/drivers/virgl/virgl_context.c | 5 ++--- > src/gallium/drivers/virgl/virgl_context.h | 2 +- > src/gallium/drivers/virgl/virgl_screen.c | 4 ++++ > src/gallium/drivers/virgl/virgl_screen.h | 3 +++ > src/gallium/drivers/virgl/virgl_texture.c | 4 ++-- > 6 files changed, 14 insertions(+), 8 deletions(-) > > diff --git a/src/gallium/drivers/virgl/virgl_buffer.c > b/src/gallium/drivers/virgl/virgl_buffer.c > index de99796..2e63aeb 100644 > --- a/src/gallium/drivers/virgl/virgl_buffer.c > +++ b/src/gallium/drivers/virgl/virgl_buffer.c > @@ -55,21 +55,21 @@ static void *virgl_buffer_transfer_map(struct > pipe_context *ctx, > bool doflushwait = false; > > if ((usage & PIPE_TRANSFER_READ) && (vbuf->on_list == TRUE)) > doflushwait = true; > else > doflushwait = virgl_res_needs_flush_wait(vctx, &vbuf->base, usage); > > if (doflushwait) > ctx->flush(ctx, NULL, 0); > > - trans = slab_alloc_st(&vctx->texture_transfer_pool); > + trans = slab_alloc(&vctx->texture_transfer_pool); > if (!trans) > return NULL; > > trans->base.resource = resource; > trans->base.level = level; > trans->base.usage = usage; > trans->base.box = *box; > trans->base.stride = 0; > trans->base.layer_stride = 0; > > @@ -107,21 +107,21 @@ static void virgl_buffer_transfer_unmap(struct > pipe_context *ctx, > if (!(transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT)) { > struct virgl_screen *vs = virgl_screen(ctx->screen); > vbuf->base.clean = FALSE; > vctx->num_transfers++; > vs->vws->transfer_put(vs->vws, vbuf->base.hw_res, > &transfer->box, trans->base.stride, > trans->base.layer_stride, trans->offset, transfer->level); > > } > } > > - slab_free_st(&vctx->texture_transfer_pool, trans); > + slab_free(&vctx->texture_transfer_pool, trans); > } > > static void virgl_buffer_transfer_flush_region(struct pipe_context *ctx, > struct pipe_transfer > *transfer, > const struct pipe_box *box) > { > struct virgl_context *vctx = virgl_context(ctx); > struct virgl_buffer *vbuf = virgl_buffer(transfer->resource); > > if (!vbuf->on_list) { > diff --git a/src/gallium/drivers/virgl/virgl_context.c > b/src/gallium/drivers/virgl/virgl_context.c > index a6c0597..e693a73 100644 > --- a/src/gallium/drivers/virgl/virgl_context.c > +++ b/src/gallium/drivers/virgl/virgl_context.c > @@ -855,21 +855,21 @@ virgl_context_destroy( struct pipe_context *ctx ) > vctx->framebuffer.zsbuf = NULL; > vctx->framebuffer.nr_cbufs = 0; > virgl_encoder_destroy_sub_ctx(vctx, vctx->hw_sub_ctx_id); > virgl_flush_eq(vctx, vctx); > > rs->vws->cmd_buf_destroy(vctx->cbuf); > if (vctx->uploader) > u_upload_destroy(vctx->uploader); > util_primconvert_destroy(vctx->primconvert); > > - slab_destroy(&vctx->texture_transfer_pool); > + slab_destroy_child(&vctx->texture_transfer_pool); > FREE(vctx); > } > > struct pipe_context *virgl_context_create(struct pipe_screen *pscreen, > void *priv, > unsigned flags) > { > struct virgl_context *vctx; > struct virgl_screen *rs = virgl_screen(pscreen); > vctx = CALLOC_STRUCT(virgl_context); > @@ -936,22 +936,21 @@ struct pipe_context *virgl_context_create(struct > pipe_screen *pscreen, > > vctx->base.resource_copy_region = virgl_resource_copy_region; > vctx->base.flush_resource = virgl_flush_resource; > vctx->base.blit = virgl_blit; > > virgl_init_context_resource_functions(&vctx->base); > virgl_init_query_functions(vctx); > virgl_init_so_functions(vctx); > > list_inithead(&vctx->to_flush_bufs); > - slab_create(&vctx->texture_transfer_pool, sizeof(struct virgl_transfer), > - 16); > + slab_create_child(&vctx->texture_transfer_pool, > rs->texture_transfer_pool); > > vctx->primconvert = util_primconvert_create(&vctx->base, > rs->caps.caps.v1.prim_mask); > vctx->uploader = u_upload_create(&vctx->base, 1024 * 1024, > PIPE_BIND_INDEX_BUFFER, > PIPE_USAGE_STREAM); > if (!vctx->uploader) > goto fail; > > vctx->hw_sub_ctx_id = rs->sub_ctx_id++; > virgl_encoder_create_sub_ctx(vctx, vctx->hw_sub_ctx_id); > > diff --git a/src/gallium/drivers/virgl/virgl_context.h > b/src/gallium/drivers/virgl/virgl_context.h > index 3b9901f..597ed49 100644 > --- a/src/gallium/drivers/virgl/virgl_context.h > +++ b/src/gallium/drivers/virgl/virgl_context.h > @@ -49,21 +49,21 @@ struct virgl_textures_info { > }; > > struct virgl_context { > struct pipe_context base; > struct virgl_cmd_buf *cbuf; > > struct virgl_textures_info samplers[PIPE_SHADER_TYPES]; > > struct pipe_framebuffer_state framebuffer; > > - struct slab_mempool texture_transfer_pool; > + struct slab_child_pool texture_transfer_pool; > > struct pipe_index_buffer index_buffer; > struct u_upload_mgr *uploader; > > struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS]; > unsigned num_vertex_buffers; > boolean vertex_array_dirty; > > struct virgl_so_target so_targets[PIPE_MAX_SO_BUFFERS]; > unsigned num_so_targets; > diff --git a/src/gallium/drivers/virgl/virgl_screen.c > b/src/gallium/drivers/virgl/virgl_screen.c > index dd135a7..5f98754 100644 > --- a/src/gallium/drivers/virgl/virgl_screen.c > +++ b/src/gallium/drivers/virgl/virgl_screen.c > @@ -540,20 +540,22 @@ virgl_get_timestamp(struct pipe_screen *_screen) > { > return os_time_get_nano(); > } > > static void > virgl_destroy_screen(struct pipe_screen *screen) > { > struct virgl_screen *vscreen = virgl_screen(screen); > struct virgl_winsys *vws = vscreen->vws; > > + slab_destroy_parent(&vscreen->texture_transfer_pool); > + > if (vws) > vws->destroy(vws); > FREE(vscreen); > } > > struct pipe_screen * > virgl_create_screen(struct virgl_winsys *vws) > { > struct virgl_screen *screen = CALLOC_STRUCT(virgl_screen); > > @@ -574,13 +576,15 @@ virgl_create_screen(struct virgl_winsys *vws) > screen->base.fence_reference = virgl_fence_reference; > //screen->base.fence_signalled = virgl_fence_signalled; > screen->base.fence_finish = virgl_fence_finish; > > virgl_init_screen_resource_functions(&screen->base); > > vws->get_caps(vws, &screen->caps); > > screen->refcnt = 1; > > + slab_create_parent(&screen->texture_transfer_pool, sizeof(struct > virgl_transfer), 16); > + > util_format_s3tc_init(); > return &screen->base; > } > diff --git a/src/gallium/drivers/virgl/virgl_screen.h > b/src/gallium/drivers/virgl/virgl_screen.h > index 8cac38d..dcf5816 100644 > --- a/src/gallium/drivers/virgl/virgl_screen.h > +++ b/src/gallium/drivers/virgl/virgl_screen.h > @@ -17,34 +17,37 @@ > * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL > * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, > * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR > * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE > * USE OR OTHER DEALINGS IN THE SOFTWARE. > */ > #ifndef VIRGL_H > #define VIRGL_H > > #include "pipe/p_screen.h" > +#include "util/slab.h" > #include "virgl_winsys.h" > > struct virgl_screen { > struct pipe_screen base; > > int refcnt; > > /* place for winsys to stash it's own stuff: */ > void *winsys_priv; > > struct virgl_winsys *vws; > > struct virgl_drm_caps caps; > > + struct slab_parent_pool texture_transfer_pool; > + > uint32_t sub_ctx_id; > }; > > > static inline struct virgl_screen * > virgl_screen(struct pipe_screen *pipe) > { > return (struct virgl_screen *)pipe; > } > > diff --git a/src/gallium/drivers/virgl/virgl_texture.c > b/src/gallium/drivers/virgl/virgl_texture.c > index 24bbc3c..150a5eb 100644 > --- a/src/gallium/drivers/virgl/virgl_texture.c > +++ b/src/gallium/drivers/virgl/virgl_texture.c > @@ -138,21 +138,21 @@ static void *virgl_texture_transfer_map(struct > pipe_context *ctx, > const unsigned h = u_minify(vtex->base.u.b.height0, level); > const unsigned nblocksy = util_format_get_nblocksy(format, h); > bool is_depth = > util_format_has_depth(util_format_description(resource->format)); > uint32_t l_stride; > bool doflushwait; > > doflushwait = virgl_res_needs_flush_wait(vctx, &vtex->base, usage); > if (doflushwait) > ctx->flush(ctx, NULL, 0); > > - trans = slab_alloc_st(&vctx->texture_transfer_pool); > + trans = slab_alloc(&vctx->texture_transfer_pool); > if (!trans) > return NULL; > > trans->base.resource = resource; > trans->base.level = level; > trans->base.usage = usage; > trans->base.box = *box; > trans->base.stride = vtex->stride[level]; > trans->base.layer_stride = trans->base.stride * nblocksy; > > @@ -228,21 +228,21 @@ static void virgl_texture_transfer_unmap(struct > pipe_context *ctx, > vctx->num_transfers++; > vs->vws->transfer_put(vs->vws, vtex->base.hw_res, > &transfer->box, trans->base.stride, l_stride, > trans->offset, transfer->level); > > } > } > > if (trans->resolve_tmp) > pipe_resource_reference((struct pipe_resource **)&trans->resolve_tmp, > NULL); > > - slab_free_st(&vctx->texture_transfer_pool, trans); > + slab_free(&vctx->texture_transfer_pool, trans); > } > > > static boolean > vrend_resource_layout(struct virgl_texture *res, > uint32_t *total_size) > { > struct pipe_resource *pt = &res->base.u.b; > unsigned level; > unsigned width = pt->width0; > -- > 2.7.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev