blob: 2ff5d6bccde7abbf0b56543d8b8e82cd860d290d [file] [log] [blame]
/*
* Copyright (c) 2007-2017, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file cm_def_os.h
//! \brief Contains CM definitions
//!
#pragma once
#pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor"
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <iostream>
#include <exception>
#include <string.h>
#include <math.h>
#include <errno.h>
#include <cstring>
#include "dlfcn.h"
#include "media_libva_cm.h"
#ifndef SUCCEEDED
#define SUCCEEDED(hr) (hr == VA_STATUS_SUCCESS)
#endif // !SUCCEEDED
#ifndef FAILED
#define FAILED(hr) (hr != VA_STATUS_SUCCESS)
#endif // !FAILED
#define CM_DRIVER_EXPOSED __attribute__ ((visibility ("default")))
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
static inline char *
strtok_s(char *strToken, const char *strDelimit, char **context)
{
return strtok_r(strToken, strDelimit, context);
}
inline int memcpy_s(void *dst, size_t numberOfElements, const void *src, size_t count)
{
if ((dst == nullptr) || (src == nullptr))
{
return EINVAL;
}
if (numberOfElements < count)
{
return ERANGE;
}
std::memcpy(dst, src, count);
return 0;
}
#define CM_CONTEXT_DATA CM_CONTEXT
#define PCM_CONTEXT_DATA PCM_CONTEXT
#define CM_MAX_SURFACE2D_FORMAT_COUNT 29
#define CM_MAX_SURFACE2D_FORMAT_COUNT_INTERNAL (CM_MAX_SURFACE2D_FORMAT_COUNT-1)
// max resolution for surface 2D
#define CM_MAX_2D_SURF_WIDTH 16384
#define CM_MAX_2D_SURF_HEIGHT 16384
typedef enum _CM_TEXTURE_ADDRESS_TYPE
{
CM_TEXTURE_ADDRESS_WRAP = 1,
CM_TEXTURE_ADDRESS_MIRROR = 2,
CM_TEXTURE_ADDRESS_CLAMP = 3,
CM_TEXTURE_ADDRESS_BORDER = 4,
CM_TEXTURE_ADDRESS_MIRRORONCE = 5
} CM_TEXTURE_ADDRESS_TYPE;
typedef enum _CM_TEXTURE_FILTER_TYPE
{
CM_TEXTURE_FILTER_TYPE_NONE = 0,
CM_TEXTURE_FILTER_TYPE_POINT = 1,
CM_TEXTURE_FILTER_TYPE_LINEAR = 2,
CM_TEXTURE_FILTER_TYPE_ANISOTROPIC = 3,
CM_TEXTURE_FILTER_TYPE_FLATCUBIC = 4,
CM_TEXTURE_FILTER_TYPE_GAUSSIANCUBIC = 5,
CM_TEXTURE_FILTER_TYPE_PYRAMIDALQUAD = 6,
CM_TEXTURE_FILTER_TYPE_GAUSSIANQUAD = 7
} CM_TEXTURE_FILTER_TYPE;
// From Compiler
#define CM_NOINLINE __attribute__((noinline))
namespace CMRT_UMD
{
class SurfaceIndex
{
public:
CM_NOINLINE SurfaceIndex() { index = 0; extraByte = 0; };
CM_NOINLINE SurfaceIndex(const SurfaceIndex& src) { index = src.index; extraByte = src.extraByte; };
CM_NOINLINE SurfaceIndex(const unsigned int& n) { index = n; extraByte = 0; };
CM_NOINLINE SurfaceIndex& operator = (const unsigned int& n) { this->index = n; return *this; };
CM_NOINLINE SurfaceIndex& operator + (const unsigned int& n) { this->index += n; return *this; };
CM_NOINLINE SurfaceIndex& operator= (const SurfaceIndex& other) { this->index = other.index; return *this; };
virtual unsigned int get_data(void) { return index; };
//g++ warning: class has virtual functions but non-virtual destructor
virtual ~SurfaceIndex() {};
private:
unsigned int index;
/*
* Do not delete this line:
* SurfaceIndex is commonly used as CM kernel function's parameter.
* It has virutal table and has copy constructor, so GNU calling convention will pass the object's pointer to kernel function.
* This is different from MSVC, which always copies the entire object transferred on the callee's stack.
*
* Depending on the special object size after adding below "extraByte",
* SetKernelArg and SetThreadArg can recognize this object and follow GNU's convention to construct kernel function's stack.
*/
unsigned char extraByte;
};
class SamplerIndex
{
public:
CM_NOINLINE SamplerIndex() { index = 0; extraByte = 0;};
CM_NOINLINE SamplerIndex(SamplerIndex& src) { index = src.get_data(); extraByte = src.extraByte; };
CM_NOINLINE SamplerIndex(const unsigned int& n) { index = n; extraByte = 0; };
CM_NOINLINE SamplerIndex& operator = (const unsigned int& n) { this->index = n; return *this; };
virtual unsigned int get_data(void) { return index; };
virtual ~SamplerIndex(){};
private:
unsigned int index;
/*
* Do not delete this line:
* Same reason as SurfaceIndex.
*/
unsigned char extraByte;
SamplerIndex& operator= (const SamplerIndex& other);
};
}
#ifndef _SYSTEMTIME_DEFINE_PROTECTOR_
#define _SYSTEMTIME_DEFINE_PROTECTOR_
typedef struct _SYSTEMTIME
{
uint16_t wYear;
uint16_t wMonth;
uint16_t wDayOfWeek;
uint16_t wDay;
uint16_t wHour;
uint16_t wMinute;
uint16_t wSecond;
uint16_t wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
inline void GetLocalTime(PSYSTEMTIME sysTime)
{
time_t temp;
struct tm *localTime;
time(&temp);
localTime=localtime(&temp);
sysTime->wYear = localTime->tm_year;
sysTime->wMonth = localTime->tm_mon;
sysTime->wDayOfWeek = localTime->tm_wday;
sysTime->wDay = localTime->tm_mday;
sysTime->wHour = localTime->tm_hour;
sysTime->wMinute = localTime->tm_min;
sysTime->wSecond = localTime->tm_sec;
sysTime->wMilliseconds = 0;
}
#endif