On 30.09.2016 14:58, Marek Olšák wrote:
For patches 2-6:

Reviewed-by: Marek Olšák <marek.ol...@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 <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

Reply via email to