[Mesa-dev] [PATCH 6/6] virgl: use the new parent/child pools for transfers
Marek Olšák
maraeo at gmail.com
Fri Sep 30 12:58:32 UTC 2016
For patches 2-6:
Reviewed-by: Marek Olšák <marek.olsak at 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 <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list