2025-04-28 08:47:28 +08:00

810 lines
29 KiB
C

/*****************************************************************************
* opencl.h: OpenCL structures and defines
*****************************************************************************
* Copyright (C) 2012-2025 x264 project
*
* Authors: Steve Borho <sborho@multicorewareinc.com>
* Anton Mitrofanov <BugMaster@narod.ru>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
*
* This program is also available under a commercial proprietary license.
* For more information, contact us at licensing@x264.com.
*****************************************************************************/
#ifndef X264_OPENCL_H
#define X264_OPENCL_H
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
#include "extras/cl.h"
#define OCL_API(ret, attr, name) typedef ret (attr *name##_func)
/* Platform API */
OCL_API(cl_int, CL_API_CALL, clGetPlatformIDs)
( cl_uint /* num_entries */,
cl_platform_id * /* platforms */,
cl_uint * /* num_platforms */);
OCL_API(cl_int, CL_API_CALL, clGetPlatformInfo)
( cl_platform_id /* platform */,
cl_platform_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Device APIs */
OCL_API(cl_int, CL_API_CALL, clGetDeviceIDs)
( cl_platform_id /* platform */,
cl_device_type /* device_type */,
cl_uint /* num_entries */,
cl_device_id * /* devices */,
cl_uint * /* num_devices */);
OCL_API(cl_int, CL_API_CALL, clGetDeviceInfo)
( cl_device_id /* device */,
cl_device_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_int, CL_API_CALL, clCreateSubDevices)
( cl_device_id /* in_device */,
const cl_device_partition_property * /* properties */,
cl_uint /* num_devices */,
cl_device_id * /* out_devices */,
cl_uint * /* num_devices_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainDevice)
( cl_device_id /* device */);
OCL_API(cl_int, CL_API_CALL, clReleaseDevice)
( cl_device_id /* device */);
/* Context APIs */
OCL_API(cl_context, CL_API_CALL, clCreateContext)
( const cl_context_properties * /* properties */,
cl_uint /* num_devices */,
const cl_device_id * /* devices */,
void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *),
void * /* user_data */,
cl_int * /* errcode_ret */);
OCL_API(cl_context, CL_API_CALL, clCreateContextFromType)
( const cl_context_properties * /* properties */,
cl_device_type /* device_type */,
void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *),
void * /* user_data */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainContext)
( cl_context /* context */);
OCL_API(cl_int, CL_API_CALL, clReleaseContext)
( cl_context /* context */);
OCL_API(cl_int, CL_API_CALL, clGetContextInfo)
( cl_context /* context */,
cl_context_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Command Queue APIs */
OCL_API(cl_command_queue, CL_API_CALL, clCreateCommandQueue)
( cl_context /* context */,
cl_device_id /* device */,
cl_command_queue_properties /* properties */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainCommandQueue)
( cl_command_queue /* command_queue */);
OCL_API(cl_int, CL_API_CALL, clReleaseCommandQueue)
( cl_command_queue /* command_queue */);
OCL_API(cl_int, CL_API_CALL, clGetCommandQueueInfo)
( cl_command_queue /* command_queue */,
cl_command_queue_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Memory Object APIs */
OCL_API(cl_mem, CL_API_CALL, clCreateBuffer)
( cl_context /* context */,
cl_mem_flags /* flags */,
size_t /* size */,
void * /* host_ptr */,
cl_int * /* errcode_ret */);
OCL_API(cl_mem, CL_API_CALL, clCreateSubBuffer)
( cl_mem /* buffer */,
cl_mem_flags /* flags */,
cl_buffer_create_type /* buffer_create_type */,
const void * /* buffer_create_info */,
cl_int * /* errcode_ret */);
OCL_API(cl_mem, CL_API_CALL, clCreateImage)
( cl_context /* context */,
cl_mem_flags /* flags */,
const cl_image_format * /* image_format */,
const cl_image_desc * /* image_desc */,
void * /* host_ptr */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainMemObject)
( cl_mem /* memobj */);
OCL_API(cl_int, CL_API_CALL, clReleaseMemObject)
( cl_mem /* memobj */);
OCL_API(cl_int, CL_API_CALL, clGetSupportedImageFormats)
( cl_context /* context */,
cl_mem_flags /* flags */,
cl_mem_object_type /* image_type */,
cl_uint /* num_entries */,
cl_image_format * /* image_formats */,
cl_uint * /* num_image_formats */);
OCL_API(cl_int, CL_API_CALL, clGetMemObjectInfo)
( cl_mem /* memobj */,
cl_mem_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_int, CL_API_CALL, clGetImageInfo)
( cl_mem /* image */,
cl_image_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_int, CL_API_CALL, clSetMemObjectDestructorCallback)
( cl_mem /* memobj */,
void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
void * /*user_data */ );
/* Sampler APIs */
OCL_API(cl_sampler, CL_API_CALL, clCreateSampler)
( cl_context /* context */,
cl_bool /* normalized_coords */,
cl_addressing_mode /* addressing_mode */,
cl_filter_mode /* filter_mode */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainSampler)
( cl_sampler /* sampler */);
OCL_API(cl_int, CL_API_CALL, clReleaseSampler)
( cl_sampler /* sampler */);
OCL_API(cl_int, CL_API_CALL, clGetSamplerInfo)
( cl_sampler /* sampler */,
cl_sampler_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Program Object APIs */
OCL_API(cl_program, CL_API_CALL, clCreateProgramWithSource)
( cl_context /* context */,
cl_uint /* count */,
const char ** /* strings */,
const size_t * /* lengths */,
cl_int * /* errcode_ret */);
OCL_API(cl_program, CL_API_CALL, clCreateProgramWithBinary)
( cl_context /* context */,
cl_uint /* num_devices */,
const cl_device_id * /* device_list */,
const size_t * /* lengths */,
const unsigned char ** /* binaries */,
cl_int * /* binary_status */,
cl_int * /* errcode_ret */);
OCL_API(cl_program, CL_API_CALL, clCreateProgramWithBuiltInKernels)
( cl_context /* context */,
cl_uint /* num_devices */,
const cl_device_id * /* device_list */,
const char * /* kernel_names */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainProgram)
( cl_program /* program */);
OCL_API(cl_int, CL_API_CALL, clReleaseProgram)
( cl_program /* program */);
OCL_API(cl_int, CL_API_CALL, clBuildProgram)
( cl_program /* program */,
cl_uint /* num_devices */,
const cl_device_id * /* device_list */,
const char * /* options */,
void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
void * /* user_data */);
OCL_API(cl_int, CL_API_CALL, clCompileProgram)
( cl_program /* program */,
cl_uint /* num_devices */,
const cl_device_id * /* device_list */,
const char * /* options */,
cl_uint /* num_input_headers */,
const cl_program * /* input_headers */,
const char ** /* header_include_names */,
void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
void * /* user_data */);
OCL_API(cl_program, CL_API_CALL, clLinkProgram)
( cl_context /* context */,
cl_uint /* num_devices */,
const cl_device_id * /* device_list */,
const char * /* options */,
cl_uint /* num_input_programs */,
const cl_program * /* input_programs */,
void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
void * /* user_data */,
cl_int * /* errcode_ret */ );
OCL_API(cl_int, CL_API_CALL, clUnloadPlatformCompiler)
( cl_platform_id /* platform */);
OCL_API(cl_int, CL_API_CALL, clGetProgramInfo)
( cl_program /* program */,
cl_program_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_int, CL_API_CALL, clGetProgramBuildInfo)
( cl_program /* program */,
cl_device_id /* device */,
cl_program_build_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Kernel Object APIs */
OCL_API(cl_kernel, CL_API_CALL, clCreateKernel)
( cl_program /* program */,
const char * /* kernel_name */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clCreateKernelsInProgram)
( cl_program /* program */,
cl_uint /* num_kernels */,
cl_kernel * /* kernels */,
cl_uint * /* num_kernels_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainKernel)
( cl_kernel /* kernel */);
OCL_API(cl_int, CL_API_CALL, clReleaseKernel)
( cl_kernel /* kernel */);
OCL_API(cl_int, CL_API_CALL, clSetKernelArg)
( cl_kernel /* kernel */,
cl_uint /* arg_index */,
size_t /* arg_size */,
const void * /* arg_value */);
OCL_API(cl_int, CL_API_CALL, clGetKernelInfo)
( cl_kernel /* kernel */,
cl_kernel_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_int, CL_API_CALL, clGetKernelArgInfo)
( cl_kernel /* kernel */,
cl_uint /* arg_indx */,
cl_kernel_arg_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_int, CL_API_CALL, clGetKernelWorkGroupInfo)
( cl_kernel /* kernel */,
cl_device_id /* device */,
cl_kernel_work_group_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Event Object APIs */
OCL_API(cl_int, CL_API_CALL, clWaitForEvents)
( cl_uint /* num_events */,
const cl_event * /* event_list */);
OCL_API(cl_int, CL_API_CALL, clGetEventInfo)
( cl_event /* event */,
cl_event_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
OCL_API(cl_event, CL_API_CALL, clCreateUserEvent)
( cl_context /* context */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clRetainEvent)
( cl_event /* event */);
OCL_API(cl_int, CL_API_CALL, clReleaseEvent)
( cl_event /* event */);
OCL_API(cl_int, CL_API_CALL, clSetUserEventStatus)
( cl_event /* event */,
cl_int /* execution_status */);
OCL_API(cl_int, CL_API_CALL, clSetEventCallback)
( cl_event /* event */,
cl_int /* command_exec_callback_type */,
void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
void * /* user_data */);
/* Profiling APIs */
OCL_API(cl_int, CL_API_CALL, clGetEventProfilingInfo)
( cl_event /* event */,
cl_profiling_info /* param_name */,
size_t /* param_value_size */,
void * /* param_value */,
size_t * /* param_value_size_ret */);
/* Flush and Finish APIs */
OCL_API(cl_int, CL_API_CALL, clFlush)
( cl_command_queue /* command_queue */);
OCL_API(cl_int, CL_API_CALL, clFinish)
( cl_command_queue /* command_queue */);
/* Enqueued Commands APIs */
OCL_API(cl_int, CL_API_CALL, clEnqueueReadBuffer)
( cl_command_queue /* command_queue */,
cl_mem /* buffer */,
cl_bool /* blocking_read */,
size_t /* offset */,
size_t /* size */,
void * /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueReadBufferRect)
( cl_command_queue /* command_queue */,
cl_mem /* buffer */,
cl_bool /* blocking_read */,
const size_t * /* buffer_offset */,
const size_t * /* host_offset */,
const size_t * /* region */,
size_t /* buffer_row_pitch */,
size_t /* buffer_slice_pitch */,
size_t /* host_row_pitch */,
size_t /* host_slice_pitch */,
void * /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueWriteBuffer)
( cl_command_queue /* command_queue */,
cl_mem /* buffer */,
cl_bool /* blocking_write */,
size_t /* offset */,
size_t /* size */,
const void * /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueWriteBufferRect)
( cl_command_queue /* command_queue */,
cl_mem /* buffer */,
cl_bool /* blocking_write */,
const size_t * /* buffer_offset */,
const size_t * /* host_offset */,
const size_t * /* region */,
size_t /* buffer_row_pitch */,
size_t /* buffer_slice_pitch */,
size_t /* host_row_pitch */,
size_t /* host_slice_pitch */,
const void * /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueFillBuffer)
( cl_command_queue /* command_queue */,
cl_mem /* buffer */,
const void * /* pattern */,
size_t /* pattern_size */,
size_t /* offset */,
size_t /* size */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueCopyBuffer)
( cl_command_queue /* command_queue */,
cl_mem /* src_buffer */,
cl_mem /* dst_buffer */,
size_t /* src_offset */,
size_t /* dst_offset */,
size_t /* size */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueCopyBufferRect)
( cl_command_queue /* command_queue */,
cl_mem /* src_buffer */,
cl_mem /* dst_buffer */,
const size_t * /* src_origin */,
const size_t * /* dst_origin */,
const size_t * /* region */,
size_t /* src_row_pitch */,
size_t /* src_slice_pitch */,
size_t /* dst_row_pitch */,
size_t /* dst_slice_pitch */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueReadImage)
( cl_command_queue /* command_queue */,
cl_mem /* image */,
cl_bool /* blocking_read */,
const size_t * /* origin[3] */,
const size_t * /* region[3] */,
size_t /* row_pitch */,
size_t /* slice_pitch */,
void * /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueWriteImage)
( cl_command_queue /* command_queue */,
cl_mem /* image */,
cl_bool /* blocking_write */,
const size_t * /* origin[3] */,
const size_t * /* region[3] */,
size_t /* input_row_pitch */,
size_t /* input_slice_pitch */,
const void * /* ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueFillImage)
( cl_command_queue /* command_queue */,
cl_mem /* image */,
const void * /* fill_color */,
const size_t * /* origin[3] */,
const size_t * /* region[3] */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueCopyImage)
( cl_command_queue /* command_queue */,
cl_mem /* src_image */,
cl_mem /* dst_image */,
const size_t * /* src_origin[3] */,
const size_t * /* dst_origin[3] */,
const size_t * /* region[3] */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueCopyImageToBuffer)
( cl_command_queue /* command_queue */,
cl_mem /* src_image */,
cl_mem /* dst_buffer */,
const size_t * /* src_origin[3] */,
const size_t * /* region[3] */,
size_t /* dst_offset */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueCopyBufferToImage)
( cl_command_queue /* command_queue */,
cl_mem /* src_buffer */,
cl_mem /* dst_image */,
size_t /* src_offset */,
const size_t * /* dst_origin[3] */,
const size_t * /* region[3] */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(void *, CL_API_CALL, clEnqueueMapBuffer)
( cl_command_queue /* command_queue */,
cl_mem /* buffer */,
cl_bool /* blocking_map */,
cl_map_flags /* map_flags */,
size_t /* offset */,
size_t /* size */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */,
cl_int * /* errcode_ret */);
OCL_API(void *, CL_API_CALL, clEnqueueMapImage)
( cl_command_queue /* command_queue */,
cl_mem /* image */,
cl_bool /* blocking_map */,
cl_map_flags /* map_flags */,
const size_t * /* origin[3] */,
const size_t * /* region[3] */,
size_t * /* image_row_pitch */,
size_t * /* image_slice_pitch */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clEnqueueUnmapMemObject)
( cl_command_queue /* command_queue */,
cl_mem /* memobj */,
void * /* mapped_ptr */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueMigrateMemObjects)
( cl_command_queue /* command_queue */,
cl_uint /* num_mem_objects */,
const cl_mem * /* mem_objects */,
cl_mem_migration_flags /* flags */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueNDRangeKernel)
( cl_command_queue /* command_queue */,
cl_kernel /* kernel */,
cl_uint /* work_dim */,
const size_t * /* global_work_offset */,
const size_t * /* global_work_size */,
const size_t * /* local_work_size */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueTask)
( cl_command_queue /* command_queue */,
cl_kernel /* kernel */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueNativeKernel)
( cl_command_queue /* command_queue */,
void (CL_CALLBACK * /*user_func*/)(void *),
void * /* args */,
size_t /* cb_args */,
cl_uint /* num_mem_objects */,
const cl_mem * /* mem_list */,
const void ** /* args_mem_loc */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueMarkerWithWaitList)
( cl_command_queue /* command_queue */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueBarrierWithWaitList)
( cl_command_queue /* command_queue */,
cl_uint /* num_events_in_wait_list */,
const cl_event * /* event_wait_list */,
cl_event * /* event */);
/* Extension function access
*
* Returns the extension function address for the given function name,
* or NULL if a valid function can not be found. The client must
* check to make sure the address is not NULL, before using or
* calling the returned function address.
*/
OCL_API(void *, CL_API_CALL, clGetExtensionFunctionAddressForPlatform)
( cl_platform_id /* platform */,
const char * /* func_name */);
// Deprecated OpenCL 1.1 APIs
OCL_API(cl_mem, CL_API_CALL, clCreateImage2D)
( cl_context /* context */,
cl_mem_flags /* flags */,
const cl_image_format * /* image_format */,
size_t /* image_width */,
size_t /* image_height */,
size_t /* image_row_pitch */,
void * /* host_ptr */,
cl_int * /* errcode_ret */);
OCL_API(cl_mem, CL_API_CALL, clCreateImage3D)
( cl_context /* context */,
cl_mem_flags /* flags */,
const cl_image_format * /* image_format */,
size_t /* image_width */,
size_t /* image_height */,
size_t /* image_depth */,
size_t /* image_row_pitch */,
size_t /* image_slice_pitch */,
void * /* host_ptr */,
cl_int * /* errcode_ret */);
OCL_API(cl_int, CL_API_CALL, clEnqueueMarker)
( cl_command_queue /* command_queue */,
cl_event * /* event */);
OCL_API(cl_int, CL_API_CALL, clEnqueueWaitForEvents)
( cl_command_queue /* command_queue */,
cl_uint /* num_events */,
const cl_event * /* event_list */);
OCL_API(cl_int, CL_API_CALL, clEnqueueBarrier)
( cl_command_queue /* command_queue */);
OCL_API(cl_int, CL_API_CALL, clUnloadCompiler)
( void);
OCL_API(void *, CL_API_CALL, clGetExtensionFunctionAddress)
( const char * /* func_name */);
#define OCL_DECLARE_FUNC(name) name##_func name
typedef struct
{
void *library;
OCL_DECLARE_FUNC( clBuildProgram );
OCL_DECLARE_FUNC( clCreateBuffer );
OCL_DECLARE_FUNC( clCreateCommandQueue );
OCL_DECLARE_FUNC( clCreateContext );
OCL_DECLARE_FUNC( clCreateImage2D );
OCL_DECLARE_FUNC( clCreateKernel );
OCL_DECLARE_FUNC( clCreateProgramWithBinary );
OCL_DECLARE_FUNC( clCreateProgramWithSource );
OCL_DECLARE_FUNC( clEnqueueCopyBuffer );
OCL_DECLARE_FUNC( clEnqueueMapBuffer );
OCL_DECLARE_FUNC( clEnqueueNDRangeKernel );
OCL_DECLARE_FUNC( clEnqueueReadBuffer );
OCL_DECLARE_FUNC( clEnqueueWriteBuffer );
OCL_DECLARE_FUNC( clFinish );
OCL_DECLARE_FUNC( clGetCommandQueueInfo );
OCL_DECLARE_FUNC( clGetDeviceIDs );
OCL_DECLARE_FUNC( clGetDeviceInfo );
OCL_DECLARE_FUNC( clGetKernelWorkGroupInfo );
OCL_DECLARE_FUNC( clGetPlatformIDs );
OCL_DECLARE_FUNC( clGetProgramBuildInfo );
OCL_DECLARE_FUNC( clGetProgramInfo );
OCL_DECLARE_FUNC( clGetSupportedImageFormats );
OCL_DECLARE_FUNC( clReleaseCommandQueue );
OCL_DECLARE_FUNC( clReleaseContext );
OCL_DECLARE_FUNC( clReleaseKernel );
OCL_DECLARE_FUNC( clReleaseMemObject );
OCL_DECLARE_FUNC( clReleaseProgram );
OCL_DECLARE_FUNC( clSetKernelArg );
} x264_opencl_function_t;
/* Number of downscale resolutions to use for motion search */
#define NUM_IMAGE_SCALES 4
/* Number of PCIe copies that can be queued before requiring a flush */
#define MAX_FINISH_COPIES 1024
/* Size (in bytes) of the page-locked buffer used for PCIe xfers */
#define PAGE_LOCKED_BUF_SIZE 32 * 1024 * 1024
typedef struct
{
x264_opencl_function_t *ocl;
cl_context context;
cl_device_id device;
cl_command_queue queue;
cl_program lookahead_program;
cl_int last_buf;
cl_mem page_locked_buffer;
char *page_locked_ptr;
int pl_occupancy;
struct
{
void *src;
void *dest;
int bytes;
} copies[MAX_FINISH_COPIES];
int num_copies;
int b_device_AMD_SI;
int b_fatal_error;
int lookahead_thread_pri;
int opencl_thread_pri;
/* downscale lowres luma */
cl_kernel downscale_hpel_kernel;
cl_kernel downscale_kernel1;
cl_kernel downscale_kernel2;
cl_mem luma_16x16_image[2];
/* weightp filtering */
cl_kernel weightp_hpel_kernel;
cl_kernel weightp_scaled_images_kernel;
cl_mem weighted_scaled_images[NUM_IMAGE_SCALES];
cl_mem weighted_luma_hpel;
/* intra */
cl_kernel memset_kernel;
cl_kernel intra_kernel;
cl_kernel rowsum_intra_kernel;
cl_mem row_satds[2];
/* hierarchical motion estimation */
cl_kernel hme_kernel;
cl_kernel subpel_refine_kernel;
cl_mem mv_buffers[2];
cl_mem lowres_mv_costs;
cl_mem mvp_buffer;
/* bidir */
cl_kernel mode_select_kernel;
cl_kernel rowsum_inter_kernel;
cl_mem lowres_costs[2];
cl_mem frame_stats[2]; /* cost_est, cost_est_aq, intra_mbs */
} x264_opencl_t;
typedef struct
{
x264_opencl_function_t *ocl;
cl_mem scaled_image2Ds[NUM_IMAGE_SCALES];
cl_mem luma_hpel;
cl_mem inv_qscale_factor;
cl_mem intra_cost;
cl_mem lowres_mvs0;
cl_mem lowres_mvs1;
cl_mem lowres_mv_costs0;
cl_mem lowres_mv_costs1;
} x264_frame_opencl_t;
typedef struct x264_frame x264_frame;
#define x264_opencl_load_library x264_template(opencl_load_library)
x264_opencl_function_t *x264_opencl_load_library( void );
#define x264_opencl_close_library x264_template(opencl_close_library)
void x264_opencl_close_library( x264_opencl_function_t *ocl );
#define x264_opencl_lookahead_init x264_template(opencl_lookahead_init)
int x264_opencl_lookahead_init( x264_t *h );
#define x264_opencl_lookahead_delete x264_template(opencl_lookahead_delete)
void x264_opencl_lookahead_delete( x264_t *h );
#define x264_opencl_frame_delete x264_template(opencl_frame_delete)
void x264_opencl_frame_delete( x264_frame *frame );
#endif