Browse Source

lavu/hwcontext_cuda: refactor context initialisation

There's enough going on here now that it should not be duplicated
between cuda_device_create and cuda_device_derive.
tags/n4.3
Philip Langdale Lynne 6 years ago
parent
commit
7f149b0452
1 changed files with 50 additions and 64 deletions
  1. +50
    -64
      libavutil/hwcontext_cuda.c

+ 50
- 64
libavutil/hwcontext_cuda.c View File

@@ -336,57 +336,44 @@ error:
return ret;
}

static int cuda_device_create(AVHWDeviceContext *device_ctx,
const char *device,
AVDictionary *opts, int flags)
{
static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags) {
AVCUDADeviceContext *hwctx = device_ctx->hwctx;
CudaFunctions *cu;
CUcontext dummy;
int ret, dev_active = 0, device_idx = 0;
int ret, dev_active = 0;
unsigned int dev_flags = 0;

const unsigned int desired_flags = CU_CTX_SCHED_BLOCKING_SYNC;

if (device)
device_idx = strtol(device, NULL, 0);

if (cuda_device_init(device_ctx) < 0)
goto error;

cu = hwctx->internal->cuda_dl;

ret = CHECK_CU(cu->cuInit(0));
if (ret < 0)
goto error;

ret = CHECK_CU(cu->cuDeviceGet(&hwctx->internal->cuda_device, device_idx));
if (ret < 0)
goto error;

hwctx->internal->flags = flags;

if (flags & AV_CUDA_USE_PRIMARY_CONTEXT) {
ret = CHECK_CU(cu->cuDevicePrimaryCtxGetState(hwctx->internal->cuda_device, &dev_flags, &dev_active));
ret = CHECK_CU(cu->cuDevicePrimaryCtxGetState(hwctx->internal->cuda_device,
&dev_flags, &dev_active));
if (ret < 0)
goto error;
return ret;

if (dev_active && dev_flags != desired_flags) {
av_log(device_ctx, AV_LOG_ERROR, "Primary context already active with incompatible flags.\n");
goto error;
return AVERROR(ENOTSUP);
} else if (dev_flags != desired_flags) {
ret = CHECK_CU(cu->cuDevicePrimaryCtxSetFlags(hwctx->internal->cuda_device, desired_flags));
ret = CHECK_CU(cu->cuDevicePrimaryCtxSetFlags(hwctx->internal->cuda_device,
desired_flags));
if (ret < 0)
goto error;
return ret;
}

ret = CHECK_CU(cu->cuDevicePrimaryCtxRetain(&hwctx->cuda_ctx, hwctx->internal->cuda_device));
ret = CHECK_CU(cu->cuDevicePrimaryCtxRetain(&hwctx->cuda_ctx,
hwctx->internal->cuda_device));
if (ret < 0)
goto error;
return ret;
} else {
ret = CHECK_CU(cu->cuCtxCreate(&hwctx->cuda_ctx, desired_flags, hwctx->internal->cuda_device));
ret = CHECK_CU(cu->cuCtxCreate(&hwctx->cuda_ctx, desired_flags,
hwctx->internal->cuda_device));
if (ret < 0)
goto error;
return ret;

CHECK_CU(cu->cuCtxPopCurrent(&dummy));
}
@@ -397,6 +384,37 @@ static int cuda_device_create(AVHWDeviceContext *device_ctx,
hwctx->stream = NULL;

return 0;
}

static int cuda_device_create(AVHWDeviceContext *device_ctx,
const char *device,
AVDictionary *opts, int flags)
{
AVCUDADeviceContext *hwctx = device_ctx->hwctx;
CudaFunctions *cu;
int ret, device_idx = 0;

if (device)
device_idx = strtol(device, NULL, 0);

if (cuda_device_init(device_ctx) < 0)
goto error;

cu = hwctx->internal->cuda_dl;

ret = CHECK_CU(cu->cuInit(0));
if (ret < 0)
goto error;

ret = CHECK_CU(cu->cuDeviceGet(&hwctx->internal->cuda_device, device_idx));
if (ret < 0)
goto error;

ret = cuda_context_init(device_ctx, flags);
if (ret < 0)
goto error;

return 0;

error:
cuda_device_uninit(device_ctx);
@@ -409,11 +427,7 @@ static int cuda_device_derive(AVHWDeviceContext *device_ctx,
AVCUDADeviceContext *hwctx = device_ctx->hwctx;
CudaFunctions *cu;
const char *src_uuid = NULL;
CUcontext dummy;
int ret, i, device_count, dev_active = 0;
unsigned int dev_flags = 0;

const unsigned int desired_flags = CU_CTX_SCHED_BLOCKING_SYNC;
int ret, i, device_count;

#if CONFIG_VULKAN
VkPhysicalDeviceIDProperties vk_idp = {
@@ -481,37 +495,9 @@ static int cuda_device_derive(AVHWDeviceContext *device_ctx,
goto error;
}

hwctx->internal->flags = flags;

if (flags & AV_CUDA_USE_PRIMARY_CONTEXT) {
ret = CHECK_CU(cu->cuDevicePrimaryCtxGetState(hwctx->internal->cuda_device, &dev_flags, &dev_active));
if (ret < 0)
goto error;

if (dev_active && dev_flags != desired_flags) {
av_log(device_ctx, AV_LOG_ERROR, "Primary context already active with incompatible flags.\n");
goto error;
} else if (dev_flags != desired_flags) {
ret = CHECK_CU(cu->cuDevicePrimaryCtxSetFlags(hwctx->internal->cuda_device, desired_flags));
if (ret < 0)
goto error;
}

ret = CHECK_CU(cu->cuDevicePrimaryCtxRetain(&hwctx->cuda_ctx, hwctx->internal->cuda_device));
if (ret < 0)
goto error;
} else {
ret = CHECK_CU(cu->cuCtxCreate(&hwctx->cuda_ctx, desired_flags, hwctx->internal->cuda_device));
if (ret < 0)
goto error;

CHECK_CU(cu->cuCtxPopCurrent(&dummy));
}

hwctx->internal->is_allocated = 1;

// Setting stream to NULL will make functions automatically use the default CUstream
hwctx->stream = NULL;
ret = cuda_context_init(device_ctx, flags);
if (ret < 0)
goto error;

return 0;



Loading…
Cancel
Save