[Mesa-dev] [PATCH 6/6] virgl: use the new parent/child pools for transfers

Nicolai Hähnle nhaehnle at gmail.com
Fri Sep 30 13:00:30 UTC 2016


On 30.09.2016 14:58, Marek Olšák wrote:
> For patches 2-6:
>
> Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Thanks.

> 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.

I do believe atomicity is necessary. Maybe the right solution is to 
change u_atomic so that p_atomic_read/set do what they advertise?

Cheers,
Nicolai

>
> 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