namespace cv::ocl

namespace ocl {

// enums

enum OclVectorStrategy;

// classes

class Context;
class Device;
class Image2D;
class Kernel;
class KernelArg;
class Platform;
class PlatformInfo;
class Program;
class ProgramSource;
class Queue;

// global functions

void
attachContext(
    const String& platformName,
    void* platformID,
    void* context,
    void* deviceID
    );

void
buildOptionsAddMatrixDescription(
    String& buildOptions,
    const String& name,
    InputArray _m
    );

int
checkOptimalVectorWidth(
    const int* vectorWidths,
    InputArray src1,
    InputArray src2 = noArray(),
    InputArray src3 = noArray(),
    InputArray src4 = noArray(),
    InputArray src5 = noArray(),
    InputArray src6 = noArray(),
    InputArray src7 = noArray(),
    InputArray src8 = noArray(),
    InputArray src9 = noArray(),
    OclVectorStrategy strat = OCL_VECTOR_DEFAULT
    );

void
convertFromBuffer(
    void* cl_mem_buffer,
    size_t step,
    int rows,
    int cols,
    int type,
    UMat& dst
    );

void
convertFromImage(
    void* cl_mem_image,
    UMat& dst
    );

const char*
convertTypeStr(
    int sdepth,
    int ddepth,
    int cn,
    char* buf
    );

void
finish();

MatAllocator*
getOpenCLAllocator();

void
getPlatfomsInfo(std::vector<PlatformInfo>& platform_info);

bool
haveAmdBlas();

bool
haveAmdFft();

bool
haveOpenCL();

bool
haveSVM();

void
initializeContextFromHandle(
    Context& ctx,
    void* platform,
    void* context,
    void* device
    );

String
kernelToStr(
    InputArray _kernel,
    int ddepth = -1,
    const char* name = NULL
    );

const char*
memopTypeToStr(int t);

int
predictOptimalVectorWidth(
    InputArray src1,
    InputArray src2 = noArray(),
    InputArray src3 = noArray(),
    InputArray src4 = noArray(),
    InputArray src5 = noArray(),
    InputArray src6 = noArray(),
    InputArray src7 = noArray(),
    InputArray src8 = noArray(),
    InputArray src9 = noArray(),
    OclVectorStrategy strat = OCL_VECTOR_DEFAULT
    );

int
predictOptimalVectorWidthMax(
    InputArray src1,
    InputArray src2 = noArray(),
    InputArray src3 = noArray(),
    InputArray src4 = noArray(),
    InputArray src5 = noArray(),
    InputArray src6 = noArray(),
    InputArray src7 = noArray(),
    InputArray src8 = noArray(),
    InputArray src9 = noArray()
    );

void
setUseOpenCL(bool flag);

const char*
typeToStr(int t);

bool
useOpenCL();

const char*
vecopTypeToStr(int t);

} // namespace ocl