|
Packit Service |
5a9772 |
/**
|
|
Packit Service |
5a9772 |
* FreeRDP: A Remote Desktop Protocol Implementation
|
|
Packit Service |
5a9772 |
* Optimized YUV/RGB conversion operations using openCL
|
|
Packit Service |
5a9772 |
*
|
|
Packit Service |
5a9772 |
* Copyright 2019 David Fort <contact@hardening-consulting.com>
|
|
Packit Service |
5a9772 |
* Copyright 2019 Rangee Gmbh
|
|
Packit Service |
5a9772 |
*
|
|
Packit Service |
5a9772 |
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit Service |
5a9772 |
* you may not use this file except in compliance with the License.
|
|
Packit Service |
5a9772 |
* You may obtain a copy of the License at
|
|
Packit Service |
5a9772 |
*
|
|
Packit Service |
5a9772 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit Service |
5a9772 |
*
|
|
Packit Service |
5a9772 |
* Unless required by applicable law or agreed to in writing, software
|
|
Packit Service |
5a9772 |
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit Service |
5a9772 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit Service |
5a9772 |
* See the License for the specific language governing permissions and
|
|
Packit Service |
5a9772 |
* limitations under the License.
|
|
Packit Service |
5a9772 |
*/
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
5a9772 |
#include "config.h"
|
|
Packit Service |
5a9772 |
#endif
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#include <freerdp/types.h>
|
|
Packit Service |
5a9772 |
#include <freerdp/primitives.h>
|
|
Packit Service |
5a9772 |
#include "prim_internal.h"
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#if defined(WITH_OPENCL)
|
|
Packit Service |
5a9772 |
#ifdef __APPLE__
|
|
Packit Service |
5a9772 |
#include "OpenCL/opencl.h"
|
|
Packit Service |
5a9772 |
#else
|
|
Packit Service |
5a9772 |
#include <CL/cl.h>
|
|
Packit Service |
5a9772 |
#endif
|
|
Packit Service |
5a9772 |
#endif
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
#define TAG FREERDP_TAG("primitives")
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
typedef struct
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
BOOL support;
|
|
Packit Service |
5a9772 |
cl_platform_id platformId;
|
|
Packit Service |
5a9772 |
cl_device_id deviceId;
|
|
Packit Service |
5a9772 |
cl_context context;
|
|
Packit Service |
5a9772 |
cl_command_queue commandQueue;
|
|
Packit Service |
5a9772 |
cl_program program;
|
|
Packit Service |
5a9772 |
} primitives_opencl_context;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static primitives_opencl_context* primitives_get_opencl_context(void);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static pstatus_t opencl_YUVToRGB(const char* kernelName, const BYTE* const pSrc[3],
|
|
Packit Service |
5a9772 |
const UINT32 srcStep[3], BYTE* pDst, UINT32 dstStep,
|
|
Packit Service |
5a9772 |
const prim_size_t* roi)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
cl_int ret;
|
|
Packit Service |
5a9772 |
cl_uint i;
|
|
Packit Service |
5a9772 |
cl_mem objs[3] = { NULL, NULL, NULL };
|
|
Packit Service |
5a9772 |
cl_mem destObj;
|
|
Packit Service |
5a9772 |
cl_kernel kernel;
|
|
Packit Service |
5a9772 |
size_t indexes[2];
|
|
Packit Service |
5a9772 |
const char* sourceNames[] = { "Y", "U", "V" };
|
|
Packit Service |
5a9772 |
primitives_opencl_context* cl = primitives_get_opencl_context();
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
kernel = clCreateKernel(cl->program, kernelName, &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable to create kernel %s", kernelName);
|
|
Packit Service |
5a9772 |
return -1;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
for (i = 0; i < 3; i++)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
objs[i] = clCreateBuffer(cl->context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,
|
|
Packit Service |
5a9772 |
srcStep[i] * roi->height, (char*)pSrc[i], &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to create %sobj", sourceNames[i]);
|
|
Packit Service |
5a9772 |
goto error_objs;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
destObj = clCreateBuffer(cl->context, CL_MEM_WRITE_ONLY, dstStep * roi->height, NULL, &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to create dest obj");
|
|
Packit Service |
5a9772 |
goto error_objs;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
/* push source + stride arguments*/
|
|
Packit Service |
5a9772 |
for (i = 0; i < 3; i++)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
ret = clSetKernelArg(kernel, i * 2, sizeof(cl_mem), &objs[i]);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to set arg for %sobj", sourceNames[i]);
|
|
Packit Service |
5a9772 |
goto error_set_args;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clSetKernelArg(kernel, i * 2 + 1, sizeof(cl_int), &srcStep[i]);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to set arg stride for %sobj", sourceNames[i]);
|
|
Packit Service |
5a9772 |
goto error_set_args;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clSetKernelArg(kernel, 6, sizeof(cl_mem), &destObj);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to set arg destObj");
|
|
Packit Service |
5a9772 |
goto error_set_args;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clSetKernelArg(kernel, 7, sizeof(cl_int), &dstStep);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to set arg dstStep");
|
|
Packit Service |
5a9772 |
goto error_set_args;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
indexes[0] = roi->width;
|
|
Packit Service |
5a9772 |
indexes[1] = roi->height;
|
|
Packit Service |
5a9772 |
ret = clEnqueueNDRangeKernel(cl->commandQueue, kernel, 2, NULL, indexes, NULL, 0, NULL, NULL);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to enqueue call kernel");
|
|
Packit Service |
5a9772 |
goto error_set_args;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
/* Transfer result to host */
|
|
Packit Service |
5a9772 |
ret = clEnqueueReadBuffer(cl->commandQueue, destObj, CL_TRUE, 0, roi->height * dstStep, pDst, 0,
|
|
Packit Service |
5a9772 |
NULL, NULL);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "unable to read back buffer");
|
|
Packit Service |
5a9772 |
goto error_set_args;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
/* cleanup things */
|
|
Packit Service |
5a9772 |
clReleaseMemObject(destObj);
|
|
Packit Service |
5a9772 |
for (i = 0; i < 3; i++)
|
|
Packit Service |
5a9772 |
if (objs[i])
|
|
Packit Service |
5a9772 |
clReleaseMemObject(objs[i]);
|
|
Packit Service |
5a9772 |
clReleaseKernel(kernel);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
return PRIMITIVES_SUCCESS;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
error_set_args:
|
|
Packit Service |
5a9772 |
clReleaseMemObject(destObj);
|
|
Packit Service |
5a9772 |
error_objs:
|
|
Packit Service |
5a9772 |
for (i = 0; i < 3; i++)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
if (objs[i])
|
|
Packit Service |
5a9772 |
clReleaseMemObject(objs[i]);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
clReleaseKernel(kernel);
|
|
Packit Service |
5a9772 |
return -1;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static primitives_opencl_context openclContext;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static primitives_opencl_context* primitives_get_opencl_context(void)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
return &openclContext;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static pstatus_t primitives_uninit_opencl(void)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
if (!openclContext.support)
|
|
Packit Service |
5a9772 |
return PRIMITIVES_SUCCESS;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
clReleaseProgram(openclContext.program);
|
|
Packit Service |
5a9772 |
clReleaseCommandQueue(openclContext.commandQueue);
|
|
Packit Service |
5a9772 |
clReleaseContext(openclContext.context);
|
|
Packit Service |
5a9772 |
clReleaseDevice(openclContext.deviceId);
|
|
Packit Service |
5a9772 |
openclContext.support = FALSE;
|
|
Packit Service |
5a9772 |
return PRIMITIVES_SUCCESS;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static const char* openclProgram =
|
|
Packit Service |
5a9772 |
#include "primitives.cl"
|
|
Packit Service |
5a9772 |
;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static BOOL primitives_init_opencl_context(primitives_opencl_context* cl)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
cl_platform_id* platform_ids = NULL;
|
|
Packit Service |
5a9772 |
cl_uint ndevices, nplatforms, i;
|
|
Packit Service |
5a9772 |
cl_kernel kernel;
|
|
Packit Service |
5a9772 |
cl_int ret;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
BOOL gotGPU = FALSE;
|
|
Packit Service |
5a9772 |
size_t programLen;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clGetPlatformIDs(0, NULL, &nplatforms);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS || nplatforms < 1)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
platform_ids = calloc(nplatforms, sizeof(*platform_ids));
|
|
Packit Service |
5a9772 |
if (!platform_ids)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clGetPlatformIDs(nplatforms, platform_ids, &nplatforms);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
free(platform_ids);
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
for (i = 0; (i < nplatforms) && !gotGPU; i++)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
cl_device_id device_id;
|
|
Packit Service |
5a9772 |
cl_context context;
|
|
Packit Service |
5a9772 |
char platformName[1000];
|
|
Packit Service |
5a9772 |
char deviceName[1000];
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clGetPlatformInfo(platform_ids[i], CL_PLATFORM_NAME, sizeof(platformName),
|
|
Packit Service |
5a9772 |
platformName, NULL);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
continue;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clGetDeviceIDs(platform_ids[i], CL_DEVICE_TYPE_GPU, 1, &device_id, &ndevices);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
continue;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clGetDeviceInfo(device_id, CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable get device name for platform %s", platformName);
|
|
Packit Service |
5a9772 |
clReleaseDevice(device_id);
|
|
Packit Service |
5a9772 |
continue;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable to create context for platform %s, device %s",
|
|
Packit Service |
5a9772 |
platformName, deviceName);
|
|
Packit Service |
5a9772 |
clReleaseDevice(device_id);
|
|
Packit Service |
5a9772 |
continue;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
cl->commandQueue = clCreateCommandQueue(context, device_id, 0, &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable to create command queue");
|
|
Packit Service |
5a9772 |
clReleaseContext(context);
|
|
Packit Service |
5a9772 |
clReleaseDevice(device_id);
|
|
Packit Service |
5a9772 |
continue;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
WLog_INFO(TAG, "openCL: using platform=%s device=%s", platformName, deviceName);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
cl->platformId = platform_ids[i];
|
|
Packit Service |
5a9772 |
cl->deviceId = device_id;
|
|
Packit Service |
5a9772 |
cl->context = context;
|
|
Packit Service |
5a9772 |
gotGPU = TRUE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
free(platform_ids);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
if (!gotGPU)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: no GPU found");
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
programLen = strlen(openclProgram);
|
|
Packit Service |
5a9772 |
cl->program =
|
|
Packit Service |
5a9772 |
clCreateProgramWithSource(cl->context, 1, (const char**)&openclProgram, &programLen, &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable to create program");
|
|
Packit Service |
5a9772 |
goto out_program_create;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
ret = clBuildProgram(cl->program, 1, &cl->deviceId, NULL, NULL, NULL);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
size_t length;
|
|
Packit Service |
5a9772 |
char buffer[2048];
|
|
Packit Service |
5a9772 |
ret = clGetProgramBuildInfo(cl->program, cl->deviceId, CL_PROGRAM_BUILD_LOG, sizeof(buffer),
|
|
Packit Service |
5a9772 |
buffer, &length);
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG,
|
|
Packit Service |
5a9772 |
"openCL: building program failed but unable to retrieve buildLog, error=%d",
|
|
Packit Service |
5a9772 |
ret);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
else
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable to build program, errorLog=%s", buffer);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
goto out_program_build;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
kernel = clCreateKernel(cl->program, "yuv420_to_bgra_1b", &ret;;
|
|
Packit Service |
5a9772 |
if (ret != CL_SUCCESS)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
WLog_ERR(TAG, "openCL: unable to create yuv420_to_bgra_1b kernel");
|
|
Packit Service |
5a9772 |
goto out_program_build;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
clReleaseKernel(kernel);
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
cl->support = TRUE;
|
|
Packit Service |
5a9772 |
return TRUE;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
out_program_build:
|
|
Packit Service |
5a9772 |
clReleaseProgram(cl->program);
|
|
Packit Service |
5a9772 |
out_program_create:
|
|
Packit Service |
5a9772 |
clReleaseCommandQueue(cl->commandQueue);
|
|
Packit Service |
5a9772 |
clReleaseContext(cl->context);
|
|
Packit Service |
5a9772 |
clReleaseDevice(cl->deviceId);
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static pstatus_t opencl_YUV420ToRGB_8u_P3AC4R(const BYTE* const pSrc[3], const UINT32 srcStep[3],
|
|
Packit Service |
5a9772 |
BYTE* pDst, UINT32 dstStep, UINT32 DstFormat,
|
|
Packit Service |
5a9772 |
const prim_size_t* roi)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
const char* kernel_name;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
switch (DstFormat)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_BGRA32:
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_BGRX32:
|
|
Packit Service |
5a9772 |
kernel_name = "yuv420_to_bgra_1b";
|
|
Packit Service |
5a9772 |
break;
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_XRGB32:
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_ARGB32:
|
|
Packit Service |
5a9772 |
kernel_name = "yuv420_to_argb_1b";
|
|
Packit Service |
5a9772 |
break;
|
|
Packit Service |
5a9772 |
default:
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
primitives_t* p = primitives_get_by_type(PRIMITIVES_ONLY_CPU);
|
|
Packit Service |
5a9772 |
if (!p)
|
|
Packit Service |
5a9772 |
return -1;
|
|
Packit Service |
5a9772 |
return p->YUV420ToRGB_8u_P3AC4R(pSrc, srcStep, pDst, dstStep, DstFormat, roi);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
return opencl_YUVToRGB(kernel_name, pSrc, srcStep, pDst, dstStep, roi);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
static pstatus_t opencl_YUV444ToRGB_8u_P3AC4R(const BYTE* const pSrc[3], const UINT32 srcStep[3],
|
|
Packit Service |
5a9772 |
BYTE* pDst, UINT32 dstStep, UINT32 DstFormat,
|
|
Packit Service |
5a9772 |
const prim_size_t* roi)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
const char* kernel_name;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
switch (DstFormat)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_BGRA32:
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_BGRX32:
|
|
Packit Service |
5a9772 |
kernel_name = "yuv444_to_bgra_1b";
|
|
Packit Service |
5a9772 |
break;
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_XRGB32:
|
|
Packit Service |
5a9772 |
case PIXEL_FORMAT_ARGB32:
|
|
Packit Service |
5a9772 |
kernel_name = "yuv444_to_argb_1b";
|
|
Packit Service |
5a9772 |
break;
|
|
Packit Service |
5a9772 |
default:
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
primitives_t* p = primitives_get_by_type(PRIMITIVES_ONLY_CPU);
|
|
Packit Service |
5a9772 |
if (!p)
|
|
Packit Service |
5a9772 |
return -1;
|
|
Packit Service |
5a9772 |
return p->YUV444ToRGB_8u_P3AC4R(pSrc, srcStep, pDst, dstStep, DstFormat, roi);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
return opencl_YUVToRGB(kernel_name, pSrc, srcStep, pDst, dstStep, roi);
|
|
Packit Service |
5a9772 |
}
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
BOOL primitives_init_opencl(primitives_t* prims)
|
|
Packit Service |
5a9772 |
{
|
|
Packit Service |
5a9772 |
primitives_t* p = primitives_get_by_type(PRIMITIVES_ONLY_CPU);
|
|
Packit Service |
5a9772 |
if (!prims || !p)
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
*prims = *p;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
if (!primitives_init_opencl_context(&openclContext))
|
|
Packit Service |
5a9772 |
return FALSE;
|
|
Packit Service |
5a9772 |
|
|
Packit Service |
5a9772 |
prims->YUV420ToRGB_8u_P3AC4R = opencl_YUV420ToRGB_8u_P3AC4R;
|
|
Packit Service |
5a9772 |
prims->YUV444ToRGB_8u_P3AC4R = opencl_YUV444ToRGB_8u_P3AC4R;
|
|
Packit Service |
5a9772 |
prims->flags |= PRIM_FLAGS_HAVE_EXTGPU;
|
|
Packit Service |
5a9772 |
prims->uninit = primitives_uninit_opencl;
|
|
Packit Service |
5a9772 |
return TRUE;
|
|
Packit Service |
5a9772 |
}
|