//
// /build/openimagedenoise/src/oidn-2.4.1/build/devices/cpu/cpu_input_process_f32_ispc.h
// (Header automatically generated by the ispc compiler.)
// DO NOT EDIT THIS FILE.
//

#pragma once
#include <stdint.h>



#ifdef __cplusplus
namespace ispc { /* namespace */
#endif // __cplusplus

///////////////////////////////////////////////////////////////////////////
// Enumerator types with external visibility from ispc code
///////////////////////////////////////////////////////////////////////////

#ifndef __ISPC_ENUM_DataType__
#define __ISPC_ENUM_DataType__
enum DataType {
    DataType_Undefined = 0,
    DataType_UInt8 = 1,
    DataType_Float16 = 2,
    DataType_Float32 = 3 
};
#endif


/* Portable alignment macro that works across different compilers and standards */
#if defined(__cplusplus) && __cplusplus >= 201103L
/* C++11 or newer - use alignas keyword */
#define __ISPC_ALIGN__(x) alignas(x)
#elif defined(__GNUC__) || defined(__clang__)
/* GCC or Clang - use __attribute__ */
#define __ISPC_ALIGN__(x) __attribute__((aligned(x)))
#elif defined(_MSC_VER)
/* Microsoft Visual C++ - use __declspec */
#define __ISPC_ALIGN__(x) __declspec(align(x))
#else
/* Unknown compiler/standard - alignment not supported */
#define __ISPC_ALIGN__(x)
#warning "Alignment not supported on this compiler"
#endif // defined(__cplusplus) && __cplusplus >= 201103L
#ifndef __ISPC_ALIGNED_STRUCT__
#if defined(__clang__) || !defined(_MSC_VER) || _MSC_VER > 1943
// Clang, GCC, ICC, Visual Studio
#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s)
#else
// Older Visual Studio
#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct
#endif // defined(__clang__) || !defined(_MSC_VER) || _MSC_VER > 1943
#endif // __ISPC_ALIGNED_STRUCT__

#ifndef __ISPC_STRUCT_ImageAccessor__
#define __ISPC_STRUCT_ImageAccessor__
struct ImageAccessor {
    int8_t * ptr;
    uint64_t hByteStride;
    uint64_t wByteStride;
    enum DataType dataType;
    int32_t C;
    int32_t H;
    int32_t W;
};
#endif

#ifndef __ISPC_STRUCT_TensorAccessor3D_ChwBc__
#define __ISPC_STRUCT_TensorAccessor3D_ChwBc__
struct TensorAccessor3D_ChwBc {
    int8_t * ptr;
    uint32_t hByteStride;
    uint32_t CByteStride;
    int32_t C;
    int32_t H;
    int32_t W;
};
#endif

#ifndef __ISPC_STRUCT_Tile__
#define __ISPC_STRUCT_Tile__
struct Tile {
    int32_t hSrcBegin;
    int32_t wSrcBegin;
    int32_t hDstBegin;
    int32_t wDstBegin;
    int32_t H;
    int32_t W;
};
#endif

#ifndef __ISPC_STRUCT_TransferFunction__
#define __ISPC_STRUCT_TransferFunction__
struct TransferFunction {
    struct v8_varying_vec3f ( * forward)(const struct TransferFunction * self, struct v8_varying_vec3f y);
    struct v8_varying_vec3f ( * inverse)(const struct TransferFunction * self, struct v8_varying_vec3f x);
    const float * inputScalePtr;
    float inputScale;
    float outputScale;
    float normScale;
    float rcpNormScale;
};
#endif

#ifndef __ISPC_STRUCT_CPUInputProcessKernel__
#define __ISPC_STRUCT_CPUInputProcessKernel__
struct CPUInputProcessKernel {
    struct ImageAccessor input;
    struct ImageAccessor albedo;
    struct ImageAccessor normal;
    struct TensorAccessor3D_ChwBc dst;
    struct Tile tile;
    struct TransferFunction transferFunc;
    bool hdr;
    bool snorm;
};
#endif

#ifndef __ISPC_STRUCT_v8_varying_vec3f__
#define __ISPC_STRUCT_v8_varying_vec3f__
__ISPC_ALIGNED_STRUCT__(32) v8_varying_vec3f {
    __ISPC_ALIGN__(32)     float x[8];
    __ISPC_ALIGN__(32)     float y[8];
    __ISPC_ALIGN__(32)     float z[8];
};
#endif


///////////////////////////////////////////////////////////////////////////
// Functions exported from ispc code
///////////////////////////////////////////////////////////////////////////
#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C )
extern "C" {
#endif // __cplusplus
    extern void CPUInputProcessKernel_run_f32(const struct CPUInputProcessKernel * self, int32_t hDst);
#if defined(__cplusplus) && (! defined(__ISPC_NO_EXTERN_C) || !__ISPC_NO_EXTERN_C )
} /* end extern C */
#endif // __cplusplus


/* Portable alignment macro that works across different compilers and standards */
#if defined(__cplusplus) && __cplusplus >= 201103L
/* C++11 or newer - use alignas keyword */
#define __ISPC_ALIGN__(x) alignas(x)
#elif defined(__GNUC__) || defined(__clang__)
/* GCC or Clang - use __attribute__ */
#define __ISPC_ALIGN__(x) __attribute__((aligned(x)))
#elif defined(_MSC_VER)
/* Microsoft Visual C++ - use __declspec */
#define __ISPC_ALIGN__(x) __declspec(align(x))
#else
/* Unknown compiler/standard - alignment not supported */
#define __ISPC_ALIGN__(x)
#warning "Alignment not supported on this compiler"
#endif // defined(__cplusplus) && __cplusplus >= 201103L
#ifndef __ISPC_ALIGNED_STRUCT__
#if defined(__clang__) || !defined(_MSC_VER) || _MSC_VER > 1943
// Clang, GCC, ICC, Visual Studio
#define __ISPC_ALIGNED_STRUCT__(s) struct __ISPC_ALIGN__(s)
#else
// Older Visual Studio
#define __ISPC_ALIGNED_STRUCT__(s) __ISPC_ALIGN__(s) struct
#endif // defined(__clang__) || !defined(_MSC_VER) || _MSC_VER > 1943
#endif // __ISPC_ALIGNED_STRUCT__

#ifndef __ISPC_STRUCT_v16_varying_vec3f__
#define __ISPC_STRUCT_v16_varying_vec3f__
__ISPC_ALIGNED_STRUCT__(64) v16_varying_vec3f {
    __ISPC_ALIGN__(64)     float x[16];
    __ISPC_ALIGN__(64)     float y[16];
    __ISPC_ALIGN__(64)     float z[16];
};
#endif



#ifdef __cplusplus
} /* namespace */
#endif // __cplusplus
