// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

// Common definitions of functions that can be used in .gpu files
// to be shared between CUDA and OpenCL implementations
//
// ### OPENCL BACKEND ###
//

#pragma once

#include "../common/gpuKernelDef.h"

// --------------------------------------------
// thread/warp ID
// --------------------------------------------

static inline unsigned get_global_id_x() { return (unsigned)get_global_id(0); }

static inline unsigned get_global_id_y() { return (unsigned)get_global_id(1); }

// --------------------------------------------
// kernel definition
// --------------------------------------------

// a device kernel callable by the host
#define __global__ kernel

// a device kernel callable by the device
#define __device__ static inline

// --------------------------------------------
// address space
// --------------------------------------------

// note: __global__ is CUDA kernel type specifier
#define global_mem global

#define __restrict__ restrict

// --------------------------------------------
// data types
// --------------------------------------------

// char is 8 Bit in the OpenCL spec
typedef uchar uint8_t;

typedef ushort uint16_t;

// int is 32 Bit in the OpenCL spec
typedef int int32_t;
typedef uint uint32_t;

typedef uint4 color_t;

#ifdef CL_ARGS_WORKAROUND
#define GPU_CL_ARGS_WORKAROUND
// Redefining GPU functions to support OpenCL limitation in parameters format
#endif

// can't be a typedef because of the access qualifier
// [OpenCL] [CL_DEVICE_NOT_AVAILABLE] : OpenCL Error : Error: Build Program driver returned (518)
#define surface_t write_only image2d_t

#define Image_clamp8 clamp8

#ifndef make_int2
#define make_int2(A, B) (int2)((A), (B))
#endif  // make_int2

#ifndef make_float2
#define make_float2(A, B) (float2)((A), (B))
#endif  // make_float2

// --------------------------------------------
// utility functions
// --------------------------------------------

#define clamp_vs clamp

// No assertions in OpenCL
#define assert(expression)