blob: c8038ade48a3e6a8bd32cbfd067e6e2adf3e06be [file] [log] [blame]
/****************************************************************************
*
* The MIT License (MIT)
*
* Copyright (c) 2014 - 2020 Vivante 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.
*
*****************************************************************************
*
* The GPL License (GPL)
*
* Copyright (C) 2014 - 2020 Vivante Corporation
*
* 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 02110-1301, USA.
*
*****************************************************************************
*
* Note: This software is released under dual MIT and GPL licenses. A
* recipient may use this file under the terms of either the MIT license or
* GPL License. If you wish to use only one license not the other, you can
* indicate your decision by deleting one of the above license notices in your
* version of this file.
*
*****************************************************************************/
#ifndef __gc_hal_types_h_
#define __gc_hal_types_h_
#include "gc_hal_version.h"
#include "gc_hal_options.h"
#if !defined(VIV_KMD)
#if defined(__KERNEL__)
#include "linux/version.h"
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
typedef unsigned long uintptr_t;
# endif
# include "linux/types.h"
#elif defined(UNDER_CE)
#include <crtdefs.h>
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
#elif defined(_MSC_VER) && (_MSC_VER <= 1500)
#include <crtdefs.h>
#include "vadefs.h"
#elif defined(__QNXNTO__)
#define _QNX_SOURCE
#include <stdint.h>
#include <stddef.h>
#else
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
#endif
#endif
#ifdef _WIN32
#pragma warning(disable:4127) /* Conditional expression is constant (do { } while(0)). */
#pragma warning(disable:4100) /* Unreferenced formal parameter. */
#pragma warning(disable:4204) /* Non-constant aggregate initializer (C99). */
#pragma warning(disable:4131) /* Uses old-style declarator. */
#pragma warning(disable:4206) /* Translation unit is empty. */
#pragma warning(disable:4214) /* Nonstandard extension used :
** bit field types other than int. */
#endif
#ifdef __cplusplus
extern "C" {
#endif
/******************************************************************************\
** Platform macros.
*/
#if defined(__GNUC__)
# define gcdHAS_ELLIPSIS 1 /* GCC always has it. */
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
# define gcdHAS_ELLIPSIS 1 /* C99 has it. */
#elif defined(_MSC_VER) && (_MSC_VER >= 1500)
# define gcdHAS_ELLIPSIS 1 /* MSVC 2007+ has it. */
#elif defined(UNDER_CE)
#if UNDER_CE >= 600
# define gcdHAS_ELLIPSIS 1
# else
# define gcdHAS_ELLIPSIS 0
# endif
#else
# error "gcdHAS_ELLIPSIS: Platform could not be determined"
#endif
/******************************************************************************\
************************************ Keyword ***********************************
\******************************************************************************/
#if defined(ANDROID) && defined(__BIONIC_FORTIFY)
#if defined(__clang__)
# define gcmINLINE __inline__ __attribute__ ((always_inline)) __attribute__ ((gnu_inline))
# else
# define gcmINLINE __inline__ __attribute__ ((always_inline)) __attribute__ ((gnu_inline)) __attribute__ ((artificial))
# endif
#elif ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__APPLE__))
# define gcmINLINE inline /* C99 keyword. */
#elif defined(__GNUC__)
# define gcmINLINE __inline__ /* GNU keyword. */
#elif defined(_MSC_VER) || defined(UNDER_CE)
# define gcmINLINE __inline /* Internal keyword. */
#else
# error "gcmINLINE: Platform could not be determined"
#endif
/* Possible debug flags. */
#define gcdDEBUG_NONE 0
#define gcdDEBUG_ALL (1 << 0)
#define gcdDEBUG_FATAL (1 << 1)
#define gcdDEBUG_TRACE (1 << 2)
#define gcdDEBUG_BREAK (1 << 3)
#define gcdDEBUG_ASSERT (1 << 4)
#define gcdDEBUG_CODE (1 << 5)
#define gcdDEBUG_STACK (1 << 6)
#define gcmIS_DEBUG(flag) (gcdDEBUG & (flag | gcdDEBUG_ALL) )
#ifndef gcdDEBUG
#if (defined(DBG) && DBG) || defined(DEBUG) || defined(_DEBUG)
# define gcdDEBUG gcdDEBUG_ALL
# else
# define gcdDEBUG gcdDEBUG_NONE
# endif
#endif
#ifdef _USRDLL
#ifdef _MSC_VER
#ifdef HAL_EXPORTS
# define HALAPI __declspec(dllexport)
# else
# define HALAPI __declspec(dllimport)
# endif
# define HALDECL __cdecl
# else
#ifdef HAL_EXPORTS
# define HALAPI
# else
# define HALAPI extern
# endif
# endif
#else
# define HALAPI
# define HALDECL
#endif
/******************************************************************************\
********************************** Common Types ********************************
\******************************************************************************/
#define gcvFALSE 0
#define gcvTRUE 1
#define gcvINFINITE ((gctUINT32) ~0U)
#define gcvINVALID_HANDLE ((gctHANDLE) ~0U)
typedef int gctBOOL;
typedef gctBOOL * gctBOOL_PTR;
typedef int gctINT;
typedef signed char gctINT8;
typedef signed short gctINT16;
typedef signed int gctINT32;
typedef signed long long gctINT64;
typedef gctINT * gctINT_PTR;
typedef gctINT8 * gctINT8_PTR;
typedef gctINT16 * gctINT16_PTR;
typedef gctINT32 * gctINT32_PTR;
typedef gctINT64 * gctINT64_PTR;
typedef unsigned int gctUINT;
typedef unsigned char gctUINT8;
typedef unsigned short gctUINT16;
typedef unsigned int gctUINT32;
typedef unsigned long long gctUINT64;
typedef uintptr_t gctUINTPTR_T;
typedef ptrdiff_t gctPTRDIFF_T;
typedef gctUINT * gctUINT_PTR;
typedef gctUINT8 * gctUINT8_PTR;
typedef gctUINT16 * gctUINT16_PTR;
typedef gctUINT32 * gctUINT32_PTR;
typedef gctUINT64 * gctUINT64_PTR;
typedef size_t gctSIZE_T;
typedef gctSIZE_T * gctSIZE_T_PTR;
typedef gctUINT32 gctTRACE;
#ifdef __cplusplus
# define gcvNULL 0
#else
# define gcvNULL ((void *) 0)
#endif
#define gcvMAXINT8 0x7f
#define gcvMININT8 0x80
#define gcvMAXINT16 0x7fff
#define gcvMININT16 0x8000
#define gcvMAXINT32 0x7fffffff
#define gcvMININT32 0x80000000
#define gcvMAXINT64 0x7fffffffffffffff
#define gcvMININT64 0x8000000000000000
#define gcvMAXUINT8 0xff
#define gcvMINUINT8 0x0
#define gcvMAXUINT16 0xffff
#define gcvMINUINT16 0x0
#define gcvMAXUINT32 0xffffffff
#define gcvMINUINT32 0x0
#define gcvMAXUINT64 0xffffffffffffffff
#define gcvMINUINT64 0x0
#define gcvMAXUINTPTR_T (~(gctUINTPTR_T)0)
#define gcvMAXSIZE_T ((gctSIZE_T)(-1))
typedef float gctFLOAT;
typedef signed int gctFIXED_POINT;
typedef float * gctFLOAT_PTR;
typedef void * gctPHYS_ADDR;
typedef void * gctHANDLE;
typedef void * gctFILE;
typedef void * gctSIGNAL;
typedef void * gctWINDOW;
typedef void * gctIMAGE;
typedef void * gctSHBUF;
typedef void * gctSEMAPHORE;
typedef void * gctPOINTER;
typedef const void * gctCONST_POINTER;
typedef char gctCHAR;
typedef signed char gctSIGNED_CHAR;
typedef unsigned char gctUNSIGNED_CHAR;
typedef char * gctSTRING;
typedef const char * gctCONST_STRING;
typedef gctUINT64 gctPHYS_ADDR_T;
typedef struct _gcsCOUNT_STRING
{
gctSIZE_T Length;
gctCONST_STRING String;
}
gcsCOUNT_STRING;
typedef union _gcuFLOAT_UINT32
{
gctFLOAT f;
gctUINT32 u;
}
gcuFLOAT_UINT32;
/* Fixed point constants. */
#define gcvZERO_X ((gctFIXED_POINT) 0x00000000)
#define gcvHALF_X ((gctFIXED_POINT) 0x00008000)
#define gcvONE_X ((gctFIXED_POINT) 0x00010000)
#define gcvNEGONE_X ((gctFIXED_POINT) 0xFFFF0000)
#define gcvTWO_X ((gctFIXED_POINT) 0x00020000)
#define gcmFIXEDCLAMP_NEG1_TO_1(_x) \
(((_x) < gcvNEGONE_X) \
? gcvNEGONE_X \
: (((_x) > gcvONE_X) \
? gcvONE_X \
: (_x)))
#define gcmFLOATCLAMP_NEG1_TO_1(_f) \
(((_f) < -1.0f) \
? -1.0f \
: (((_f) > 1.0f) \
? 1.0f \
: (_f)))
#define gcmFIXEDCLAMP_0_TO_1(_x) \
(((_x) < 0) \
? 0 \
: (((_x) > gcvONE_X) \
? gcvONE_X \
: (_x)))
#define gcmFLOATCLAMP_0_TO_1(_f) \
(((_f) < 0.0f) \
? 0.0f \
: (((_f) > 1.0f) \
? 1.0f \
: (_f)))
/******************************************************************************\
******************************* Multicast Values *******************************
\******************************************************************************/
/* Value unions. */
typedef union _gcuVALUE
{
gctUINT uintValue;
gctFIXED_POINT fixedValue;
gctFLOAT floatValue;
gctINT intValue;
}
gcuVALUE;
/* Stringizing macro. */
#define gcmSTRING(Value) #Value
/******************************************************************************\
******************************* Fixed Point Math *******************************
\******************************************************************************/
#define gcmXMultiply(x1, x2) gcoMATH_MultiplyFixed(x1, x2)
#define gcmXDivide(x1, x2) gcoMATH_DivideFixed(x1, x2)
#define gcmXMultiplyDivide(x1, x2, x3) gcoMATH_MultiplyDivideFixed(x1, x2, x3)
/* 2D Engine profile. */
typedef struct _gcs2D_PROFILE
{
/* Cycle count.
32bit counter incremented every 2D clock cycle.
Wraps back to 0 when the counter overflows.
*/
gctUINT32 cycleCount;
/* Pixels rendered by the 2D engine.
Resets to 0 every time it is read. */
gctUINT32 pixelsRendered;
}
gcs2D_PROFILE;
#define gcmPRINTABLE(c) ((((c) >= ' ') && ((c) <= '}')) ? ((c) != '%' ? (c) : ' ') : ' ')
#define gcmCC_PRINT(cc) \
gcmPRINTABLE((char) ((cc) & 0xFF)), \
gcmPRINTABLE((char) (((cc) >> 8) & 0xFF)), \
gcmPRINTABLE((char) (((cc) >> 16) & 0xFF)), \
gcmPRINTABLE((char) (((cc) >> 24) & 0xFF))
/******************************************************************************\
****************************** Function Parameters *****************************
\******************************************************************************/
#define IN
#define OUT
#define INOUT
#define OPTIONAL
/******************************************************************************\
********************************* Status Macros ********************************
\******************************************************************************/
#define gcmIS_ERROR(status) (status < 0)
#define gcmNO_ERROR(status) (status >= 0)
#define gcmIS_SUCCESS(status) (status == gcvSTATUS_OK)
/******************************************************************************\
********************************* Field Macros *********************************
\******************************************************************************/
#define __gcmSTART(reg_field) \
(0 ? reg_field)
#define __gcmEND(reg_field) \
(1 ? reg_field)
#define __gcmGETSIZE(reg_field) \
(__gcmEND(reg_field) - __gcmSTART(reg_field) + 1)
#define __gcmALIGN(data, reg_field) \
(((gctUINT32) (data)) << __gcmSTART(reg_field))
#define __gcmMASK(reg_field) \
((gctUINT32) ((__gcmGETSIZE(reg_field) == 32) \
? ~0U \
: (~(~0U << __gcmGETSIZE(reg_field)))))
/*******************************************************************************
**
** gcmFIELDMASK
**
** Get aligned field mask.
**
** ARGUMENTS:
**
** reg Name of register.
** field Name of field within register.
*/
#define gcmFIELDMASK(reg, field) \
(\
__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field) \
)
/*******************************************************************************
**
** gcmGETFIELD
**
** Extract the value of a field from specified data.
**
** ARGUMENTS:
**
** data Data value.
** reg Name of register.
** field Name of field within register.
*/
#define gcmGETFIELD(data, reg, field) \
(\
((((gctUINT32) (data)) >> __gcmSTART(reg##_##field)) \
& __gcmMASK(reg##_##field)) \
)
/*******************************************************************************
**
** gcmSETFIELD
**
** Set the value of a field within specified data.
**
** ARGUMENTS:
**
** data Data value.
** reg Name of register.
** field Name of field within register.
** value Value for field.
*/
#define gcmSETFIELD(data, reg, field, value) \
(\
(((gctUINT32) (data)) \
& ~__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field)) \
| __gcmALIGN((gctUINT32) (value) \
& __gcmMASK(reg##_##field), reg##_##field) \
)
/*******************************************************************************
**
** gcmSETFIELDVALUE
**
** Set the value of a field within specified data with a
** predefined value.
**
** ARGUMENTS:
**
** data Data value.
** reg Name of register.
** field Name of field within register.
** value Name of the value within the field.
*/
#define gcmSETFIELDVALUE(data, reg, field, value) \
(\
(((gctUINT32) (data)) \
& ~__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field)) \
| __gcmALIGN(reg##_##field##_##value \
& __gcmMASK(reg##_##field), reg##_##field) \
)
/*******************************************************************************
**
** gcmGETMASKEDFIELDMASK
**
** Determine field mask of a masked field.
**
** ARGUMENTS:
**
** reg Name of register.
** field Name of field within register.
*/
#define gcmGETMASKEDFIELDMASK(reg, field) \
(\
gcmSETFIELD(0, reg, field, ~0U) | \
gcmSETFIELD(0, reg, MASK_ ## field, ~0U) \
)
/*******************************************************************************
**
** gcmSETMASKEDFIELD
**
** Set the value of a masked field with specified data.
**
** ARGUMENTS:
**
** reg Name of register.
** field Name of field within register.
** value Value for field.
*/
#define gcmSETMASKEDFIELD(reg, field, value) \
(\
gcmSETFIELD (~0U, reg, field, value) & \
gcmSETFIELDVALUE(~0U, reg, MASK_ ## field, ENABLED) \
)
/*******************************************************************************
**
** gcmSETMASKEDFIELDVALUE
**
** Set the value of a masked field with specified data.
**
** ARGUMENTS:
**
** reg Name of register.
** field Name of field within register.
** value Value for field.
*/
#define gcmSETMASKEDFIELDVALUE(reg, field, value) \
(\
gcmSETFIELDVALUE(~0U, reg, field, value) & \
gcmSETFIELDVALUE(~0U, reg, MASK_ ## field, ENABLED) \
)
/*******************************************************************************
**
** gcmVERIFYFIELDVALUE
**
** Verify if the value of a field within specified data equals a
** predefined value.
**
** ARGUMENTS:
**
** data Data value.
** reg Name of register.
** field Name of field within register.
** value Name of the value within the field.
*/
#define gcmVERIFYFIELDVALUE(data, reg, field, value) \
(\
(((gctUINT32) (data)) >> __gcmSTART(reg##_##field) & \
__gcmMASK(reg##_##field)) \
== \
(reg##_##field##_##value & __gcmMASK(reg##_##field)) \
)
/*******************************************************************************
** Bit field macros.
*/
#define __gcmSTARTBIT(Field) \
(1 ? Field )
#define __gcmBITSIZE(Field) \
(0 ? Field )
#define __gcmBITMASK(Field) \
(\
(1 << __gcmBITSIZE(Field)) - 1 \
)
#define gcmGETBITS(Value, Type, Field) \
(\
(((Type) (Value)) >> __gcmSTARTBIT(Field) ) \
& \
__gcmBITMASK(Field) \
)
#define gcmSETBITS(Value, Type, Field, NewValue) \
(\
(((Type) (Value)) \
& ~(__gcmBITMASK(Field) << __gcmSTARTBIT(Field)) \
) \
| \
((((Type) (NewValue)) \
& __gcmBITMASK(Field) \
) << __gcmSTARTBIT(Field) \
) \
)
/*******************************************************************************
**
** gcmISINREGRANGE
**
** Verify whether the specified address is in the register range.
**
** ARGUMENTS:
**
** Address Address to be verified.
** Name Name of a register.
*/
#define gcmISINREGRANGE(Address, Name) \
(\
((Address & (~0U << Name ## _LSB)) == (Name ## _Address >> 2)) \
)
/******************************************************************************\
******************************** Ceiling Macro ********************************
\******************************************************************************/
#define gcmCEIL(x) (((x) - (gctUINT32)(x)) == 0 ? (gctUINT32)(x) : (gctUINT32)(x) + 1)
/******************************************************************************\
******************************** Min/Max Macros ********************************
\******************************************************************************/
#define gcmMIN(x, y) (((x) <= (y)) ? (x) : (y))
#define gcmMAX(x, y) (((x) >= (y)) ? (x) : (y))
#define gcmCLAMP(x, min, max) (((x) < (min)) ? (min) : \
((x) > (max)) ? (max) : (x))
#define gcmABS(x) (((x) < 0) ? -(x) : (x))
#define gcmNEG(x) (((x) < 0) ? (x) : -(x))
/******************************************************************************\
******************************** Bit Macro ********************************
\******************************************************************************/
#define gcmBITSET(x, bit) ((x) | (1 << (bit)))
#define gcmBITCLEAR(x, bit) ((x) & ~(1 << (bit)))
#define gcmBITTEST(x, bit) ((x) & (1 << (bit)))
/*******************************************************************************
**
** gcmPTR2SIZE
**
** Convert a pointer to an integer value.
**
** ARGUMENTS:
**
** p Pointer value.
*/
#define gcmPTR2SIZE(p) \
(\
(gctUINTPTR_T) (p) \
)
#define gcmPTR2INT32(p) \
(\
(gctUINT32)(gctUINTPTR_T) (p) \
)
/*******************************************************************************
**
** gcmINT2PTR
**
** Convert an integer value into a pointer.
**
** ARGUMENTS:
**
** v Integer value.
*/
#define gcmINT2PTR(i) \
(\
(gctPOINTER) (gctUINTPTR_T)(i) \
)
/*******************************************************************************
**
** gcmOFFSETOF
**
** Compute the byte offset of a field inside a structure.
**
** ARGUMENTS:
**
** s Structure name.
** field Field name.
*/
#define gcmOFFSETOF(s, field) \
(\
gcmPTR2INT32(& (((struct s *) 0)->field)) \
)
#define __gcmOFFSETOF(type, field) \
(\
gcmPTR2INT32(& (((type *) 0)->field)) \
)
/*******************************************************************************
**
** gcmCONTAINEROF
**
** Get containing structure of a member.
**
** ARGUMENTS:
**
** Pointer Pointer of member.
** Type Structure name.
** Name Field name.
*/
#define gcmCONTAINEROF(Pointer, Type, Member) \
(\
(Type *)((gctUINTPTR_T)Pointer - __gcmOFFSETOF(Type, Member)) \
)
/*******************************************************************************
**
** gcmBSWAP32
**
** Return a value with all bytes in the 32 bit argument swapped.
*/
#if !defined(__KERNEL__) && defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ >= 40300) \
&& !defined(__VXWORKS__)
# define gcmBSWAP32(x) __builtin_bswap32(x)
#else
# define gcmBSWAP32(x) ((gctUINT32)(\
(((gctUINT32)(x) & (gctUINT32)0x000000FFUL) << 24) | \
(((gctUINT32)(x) & (gctUINT32)0x0000FF00UL) << 8) | \
(((gctUINT32)(x) & (gctUINT32)0x00FF0000UL) >> 8) | \
(((gctUINT32)(x) & (gctUINT32)0xFF000000UL) >> 24)))
#endif
/*******************************************************************************
***** Database ****************************************************************/
typedef struct _gcsDATABASE_COUNTERS
{
/* Number of currently allocated bytes. */
gctUINT64 bytes;
/* Maximum number of bytes allocated (memory footprint). */
gctUINT64 maxBytes;
/* Total number of bytes allocated. */
gctUINT64 totalBytes;
/* The numbers of times video memory was allocated. */
gctUINT32 allocCount;
/* The numbers of times video memory was freed. */
gctUINT32 freeCount;
}
gcsDATABASE_COUNTERS;
typedef struct _gcuDATABASE_INFO
{
/* Counters. */
gcsDATABASE_COUNTERS counters;
/* Time value. */
gctUINT64 time;
}
gcuDATABASE_INFO;
/*******************************************************************************
***** Frame database **********************************************************/
/* gcsHAL_FRAME_INFO */
typedef struct _gcsHAL_FRAME_INFO
{
/* Current timer tick. */
OUT gctUINT64 ticks;
/* Bandwidth counters. */
OUT gctUINT readBytes8[8];
OUT gctUINT writeBytes8[8];
/* Counters. */
OUT gctUINT cycles[8];
OUT gctUINT idleCycles[8];
OUT gctUINT mcCycles[8];
OUT gctUINT readRequests[8];
OUT gctUINT writeRequests[8];
/* 3D counters. */
OUT gctUINT vertexCount;
OUT gctUINT primitiveCount;
OUT gctUINT rejectedPrimitives;
OUT gctUINT culledPrimitives;
OUT gctUINT clippedPrimitives;
OUT gctUINT outPrimitives;
OUT gctUINT inPrimitives;
OUT gctUINT culledQuadCount;
OUT gctUINT totalQuadCount;
OUT gctUINT quadCount;
OUT gctUINT totalPixelCount;
/* PE counters. */
OUT gctUINT colorKilled[8];
OUT gctUINT colorDrawn[8];
OUT gctUINT depthKilled[8];
OUT gctUINT depthDrawn[8];
/* Shader counters. */
OUT gctUINT shaderCycles;
OUT gctUINT vsInstructionCount;
OUT gctUINT vsTextureCount;
OUT gctUINT psInstructionCount;
OUT gctUINT psTextureCount;
/* Texture counters. */
OUT gctUINT bilinearRequests;
OUT gctUINT trilinearRequests;
OUT gctUINT txBytes8;
OUT gctUINT txHitCount;
OUT gctUINT txMissCount;
}
gcsHAL_FRAME_INFO;
typedef struct _gckLINKDATA * gckLINKDATA;
struct _gckLINKDATA
{
gctUINT32 start;
gctUINT32 end;
gctUINT32 pid;
gctUINT32 linkLow;
gctUINT32 linkHigh;
};
typedef struct _gckADDRESSDATA * gckADDRESSDATA;
struct _gckADDRESSDATA
{
gctUINT32 start;
gctUINT32 end;
};
typedef union _gcuQUEUEDATA
{
struct _gckLINKDATA linkData;
struct _gckADDRESSDATA addressData;
}
gcuQUEUEDATA;
typedef struct _gckQUEUE * gckQUEUE;
struct _gckQUEUE
{
gcuQUEUEDATA * datas;
gctUINT32 rear;
gctUINT32 front;
gctUINT32 count;
gctUINT32 size;
};
typedef struct _gcsLISTHEAD * gcsLISTHEAD_PTR;
typedef struct _gcsLISTHEAD
{
gcsLISTHEAD_PTR prev;
gcsLISTHEAD_PTR next;
}
gcsLISTHEAD;
/*
* 'Patch' here means a mechanism to let kernel side modify user space reserved
* command buffer location, or something the like, during the command buffer
* commit.
*
* Reasons of using 'patch':
* 1. Some resources/states are managed globally only in kernel side, such as
* MCFE semaphore, etc.
* 2. For the sake of security or optimization, like video memory address.
*
* Patches are arranged in arrays, each array has the same type. The 'patchArray'
* in 'gcsHAL_PATCH_LIST' pointers the concrete patch item array.
*
* NOTICE:
* Be aware of the order and values! Tables in gc_hal_user_buffer.c and
* gc_hal_kernel_command.c depend on this.
*/
/* The patch array. */
typedef struct _gcsHAL_PATCH_LIST
{
/* Patch type. */
gctUINT32 type;
/* Patch item count. */
gctUINT32 count;
/*
* Pointer to the patch items.
*
* gcsHAL_PATCH_VIDMEM_ADDRESS * patchArray;
* gcsHAL_PATCH_MCFE_SEMAPHORE * patchArray;
* gcsHAL_PATCH_VIDMEM_TIMESTAMP * patchArray;
* ...
*/
gctUINT64 patchArray;
/* struct _gcsHAL_PATCH_LIST * next; */
gctUINT64 next;
}
gcsHAL_PATCH_LIST;
/*
* Patch a GPU address in the place (gcvHAL_PATCH_VIDMEM_ADDRESS).
* Size of a GPU address is always 32 bits.
*/
typedef struct _gcsHAL_PATCH_VIDMEM_ADDRESS
{
/* Patch location in the command buffer. */
gctUINT32 location;
/* Handle of the video memory node. */
gctUINT32 node;
/* Address offset in the video memory node. */
gctUINT32 offset;
}
gcsHAL_PATCH_VIDMEM_ADDRESS;
/*
* Patch a MCFE semaphore command in the place (gcvHAL_PATCH_MCFE_SEMAPHORE).
* Size of the semaphore command is fixed at _64_ bits!
*/
typedef struct _gcsHAL_PATCH_MCFE_SEMAPHORE
{
/* Patch location in the command buffer. */
gctUINT32 location;
/* semaphore direction: 1 = Send, 0 = Wait. */
gctUINT32 sendSema;
/* Handle of the semaphore. */
gctUINT32 semaHandle;
}
gcsHAL_PATCH_MCFE_SEMAPHORE;
/*
* Patch timestamp of given video memory node (gcvHAL_PATCH_VIDMEM_TIMESTAMP).
* Pure software-wise, not command relevant.
*/
typedef struct _gcsHAL_PATCH_VIDMEM_TIMESTAMP
{
/* Handle of a video memory node. */
gctUINT32 handle;
gctUINT32 flag;
}
gcsHAL_PATCH_VIDMEM_TIMESTAMP;
/*
gcvFEATURE_DATABASE_DATE_MASK
Mask used to control which bits of chip date will be used to
query feature database, ignore release date for fpga and emulator.
*/
#if (gcdFPGA_BUILD || defined(EMULATOR))
# define gcvFEATURE_DATABASE_DATE_MASK (0U)
#else
# define gcvFEATURE_DATABASE_DATE_MASK (~0U)
#endif
#if defined(__GNUC__)
#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
#define gcdENDIAN_BIG 1
#else
#define gcdENDIAN_BIG 0
#endif
#else
#define gcdENDIAN_BIG 0
#endif
#ifdef __cplusplus
}
#endif
#endif /* __gc_hal_types_h_ */