[Mesa-dev] [PATCH 3/3] radeonsi: implement sync_file import/export

Marek Olšák maraeo at gmail.com
Wed Sep 13 16:21:57 UTC 2017


On Wed, Sep 13, 2017 at 5:39 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> On 12.09.2017 22:50, Marek Olšák wrote:
>>
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>   src/gallium/drivers/radeon/r600_pipe_common.c | 77
>> ++++++++++++++++++++++++++-
>>   src/gallium/drivers/radeonsi/si_pipe.c        |  4 +-
>>   2 files changed, 79 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c
>> b/src/gallium/drivers/radeon/r600_pipe_common.c
>> index 48fda7b..b66acf7 100644
>> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
>> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
>> @@ -31,20 +31,21 @@
>>   #include "util/u_draw_quad.h"
>>   #include "util/u_memory.h"
>>   #include "util/u_format_s3tc.h"
>>   #include "util/u_upload_mgr.h"
>>   #include "os/os_time.h"
>>   #include "vl/vl_decoder.h"
>>   #include "vl/vl_video_buffer.h"
>>   #include "radeon/radeon_video.h"
>>   #include <inttypes.h>
>>   #include <sys/utsname.h>
>> +#include <libsync.h>
>>     #ifndef HAVE_LLVM
>>   #define HAVE_LLVM 0
>>   #endif
>>     #if HAVE_LLVM
>>   #include <llvm-c/TargetMachine.h>
>>   #endif
>>     #ifndef MESA_LLVM_VERSION_PATCH
>> @@ -448,20 +449,89 @@ static void r600_fence_server_sync(struct
>> pipe_context *ctx,
>>          * this fence dependency is signalled.
>>          *
>>          * Should we flush the context to allow more GPU parallelism?
>>          */
>>         if (rfence->sdma)
>>                 r600_add_fence_dependency(rctx, rfence->sdma);
>>         if (rfence->gfx)
>>                 r600_add_fence_dependency(rctx, rfence->gfx);
>>   }
>>   +static void r600_create_fence_fd(struct pipe_context *ctx,
>> +                                struct pipe_fence_handle **pfence, int
>> fd)
>> +{
>> +       struct r600_common_screen *rscreen = (struct
>> r600_common_screen*)ctx->screen;
>> +       struct radeon_winsys *ws = rscreen->ws;
>> +       struct r600_multi_fence *rfence;
>> +
>> +       *pfence = NULL;
>> +
>> +       if (!rscreen->info.has_sync_file)
>> +               return;
>> +
>> +       rfence = CALLOC_STRUCT(r600_multi_fence);
>> +       if (!rfence)
>> +               return;
>> +
>> +       pipe_reference_init(&rfence->reference, 1);
>> +       rfence->gfx = ws->fence_import_sync_file(ws, fd);
>> +       if (!rfence->gfx) {
>> +               FREE(rfence);
>> +               return;
>> +       }
>> +
>> +       *pfence = (struct pipe_fence_handle*)rfence;
>> +}
>> +
>> +static int r600_fence_get_fd(struct pipe_screen *screen,
>> +                            struct pipe_fence_handle *fence)
>> +{
>> +       struct r600_common_screen *rscreen = (struct
>> r600_common_screen*)screen;
>> +       struct radeon_winsys *ws = rscreen->ws;
>> +       struct r600_multi_fence *rfence = (struct r600_multi_fence
>> *)fence;
>> +       int gfx_fd = -1, sdma_fd = -1;
>> +
>> +       if (!rscreen->info.has_sync_file)
>> +               return -1;
>> +
>> +       /* Deferred fences aren't supported. */
>> +       assert(!rfence->gfx_unflushed.ctx);
>> +       if (rfence->gfx_unflushed.ctx)
>> +               return -1;
>> +
>> +       if (rfence->sdma) {
>> +               sdma_fd = ws->fence_export_sync_file(ws, rfence->sdma);
>> +               if (sdma_fd == -1)
>> +                       return -1;
>> +       }
>> +       if (rfence->gfx) {
>> +               gfx_fd = ws->fence_export_sync_file(ws, rfence->gfx);
>> +               if (gfx_fd == -1) {
>> +                       if (sdma_fd != -1)
>> +                               close(sdma_fd);
>> +                       return -1;
>> +               }
>> +       }
>> +
>> +       /* If we don't have FDs at this point, it means we don't have
>> fences
>> +        * either. */
>> +       if (sdma_fd == -1)
>> +               return gfx_fd;
>> +       if (gfx_fd == -1)
>> +               return sdma_fd;
>> +
>> +       /* Get a fence that will be a combination of both fences. */
>> +       sync_accumulate("radeonsi", &gfx_fd, sdma_fd);
>
>
> What happens if this fails?

gfx_fd will be returned.

Marek


More information about the mesa-dev mailing list