gallium/radeon: unwrap a context if we get a wrapped one
authorMarek Olšák <marek.olsak@amd.com>
Sun, 26 Feb 2017 17:48:28 +0000 (18:48 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 15 May 2017 11:01:33 +0000 (13:01 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
src/gallium/drivers/radeon/r600_pipe_common.c
src/gallium/drivers/radeon/r600_texture.c
src/gallium/drivers/radeonsi/si_pipe.c

index f958807a1c543f053c882b8bac4dcbfead02f160..48f0bf9a8e9a316cb445742cb5ad545acc20228d 100644 (file)
@@ -1220,10 +1220,12 @@ static boolean r600_fence_finish(struct pipe_screen *screen,
 {
        struct radeon_winsys *rws = ((struct r600_common_screen*)screen)->ws;
        struct r600_multi_fence *rfence = (struct r600_multi_fence *)fence;
-       struct r600_common_context *rctx =
-               ctx ? (struct r600_common_context*)ctx : NULL;
+       struct r600_common_context *rctx;
        int64_t abs_timeout = os_time_get_absolute_timeout(timeout);
 
+       ctx = threaded_context_unwrap_sync(ctx);
+       rctx = ctx ? (struct r600_common_context*)ctx : NULL;
+
        if (rfence->sdma) {
                if (!rws->fence_wait(rws, rfence->sdma, timeout))
                        return false;
index 57e3960268fe3dc5d631cbaebd87c5dd351de577..449d7bc6cf030d662da93a342237ae3dea1aaf0c 100644 (file)
@@ -530,14 +530,16 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen,
                                        unsigned usage)
 {
        struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
-       struct r600_common_context *rctx = (struct r600_common_context*)
-                                          (ctx ? ctx : rscreen->aux_context);
+       struct r600_common_context *rctx;
        struct r600_resource *res = (struct r600_resource*)resource;
        struct r600_texture *rtex = (struct r600_texture*)resource;
        struct radeon_bo_metadata metadata;
        bool update_metadata = false;
        unsigned stride, offset, slice_size;
 
+       ctx = threaded_context_unwrap_sync(ctx);
+       rctx = (struct r600_common_context*)(ctx ? ctx : rscreen->aux_context);
+
        /* This is not supported now, but it might be required for OpenCL
         * interop in the future.
         */
index 0c85fdee3c7a02b92b94beed79de18b846ce5ff5..5edfed3f0d16377e5b3c0bc0749775fbc69a166e 100644 (file)
@@ -155,7 +155,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
                sscreen->record_llvm_ir = true; /* racy but not critical */
 
        sctx->b.b.screen = screen; /* this must be set first */
-       sctx->b.b.priv = priv;
+       sctx->b.b.priv = NULL;
        sctx->b.b.destroy = si_destroy_context;
        sctx->b.b.emit_string_marker = si_emit_string_marker;
        sctx->b.set_atom_dirty = (void *)si_set_atom_dirty;