2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2021-05-17 02:51:16 +08:00
|
|
|
* Copyright (C) 2018-2021 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/helpers/get_info.h"
|
|
|
|
#include "shared/source/utilities/api_intercept.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/api/api.h"
|
2020-03-20 18:15:25 +08:00
|
|
|
#include "opencl/source/cl_device/cl_device.h"
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/command_queue/command_queue.h"
|
|
|
|
#include "opencl/source/context/context.h"
|
|
|
|
#include "opencl/source/platform/platform.h"
|
2020-10-16 23:49:57 +08:00
|
|
|
#include "opencl/source/sharings/va/va_device.h"
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/sharings/va/va_sharing.h"
|
|
|
|
#include "opencl/source/sharings/va/va_surface.h"
|
2019-02-27 18:39:32 +08:00
|
|
|
|
|
|
|
#include "CL/cl.h"
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
#include <cstring>
|
|
|
|
|
2019-03-26 18:59:46 +08:00
|
|
|
using namespace NEO;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
cl_mem CL_API_CALL
|
|
|
|
clCreateFromVA_APIMediaSurfaceINTEL(cl_context context, cl_mem_flags flags, VASurfaceID *surface,
|
|
|
|
cl_uint plane, cl_int *errcodeRet) {
|
|
|
|
|
2018-08-14 16:23:10 +08:00
|
|
|
cl_int returnCode = CL_SUCCESS;
|
|
|
|
API_ENTER(&returnCode);
|
|
|
|
DBG_LOG_INPUTS("context", context,
|
|
|
|
"flags", flags,
|
|
|
|
"VASurfaceID", surface,
|
|
|
|
"plane", plane);
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2018-08-14 16:23:10 +08:00
|
|
|
Context *pContext = nullptr;
|
|
|
|
cl_mem image = nullptr;
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2018-08-14 16:23:10 +08:00
|
|
|
returnCode = validateObject(WithCastToInternal(context, &pContext));
|
2017-12-21 07:45:38 +08:00
|
|
|
ErrorCodeHelper err(errcodeRet, returnCode);
|
|
|
|
|
|
|
|
if (returnCode != CL_SUCCESS) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
2019-04-16 21:38:08 +08:00
|
|
|
|
|
|
|
if (!VASurface::validate(flags, plane)) {
|
|
|
|
returnCode = CL_INVALID_VALUE;
|
|
|
|
err.set(returnCode);
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2020-04-26 14:56:42 +08:00
|
|
|
image = VASurface::createSharedVaSurface(pContext, pContext->getSharing<VASharingFunctions>(), flags, 0, surface, plane, errcodeRet);
|
2018-08-14 16:23:10 +08:00
|
|
|
DBG_LOG_INPUTS("image", image);
|
|
|
|
return image;
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
2018-01-29 19:25:49 +08:00
|
|
|
cl_int CL_API_CALL
|
|
|
|
clGetDeviceIDsFromVA_APIMediaAdapterINTEL(cl_platform_id platform, cl_va_api_device_source_intel mediaAdapterType,
|
|
|
|
void *mediaAdapter, cl_va_api_device_set_intel mediaAdapterSet, cl_uint numEntries,
|
|
|
|
cl_device_id *devices, cl_uint *numDevices) {
|
2018-08-14 16:23:10 +08:00
|
|
|
cl_int status = CL_SUCCESS;
|
|
|
|
API_ENTER(&status);
|
|
|
|
DBG_LOG_INPUTS("platform", platform,
|
|
|
|
"mediaAdapterType", mediaAdapterType,
|
|
|
|
"mediaAdapter", mediaAdapter,
|
|
|
|
"mediaAdapterSet", mediaAdapterSet,
|
|
|
|
"numEntries", numEntries);
|
2018-01-29 19:25:49 +08:00
|
|
|
|
|
|
|
Platform *pPlatform = nullptr;
|
2018-08-14 16:23:10 +08:00
|
|
|
status = validateObjects(WithCastToInternal(platform, &pPlatform));
|
2018-01-29 19:25:49 +08:00
|
|
|
if (status != CL_SUCCESS) {
|
2018-08-14 16:23:10 +08:00
|
|
|
status = CL_INVALID_PLATFORM;
|
|
|
|
} else {
|
2020-10-16 23:49:57 +08:00
|
|
|
VADevice vaDevice{};
|
|
|
|
cl_device_id device = vaDevice.getDeviceFromVA(pPlatform, mediaAdapter);
|
2018-08-14 16:23:10 +08:00
|
|
|
GetInfoHelper::set(devices, device);
|
2021-02-18 05:17:01 +08:00
|
|
|
if (device == nullptr) {
|
|
|
|
GetInfoHelper::set(numDevices, 0u);
|
|
|
|
status = CL_DEVICE_NOT_FOUND;
|
|
|
|
} else {
|
|
|
|
GetInfoHelper::set(numDevices, 1u);
|
|
|
|
}
|
2018-01-29 19:25:49 +08:00
|
|
|
}
|
2018-08-14 16:23:10 +08:00
|
|
|
return status;
|
2018-01-29 19:25:49 +08:00
|
|
|
}
|
|
|
|
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_int CL_API_CALL
|
|
|
|
clEnqueueAcquireVA_APIMediaSurfacesINTEL(cl_command_queue commandQueue,
|
|
|
|
cl_uint numObjects,
|
|
|
|
const cl_mem *memObjects,
|
|
|
|
cl_uint numEventsInWaitList,
|
|
|
|
const cl_event *eventWaitList,
|
|
|
|
cl_event *event) {
|
2018-08-14 16:23:10 +08:00
|
|
|
cl_int status = CL_SUCCESS;
|
|
|
|
API_ENTER(&status);
|
|
|
|
DBG_LOG_INPUTS("commandQueue", commandQueue,
|
|
|
|
"numObjects", numObjects,
|
2019-12-10 23:26:35 +08:00
|
|
|
"memObjects", FileLoggerInstance().getMemObjects(reinterpret_cast<const uintptr_t *>(memObjects), numObjects),
|
2018-08-14 16:23:10 +08:00
|
|
|
"numEventsInWaitList", numEventsInWaitList,
|
2019-12-10 23:26:35 +08:00
|
|
|
"eventWaitList", FileLoggerInstance().getEvents(reinterpret_cast<const uintptr_t *>(eventWaitList), numEventsInWaitList),
|
|
|
|
"event", FileLoggerInstance().getEvents(reinterpret_cast<const uintptr_t *>(event), 1));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
CommandQueue *pCommandQueue = nullptr;
|
|
|
|
|
2018-08-14 16:23:10 +08:00
|
|
|
status = validateObjects(WithCastToInternal(commandQueue, &pCommandQueue));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
if (status == CL_SUCCESS) {
|
|
|
|
status = pCommandQueue->enqueueAcquireSharedObjects(numObjects, memObjects, numEventsInWaitList,
|
|
|
|
eventWaitList, event, CL_COMMAND_ACQUIRE_VA_API_MEDIA_SURFACES_INTEL);
|
|
|
|
}
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
cl_int CL_API_CALL
|
|
|
|
clEnqueueReleaseVA_APIMediaSurfacesINTEL(cl_command_queue commandQueue,
|
|
|
|
cl_uint numObjects,
|
|
|
|
const cl_mem *memObjects,
|
|
|
|
cl_uint numEventsInWaitList,
|
|
|
|
const cl_event *eventWaitList,
|
|
|
|
cl_event *event) {
|
2018-08-14 16:23:10 +08:00
|
|
|
cl_int status = CL_SUCCESS;
|
|
|
|
API_ENTER(&status);
|
|
|
|
DBG_LOG_INPUTS("commandQueue", commandQueue,
|
|
|
|
"numObjects", numObjects,
|
2019-12-10 23:26:35 +08:00
|
|
|
"memObjects", FileLoggerInstance().getMemObjects(reinterpret_cast<const uintptr_t *>(memObjects), numObjects),
|
2018-08-14 16:23:10 +08:00
|
|
|
"numEventsInWaitList", numEventsInWaitList,
|
2019-12-10 23:26:35 +08:00
|
|
|
"eventWaitList", FileLoggerInstance().getEvents(reinterpret_cast<const uintptr_t *>(eventWaitList), numEventsInWaitList),
|
|
|
|
"event", FileLoggerInstance().getEvents(reinterpret_cast<const uintptr_t *>(event), 1));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
CommandQueue *pCommandQueue = nullptr;
|
|
|
|
|
2018-08-14 16:23:10 +08:00
|
|
|
status = validateObjects(WithCastToInternal(commandQueue, &pCommandQueue));
|
2017-12-21 07:45:38 +08:00
|
|
|
|
|
|
|
if (status == CL_SUCCESS) {
|
|
|
|
status = pCommandQueue->enqueueReleaseSharedObjects(numObjects, memObjects, numEventsInWaitList,
|
|
|
|
eventWaitList, event, CL_COMMAND_RELEASE_VA_API_MEDIA_SURFACES_INTEL);
|
2020-05-26 05:13:01 +08:00
|
|
|
if (!pCommandQueue->getContext().getInteropUserSyncEnabled()) {
|
|
|
|
pCommandQueue->finish();
|
|
|
|
}
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
return status;
|
|
|
|
}
|
2019-05-27 21:58:58 +08:00
|
|
|
|
2019-06-03 15:54:55 +08:00
|
|
|
cl_int CL_API_CALL clGetSupportedVA_APIMediaSurfaceFormatsINTEL(
|
2019-05-27 21:58:58 +08:00
|
|
|
cl_context context,
|
|
|
|
cl_mem_flags flags,
|
|
|
|
cl_mem_object_type imageType,
|
2021-01-19 22:58:32 +08:00
|
|
|
cl_uint plane,
|
2019-05-27 21:58:58 +08:00
|
|
|
cl_uint numEntries,
|
|
|
|
VAImageFormat *vaApiFormats,
|
|
|
|
cl_uint *numImageFormats) {
|
|
|
|
|
|
|
|
if (numImageFormats) {
|
|
|
|
*numImageFormats = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
Context *pContext = castToObjectOrAbort<Context>(context);
|
|
|
|
auto pSharing = pContext->getSharing<VASharingFunctions>();
|
|
|
|
if (!pSharing) {
|
|
|
|
return CL_INVALID_CONTEXT;
|
|
|
|
}
|
|
|
|
|
2021-01-19 22:58:32 +08:00
|
|
|
return pSharing->getSupportedFormats(flags, imageType, plane, numEntries, vaApiFormats, numImageFormats);
|
2019-05-27 21:58:58 +08:00
|
|
|
}
|