From 2e575255b8c53d3cfe2af068411696fe3c40debb Mon Sep 17 00:00:00 2001 From: Loren Huang Date: Mon, 2 Sep 2013 12:16:48 +0800 Subject: [PATCH 01/16] ENGR00278350 gpu:viante 4.6.9p13 kernel part integration Integrated 4.6.9p13 kernel part change. This integration is mainly for android test. Linux test will be focused on 3.10 kernel. Signed-off-by: Loren HUANG Acked-by: Shawn Guo --- drivers/mxc/gpu-viv/Kbuild | 33 +- .../GC350/hal/kernel/gc_hal_kernel_hardware_vg.c | 177 ++-- .../GC350/hal/kernel/gc_hal_kernel_hardware_vg.h | 9 +- .../arch/XAQ2/hal/kernel/gc_hal_kernel_context.c | 8 +- .../arch/XAQ2/hal/kernel/gc_hal_kernel_context.h | 13 + .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c | 736 ++++++++++++- .../arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h | 1 + drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c | 125 ++- drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h | 24 +- .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c | 57 ++ .../gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c | 45 +- drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c | 12 + .../mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c | 29 + .../hal/kernel/gc_hal_kernel_interrupt_vg.c | 3 + drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c | 8 +- .../hal/kernel/gc_hal_kernel_video_memory.c | 20 +- drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h | 84 +- drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h | 172 +++- .../mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h | 142 ++- drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h | 37 + drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h | 46 +- drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h | 125 ++- .../mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h | 86 +- .../mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h | 1078 +++----------------- drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h | 48 + drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h | 79 +- .../mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h | 2 +- .../hal/os/linux/kernel/gc_hal_kernel_device.c | 17 +- .../hal/os/linux/kernel/gc_hal_kernel_device.h | 16 +- .../hal/os/linux/kernel/gc_hal_kernel_driver.c | 99 +- .../gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c | 655 ++++++++++-- .../hal/os/linux/kernel/gc_hal_kernel_sync.c | 174 ++++ .../hal/os/linux/kernel/gc_hal_kernel_sync.h | 71 ++ 33 files changed, 2974 insertions(+), 1257 deletions(-) create mode 100644 drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c create mode 100644 drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h diff --git a/drivers/mxc/gpu-viv/Kbuild b/drivers/mxc/gpu-viv/Kbuild index 93b1259..2b277d6 100644 --- a/drivers/mxc/gpu-viv/Kbuild +++ b/drivers/mxc/gpu-viv/Kbuild @@ -45,8 +45,6 @@ OBJS := $(OS_KERNEL_DIR)/gc_hal_kernel_device.o \ $(OS_KERNEL_DIR)/gc_hal_kernel_os.o \ $(OS_KERNEL_DIR)/gc_hal_kernel_debugfs.o -ifeq ($(USE_3D_VG), 1) - OBJS += $(HAL_KERNEL_DIR)/gc_hal_kernel.o \ $(HAL_KERNEL_DIR)/gc_hal_kernel_command.o \ $(HAL_KERNEL_DIR)/gc_hal_kernel_db.o \ @@ -69,19 +67,9 @@ OBJS +=\ $(ARCH_VG_KERNEL_DIR)/gc_hal_kernel_hardware_command_vg.o\ $(ARCH_VG_KERNEL_DIR)/gc_hal_kernel_hardware_vg.o endif -else - -OBJS += $(HAL_KERNEL_DIR)/gc_hal_kernel.o \ - $(HAL_KERNEL_DIR)/gc_hal_kernel_command.o \ - $(HAL_KERNEL_DIR)/gc_hal_kernel_heap.o \ - $(HAL_KERNEL_DIR)/gc_hal_kernel_interrupt.o \ - $(HAL_KERNEL_DIR)/gc_hal_kernel_mmu.o \ - $(HAL_KERNEL_DIR)/gc_hal_kernel_video_memory.o \ - $(OS_KERNEL_DIR)/gc_hal_kernel_debug.o - -OBJS += $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware.o \ - $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware_command.o +ifneq ($(CONFIG_SYNC),) +OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_sync.o endif ifeq ($(KERNELRELEASE), ) @@ -129,23 +117,16 @@ ifeq ($(CONFIG_DOVE_GPU), 1) EXTRA_CFLAGS += -DCONFIG_DOVE_GPU=1 endif -ifeq ($(USE_POWER_MANAGEMENT), 1) -EXTRA_CFLAGS += -DgcdPOWER_MANAGEMENT=1 -else -EXTRA_CFLAGS += -DgcdPOWER_MANAGEMENT=0 -endif - ifneq ($(USE_PLATFORM_DRIVER), 0) EXTRA_CFLAGS += -DUSE_PLATFORM_DRIVER=1 else EXTRA_CFLAGS += -DUSE_PLATFORM_DRIVER=0 endif -ifeq ($(USE_PROFILER), 1) + EXTRA_CFLAGS += -DVIVANTE_PROFILER=1 -else -EXTRA_CFLAGS += -DVIVANTE_PROFILER=0 -endif +EXTRA_CFLAGS += -DVIVANTE_PROFILER_CONTEXT=1 + ifeq ($(ANDROID), 1) EXTRA_CFLAGS += -DANDROID=1 @@ -235,6 +216,10 @@ ifeq ($(USE_BANK_ALIGNMENT), 1) endif endif +ifneq ($(CONFIG_SYNC),) +EXTRA_CFLAGS += -DgcdANDROID_NATIVE_FENCE_SYNC=1 +endif + EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/inc EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel EXTRA_CFLAGS += -I$(AQARCH)/hal/kernel diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c index 70c2cd6..a17d2fd 100644 --- a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c +++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.c @@ -217,50 +217,17 @@ _IdentifyHardware( return status; } -static gctTHREADFUNCRESULT gctTHREADFUNCTYPE -_TimeIdleThread( - gctTHREADFUNCPARAMETER ThreadParameter +#if gcdPOWEROFF_TIMEOUT +void +_VGPowerTimerFunction( + gctPOINTER Data ) { - gctUINT32 currentTime = 0; - gctBOOL isAfter = gcvFALSE; - gceCHIPPOWERSTATE state; - - /* Cast the object. */ - gckVGHARDWARE hardware = (gckVGHARDWARE) ThreadParameter; - - while(gcvTRUE) - { - gcmkVERIFY_OK(gckOS_WaitSignal(hardware->os, - hardware->idleSignal, gcvINFINITE)); - - if (hardware->killThread) - { - break; - } - - do - { - gcmkVERIFY_OK(gckOS_GetTicks(¤tTime)); - - gcmkVERIFY_OK( - gckOS_TicksAfter(currentTime, hardware->powerOffTime, &isAfter)); - - if (isAfter) - { - gcmkVERIFY_OK(gckVGHARDWARE_SetPowerManagementState( - hardware, gcvPOWER_OFF_BROADCAST)); - } - - gcmkVERIFY_OK(gckOS_Delay(hardware->os, 200)); - - gcmkVERIFY_OK(gckVGHARDWARE_QueryPowerManagementState( - hardware, &state)); - - } while (state == gcvPOWER_IDLE); - } - return 0; + gckVGHARDWARE hardware = (gckVGHARDWARE)Data; + gcmkVERIFY_OK( + gckVGHARDWARE_SetPowerManagementState(hardware, gcvPOWER_OFF_TIMEOUT)); } +#endif /******************************************************************************\ ****************************** gckVGHARDWARE API code ***************************** @@ -338,15 +305,21 @@ gckVGHARDWARE_Construct( hardware->chipMinorFeatures2 = chipMinorFeatures2; hardware->powerMutex = gcvNULL; - hardware->idleSignal = gcvNULL; hardware->chipPowerState = gcvPOWER_ON; hardware->chipPowerStateGlobal = gcvPOWER_ON; hardware->clockState = gcvTRUE; hardware->powerState = gcvTRUE; - hardware->powerOffTimeout = gcdPOWEROFF_TIMEOUT; + hardware->powerOffTime = 0; - hardware->timeIdleThread = gcvNULL; - hardware->killThread = gcvFALSE; +#if gcdPOWEROFF_TIMEOUT + hardware->powerOffTimeout = gcdPOWEROFF_TIMEOUT; + + gcmkVERIFY_OK(gckOS_CreateTimer(Os, + _VGPowerTimerFunction, + (gctPOINTER)hardware, + &hardware->powerOffTimer)); +#endif + /* Determine whether FE 2.0 is present. */ hardware->fe20 = ((((gctUINT32) (hardware->chipFeatures)) >> (0 ? 28:28) & ((gctUINT32) ((((1 ? 28:28) - (0 ? 28:28) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 28:28) - (0 ? 28:28) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 28:28) - (0 ? 28:28) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 28:28) - (0 ? 28:28) + 1))))))); @@ -365,18 +338,10 @@ gckVGHARDWARE_Construct( gcmkVERIFY_OK(gckVGHARDWARE_SetFastClear(hardware, -1)); gcmkERR_BREAK(gckOS_CreateMutex(Os, &hardware->powerMutex)); - gcmkERR_BREAK(gckOS_CreateSignal(Os, gcvFALSE, &hardware->idleSignal)); /* Enable power management by default. */ hardware->powerManagement = gcvTRUE; - gcmkERR_BREAK(gckOS_StartThread( - hardware->os, - _TimeIdleThread, - hardware, - &hardware->timeIdleThread - )); - /* Return pointer to the gckVGHARDWARE object. */ *Hardware = hardware; @@ -386,6 +351,14 @@ gckVGHARDWARE_Construct( } while (gcvFALSE); +#if gcdPOWEROFF_TIMEOUT + if (hardware->powerOffTimer != gcvNULL) + { + gcmkVERIFY_OK(gckOS_StopTimer(Os, hardware->powerOffTimer)); + gcmkVERIFY_OK(gckOS_DestroyTimer(Os, hardware->powerOffTimer)); + } +#endif + if (hardware->pageTableDirty != gcvNULL) { gcmkVERIFY_OK(gckOS_AtomDestroy(Os, hardware->pageTableDirty)); @@ -428,10 +401,6 @@ gckVGHARDWARE_Destroy( /* Verify the arguments. */ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); - Hardware->killThread = gcvTRUE; - gcmkVERIFY_OK(gckOS_Signal(Hardware->os, Hardware->idleSignal, gcvTRUE)); - gcmkVERIFY_OK(gckOS_StopThread(Hardware->os, Hardware->timeIdleThread)); - /* Mark the object as unknown. */ Hardware->object.type = gcvOBJ_UNKNOWN; @@ -441,11 +410,10 @@ gckVGHARDWARE_Destroy( Hardware->os, Hardware->powerMutex)); } - if (Hardware->idleSignal != gcvNULL) - { - gcmkVERIFY_OK(gckOS_DestroySignal( - Hardware->os, Hardware->idleSignal)); - } +#if gcdPOWEROFF_TIMEOUT + gcmkVERIFY_OK(gckOS_StopTimer(Hardware->os, Hardware->powerOffTimer)); + gcmkVERIFY_OK(gckOS_DestroyTimer(Hardware->os, Hardware->powerOffTimer)); +#endif if (Hardware->pageTableDirty != gcvNULL) { @@ -1510,11 +1478,15 @@ gckVGHARDWARE_SetPowerManagementState( gctBOOL commitMutex = gcvFALSE; gctBOOL mutexAcquired = gcvFALSE; +#if gcdPOWEROFF_TIMEOUT + gctBOOL timeout = gcvFALSE; + gctBOOL isAfter = gcvFALSE; + gctUINT32 currentTime; +#endif + gctBOOL broadcast = gcvFALSE; gctUINT32 process, thread; gctBOOL global = gcvFALSE; - gctUINT32 currentTime; - #if gcdENABLE_PROFILING gctUINT64 time, freq, mutexTime, onTime, stallTime, stopTime, delayTime, @@ -1661,6 +1633,16 @@ gckVGHARDWARE_SetPowerManagementState( global = gcvTRUE; break; +#if gcdPOWEROFF_TIMEOUT + case gcvPOWER_OFF_TIMEOUT: + /* Convert to OFF and note we are inside broadcast. */ + State = gcvPOWER_OFF; + broadcast = gcvTRUE; + /* Check time out */ + timeout = gcvTRUE; + break; +#endif + default: break; } @@ -1719,6 +1701,31 @@ gckVGHARDWARE_SetPowerManagementState( flag = flags[Hardware->chipPowerState][State]; /*clock = clocks[State];*/ +#if gcdPOWEROFF_TIMEOUT + if (timeout) + { + gcmkONERROR(gckOS_GetTicks(¤tTime)); + + gcmkONERROR( + gckOS_TicksAfter(Hardware->powerOffTime, currentTime, &isAfter)); + + /* powerOffTime is pushed forward, give up.*/ + if (isAfter + /* Expect a transition start from IDLE. */ + || (Hardware->chipPowerState == gcvPOWER_ON) + || (Hardware->chipPowerState == gcvPOWER_OFF) + ) + { + /* Release the power mutex. */ + gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex)); + + /* No need to do anything. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + } + } +#endif + if (flag == 0) { /* Release the power mutex. */ @@ -1742,6 +1749,18 @@ gckVGHARDWARE_SetPowerManagementState( return gcvSTATUS_OK; } } + else + { + if (flag & gcvPOWER_FLAG_ACQUIRE) + { + /* Acquire the power management semaphore. */ + gcmkONERROR(gckOS_AcquireSemaphore(os, command->powerSemaphore)); + acquired = gcvTRUE; + + /* avoid acquiring again. */ + flag &= ~gcvPOWER_FLAG_ACQUIRE; + } + } if (flag & (gcvPOWER_FLAG_INITIALIZE | gcvPOWER_FLAG_CLOCK_ON)) { @@ -1858,14 +1877,6 @@ gckVGHARDWARE_SetPowerManagementState( Hardware->chipPowerStateGlobal = State; } - if (State == gcvPOWER_IDLE) - { - gcmkVERIFY_OK(gckOS_Signal(os, Hardware->idleSignal, gcvTRUE)); - } - /* Reset power off time */ - gcmkVERIFY_OK(gckOS_GetTicks(¤tTime)); - Hardware->powerOffTime = currentTime + Hardware->powerOffTimeout; - if (commitMutex) { /* Acquire the mutex. */ @@ -1875,6 +1886,28 @@ gckVGHARDWARE_SetPowerManagementState( )); } +#if gcdPOWEROFF_TIMEOUT + /* Reset power off time */ + gcmkONERROR(gckOS_GetTicks(¤tTime)); + + Hardware->powerOffTime = currentTime + Hardware->powerOffTimeout; + + if (State == gcvPOWER_IDLE) + { + /* Start a timer to power off GPU when GPU enters IDLE or SUSPEND. */ + gcmkVERIFY_OK(gckOS_StartTimer(os, + Hardware->powerOffTimer, + Hardware->powerOffTimeout)); + } + else + { + gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "Cancel powerOfftimer"); + + /* Cancel running timer when GPU enters ON or OFF. */ + gcmkVERIFY_OK(gckOS_StopTimer(os, Hardware->powerOffTimer)); + } +#endif + /* Release the power mutex. */ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex)); diff --git a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h index 16b81ae..73d4594 100644 --- a/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h +++ b/drivers/mxc/gpu-viv/arch/GC350/hal/kernel/gc_hal_kernel_hardware_vg.h @@ -53,7 +53,6 @@ struct _gckVGHARDWARE gctBOOL clockState; gctBOOL powerState; gctPOINTER powerMutex; - gctSIGNAL idleSignal; gctUINT32 powerProcess; gctUINT32 powerThread; gceCHIPPOWERSTATE chipPowerState; @@ -61,11 +60,13 @@ struct _gckVGHARDWARE gctISRMANAGERFUNC startIsr; gctISRMANAGERFUNC stopIsr; gctPOINTER isrContext; + gctPOINTER pageTableDirty; + +#if gcdPOWEROFF_TIMEOUT gctUINT32 powerOffTime; gctUINT32 powerOffTimeout; - gctTHREAD timeIdleThread; - gctBOOL killThread; - gctPOINTER pageTableDirty; + gctPOINTER powerOffTimer; +#endif gctBOOL powerManagement; }; diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c index 24003e7..42e6915 100644 --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.c @@ -181,7 +181,8 @@ _FlushPipe( ? ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 3:3) - (0 ? 3:3) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3))) : ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 1:1) - (0 ? 1:1) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) - | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))); + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))); /* Semaphore from FE to PE. */ *buffer++ @@ -620,7 +621,10 @@ _InitializeContextBuffer( index += _State(Context, index, 0x10180 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x10200 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x10280 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE); - index += _State(Context, index, 0x02C00 >> 2, 0x00000000, 256, gcvFALSE, gcvFALSE); + for (i = 0; i < 256 / 16; i += 1) + { + index += _State(Context, index, (0x02C00 >> 2) + i * 16, 0x00000000, 14, gcvFALSE, gcvFALSE); + } index += _State(Context, index, 0x10300 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x10380 >> 2, 0x00321000, 32, gcvFALSE, gcvFALSE); index += _State(Context, index, 0x10400 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE); diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h index 7554045..5d2c7c7 100644 --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_context.h @@ -134,6 +134,19 @@ struct _gckCONTEXT #if gcdSECURE_USER gctBOOL_PTR hint; #endif + +#if VIVANTE_PROFILER_CONTEXT + gcsPROFILER_COUNTERS latestProfiler; + gcsPROFILER_COUNTERS histroyProfiler; + gctUINT32 prevVSInstCount; + gctUINT32 prevVSBranchInstCount; + gctUINT32 prevVSTexInstCount; + gctUINT32 prevVSVertexCount; + gctUINT32 prevPSInstCount; + gctUINT32 prevPSBranchInstCount; + gctUINT32 prevPSTexInstCount; + gctUINT32 prevPSPixelCount; +#endif }; #ifdef __cplusplus diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c index 00f3839..e02dc23 100644 --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.c @@ -21,6 +21,9 @@ #include "gc_hal.h" #include "gc_hal_kernel.h" +#if VIVANTE_PROFILER_CONTEXT +#include "gc_hal_kernel_context.h" +#endif #define _GC_OBJ_ZONE gcvZONE_HARDWARE @@ -69,6 +72,7 @@ _IdentifyHardware( gctUINT32 numConstants = 0; gctUINT32 bufferSize = 0; gctUINT32 varyingsCount = 0; + gctBOOL useHZ; gcmkHEADER_ARG("Os=0x%x", Os); @@ -209,6 +213,15 @@ _IdentifyHardware( 0x00088, &Identity->chipMinorFeatures3)); + /*The BG2 chip has no compression supertiled, and the bit of GCMinorFeature3BugFixes15 is n/a*/ + if(Identity->chipModel == gcv1000 && Identity->chipRevision == 0x5036) + { + Identity->chipMinorFeatures3 + = ((((gctUINT32) (Identity->chipMinorFeatures3)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 5:5) - (0 ? 5:5) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))); + Identity->chipMinorFeatures3 + = ((((gctUINT32) (Identity->chipMinorFeatures3)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 27:27) - (0 ? 27:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:27) - (0 ? 27:27) + 1))))))) << (0 ? 27:27))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? 27:27) - (0 ? 27:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 27:27) - (0 ? 27:27) + 1))))))) << (0 ? 27:27))); + } + /* Read chip minor featuress register #4. */ gcmkONERROR( gckOS_ReadRegisterEx(Os, Core, @@ -244,14 +257,31 @@ _IdentifyHardware( if (((Identity->chipModel == gcv1000) && ((Identity->chipRevision == 0x5035) || (Identity->chipRevision == 0x5036) || (Identity->chipRevision == 0x5037))) - || ((Identity->chipModel == gcv800) && (Identity->chipRevision == 0x4612))) + || ((Identity->chipModel == gcv800) && (Identity->chipRevision == 0x4612)) + || ((Identity->chipModel == gcv860) && (Identity->chipRevision == 0x4647))) { Identity->superTileMode = 1; } + if (Identity->chipModel == gcv4000 && Identity->chipRevision == 0x5245) + { + useHZ = ((((gctUINT32) (Identity->chipMinorFeatures3)) >> (0 ? 26:26) & ((gctUINT32) ((((1 ? 26:26) - (0 ? 26:26) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 26:26) - (0 ? 26:26) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 26:26) - (0 ? 26:26) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) + || ((((gctUINT32) (Identity->chipMinorFeatures3)) >> (0 ? 8:8) & ((gctUINT32) ((((1 ? 8:8) - (0 ? 8:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:8) - (0 ? 8:8) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 8:8) - (0 ? 8:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 8:8) - (0 ? 8:8) + 1))))))); + } + else + { + useHZ = gcvFALSE; + } - /* Disable HZ when EZ is present for older chips. */ - if (!((((gctUINT32) (Identity->chipFeatures)) >> (0 ? 16:16) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))))) + if (useHZ) + { + /* Disable EZ. */ + Identity->chipFeatures + = ((((gctUINT32) (Identity->chipFeatures)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))); + } + + /* Disable HZ when EZ is present for older chips. */ + else if (!((((gctUINT32) (Identity->chipFeatures)) >> (0 ? 16:16) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))))) { /* Disable HIERARCHICAL_Z. */ Identity->chipMinorFeatures @@ -470,6 +500,15 @@ _IdentifyHardware( Identity->varyingsCount = 8; } + /* For some cores, it consumes two varying for position, so the max varying vectors should minus one. */ + if ((Identity->chipModel == gcv4000 && Identity->chipRevision == 0x5222) || + (Identity->chipModel == gcv4000 && Identity->chipRevision == 0x5208) || + ((Identity->chipModel == gcv2100 || Identity->chipModel == gcv2000) && Identity->chipRevision == 0x5108) || + (Identity->chipModel == gcv880 && (Identity->chipRevision == 0x5107 || Identity->chipRevision == 0x5106))) + { + Identity->varyingsCount -= 1; + } + /* Success. */ gcmkFOOTER(); return gcvSTATUS_OK; @@ -535,9 +574,9 @@ _DumpDebugRegisters( IN gcsiDEBUG_REGISTERS_PTR Descriptor ) { - gceSTATUS status; + gceSTATUS status = gcvSTATUS_OK; gctUINT32 select; - gctUINT32 data; + gctUINT32 data = 0; gctUINT i; gcmkHEADER_ARG("Os=0x%X Descriptor=0x%X", Os, Descriptor); @@ -643,6 +682,42 @@ OnError: return status; } +gceSTATUS +_FlushCache( + gckHARDWARE Hardware, + gckCOMMAND Command + ) +{ + gceSTATUS status; + gctSIZE_T bytes, requested; + gctPOINTER buffer; + + /* Get the size of the flush command. */ + gcmkONERROR(gckHARDWARE_Flush(Hardware, + gcvFLUSH_ALL, + gcvNULL, + &requested)); + + /* Reserve space in the command queue. */ + gcmkONERROR(gckCOMMAND_Reserve(Command, + requested, + &buffer, + &bytes)); + + /* Append a flush. */ + gcmkONERROR(gckHARDWARE_Flush( + Hardware, gcvFLUSH_ALL, buffer, &bytes + )); + + /* Execute the command queue. */ + gcmkONERROR(gckCOMMAND_Execute(Command, requested)); + + return gcvSTATUS_OK; + +OnError: + return status; +} + /******************************************************************************\ ****************************** gckHARDWARE API code ***************************** \******************************************************************************/ @@ -809,6 +884,9 @@ gckHARDWARE_Construct( /* Enable power management by default. */ hardware->powerManagement = gcvTRUE; + /* Disable profiler by default */ + hardware->gpuProfiler = gcvFALSE; + /* Return pointer to the gckHARDWARE object. */ *Hardware = hardware; @@ -1113,6 +1191,31 @@ gckHARDWARE_InitializeHardware( ((((gctUINT32) (0x01590880)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:23) - (0 ? 23:23) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:23) - (0 ? 23:23) + 1))))))) << (0 ? 23:23))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 23:23) - (0 ? 23:23) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:23) - (0 ? 23:23) + 1))))))) << (0 ? 23:23))))); } + if ((gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI2) == gcvFALSE) + || (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI2) && (Hardware->identity.chipRevision < 0x5422)) + ) + { + gctUINT32 data; + + gcmkONERROR( + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + Hardware->powerBaseAddress + + 0x00104, + &data)); + + + data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:15) - (0 ? 15:15) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:15) - (0 ? 15:15) + 1))))))) << (0 ? 15:15))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:15) - (0 ? 15:15) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:15) - (0 ? 15:15) + 1))))))) << (0 ? 15:15))); + + + gcmkONERROR( + gckOS_WriteRegisterEx(Hardware->os, + Hardware->core, + Hardware->powerBaseAddress + + 0x00104, + data)); + } + /* Special workaround for this core ** Make sure FE and TX are on different buses */ if ((Hardware->identity.chipModel == gcv2000) @@ -1152,7 +1255,9 @@ gckHARDWARE_InitializeHardware( } if (Hardware->identity.chipModel >= gcv400 - && Hardware->identity.chipModel != gcv420) + && Hardware->identity.chipModel != gcv420 + && (((((gctUINT32) (Hardware->identity.chipMinorFeatures3)) >> (0 ? 15:15) & ((gctUINT32) ((((1 ? 15:15) - (0 ? 15:15) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:15) - (0 ? 15:15) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 15:15) - (0 ? 15:15) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:15) - (0 ? 15:15) + 1))))))) != gcvTRUE) + ) { gctUINT32 data; @@ -2883,35 +2988,44 @@ gckHARDWARE_QueryShaderCaps( OUT gctUINT * Varyings ) { + gctUINT32 vsConstMax; + gctUINT32 psConstMax; + gcmkHEADER_ARG("Hardware=0x%x VertexUniforms=0x%x " "FragmentUniforms=0x%x Varyings=0x%x", Hardware, VertexUniforms, FragmentUniforms, Varyings); + if ((Hardware->identity.chipModel == gcv2000) + && (Hardware->identity.chipRevision == 0x5118)) + { + vsConstMax = 256; + psConstMax = 64; + } + else if (Hardware->identity.numConstants > 256) + { + vsConstMax = 256; + psConstMax = 256; + } + else if (Hardware->identity.numConstants == 256) + { + vsConstMax = 256; + psConstMax = 256; + } + else + { + vsConstMax = 168; + psConstMax = 64; + } + if (VertexUniforms != gcvNULL) { - /* Return the vs shader const count. */ - if (Hardware->identity.chipModel < gcv4000) - { - *VertexUniforms = 168; - } - else - { - *VertexUniforms = 256; - } + *VertexUniforms = vsConstMax; } if (FragmentUniforms != gcvNULL) { - /* Return the ps shader const count. */ - if (Hardware->identity.chipModel < gcv4000) - { - *FragmentUniforms = 64; - } - else - { - *FragmentUniforms = 256; - } + *FragmentUniforms = psConstMax; } if (Varyings != gcvNULL) @@ -3229,12 +3343,28 @@ gckHARDWARE_SetMMUv2( gctBOOL commitEntered = gcvFALSE; gctPOINTER pointer = gcvNULL; gctBOOL acquired = gcvFALSE; + gctBOOL config2D; + gctSIZE_T configSize; gcmkHEADER_ARG("Hardware=0x%x Enable=%d", Hardware, Enable); /* Verify the arguments. */ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); + config2D = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_PIPE_3D) + && gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_PIPE_2D); + + configSize = 4 * 4; + + if (config2D) + { + configSize += + /* Pipe Select. */ + 4 * 4 + /* Configure MMU States. */ + + 4 * 4; + } + /* Convert logical address into physical address. */ gcmkONERROR( gckOS_GetPhysicalAddress(Hardware->os, MtlbAddress, &config)); @@ -3281,7 +3411,7 @@ gckHARDWARE_SetMMUv2( commitEntered = gcvTRUE; gcmkONERROR(gckCOMMAND_Reserve( - command, 16, &pointer, &bufferSize + command, configSize, &pointer, &bufferSize )); buffer = pointer; @@ -3300,10 +3430,43 @@ gckHARDWARE_SetMMUv2( buffer[3] = address; + if (config2D) + { + /* LoadState(AQPipeSelect, 1), pipe. */ + buffer[4] + = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E00) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))); + + buffer[5] = 0x1; + + buffer[6] + = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))); + + buffer[7] = config; + + buffer[8] + = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32) ((gctUINT32) (0x0060) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))); + + buffer[9] = address; + + /* LoadState(AQPipeSelect, 1), pipe. */ + buffer[10] + = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E00) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))); + + buffer[11] = 0x0; + } + gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "Setup MMU: config=%08x, Safe Address=%08x\n.", config, address); - gcmkONERROR(gckCOMMAND_Execute(command, 16)); + gcmkONERROR(gckCOMMAND_Execute(command, configSize)); if (FromPower == gcvFALSE) { @@ -3501,6 +3664,8 @@ gckHARDWARE_Flush( gctUINT32 flush = 0; gctUINT32_PTR logical = (gctUINT32_PTR) Logical; gceSTATUS status; + gctBOOL fcFlushStall; + gctUINT32 reserveBytes = 8; gcmkHEADER_ARG("Hardware=0x%x Flush=0x%x Logical=0x%x *Bytes=%lu", Hardware, Flush, Logical, gcmOPT_VALUE(Bytes)); @@ -3511,6 +3676,16 @@ gckHARDWARE_Flush( /* Get current pipe. */ pipe = Hardware->kernel->command->pipeSelect; + fcFlushStall + = ((((gctUINT32) (Hardware->identity.chipMinorFeatures1)) >> (0 ? 31:31) & ((gctUINT32) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) + && (Flush == gcvFLUSH_ALL) + ; + + if (fcFlushStall) + { + reserveBytes += 8; + } + /* Flush 3D color cache. */ if ((Flush & gcvFLUSH_COLOR) && (pipe == 0x0)) { @@ -3527,6 +3702,7 @@ gckHARDWARE_Flush( if ((Flush & gcvFLUSH_TEXTURE) && (pipe == 0x0)) { flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))); + flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 4:4) - (0 ? 4:4) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))); } /* Flush 2D cache. */ @@ -3550,7 +3726,7 @@ gckHARDWARE_Flush( /* Copy to command queue. */ if (Logical != gcvNULL) { - if (*Bytes < 8) + if (*Bytes < reserveBytes) { /* Command queue too small. */ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL); @@ -3565,12 +3741,26 @@ gckHARDWARE_Flush( gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: FLUSH 0x%x", logical, flush); + + if (fcFlushStall) + { + logical[2] = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) | (((gctUINT32) ((gctUINT32) (0x0594) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) + | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))); + + logical[3] = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))); + + + gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, + "0x%x: FLUSH 0x%x", logical + 3, logical[3]); + } + } if (Bytes != gcvNULL) { - /* 8 bytes required. */ - *Bytes = 8; + /* bytes required. */ + *Bytes = reserveBytes; } } @@ -4285,6 +4475,48 @@ gckHARDWARE_SetPowerManagementState( } } + /* Flush Cache before Power Off. */ + if (flag & gcvPOWER_FLAG_POWER_OFF) + { + if (Hardware->clockState == gcvFALSE) + { + /* Turn off the GPU power. */ + gcmkONERROR( + gckOS_SetGPUPower(os, + Hardware->core, + gcvTRUE, + gcvTRUE)); + + Hardware->clockState = gcvTRUE; + + if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_DYNAMIC_FREQUENCY_SCALING) != gcvTRUE) + { + /* Write the clock control register. */ + gcmkONERROR(gckOS_WriteRegisterEx(os, + Hardware->core, + 0x00000, + clocks[0])); + + /* Done loading the frequency scaler. */ + gcmkONERROR(gckOS_WriteRegisterEx(os, + Hardware->core, + 0x00000, + ((((gctUINT32) (clocks[0])) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))))); + } + } + + gcmkONERROR(gckCOMMAND_Start(command)); + + gcmkONERROR(_FlushCache(Hardware, command)); + + gckOS_Delay(gcvNULL, 1); + + /* Stop the command parser. */ + gcmkONERROR(gckCOMMAND_Stop(command, gcvFALSE)); + + flag |= gcvPOWER_FLAG_CLOCK_OFF; + } + /* Get time until stopped. */ gcmkPROFILE_QUERY(time, stopTime); @@ -4582,6 +4814,40 @@ gckHARDWARE_SetPowerManagement( return gcvSTATUS_OK; } +/******************************************************************************* +** +** gckHARDWARE_SetGpuProfiler +** +** Configure GPU profiler function. +** Only used in driver initialization stage. +** +** INPUT: +** +** gckHARDWARE Harwdare +** Pointer to an gckHARDWARE object. +** +** gctBOOL GpuProfiler +** GOU Profiler State. +** +*/ +gceSTATUS +gckHARDWARE_SetGpuProfiler( + IN gckHARDWARE Hardware, + IN gctBOOL GpuProfiler + ) +{ + gcmkHEADER_ARG("Hardware=0x%x", Hardware); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); + + Hardware->gpuProfiler = GpuProfiler; + + /* Success. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; +} + #if gcdENABLE_FSCALE_VAL_ADJUST gceSTATUS gckHARDWARE_SetFscaleValue( @@ -5141,6 +5407,402 @@ OnError: } #endif +#if VIVANTE_PROFILER_CONTEXT +#define gcmkUPDATE_PROFILE_DATA(data) \ + profilerHistroy->data += profiler->data + +gceSTATUS +gckHARDWARE_QueryContextProfile( + IN gckHARDWARE Hardware, + IN gctBOOL Reset, + IN gckCONTEXT Context, + OUT gcsPROFILER_COUNTERS * Counters + ) +{ + gceSTATUS status; + gckCOMMAND command = Hardware->kernel->command; + gcsPROFILER_COUNTERS * profiler = Counters; + + gcmkHEADER_ARG("Hardware=0x%x Counters=0x%x", Hardware, Counters); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); + + /* Acquire the context sequnence mutex. */ + gcmkONERROR(gckOS_AcquireMutex( + command->os, command->mutexContextSeq, gcvINFINITE + )); + + /* Read the counters. */ + gcmkVERIFY_OK(gckOS_MemCopy( + profiler, &Context->histroyProfiler, gcmSIZEOF(gcsPROFILER_COUNTERS) + )); + + if (Reset) + { + /* Reset counters. */ + gcmkVERIFY_OK(gckOS_ZeroMemory( + &Context->histroyProfiler, gcmSIZEOF(gcsPROFILER_COUNTERS) + )); + } + + gcmkVERIFY_OK(gckOS_ReleaseMutex( + command->os, command->mutexContextSeq + )); + + /* Success. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + +OnError: + /* Return the status. */ + gcmkFOOTER(); + return status; +} + + +gceSTATUS +gckHARDWARE_UpdateContextProfile( + IN gckHARDWARE Hardware, + IN gckCONTEXT Context + ) +{ + gceSTATUS status; + gcsPROFILER_COUNTERS * profiler = &Context->latestProfiler; + gcsPROFILER_COUNTERS * profilerHistroy = &Context->histroyProfiler; + gctUINT i, clock; + gctUINT32 colorKilled, colorDrawn, depthKilled, depthDrawn; + gctUINT32 totalRead, totalWrite; + gceCHIPMODEL chipModel; + gctUINT32 chipRevision; + gctUINT32 temp; + gctBOOL needResetShader = gcvFALSE; + + gcmkHEADER_ARG("Hardware=0x%x Context=0x%x", Hardware, Context); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE); + gcmkVERIFY_OBJECT(Context, gcvOBJ_CONTEXT); + + chipModel = Hardware->identity.chipModel; + chipRevision = Hardware->identity.chipRevision; + if (chipModel == gcv2000 || (chipModel == gcv2100 && chipRevision == 0x5118)) + { + needResetShader = gcvTRUE; + } + + /* Read the counters. */ + gcmkONERROR( + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00438, + &profiler->gpuCyclesCounter)); + gcmkUPDATE_PROFILE_DATA(gpuCyclesCounter); + + gcmkONERROR( + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00078, + &profiler->gpuTotalCyclesCounter)); + gcmkUPDATE_PROFILE_DATA(gpuTotalCyclesCounter); + + gcmkONERROR( + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x0007C, + &profiler->gpuIdleCyclesCounter)); + gcmkUPDATE_PROFILE_DATA(gpuIdleCyclesCounter); + + /* Read clock control register. */ + gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00000, + &clock)); + + profiler->gpuTotalRead64BytesPerFrame = 0; + profiler->gpuTotalWrite64BytesPerFrame = 0; + profiler->pe_pixel_count_killed_by_color_pipe = 0; + profiler->pe_pixel_count_killed_by_depth_pipe = 0; + profiler->pe_pixel_count_drawn_by_color_pipe = 0; + profiler->pe_pixel_count_drawn_by_depth_pipe = 0; + + /* Walk through all avaiable pixel pipes. */ + for (i = 0; i < Hardware->identity.pixelPipes; ++i) + { + /* Select proper pipe. */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, + Hardware->core, + 0x00000, + ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:20) - (0 ? 23:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:20) - (0 ? 23:20) + 1))))))) << (0 ? 23:20))) | (((gctUINT32) ((gctUINT32) (i) & ((gctUINT32) ((((1 ? 23:20) - (0 ? 23:20) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:20) - (0 ? 23:20) + 1))))))) << (0 ? 23:20))))); + + /* BW */ + gcmkONERROR( + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00040, + &totalRead)); + gcmkONERROR( + gckOS_ReadRegisterEx(Hardware->os, + Hardware->core, + 0x00044, + &totalWrite)); + + profiler->gpuTotalRead64BytesPerFrame += totalRead; + profiler->gpuTotalWrite64BytesPerFrame += totalWrite; + gcmkUPDATE_PROFILE_DATA(gpuTotalRead64BytesPerFrame); + gcmkUPDATE_PROFILE_DATA(gpuTotalWrite64BytesPerFrame); + + /* PE */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &colorKilled)); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &depthKilled)); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &colorDrawn)); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))));gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00454, &depthDrawn)); + + profiler->pe_pixel_count_killed_by_color_pipe += colorKilled; + profiler->pe_pixel_count_killed_by_depth_pipe += depthKilled; + profiler->pe_pixel_count_drawn_by_color_pipe += colorDrawn; + profiler->pe_pixel_count_drawn_by_depth_pipe += depthDrawn; + gcmkUPDATE_PROFILE_DATA(pe_pixel_count_killed_by_color_pipe); + gcmkUPDATE_PROFILE_DATA(pe_pixel_count_killed_by_depth_pipe); + gcmkUPDATE_PROFILE_DATA(pe_pixel_count_drawn_by_color_pipe); + gcmkUPDATE_PROFILE_DATA(pe_pixel_count_drawn_by_depth_pipe); + } + + /* Reset clock control register. */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, + Hardware->core, + 0x00000, + clock)); + + + + + /* Reset counters. */ + gcmkONERROR( + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 1)); + gcmkONERROR( + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x0003C, 0)); + gcmkONERROR( + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0)); + gcmkONERROR( + gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00078, 0)); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) +)); + + /* SH */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->ps_inst_counter)); + if (needResetShader) + { + temp = profiler->ps_inst_counter; + profiler->ps_inst_counter -= Context->prevPSInstCount; + Context->prevPSInstCount = temp; + } + gcmkUPDATE_PROFILE_DATA(ps_inst_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->rendered_pixel_counter)); + if (needResetShader) + { + temp = profiler->rendered_pixel_counter; + profiler->rendered_pixel_counter -= Context->prevPSPixelCount; + Context->prevPSPixelCount = temp; + } + gcmkUPDATE_PROFILE_DATA(rendered_pixel_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vs_inst_counter)); + if (needResetShader) + { + temp = profiler->vs_inst_counter; + profiler->vs_inst_counter -= Context->prevVSInstCount; + Context->prevVSInstCount = temp; + } + gcmkUPDATE_PROFILE_DATA(vs_inst_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->rendered_vertice_counter)); + if (needResetShader) + { + temp = profiler->rendered_vertice_counter; + profiler->rendered_vertice_counter -= Context->prevVSVertexCount; + Context->prevVSVertexCount = temp; + } + gcmkUPDATE_PROFILE_DATA(rendered_vertice_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (11) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vtx_branch_inst_counter)); + if (needResetShader) + { + temp = profiler->vtx_branch_inst_counter; + profiler->vtx_branch_inst_counter -= Context->prevVSBranchInstCount; + Context->prevVSBranchInstCount = temp; + } + gcmkUPDATE_PROFILE_DATA(vtx_branch_inst_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (12) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->vtx_texld_inst_counter)); + if (needResetShader) + { + temp = profiler->vtx_texld_inst_counter; + profiler->vtx_texld_inst_counter -= Context->prevVSTexInstCount; + Context->prevVSTexInstCount = temp; + } + gcmkUPDATE_PROFILE_DATA(vtx_texld_inst_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (13) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->pxl_branch_inst_counter)); + if (needResetShader) + { + temp = profiler->pxl_branch_inst_counter; + profiler->pxl_branch_inst_counter -= Context->prevPSBranchInstCount; + Context->prevPSBranchInstCount = temp; + } + gcmkUPDATE_PROFILE_DATA(pxl_branch_inst_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (14) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &profiler->pxl_texld_inst_counter)); + if (needResetShader) + { + temp = profiler->pxl_texld_inst_counter; + profiler->pxl_texld_inst_counter -= Context->prevPSTexInstCount; + Context->prevPSTexInstCount = temp; + } + gcmkUPDATE_PROFILE_DATA(pxl_texld_inst_counter); + + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) +)); + + /* PA */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_input_vtx_counter)); + gcmkUPDATE_PROFILE_DATA(pa_input_vtx_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_input_prim_counter)); + gcmkUPDATE_PROFILE_DATA(pa_input_prim_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_output_prim_counter)); + gcmkUPDATE_PROFILE_DATA(pa_output_prim_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_depth_clipped_counter)); + gcmkUPDATE_PROFILE_DATA(pa_depth_clipped_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_trivial_rejected_counter)); + gcmkUPDATE_PROFILE_DATA(pa_trivial_rejected_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00460, &profiler->pa_culled_counter)); + gcmkUPDATE_PROFILE_DATA(pa_culled_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) +)); + + /* SE */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_culled_triangle_count)); + gcmkUPDATE_PROFILE_DATA(se_culled_triangle_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00464, &profiler->se_culled_lines_count)); + gcmkUPDATE_PROFILE_DATA(se_culled_lines_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) +)); + + /* RA */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_valid_pixel_count)); + gcmkUPDATE_PROFILE_DATA(ra_valid_pixel_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_total_quad_count)); + gcmkUPDATE_PROFILE_DATA(ra_total_quad_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_valid_quad_count_after_early_z)); + gcmkUPDATE_PROFILE_DATA(ra_valid_quad_count_after_early_z); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_total_primitive_count)); + gcmkUPDATE_PROFILE_DATA(ra_total_primitive_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_pipe_cache_miss_counter)); + gcmkUPDATE_PROFILE_DATA(ra_pipe_cache_miss_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (10) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00448, &profiler->ra_prefetch_cache_miss_counter)); + gcmkUPDATE_PROFILE_DATA(ra_prefetch_cache_miss_counter); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 23:16) - (0 ? 23:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16))) +)); + + /* TX */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_bilinear_requests)); + gcmkUPDATE_PROFILE_DATA(tx_total_bilinear_requests); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_trilinear_requests)); + gcmkUPDATE_PROFILE_DATA(tx_total_trilinear_requests); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_discarded_texture_requests)); + gcmkUPDATE_PROFILE_DATA(tx_total_discarded_texture_requests); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_total_texture_requests)); + gcmkUPDATE_PROFILE_DATA(tx_total_texture_requests); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_mem_read_count)); + gcmkUPDATE_PROFILE_DATA(tx_mem_read_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_mem_read_in_8B_count)); + gcmkUPDATE_PROFILE_DATA(tx_mem_read_in_8B_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (7) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_miss_count)); + gcmkUPDATE_PROFILE_DATA(tx_cache_miss_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (8) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_hit_texel_count)); + gcmkUPDATE_PROFILE_DATA(tx_cache_hit_texel_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (9) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0044C, &profiler->tx_cache_miss_texel_count)); + gcmkUPDATE_PROFILE_DATA(tx_cache_miss_texel_count); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00474, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 31:24) - (0 ? 31:24) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24))) +)); + + /* MC */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_read_req_8B_from_pipeline)); + gcmkUPDATE_PROFILE_DATA(mc_total_read_req_8B_from_pipeline); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_read_req_8B_from_IP)); + gcmkUPDATE_PROFILE_DATA(mc_total_read_req_8B_from_IP); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (3) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00468, &profiler->mc_total_write_req_8B_from_pipeline)); + gcmkUPDATE_PROFILE_DATA(mc_total_write_req_8B_from_pipeline); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 7:0) - (0 ? 7:0) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))) +)); + + /* HI */ + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_read_request_stalled)); + gcmkUPDATE_PROFILE_DATA(hi_axi_cycles_read_request_stalled); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_write_request_stalled)); + gcmkUPDATE_PROFILE_DATA(hi_axi_cycles_write_request_stalled); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (2) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0046C, &profiler->hi_axi_cycles_write_data_stalled)); + gcmkUPDATE_PROFILE_DATA(hi_axi_cycles_write_data_stalled); + gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (15) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) )); +gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8))) +)); + + /* Success. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + +OnError: + /* Return the status. */ + gcmkFOOTER(); + return status; +} +#endif + static gceSTATUS _ResetGPU( IN gckHARDWARE Hardware, @@ -5602,6 +6264,22 @@ gckHARDWARE_IsFeatureAvailable( && ((((gctUINT32) (Hardware->identity.chipFeatures)) >> (0 ? 2:2) & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))); break; + case gcvFEATURE_PIPE_2D: + available = ((((gctUINT32) (Hardware->identity.chipFeatures)) >> (0 ? 9:9) & ((gctUINT32) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 9:9) - (0 ? 9:9) + 1))))))); + break; + + case gcvFEATURE_PIPE_3D: +#ifndef VIVANTE_NO_3D + available = ((((gctUINT32) (Hardware->identity.chipFeatures)) >> (0 ? 2:2) & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 2:2) - (0 ? 2:2) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 2:2) - (0 ? 2:2) + 1))))))); +#else + available = gcvFALSE; +#endif + break; + + case gcvFEATURE_HALTI2: + available = ((((gctUINT32) (Hardware->identity.chipMinorFeatures4)) >> (0 ? 16:16) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0 : (~(~0 << ((1 ? 16:16) - (0 ? 16:16) + 1))))))); + break; + default: gcmkFATAL("Invalid feature has been requested."); available = gcvFALSE; diff --git a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h index 37226b7..287ea60 100644 --- a/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h +++ b/drivers/mxc/gpu-viv/arch/XAQ2/hal/kernel/gc_hal_kernel_hardware.h @@ -92,6 +92,7 @@ struct _gckHARDWARE #endif gctBOOL powerManagement; + gctBOOL gpuProfiler; }; gceSTATUS diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c index b7b0d28..12a5340 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c @@ -128,19 +128,6 @@ _ResetFinishFunction( ** Pointer to a variable that will hold the pointer to the gckKERNEL ** object. */ -#ifdef ANDROID -#if gcdNEW_PROFILER_FILE -#define DEFAULT_PROFILE_FILE_NAME "/sdcard/vprofiler.vpd" -#else -#define DEFAULT_PROFILE_FILE_NAME "/sdcard/vprofiler.xml" -#endif -#else -#if gcdNEW_PROFILER_FILE -#define DEFAULT_PROFILE_FILE_NAME "vprofiler.vpd" -#else -#define DEFAULT_PROFILE_FILE_NAME "vprofiler.xml" -#endif -#endif gceSTATUS gckKERNEL_Construct( @@ -302,17 +289,12 @@ gckKERNEL_Construct( #if VIVANTE_PROFILER /* Initialize profile setting */ -#if defined ANDROID kernel->profileEnable = gcvFALSE; -#else - kernel->profileEnable = gcvTRUE; -#endif kernel->profileCleanRegister = gcvTRUE; +#endif - gcmkVERIFY_OK( - gckOS_MemCopy(kernel->profileFileName, - DEFAULT_PROFILE_FILE_NAME, - gcmSIZEOF(DEFAULT_PROFILE_FILE_NAME) + 1)); +#if gcdANDROID_NATIVE_FENCE_SYNC + gcmkONERROR(gckOS_CreateSyncTimeline(Os, &kernel->timeline)); #endif /* Return pointer to the gckKERNEL object. */ @@ -395,6 +377,13 @@ OnError: } #endif +#if gcdANDROID_NATIVE_FENCE_SYNC + if (kernel->timeline) + { + gcmkVERIFY_OK(gckOS_DestroySyncTimeline(Os, kernel->timeline)); + } +#endif + gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os, kernel)); } @@ -525,6 +514,10 @@ gckKERNEL_Destroy( } #endif +#if gcdANDROID_NATIVE_FENCE_SYNC + gcmkVERIFY_OK(gckOS_DestroySyncTimeline(Kernel->os, Kernel->timeline)); +#endif + /* Mark the gckKERNEL object as unknown. */ Kernel->object.type = gcvOBJ_UNKNOWN; @@ -1310,7 +1303,8 @@ gckKERNEL_Dispatch( /* Commit a command and context buffer. */ gcmkONERROR( gckCOMMAND_Commit(Kernel->command, - gcmNAME_TO_PTR(Interface->u.Commit.context), + Interface->u.Commit.context ? + gcmNAME_TO_PTR(Interface->u.Commit.context) : gcvNULL, gcmUINT64_TO_PTR(Interface->u.Commit.commandBuffer), gcmUINT64_TO_PTR(Interface->u.Commit.delta), gcmUINT64_TO_PTR(Interface->u.Commit.queue), @@ -1600,7 +1594,15 @@ gckKERNEL_Dispatch( break; case gcvHAL_READ_ALL_PROFILE_REGISTERS: -#if VIVANTE_PROFILER +#if VIVANTE_PROFILER && VIVANTE_PROFILER_CONTEXT + /* Read profile data according to the context. */ + gcmkONERROR( + gckHARDWARE_QueryContextProfile( + Kernel->hardware, + Kernel->profileCleanRegister, + gcmNAME_TO_PTR(Interface->u.RegisterProfileData.context), + &Interface->u.RegisterProfileData.counters)); +#elif VIVANTE_PROFILER /* Read all 3D profile registers. */ gcmkONERROR( gckHARDWARE_QueryProfileRegisters( @@ -1628,11 +1630,6 @@ gckKERNEL_Dispatch( #if VIVANTE_PROFILER /* Get profile setting */ Interface->u.GetProfileSetting.enable = Kernel->profileEnable; - - gcmkVERIFY_OK( - gckOS_MemCopy(Interface->u.GetProfileSetting.fileName, - Kernel->profileFileName, - gcdMAX_PROFILE_FILE_NAME)); #endif status = gcvSTATUS_OK; @@ -1640,12 +1637,13 @@ gckKERNEL_Dispatch( case gcvHAL_SET_PROFILE_SETTING: #if VIVANTE_PROFILER /* Set profile setting */ - Kernel->profileEnable = Interface->u.SetProfileSetting.enable; - - gcmkVERIFY_OK( - gckOS_MemCopy(Kernel->profileFileName, - Interface->u.SetProfileSetting.fileName, - gcdMAX_PROFILE_FILE_NAME)); + if(Kernel->hardware->gpuProfiler) + Kernel->profileEnable = Interface->u.SetProfileSetting.enable; + else + { + status = gcvSTATUS_NOT_SUPPORTED; + break; + } #endif status = gcvSTATUS_OK; @@ -2093,6 +2091,61 @@ gckKERNEL_Dispatch( #endif break; +#if gcdANDROID_NATIVE_FENCE_SYNC + case gcvHAL_SYNC_POINT: + { + gctSYNC_POINT syncPoint; + + switch (Interface->u.SyncPoint.command) + { + case gcvSYNC_POINT_CREATE: + gcmkONERROR(gckOS_CreateSyncPoint(Kernel->os, &syncPoint)); + + Interface->u.SyncPoint.syncPoint = gcmPTR_TO_UINT64(syncPoint); + + gcmkVERIFY_OK( + gckKERNEL_AddProcessDB(Kernel, + processID, gcvDB_SYNC_POINT, + syncPoint, + gcvNULL, + 0)); + break; + + case gcvSYNC_POINT_DESTROY: + syncPoint = gcmUINT64_TO_PTR(Interface->u.SyncPoint.syncPoint); + + gcmkONERROR(gckOS_DestroySyncPoint(Kernel->os, syncPoint)); + + gcmkVERIFY_OK( + gckKERNEL_RemoveProcessDB(Kernel, + processID, gcvDB_SYNC_POINT, + syncPoint)); + break; + + default: + gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); + break; + } + } + break; + + case gcvHAL_CREATE_NATIVE_FENCE: + { + gctINT fenceFD; + gctSYNC_POINT syncPoint = + gcmUINT64_TO_PTR(Interface->u.CreateNativeFence.syncPoint); + + gcmkONERROR( + gckOS_CreateNativeFence(Kernel->os, + Kernel->timeline, + syncPoint, + &fenceFD)); + + Interface->u.CreateNativeFence.fenceFD = fenceFD; + } + break; +#endif + default: /* Invalid command. */ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT); @@ -2856,6 +2909,8 @@ gckKERNEL_Recovery( return gcvSTATUS_OK; } + gcmkPRINT("[galcore]: GPU[%d] hang, automatic recovery.", Kernel->core); + /* Start a timer to clear reset flag, before timer is expired, ** other recovery request is ignored. */ gcmkVERIFY_OK( @@ -3382,7 +3437,7 @@ gckLINKQUEUE_Dequeue( IN gckLINKQUEUE LinkQueue ) { - gcmASSERT(LinkQueue->count == gcdLINK_QUEUE_SIZE); + gcmkASSERT(LinkQueue->count == gcdLINK_QUEUE_SIZE); LinkQueue->count--; LinkQueue->front = (LinkQueue->front + 1) % gcdLINK_QUEUE_SIZE; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h index 5896e93..1c40df2 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h @@ -140,8 +140,9 @@ typedef enum _gceDATABASE_TYPE gcvDB_CONTEXT, /* Context */ gcvDB_IDLE, /* GPU idle. */ gcvDB_MAP_MEMORY, /* Map memory */ - gcvDB_SHARED_INFO, /* Private data */ - gcvDB_MAP_USER_MEMORY /* Map user memory */ + gcvDB_SHARED_INFO, /* Private data */ + gcvDB_MAP_USER_MEMORY, /* Map user memory */ + gcvDB_SYNC_POINT, /* Sync point. */ } gceDATABASE_TYPE; @@ -406,9 +407,6 @@ struct _gckKERNEL /* Enable profiling */ gctBOOL profileEnable; - /* The profile file name */ - gctCHAR profileFileName[gcdMAX_PROFILE_FILE_NAME]; - /* Clear profile register or not*/ gctBOOL profileCleanRegister; @@ -445,6 +443,10 @@ struct _gckKERNEL #if gcdDVFS gckDVFS dvfs; #endif + +#if gcdANDROID_NATIVE_FENCE_SYNC + gctHANDLE timeline; +#endif }; struct _FrequencyHistory @@ -496,6 +498,11 @@ struct _gckCOMMAND /* Context switching mutex. */ gctPOINTER mutexContext; +#if VIVANTE_PROFILER_CONTEXT + /* Context sequence mutex. */ + gctPOINTER mutexContextSeq; +#endif + /* Command queue power semaphore. */ gctPOINTER powerSemaphore; @@ -649,6 +656,8 @@ struct _gckEVENT gctPOINTER eventListMutex; gctPOINTER submitTimer; + + volatile gctBOOL inNotify; }; /* Free all events belonging to a process. */ @@ -668,6 +677,11 @@ gckEVENT_Stop( IN OUT gctSIZE_T * waitSize ); +gceSTATUS +gckEVENT_WaitEmpty( + IN gckEVENT Event + ); + /* gcuVIDMEM_NODE structure. */ typedef union _gcuVIDMEM_NODE { diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c index 9ee9ea1..73dab81 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c @@ -494,6 +494,11 @@ gckCOMMAND_Construct( /* Create the context switching mutex. */ gcmkONERROR(gckOS_CreateMutex(os, &command->mutexContext)); +#if VIVANTE_PROFILER_CONTEXT + /* Create the context switching mutex. */ + gcmkONERROR(gckOS_CreateMutex(os, &command->mutexContextSeq)); +#endif + /* Create the power management semaphore. */ gcmkONERROR(gckOS_CreateSemaphore(os, &command->powerSemaphore)); @@ -572,6 +577,13 @@ OnError: gcmkVERIFY_OK(gckOS_DeleteMutex(os, command->mutexContext)); } +#if VIVANTE_PROFILER_CONTEXT + if (command->mutexContextSeq != gcvNULL) + { + gcmkVERIFY_OK(gckOS_DeleteMutex(os, command->mutexContextSeq)); + } +#endif + if (command->mutexQueue != gcvNULL) { gcmkVERIFY_OK(gckOS_DeleteMutex(os, command->mutexQueue)); @@ -662,6 +674,11 @@ gckCOMMAND_Destroy( /* Delete the context switching mutex. */ gcmkVERIFY_OK(gckOS_DeleteMutex(Command->os, Command->mutexContext)); +#if VIVANTE_PROFILER_CONTEXT + if (Command->mutexContextSeq != gcvNULL) + gcmkVERIFY_OK(gckOS_DeleteMutex(Command->os, Command->mutexContextSeq)); +#endif + /* Delete the command queue mutex. */ gcmkVERIFY_OK(gckOS_DeleteMutex(Command->os, Command->mutexQueue)); @@ -1127,6 +1144,10 @@ gckCOMMAND_Commit( # endif #endif +#if VIVANTE_PROFILER_CONTEXT + gctBOOL sequenceAcquired = gcvFALSE; +#endif + gctPOINTER pointer = gcvNULL; gcmkHEADER_ARG( @@ -1145,6 +1166,17 @@ gckCOMMAND_Commit( gcmkONERROR(_FlushMMU(Command)); +#if VIVANTE_PROFILER_CONTEXT + if((Command->kernel->hardware->gpuProfiler) && (Command->kernel->profileEnable)) + { + /* Acquire the context sequnence mutex. */ + gcmkONERROR(gckOS_AcquireMutex( + Command->os, Command->mutexContextSeq, gcvINFINITE + )); + sequenceAcquired = gcvTRUE; + } +#endif + /* Acquire the command queue. */ gcmkONERROR(gckCOMMAND_EnterCommit(Command, gcvFALSE)); commitEntered = gcvTRUE; @@ -2002,6 +2034,23 @@ gckCOMMAND_Commit( gcmkONERROR(gckCOMMAND_ExitCommit(Command, gcvFALSE)); commitEntered = gcvFALSE; +#if VIVANTE_PROFILER_CONTEXT + if(sequenceAcquired) + { + gcmkONERROR(gckCOMMAND_Stall(Command, gcvTRUE)); + if (Command->currContext) + { + gcmkONERROR(gckHARDWARE_UpdateContextProfile( + hardware, + Command->currContext)); + } + + /* Release the context switching mutex. */ + gcmkONERROR(gckOS_ReleaseMutex(Command->os, Command->mutexContextSeq)); + sequenceAcquired = gcvFALSE; + } +#endif + /* Loop while there are records in the queue. */ while (EventQueue != gcvNULL) { @@ -2114,6 +2163,14 @@ OnError: gcmkVERIFY_OK(gckCOMMAND_ExitCommit(Command, gcvFALSE)); } +#if VIVANTE_PROFILER_CONTEXT + if (sequenceAcquired) + { + /* Release the context sequence mutex. */ + gcmkVERIFY_OK(gckOS_ReleaseMutex(Command->os, Command->mutexContextSeq)); + } +#endif + /* Unmap the command buffer pointer. */ if (commandBufferMapped) { diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c index 76c1c10..1a7c340 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c @@ -2819,6 +2819,7 @@ gckVGCOMMAND_Construct( ** Enable TS overflow interrupt. */ + command->info.tsOverflowInt = 0; gcmkERR_BREAK(gckVGINTERRUPT_Enable( Kernel->interrupt, &command->info.tsOverflowInt, @@ -3406,38 +3407,26 @@ gckVGCOMMAND_Commit( gctBOOL previousExecuted; gctUINT controlIndex; + gcmkERR_BREAK(gckVGHARDWARE_SetPowerManagementState( + Command->hardware, gcvPOWER_ON_AUTO + )); + + /* Acquire the power semaphore. */ + gcmkERR_BREAK(gckOS_AcquireSemaphore( + Command->os, Command->powerSemaphore + )); + /* Acquire the mutex. */ - gcmkERR_BREAK(gckOS_AcquireMutex( + status = gckOS_AcquireMutex( Command->os, Command->commitMutex, gcvINFINITE - )); - - status = gckVGHARDWARE_SetPowerManagementState( - Command->hardware, gcvPOWER_ON_AUTO); - - if (gcmIS_ERROR(status)) - { - /* Acquire the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex( - Command->os, - Command->commitMutex - )); - - break; - } - /* Acquire the power semaphore. */ - status = gckOS_AcquireSemaphore( - Command->os, Command->powerSemaphore); + ); if (gcmIS_ERROR(status)) { - /* Acquire the mutex. */ - gcmkVERIFY_OK(gckOS_ReleaseMutex( - Command->os, - Command->commitMutex - )); - + gcmkVERIFY_OK(gckOS_ReleaseSemaphore( + Command->os, Command->powerSemaphore)); break; } @@ -3669,14 +3658,14 @@ gckVGCOMMAND_Commit( } while (gcvFALSE); - gcmkVERIFY_OK(gckOS_ReleaseSemaphore( - Command->os, Command->powerSemaphore)); - /* Release the mutex. */ gcmkCHECK_STATUS(gckOS_ReleaseMutex( Command->os, Command->commitMutex )); + + gcmkVERIFY_OK(gckOS_ReleaseSemaphore( + Command->os, Command->powerSemaphore)); } while (gcvFALSE); diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c index 673d4f7..134351a 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c @@ -1307,6 +1307,18 @@ gckKERNEL_DestroyProcessDB( status = gckOS_FreeMemory(Kernel->os, record->physical); break; +#if gcdANDROID_NATIVE_FENCE_SYNC + case gcvDB_SYNC_POINT: + /* Free the user signal. */ + status = gckOS_DestroySyncPoint(Kernel->os, + (gctSYNC_POINT) record->data); + + gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE, + "DB: SYNC POINT %d (status=%d)", + (gctINT)(gctUINTPTR_T)record->data, status); + break; +#endif + default: gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DATABASE, "DB: Correcupted record=0x%08x type=%d", diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c index 217f7f1..2d81a56 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c @@ -931,6 +931,7 @@ gckEVENT_AddList( || (Interface->command == gcvHAL_TIMESTAMP) || (Interface->command == gcvHAL_COMMIT_DONE) || (Interface->command == gcvHAL_FREE_VIRTUAL_COMMAND_BUFFER) + || (Interface->command == gcvHAL_SYNC_POINT) ); /* Validate the source. */ @@ -2131,6 +2132,9 @@ gckEVENT_Notify( gcvINFINITE)); acquired = gcvTRUE; + /* We are in the notify loop. */ + Event->inNotify = gcvTRUE; + /* Grab the event head. */ record = queue->head; @@ -2463,6 +2467,17 @@ gckEVENT_Notify( break; #endif +#if gcdANDROID_NATIVE_FENCE_SYNC + case gcvHAL_SYNC_POINT: + { + gctSYNC_POINT syncPoint; + + syncPoint = gcmUINT64_TO_PTR(record->info.u.SyncPoint.syncPoint); + status = gckOS_SignalSyncPoint(Event->os, syncPoint); + } + break; +#endif + case gcvHAL_COMMIT_DONE: break; @@ -2505,6 +2520,9 @@ gckEVENT_Notify( gcmkONERROR(_TryToIdleGPU(Event)); } + /* We are out the notify loop. */ + Event->inNotify = gcvFALSE; + /* Success. */ gcmkFOOTER_NO(); return gcvSTATUS_OK; @@ -2524,6 +2542,9 @@ OnError: } #endif + /* We are out the notify loop. */ + Event->inNotify = gcvFALSE; + /* Return the status. */ gcmkFOOTER(); return status; @@ -2871,3 +2892,11 @@ gckEVENT_Dump( return gcvSTATUS_OK; } +gceSTATUS gckEVENT_WaitEmpty(gckEVENT Event) +{ + gctBOOL isEmpty; + + while (Event->inNotify || (gcmIS_SUCCESS(gckEVENT_IsEmpty(Event, &isEmpty)) && !isEmpty)) ; + + return gcvSTATUS_OK; +} diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c index 8ac187b..50bc63e 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c @@ -794,6 +794,9 @@ gckVGINTERRUPT_Enque( Interrupt->kernel->hardware, &triggered )); + /* Mask out TS overflow interrupt */ + triggered &= 0xfffffffe; + /* No interrupts to process? */ if (triggered == 0) { diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c index c7f67c7..e4ca497 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c @@ -1436,7 +1436,7 @@ gckMMU_AllocatePages( acquired = gcvTRUE; /* Allocate page table for current MMU. */ - for (i = 0; i < mirrorPageTable->reference; i++) + for (i = 0; i < (gctINT)mirrorPageTable->reference; i++) { if (Mmu == mirrorPageTable->mmus[i]) { @@ -1446,7 +1446,7 @@ gckMMU_AllocatePages( } /* Allocate page table for other MMUs. */ - for (i = 0; i < mirrorPageTable->reference; i++) + for (i = 0; i < (gctINT)mirrorPageTable->reference; i++) { mmu = mirrorPageTable->mmus[i]; @@ -1500,7 +1500,7 @@ gckMMU_FreePages( offset = (gctUINT32)PageTable - (gctUINT32)Mmu->pageTableLogical; - for (i = 0; i < mirrorPageTable->reference; i++) + for (i = 0; i < (gctINT)mirrorPageTable->reference; i++) { mmu = mirrorPageTable->mmus[i]; @@ -1639,7 +1639,7 @@ gckMMU_SetPage( _WritePageEntry(PageEntry, data); #if gcdMIRROR_PAGETABLE - for (i = 0; i < mirrorPageTable->reference; i++) + for (i = 0; i < (gctINT)mirrorPageTable->reference; i++) { mmu = mirrorPageTable->mmus[i]; diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c index 8b8bbdc..3b5dd82 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c +++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c @@ -1582,6 +1582,7 @@ _NeedVirtualMapping( gctUINT32 end; gcePOOL pool; gctUINT32 offset; + gctUINT32 baseAddress; gcmkHEADER_ARG("Node=0x%X", Node); @@ -1601,10 +1602,16 @@ _NeedVirtualMapping( else #endif { - /* For cores which can't access all physical address. */ - gcmkONERROR(gckHARDWARE_ConvertLogical(Kernel->hardware, - Node->Virtual.logical, - &phys)); + /* Convert logical address into a physical address. */ + gcmkONERROR( + gckOS_GetPhysicalAddress(Kernel->os, Node->Virtual.logical, &phys)); + + gcmkONERROR(gckOS_GetBaseAddress(Kernel->os, &baseAddress)); + + gcmkASSERT(phys >= baseAddress); + + /* Subtract baseAddress to get a GPU address used for programming. */ + phys -= baseAddress; /* If part of region is belong to gcvPOOL_VIRTUAL, ** whole region has to be mapped. */ @@ -1734,6 +1741,11 @@ gckVIDMEM_Lock( gcmkONERROR(gckOS_AcquireMutex(os, Node->Virtual.mutex, gcvINFINITE)); acquired = gcvTRUE; +#if gcdPAGED_MEMORY_CACHEABLE + /* Force video memory cacheable. */ + Cacheable = gcvTRUE; +#endif + gcmkONERROR( gckOS_LockPages(os, Node->Virtual.physical, diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h index 4406d7e..7312cc2 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h @@ -123,6 +123,12 @@ extern "C" { #define gcvINVALID_ADDRESS ~0U +#define gcmGET_PRE_ROTATION(rotate) \ + ((rotate) & (~(gcvSURF_POST_FLIP_X | gcvSURF_POST_FLIP_Y))) + +#define gcmGET_POST_ROTATION(rotate) \ + ((rotate) & (gcvSURF_POST_FLIP_X | gcvSURF_POST_FLIP_Y)) + /******************************************************************************\ ******************************** gcsOBJECT Object ******************************* \******************************************************************************/ @@ -1124,6 +1130,60 @@ gckOS_UnmapUserMemory( IN gctUINT32 Address ); +/******************************************************************************\ +************************** Android Native Fence Sync *************************** +\******************************************************************************/ +gceSTATUS +gckOS_CreateSyncTimeline( + IN gckOS Os, + OUT gctHANDLE * Timeline + ); + +gceSTATUS +gckOS_DestroySyncTimeline( + IN gckOS Os, + IN gctHANDLE Timeline + ); + +gceSTATUS +gckOS_CreateSyncPoint( + IN gckOS Os, + OUT gctSYNC_POINT * SyncPoint + ); + +gceSTATUS +gckOS_ReferenceSyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint + ); + +gceSTATUS +gckOS_DestroySyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint + ); + +gceSTATUS +gckOS_SignalSyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint + ); + +gceSTATUS +gckOS_QuerySyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint, + OUT gctBOOL_PTR State + ); + +gceSTATUS +gckOS_CreateNativeFence( + IN gckOS Os, + IN gctHANDLE Timeline, + IN gctSYNC_POINT SyncPoint, + OUT gctINT * FenceFD + ); + #if !USE_NEW_LINUX_SIGNAL /* Create signal to be used in the user space. */ gceSTATUS @@ -1758,7 +1818,7 @@ gckKERNEL_Recovery( void gckKERNEL_SetTimeOut( IN gckKERNEL Kernel, - IN gctUINT32 timeOut + IN gctUINT32 timeOut ); /* Get access to the user data. */ @@ -2078,6 +2138,12 @@ gckHARDWARE_SetPowerManagement( IN gctBOOL PowerManagement ); +gceSTATUS +gckHARDWARE_SetGpuProfiler( + IN gckHARDWARE Hardware, + IN gctBOOL GpuProfiler + ); + #if gcdENABLE_FSCALE_VAL_ADJUST gceSTATUS gckHARDWARE_SetFscaleValue( @@ -2554,6 +2620,22 @@ gckHARDWARE_QueryProfileRegisters( ); #endif +#if VIVANTE_PROFILER_CONTEXT +gceSTATUS +gckHARDWARE_QueryContextProfile( + IN gckHARDWARE Hardware, + IN gctBOOL Clear, + IN gckCONTEXT Context, + OUT gcsPROFILER_COUNTERS * Counters + ); + +gceSTATUS +gckHARDWARE_UpdateContextProfile( + IN gckHARDWARE Hardware, + IN gckCONTEXT Context + ); +#endif + gceSTATUS gckOS_SignalQueryHardware( IN gckOS Os, diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h index 44689b0..9c17114 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h @@ -71,10 +71,17 @@ typedef struct _gcoFENCE * gcoFENCE; typedef struct _gcsSYNC_CONTEXT * gcsSYNC_CONTEXT_PTR; #endif +typedef struct _gcoOS_SymbolsList gcoOS_SymbolsList; + /******************************************************************************\ ******************************* Process local storage ************************* \******************************************************************************/ typedef struct _gcsPLS * gcsPLS_PTR; + +typedef void (* gctPLS_DESTRUCTOR) ( + gcsPLS_PTR + ); + typedef struct _gcsPLS { /* Global objects. */ @@ -103,6 +110,12 @@ typedef struct _gcsPLS /* PorcessID of the constrcutor process */ gctUINT32 processID; +#if gcdFORCE_GAL_LOAD_TWICE + /* ThreadID of the constrcutor process. */ + gctSIZE_T threadID; + /* Flag for calling module destructor. */ + gctBOOL exiting; +#endif /* Reference count for destructor. */ gcsATOM_PTR reference; @@ -111,6 +124,8 @@ typedef struct _gcsPLS gctBOOL bNeedSupportNP2Texture; #endif + /* Destructor for eglDisplayInfo. */ + gctPLS_DESTRUCTOR destructor; } gcsPLS; @@ -148,6 +163,11 @@ typedef struct _gcsTLS #endif gco2D engine2D; gctBOOL copied; + +#if gcdFORCE_GAL_LOAD_TWICE + /* libGAL.so handle */ + gctHANDLE handle; +#endif } gcsTLS; @@ -160,6 +180,7 @@ typedef enum _gcePLS_VALUE gcePLS_VALUE_EGL_DISPLAY_INFO, gcePLS_VALUE_EGL_SURFACE_INFO, gcePLS_VALUE_EGL_CONFIG_FORMAT_INFO, + gcePLS_VALUE_EGL_DESTRUCTOR_INFO, } gcePLS_VALUE; @@ -577,6 +598,12 @@ gcoHAL_Call( IN OUT gcsHAL_INTERFACE_PTR Interface ); +gceSTATUS +gcoHAL_GetPatchID( + IN gcoHAL Hal, + OUT gcePATCH_ID * PatchID + ); + /* Schedule an event. */ gceSTATUS gcoHAL_ScheduleEvent( @@ -637,6 +664,16 @@ gcoHAL_QuerySeparated3D2D( IN gcoHAL Hal ); +gceSTATUS +gcoHAL_QuerySpecialHint( + IN gceSPECIAL_HINT Hint + ); + +gceSTATUS +gcoHAL_SetSpecialHintData( + IN gcoHARDWARE Hardware + ); + /* Get pointer to gcoVG object. */ gceSTATUS gcoHAL_GetVGEngine( @@ -786,7 +823,6 @@ gcoOS_FreeVideoMemory( IN gctPOINTER Handle ); -#if gcdENABLE_BANK_ALIGNMENT gceSTATUS gcoSURF_GetBankOffsetBytes( IN gcoSURF Surfce, @@ -794,7 +830,6 @@ gcoSURF_GetBankOffsetBytes( IN gctUINT32 Stride, IN gctUINT32_PTR Bytes ); -#endif /* Map user memory. */ gceSTATUS @@ -918,6 +953,21 @@ gcoOS_Flush( IN gctFILE File ); +/* Close a file descriptor. */ +gceSTATUS +gcoOS_CloseFD( + IN gcoOS Os, + IN gctINT FD + ); + +/* Dup file descriptor to another. */ +gceSTATUS +gcoOS_DupFD( + IN gcoOS Os, + IN gctINT FD, + OUT gctINT * FD2 + ); + /* Create an endpoint for communication. */ gceSTATUS gcoOS_Socket( @@ -977,6 +1027,14 @@ gcoOS_GetEnv( OUT gctSTRING * Value ); +/* Set environment variable value. */ +gceSTATUS +gcoOS_SetEnv( + IN gcoOS Os, + IN gctCONST_STRING VarName, + IN gctSTRING Value + ); + /* Get current working directory. */ gceSTATUS gcoOS_GetCwd( @@ -1210,6 +1268,13 @@ gcoOS_DetectProcessByEncryptedName( IN gctCONST_STRING Name ); +#if defined(ANDROID) +gceSTATUS +gcoOS_DetectProgrameByEncryptedSymbols( + IN gcoOS_SymbolsList Symbols + ); +#endif + /*----------------------------------------------------------------------------*/ /*----- Atoms ----------------------------------------------------------------*/ @@ -1403,6 +1468,42 @@ gcoOS_UnmapSignal( IN gctSIGNAL Signal ); +/*----------------------------------------------------------------------------*/ +/*----- Android Native Fence -------------------------------------------------*/ + +/* Create sync point. */ +gceSTATUS +gcoOS_CreateSyncPoint( + IN gcoOS Os, + OUT gctSYNC_POINT * SyncPoint + ); + +/* Destroy sync point. */ +gceSTATUS +gcoOS_DestroySyncPoint( + IN gcoOS Os, + IN gctSYNC_POINT SyncPoint + ); + +/* Create native fence. */ +gceSTATUS +gcoOS_CreateNativeFence( + IN gcoOS Os, + IN gctSYNC_POINT SyncPoint, + OUT gctINT * FenceFD + ); + +/* Wait on native fence. */ +gceSTATUS +gcoOS_WaitNativeFence( + IN gcoOS Os, + IN gctINT FenceFD, + IN gctUINT32 Timeout + ); + +/*----------------------------------------------------------------------------*/ +/*----- Memory Access and Cache ----------------------------------------------*/ + /* Write a register. */ gceSTATUS gcoOS_WriteRegister( @@ -1507,7 +1608,7 @@ gcoOS_QueryProfileTickRate( # define gcmPROFILE_QUERY(start, ticks) do { } while (gcvFALSE) # define gcmPROFILE_ONLY(x) do { } while (gcvFALSE) # define gcmPROFILE_ELSE(x) x -# define gcmPROFILE_DECLARE_ONLY(x) typedef x +# define gcmPROFILE_DECLARE_ONLY(x) do { } while (gcvFALSE) # define gcmPROFILE_DECLARE_ELSE(x) x #endif @@ -1579,6 +1680,28 @@ typedef struct _gcsRECT } gcsRECT; +typedef union _gcsPIXEL +{ + struct + { + gctFLOAT r, g, b, a; + gctFLOAT d, s; + } pf; + + struct + { + gctINT32 r, g, b, a; + gctINT32 d, s; + } pi; + + struct + { + gctUINT32 r, g, b, a; + gctUINT32 d, s; + } pui; + +} gcsPIXEL; + /******************************************************************************\ ********************************* gcoSURF Object ******************************** @@ -1795,6 +1918,18 @@ gcoSURF_SetRotation( ); gceSTATUS +gcoSURF_SetPreRotation( + IN gcoSURF Surface, + IN gceSURF_ROTATION Rotation + ); + +gceSTATUS +gcoSURF_GetPreRotation( + IN gcoSURF Surface, + IN gceSURF_ROTATION *Rotation + ); + +gceSTATUS gcoSURF_IsValid( IN gcoSURF Surface ); @@ -1824,6 +1959,15 @@ gcoSURF_DisableTileStatus( IN gcoSURF Surface, IN gctBOOL Decompress ); + +gceSTATUS +gcoSURF_AlignResolveRect( + IN gcoSURF Surf, + IN gcsPOINT_PTR RectOrigin, + IN gcsPOINT_PTR RectSize, + OUT gcsPOINT_PTR AlignedOrigin, + OUT gcsPOINT_PTR AlignedSize + ); #endif /* VIVANTE_NO_3D */ /* Get surface size. */ @@ -1910,6 +2054,9 @@ gcoSURF_FillFromTile( IN gcoSURF Surface ); +/* Check if surface needs a filler. */ +gceSTATUS gcoSURF_NeedFiller(IN gcoSURF Surface); + /* Fill surface with a value. */ gceSTATUS gcoSURF_Fill( @@ -1949,6 +2096,19 @@ gcoSURF_SetBuffer( IN gctUINT32 Physical ); +/* Set the underlying video buffer for the surface wrapper. */ +gceSTATUS +gcoSURF_SetVideoBuffer( + IN gcoSURF Surface, + IN gceSURF_TYPE Type, + IN gceSURF_FORMAT Format, + IN gctUINT Width, + IN gctUINT Height, + IN gctUINT Stride, + IN gctPOINTER *LogicalPlane1, + IN gctUINT32 *PhysicalPlane1 + ); + /* Set the size of the surface in pixels and map the underlying buffer. */ gceSTATUS gcoSURF_SetWindow( @@ -3705,6 +3865,12 @@ gcGetUserDebugOption( void ); +struct _gcoOS_SymbolsList +{ + gcePATCH_ID patchId; + const char * symList[10]; +}; + #if gcdHAS_ELLIPSES #define gcmUSER_DEBUG_MSG(level, ...) \ do \ diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h index 8693c37..062224c 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_compiler.h @@ -39,12 +39,10 @@ extern "C" { #define GC_ENABLE_LOADTIME_OPT 1 #endif -#define TEMP_OPT_CONSTANT_TEXLD_COORD 1 +#define TEMP_OPT_CONSTANT_TEXLD_COORD 0 #define TEMP_SHADER_PATCH 1 -#define ADD_PRE_ROTATION_TO_VS 0 - #define TEMP_INLINE_ALL_EXPANSION 1 /******************************* IR VERSION ******************/ #define gcdSL_IR_VERSION gcmCC('\0','\0','\0','\1') @@ -271,6 +269,7 @@ typedef enum _gcSL_OPCODE gcSL_ADDSAT, /* 0x5C */ /* Integer only. */ gcSL_SUBSAT, /* 0x5D */ /* Integer only. */ gcSL_MULSAT, /* 0x5E */ /* Integer only. */ + gcSL_DP2, /* 0x5F */ gcSL_MAXOPCODE } gcSL_OPCODE; @@ -474,6 +473,9 @@ struct _gcsHINT gctBOOL clipW; + /* Flag whether or not the shader has a KILL instruction. */ + gctBOOL hasKill; + /* Element count. */ gctUINT32 elementCount; @@ -495,12 +497,18 @@ struct _gcsHINT /* Balance maximum. */ gctUINT32 balanceMax; + /* Auto-shift balancing. */ + gctBOOL autoShift; + /* Flag whether the PS outputs the depth value or not. */ gctBOOL psHasFragDepthOut; /* Flag whether the ThreadWalker is in PS. */ gctBOOL threadWalkerInPS; + /* HW reg number for position of VS */ + gctUINT32 hwRegNoOfSIVPos; + #if gcdALPHA_KILL_IN_SHADER /* States to set when alpha kill is enabled. */ gctUINT32 killStateAddress; @@ -687,12 +695,12 @@ typedef enum _gceSHADER_FLAGS gcvSHADER_USE_ALPHA_KILL = 0x100, #endif -#if ADD_PRE_ROTATION_TO_VS +#if gcdPRE_ROTATION && (ANDROID_SDK_VERSION >= 14) gcvSHADER_VS_PRE_ROTATION = 0x200, #endif #if TEMP_INLINE_ALL_EXPANSION - gcvSHADER_INLINE_ALL_EXPANSION = 0x200, + gcvSHADER_INLINE_ALL_EXPANSION = 0x400, #endif } gceSHADER_FLAGS; @@ -827,6 +835,7 @@ typedef struct _gcOPTIMIZER_OPTION gctBOOL dumpOptimizerVerbose; /* dump result IR in each optimization phase */ gctBOOL dumpBEGenertedCode; /* dump generated machine code */ gctBOOL dumpBEVerbose; /* dump BE tree and optimization detail */ + gctBOOL dumpBEFinalIR; /* dump BE final IR */ /* Code generation */ @@ -945,6 +954,8 @@ extern gcOPTIMIZER_OPTION theOptimizerOption; gcmOPT_DUMP_CODEGEN_VERBOSE() ) #define gcmOPT_DUMP_CODEGEN_VERBOSE() \ (gcmGetOptimizerOption()->dumpBEVerbose != 0) +#define gcmOPT_DUMP_FINAL_IR() \ + (gcmGetOptimizerOption()->dumpBEFinalIR != 0) #define gcmOPT_SET_DUMP_SHADER_SRC(v) \ gcmGetOptimizerOption()->dumpShaderSource = (v) @@ -1064,6 +1075,13 @@ typedef struct _gcNPOT_PATCH_PARAM gctINT texDimension; /* 2 or 3 */ }gcNPOT_PATCH_PARAM, *gcNPOT_PATCH_PARAM_PTR; +typedef struct _gcZBIAS_PATCH_PARAM +{ + /* Driver uses this to program uniform that designating zbias */ + gctINT uniformAddr; + gctINT channel; +}gcZBIAS_PATCH_PARAM, *gcZBIAS_PATCH_PARAM_PTR; + void gcGetOptionFromEnv( IN OUT gcOPTIMIZER_OPTION * Option @@ -1556,6 +1574,43 @@ gcSHADER_AddUniform( OUT gcUNIFORM * Uniform ); +/******************************************************************************* +** gcSHADER_AddPreRotationUniform +******************************************************************************** +** +** Add an uniform to a gcSHADER object. +** +** INPUT: +** +** gcSHADER Shader +** Pointer to a gcSHADER object. +** +** gctCONST_STRING Name +** Name of the uniform to add. +** +** gcSHADER_TYPE Type +** Type of the uniform to add. +** +** gctSIZE_T Length +** Array length of the uniform to add. 'Length' must be at least 1. +** +** gctINT col +** Which uniform. +** +** OUTPUT: +** +** gcUNIFORM * Uniform +** Pointer to a variable receiving the gcUNIFORM object pointer. +*/ +gceSTATUS +gcSHADER_AddPreRotationUniform( + IN gcSHADER Shader, + IN gctCONST_STRING Name, + IN gcSHADER_TYPE Type, + IN gctSIZE_T Length, + IN gctINT col, + OUT gcUNIFORM * Uniform + ); /******************************************************************************* ** gcSHADER_AddUniformEx @@ -1677,6 +1732,28 @@ gcSHADER_GetUniformCount( ); /******************************************************************************* +** gcSHADER_GetPreRotationUniform +******************************************************************************** +** +** Get the preRotate Uniform. +** +** INPUT: +** +** gcSHADER Shader +** Pointer to a gcSHADER object. +** +** OUTPUT: +** +** gcUNIFORM ** pUniform +** Pointer to a preRotation uniforms array. +*/ +gceSTATUS +gcSHADER_GetPreRotationUniform( + IN gcSHADER Shader, + OUT gcUNIFORM ** pUniform + ); + +/******************************************************************************* ** gcSHADER_GetUniform ******************************************************************************** ** @@ -3438,6 +3515,34 @@ gcUNIFORM_SetValueF( ); /******************************************************************************* +** gcUNIFORM_ProgramF +** +** Set the value of a uniform in floating point. +** +** INPUT: +** +** gctUINT32 Address +** Address of Uniform. +** +** gctSIZE_T Row/Col +** +** const gctFLOAT * Value +** Pointer to a buffer holding the floating point values for the +** uniform. +** +** OUTPUT: +** +** Nothing. +*/ +gceSTATUS +gcUNIFORM_ProgramF( + IN gctUINT32 Address, + IN gctSIZE_T Row, + IN gctSIZE_T Col, + IN const gctFLOAT * Value + ); + +/******************************************************************************* ** gcUNIFORM_GetModelViewProjMatrix ******************************************************************************** ** @@ -3912,6 +4017,23 @@ gcRecompileShaders( IN gctUINT32 *SamplerWrapS, IN gctUINT32 *SamplerWrapT ); + +gceSTATUS +gcRecompileDepthBias( + IN gcoHAL Hal, + IN gcMACHINECODE_PTR pVsMachineCode, + /*Recompile variables*/ + IN OUT gctPOINTER *ppRecompileStateBuffer, + IN OUT gctSIZE_T *pRecompileStateBufferSize, + IN OUT gcsHINT_PTR *ppRecompileHints, + /* natvie state*/ + IN gctPOINTER pNativeStateBuffer, + IN gctSIZE_T nativeStateBufferSize, + IN gcsHINT_PTR pNativeHints, + OUT gctINT * uniformAddr, + OUT gctINT * uniformChannel + ); + /******************************************************************************* ** gcSaveProgram ******************************************************************************** @@ -4138,6 +4260,16 @@ gcSHADER_PatchNPOTForMachineCode( IN OUT gcsHINT_PTR pHints /* User needs copy original hints to this one, then passed this one in */ ); +gceSTATUS +gcSHADER_PatchZBiasForMachineCodeVS( + IN gcMACHINECODE_PTR pMachineCode, + IN OUT gcZBIAS_PATCH_PARAM_PTR pPatchParam, + IN gctUINT hwSupportedInstCount, + OUT gctPOINTER* ppCmdBuffer, + OUT gctUINT32* pByteSizeOfCmdBuffer, + IN OUT gcsHINT_PTR pHints /* User needs copy original hints to this one, then passed this one in */ + ); + #ifdef __cplusplus } #endif diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h index b056c52..fc8c395 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h @@ -166,6 +166,12 @@ typedef enum _gceHAL_COMMAND_CODES /* Reset time stamp. */ gcvHAL_QUERY_RESET_TIME_STAMP, + + /* Sync point operations. */ + gcvHAL_SYNC_POINT, + + /* Create native fence and return its fd. */ + gcvHAL_CREATE_NATIVE_FENCE, } gceHAL_COMMAND_CODES; @@ -723,6 +729,10 @@ typedef struct _gcsHAL_INTERFACE /* gcvHAL_READ_ALL_PROFILE_REGISTERS */ struct _gcsHAL_READ_ALL_PROFILE_REGISTERS { +#if VIVANTE_PROFILER_CONTEXT + /* Context buffer object gckCONTEXT. Just a name. */ + IN gctUINT32 context; +#endif /* Data read. */ OUT gcsPROFILER_COUNTERS counters; } @@ -978,6 +988,33 @@ typedef struct _gcsHAL_INTERFACE OUT gctUINT64 timeStamp; } QueryResetTimeStamp; + + struct _gcsHAL_SYNC_POINT + { + /* Command. */ + gceSYNC_POINT_COMMAND_CODES command; + + /* Sync point. */ + IN OUT gctUINT64 syncPoint; + + /* From where. */ + IN gceKERNEL_WHERE fromWhere; + + /* Signaled state. */ + OUT gctBOOL state; + } + SyncPoint; + + struct _gcsHAL_CREATE_NATIVE_FENCE + { + /* Signal id to dup. */ + IN gctUINT64 syncPoint; + + /* Native fence file descriptor. */ + OUT gctINT fenceFD; + + } + CreateNativeFence; } u; } diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h index 8481375..3fb2fe4 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h @@ -323,6 +323,15 @@ gcoSURF_Resolve( IN gcoSURF DestSurface ); +gceSTATUS +gcoSURF_IsHWResolveable( + IN gcoSURF SrcSurface, + IN gcoSURF DestSurface, + IN gcsPOINT_PTR SrcOrigin, + IN gcsPOINT_PTR DestOrigin, + IN gcsPOINT_PTR RectSize + ); + /* Resolve rectangular area of a surface. */ gceSTATUS gcoSURF_ResolveRect( @@ -345,6 +354,11 @@ gcoSURF_IsRenderable( IN gcoSURF Surface ); +gceSTATUS +gcoSURF_IsFormatRenderableAsRT( + IN gcoSURF Surface + ); + #if gcdSYNC gceSTATUS gcoSURF_GetFence( @@ -1006,6 +1020,7 @@ typedef struct _gcsALPHA_INFO gctBOOL test; gceCOMPARE compare; gctUINT8 reference; + gctFLOAT floatReference; /* Alpha blending states. */ gctBOOL blend; @@ -1040,7 +1055,8 @@ gco3D_SetAlphaCompare( gceSTATUS gco3D_SetAlphaReference( IN gco3D Engine, - IN gctUINT8 Reference + IN gctUINT8 Reference, + IN gctFLOAT FloatReference ); /* Set alpha test reference in fixed point. */ @@ -1504,6 +1520,19 @@ gcoTEXTURE_UploadSub( IN gceSURF_FORMAT Format ); +/* Upload YUV data to an gcoTEXTURE object. */ +gceSTATUS +gcoTEXTURE_UploadYUV( + IN gcoTEXTURE Texture, + IN gceTEXTURE_FACE Face, + IN gctUINT Width, + IN gctUINT Height, + IN gctUINT Slice, + IN gctPOINTER Memory[3], + IN gctINT Stride[3], + IN gceSURF_FORMAT Format + ); + /* Upload compressed data to an gcoTEXTURE object. */ gceSTATUS gcoTEXTURE_UploadCompressed( @@ -1621,6 +1650,13 @@ gcoTEXTURE_QueryCaps( ); gceSTATUS +gcoTEXTURE_GetTiling( + IN gcoTEXTURE Texture, + IN gctINT preferLevel, + OUT gceTILING * Tiling + ); + +gceSTATUS gcoTEXTURE_GetClosestFormat( IN gcoHAL Hal, IN gceSURF_FORMAT InFormat, @@ -2001,6 +2037,14 @@ gcoHAL_SetSharedInfo( IN gctSIZE_T Bytes ); +#if VIVANTE_PROFILER_CONTEXT +gceSTATUS +gcoHARDWARE_GetContext( + IN gcoHARDWARE Hardware, + OUT gctUINT32 * Context + ); +#endif + #ifdef __cplusplus } #endif diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h index a1d9ae5..8e3c2f8 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h @@ -146,10 +146,26 @@ typedef enum _gceFEATURE gcvFEATURE_FRUSTUM_CLIP_FIX, gcvFEATURE_TEXTURE_LINEAR, gcvFEATURE_TEXTURE_YUV_ASSEMBLER, + gcvFEATURE_SHADER_HAS_INSTRUCTION_CACHE, gcvFEATURE_DYNAMIC_FREQUENCY_SCALING, gcvFEATURE_BUGFIX15, + gcvFEATURE_2D_GAMMA, + gcvFEATURE_2D_COLOR_SPACE_CONVERSION, + gcvFEATURE_2D_SUPER_TILE_VERSION, gcvFEATURE_2D_MIRROR_EXTENSION, + gcvFEATURE_2D_SUPER_TILE_V1, + gcvFEATURE_2D_SUPER_TILE_V2, + gcvFEATURE_2D_SUPER_TILE_V3, + gcvFEATURE_2D_MULTI_SOURCE_BLT_EX2, gcvFEATURE_ELEMENT_INDEX_UINT, + gcvFEATURE_2D_COMPRESSION, + gcvFEATURE_2D_OPF_YUV_OUTPUT, + gcvFEATURE_2D_MULTI_SRC_BLT_TO_UNIFIED_DST_RECT, + gcvFEATURE_2D_YUV_MODE, + gcvFEATURE_DECOMPRESS_Z16, + gcvFEATURE_LINEAR_RENDER_TARGET, + gcvFEATURE_BUG_FIXES8, + gcvFEATURE_HALTI2, } gceFEATURE; @@ -203,11 +219,14 @@ typedef enum _gceSURF_TYPE gcvSURF_NO_VIDMEM = 0x200, /* Used to allocate surfaces with no underlying vidmem node. In Android, vidmem node is allocated by another process. */ gcvSURF_CACHEABLE = 0x400, /* Used to allocate a cacheable surface */ -#if gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST gcvSURF_FLIP = 0x800, /* The Resolve Target the will been flip resolve from RT */ -#endif gcvSURF_TILE_STATUS_DIRTY = 0x1000, /* Init tile status to all dirty */ + gcvSURF_LINEAR = 0x2000, + + gcvSURF_TEXTURE_LINEAR = gcvSURF_TEXTURE + | gcvSURF_LINEAR, + gcvSURF_RENDER_TARGET_NO_TILE_STATUS = gcvSURF_RENDER_TARGET | gcvSURF_NO_TILE_STATUS, @@ -217,6 +236,9 @@ typedef enum _gceSURF_TYPE gcvSURF_DEPTH_NO_TILE_STATUS = gcvSURF_DEPTH | gcvSURF_NO_TILE_STATUS, + gcvSURF_DEPTH_TS_DIRTY = gcvSURF_DEPTH + | gcvSURF_TILE_STATUS_DIRTY, + /* Supported surface types with no vidmem node. */ gcvSURF_BITMAP_NO_VIDMEM = gcvSURF_BITMAP | gcvSURF_NO_VIDMEM, @@ -231,10 +253,8 @@ typedef enum _gceSURF_TYPE gcvSURF_CACHEABLE_BITMAP = gcvSURF_BITMAP | gcvSURF_CACHEABLE, -#if gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST gcvSURF_FLIP_BITMAP = gcvSURF_BITMAP | gcvSURF_FLIP, -#endif } gceSURF_TYPE; @@ -263,6 +283,9 @@ typedef enum _gceSURF_ROTATION gcvSURF_270_DEGREE, gcvSURF_FLIP_X, gcvSURF_FLIP_Y, + + gcvSURF_POST_FLIP_X = 0x40000000, + gcvSURF_POST_FLIP_Y = 0x80000000, } gceSURF_ROTATION; @@ -622,21 +645,16 @@ gce2D_PORTER_DUFF_RULE; typedef enum _gce2D_YUV_COLOR_MODE { gcv2D_YUV_601= 0, - gcv2D_YUV_709 -} -gce2D_YUV_COLOR_MODE; + gcv2D_YUV_709, + gcv2D_YUV_USER_DEFINED, + gcv2D_YUV_USER_DEFINED_CLAMP, -/* 2D Rotation and flipping. */ -typedef enum _gce2D_ORIENTATION -{ - gcv2D_0_DEGREE = 0, - gcv2D_90_DEGREE, - gcv2D_180_DEGREE, - gcv2D_270_DEGREE, - gcv2D_X_FLIP, - gcv2D_Y_FLIP + /* Default setting is for src. gcv2D_YUV_DST + can be ORed to set dst. + */ + gcv2D_YUV_DST = 0x80000000, } -gce2D_ORIENTATION; +gce2D_YUV_COLOR_MODE; typedef enum _gce2D_COMMAND { @@ -656,21 +674,39 @@ typedef enum _gce2D_TILE_STATUS_CONFIG gcv2D_TSC_ENABLE = 0x00000001, gcv2D_TSC_COMPRESSED = 0x00000002, gcv2D_TSC_DOWN_SAMPLER = 0x00000004, + gcv2D_TSC_2D_COMPRESSED = 0x00000008, } gce2D_TILE_STATUS_CONFIG; typedef enum _gce2D_QUERY { - gcv2D_QUERY_RGB_ADDRESS_MAX_ALIGN = 0, - gcv2D_QUERY_RGB_STRIDE_MAX_ALIGN, - gcv2D_QUERY_YUV_ADDRESS_MAX_ALIGN, - gcv2D_QUERY_YUV_STRIDE_MAX_ALIGN, + gcv2D_QUERY_RGB_ADDRESS_MIN_ALIGN = 0, + gcv2D_QUERY_RGB_STRIDE_MIN_ALIGN, + gcv2D_QUERY_YUV_ADDRESS_MIN_ALIGN, + gcv2D_QUERY_YUV_STRIDE_MIN_ALIGN, } gce2D_QUERY; +typedef enum _gce2D_SUPER_TILE_VERSION +{ + gcv2D_SUPER_TILE_VERSION_V1 = 1, + gcv2D_SUPER_TILE_VERSION_V2 = 2, + gcv2D_SUPER_TILE_VERSION_V3 = 3, +} +gce2D_SUPER_TILE_VERSION; + typedef enum _gce2D_STATE { gcv2D_STATE_SPECIAL_FILTER_MIRROR_MODE = 1, + gcv2D_STATE_SUPER_TILE_VERSION, + gcv2D_STATE_EN_GAMMA, + gcv2D_STATE_DE_GAMMA, + gcv2D_STATE_MULTI_SRC_BLIT_UNIFIED_DST_RECT, + + gcv2D_STATE_ARRAY_EN_GAMMA = 0x10001, + gcv2D_STATE_ARRAY_DE_GAMMA, + gcv2D_STATE_ARRAY_CSC_YUV_TO_RGB, + gcv2D_STATE_ARRAY_CSC_RGB_TO_YUV, } gce2D_STATE; @@ -809,6 +845,15 @@ typedef enum _gceUSER_SIGNAL_COMMAND_CODES } gceUSER_SIGNAL_COMMAND_CODES; +/* Sync point command codes. */ +typedef enum _gceSYNC_POINT_COMMAND_CODES +{ + gcvSYNC_POINT_CREATE, + gcvSYNC_POINT_DESTROY, + gcvSYNC_POINT_SIGNAL, +} +gceSYNC_POINT_COMMAND_CODES; + /* Event locations. */ typedef enum _gceKERNEL_WHERE { @@ -848,6 +893,44 @@ typedef enum _gceDEBUG_MESSAGE_TYPE } gceDEBUG_MESSAGE_TYPE; +typedef enum _gceSPECIAL_HINT +{ + gceSPECIAL_HINT0, + gceSPECIAL_HINT1, + gceSPECIAL_HINT2, + gceSPECIAL_HINT3, + /* For disable dynamic stream/index */ + gceSPECIAL_HINT4 +} +gceSPECIAL_HINT; + +typedef enum _gceMACHINECODE +{ + gcvMACHINECODE_HOVERJET0 = 0x0, + gcvMACHINECODE_HOVERJET1 , + + gcvMACHINECODE_TAIJI0 , + gcvMACHINECODE_TAIJI1 , + gcvMACHINECODE_TAIJI2 , + + gcvMACHINECODE_ANTUTU0 , + + gcvMACHINECODE_GLB27_RELEASE_0, + gcvMACHINECODE_GLB27_RELEASE_1, + + gcvMACHINECODE_WAVESCAPE0 , + gcvMACHINECODE_WAVESCAPE1 , + + gcvMACHINECODE_NENAMARKV2_4_0 , + gcvMACHINECODE_NENAMARKV2_4_1 , + + gcvMACHINECODE_GLB25_RELEASE_0, + gcvMACHINECODE_GLB25_RELEASE_1, + gcvMACHINECODE_GLB25_RELEASE_2, +} +gceMACHINECODE; + + /******************************************************************************\ ****************************** Object Declarations ***************************** \******************************************************************************/ diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h index 9e2a8db..b53b618 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h @@ -46,7 +46,7 @@ This define enables the profiler. */ #ifndef VIVANTE_PROFILER -# define VIVANTE_PROFILER 0 +# define VIVANTE_PROFILER 1 #endif #ifndef VIVANTE_PROFILER_PERDRAW @@ -54,6 +54,15 @@ #endif /* + VIVANTE_PROFILER_CONTEXT + + This define enables the profiler according to each hw context. +*/ +#ifndef VIVANTE_PROFILER_CONTEXT +# define VIVANTE_PROFILER_CONTEXT 1 +#endif + +/* gcdUSE_VG Enable VG HAL layer (only for GC350). @@ -729,7 +738,24 @@ Use linear buffer for GPU apps so HWC can do 2D composition. */ #ifndef gcdGPU_LINEAR_BUFFER_ENABLED -# define gcdGPU_LINEAR_BUFFER_ENABLED 0 +# define gcdGPU_LINEAR_BUFFER_ENABLED 1 +#endif + +/* + gcdENABLE_RENDER_INTO_WINDOW + + Enable Render-Into-Window (ie, No-Resolve) feature on android. + NOTE that even if enabled, it still depends on hardware feature and + android application behavior. When hardware feature or application + behavior can not support render into window mode, it will fail back + to normal mode. + When Render-Into-Window is finally used, window back buffer of android + applications will be allocated matching render target tiling format. + Otherwise buffer tiling is decided by the above option + 'gcdGPU_LINEAR_BUFFER_ENABLED'. +*/ +#ifndef gcdENABLE_RENDER_INTO_WINDOW +# define gcdENABLE_RENDER_INTO_WINDOW 1 #endif /* @@ -758,7 +784,11 @@ #endif #ifndef gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST -# define gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST 0 +# ifdef ANDROID +# define gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST 1 +# else +# define gcdANDROID_UNALIGNED_LINEAR_COMPOSITION_ADJUST 0 +# endif #endif #ifndef gcdENABLE_PE_DITHER_FIX @@ -800,6 +830,10 @@ # define gcdDISALBE_EARLY_EARLY_Z 1 #endif +#ifndef gcdSHADER_SRC_BY_MACHINECODE +# define gcdSHADER_SRC_BY_MACHINECODE 1 +#endif + /* gcdLINK_QUEUE_SIZE @@ -849,11 +883,20 @@ #define gcdUSE_NPOT_PATCH 1 #endif - #ifndef gcdSYNC # define gcdSYNC 1 #endif +#ifndef gcdENABLE_SPECIAL_HINT3 +# define gcdENABLE_SPECIAL_HINT3 1 +#endif + +#if defined(ANDROID) +#ifndef gcdPRE_ROTATION +# define gcdPRE_ROTATION 1 +#endif +#endif + /* gcdDVFS @@ -866,4 +909,39 @@ # define gcdDVFS_POLLING_TIME (gcdDVFS_ANAYLSE_WINDOW * 4) #endif +/* + gcdANDROID_NATIVE_FENCE_SYNC + + Enable android native fence sync. It is introduced since jellybean-4.2. + Depends on linux kernel option: CONFIG_SYNC. + + 0: Disabled + 1: Build framework for native fence sync feature, and EGL extension + 2: Enable async swap buffers for client + * Native fence sync for client 'queueBuffer' in EGL, which is + 'acquireFenceFd' for layer in compositor side. + 3. Enable async hwcomposer composition. + * 'releaseFenceFd' for layer in compositor side, which is native + fence sync when client 'dequeueBuffer' + * Native fence sync for compositor 'queueBuffer' in EGL, which is + 'acquireFenceFd' for framebuffer target for DC + */ +#ifndef gcdANDROID_NATIVE_FENCE_SYNC +# define gcdANDROID_NATIVE_FENCE_SYNC 0 +#endif + +#ifndef gcdFORCE_MIPMAP +# define gcdFORCE_MIPMAP 0 +#endif + +/* + gcdFORCE_GAL_LOAD_TWICE + + When non-zero, each thread except the main one will load libGAL.so twice to avoid potential segmetantion fault when app using dlopen/dlclose. + If threads exit arbitrarily, libGAL.so may not unload until the process quit. + */ +#ifndef gcdFORCE_GAL_LOAD_TWICE +# define gcdFORCE_GAL_LOAD_TWICE 0 +#endif + #endif /* __gc_hal_options_h_ */ diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h index 3e450ba..aed73aa 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h @@ -45,509 +45,115 @@ extern "C" { #define gcdNEW_PROFILER_FILE 1 #endif -/* OpenGL ES11 API IDs. */ -#define ES11_ACTIVETEXTURE 1 -#define ES11_ALPHAFUNC (ES11_ACTIVETEXTURE + 1) -#define ES11_ALPHAFUNCX (ES11_ALPHAFUNC + 1) -#define ES11_BINDBUFFER (ES11_ALPHAFUNCX + 1) -#define ES11_BINDTEXTURE (ES11_BINDBUFFER + 1) -#define ES11_BLENDFUNC (ES11_BINDTEXTURE + 1) -#define ES11_BUFFERDATA (ES11_BLENDFUNC + 1) -#define ES11_BUFFERSUBDATA (ES11_BUFFERDATA + 1) -#define ES11_CLEAR (ES11_BUFFERSUBDATA + 1) -#define ES11_CLEARCOLOR (ES11_CLEAR + 1) -#define ES11_CLEARCOLORX (ES11_CLEARCOLOR + 1) -#define ES11_CLEARDEPTHF (ES11_CLEARCOLORX + 1) -#define ES11_CLEARDEPTHX (ES11_CLEARDEPTHF + 1) -#define ES11_CLEARSTENCIL (ES11_CLEARDEPTHX + 1) -#define ES11_CLIENTACTIVETEXTURE (ES11_CLEARSTENCIL + 1) -#define ES11_CLIPPLANEF (ES11_CLIENTACTIVETEXTURE + 1) -#define ES11_CLIPPLANEX (ES11_CLIPPLANEF + 1) -#define ES11_COLOR4F (ES11_CLIPPLANEX + 1) -#define ES11_COLOR4UB (ES11_COLOR4F + 1) -#define ES11_COLOR4X (ES11_COLOR4UB + 1) -#define ES11_COLORMASK (ES11_COLOR4X + 1) -#define ES11_COLORPOINTER (ES11_COLORMASK + 1) -#define ES11_COMPRESSEDTEXIMAGE2D (ES11_COLORPOINTER + 1) -#define ES11_COMPRESSEDTEXSUBIMAGE2D (ES11_COMPRESSEDTEXIMAGE2D + 1) -#define ES11_COPYTEXIMAGE2D (ES11_COMPRESSEDTEXSUBIMAGE2D + 1) -#define ES11_COPYTEXSUBIMAGE2D (ES11_COPYTEXIMAGE2D + 1) -#define ES11_CULLFACE (ES11_COPYTEXSUBIMAGE2D + 1) -#define ES11_DELETEBUFFERS (ES11_CULLFACE + 1) -#define ES11_DELETETEXTURES (ES11_DELETEBUFFERS + 1) -#define ES11_DEPTHFUNC (ES11_DELETETEXTURES + 1) -#define ES11_DEPTHMASK (ES11_DEPTHFUNC + 1) -#define ES11_DEPTHRANGEF (ES11_DEPTHMASK + 1) -#define ES11_DEPTHRANGEX (ES11_DEPTHRANGEF + 1) -#define ES11_DISABLE (ES11_DEPTHRANGEX + 1) -#define ES11_DISABLECLIENTSTATE (ES11_DISABLE + 1) -#define ES11_DRAWARRAYS (ES11_DISABLECLIENTSTATE + 1) -#define ES11_DRAWELEMENTS (ES11_DRAWARRAYS + 1) -#define ES11_ENABLE (ES11_DRAWELEMENTS + 1) -#define ES11_ENABLECLIENTSTATE (ES11_ENABLE + 1) -#define ES11_FINISH (ES11_ENABLECLIENTSTATE + 1) -#define ES11_FLUSH (ES11_FINISH + 1) -#define ES11_FOGF (ES11_FLUSH + 1) -#define ES11_FOGFV (ES11_FOGF + 1) -#define ES11_FOGX (ES11_FOGFV + 1) -#define ES11_FOGXV (ES11_FOGX + 1) -#define ES11_FRONTFACE (ES11_FOGXV + 1) -#define ES11_FRUSTUMF (ES11_FRONTFACE + 1) -#define ES11_FRUSTUMX (ES11_FRUSTUMF + 1) -#define ES11_GENBUFFERS (ES11_FRUSTUMX + 1) -#define ES11_GENTEXTURES (ES11_GENBUFFERS + 1) -#define ES11_GETBOOLEANV (ES11_GENTEXTURES + 1) -#define ES11_GETBUFFERPARAMETERIV (ES11_GETBOOLEANV + 1) -#define ES11_GETCLIPPLANEF (ES11_GETBUFFERPARAMETERIV + 1) -#define ES11_GETCLIPPLANEX (ES11_GETCLIPPLANEF + 1) -#define ES11_GETERROR (ES11_GETCLIPPLANEX + 1) -#define ES11_GETFIXEDV (ES11_GETERROR + 1) -#define ES11_GETFLOATV (ES11_GETFIXEDV + 1) -#define ES11_GETINTEGERV (ES11_GETFLOATV + 1) -#define ES11_GETLIGHTFV (ES11_GETINTEGERV + 1) -#define ES11_GETLIGHTXV (ES11_GETLIGHTFV + 1) -#define ES11_GETMATERIALFV (ES11_GETLIGHTXV + 1) -#define ES11_GETMATERIALXV (ES11_GETMATERIALFV + 1) -#define ES11_GETPOINTERV (ES11_GETMATERIALXV + 1) -#define ES11_GETSTRING (ES11_GETPOINTERV + 1) -#define ES11_GETTEXENVFV (ES11_GETSTRING + 1) -#define ES11_GETTEXENVIV (ES11_GETTEXENVFV + 1) -#define ES11_GETTEXENVXV (ES11_GETTEXENVIV + 1) -#define ES11_GETTEXPARAMETERFV (ES11_GETTEXENVXV + 1) -#define ES11_GETTEXPARAMETERIV (ES11_GETTEXPARAMETERFV + 1) -#define ES11_GETTEXPARAMETERXV (ES11_GETTEXPARAMETERIV + 1) -#define ES11_HINT (ES11_GETTEXPARAMETERXV + 1) -#define ES11_ISBUFFER (ES11_HINT + 1) -#define ES11_ISENABLED (ES11_ISBUFFER + 1) -#define ES11_ISTEXTURE (ES11_ISENABLED + 1) -#define ES11_LIGHTF (ES11_ISTEXTURE + 1) -#define ES11_LIGHTFV (ES11_LIGHTF + 1) -#define ES11_LIGHTMODELF (ES11_LIGHTFV + 1) -#define ES11_LIGHTMODELFV (ES11_LIGHTMODELF + 1) -#define ES11_LIGHTMODELX (ES11_LIGHTMODELFV + 1) -#define ES11_LIGHTMODELXV (ES11_LIGHTMODELX + 1) -#define ES11_LIGHTX (ES11_LIGHTMODELXV + 1) -#define ES11_LIGHTXV (ES11_LIGHTX + 1) -#define ES11_LINEWIDTH (ES11_LIGHTXV + 1) -#define ES11_LINEWIDTHX (ES11_LINEWIDTH + 1) -#define ES11_LOADIDENTITY (ES11_LINEWIDTHX + 1) -#define ES11_LOADMATRIXF (ES11_LOADIDENTITY + 1) -#define ES11_LOADMATRIXX (ES11_LOADMATRIXF + 1) -#define ES11_LOGICOP (ES11_LOADMATRIXX + 1) -#define ES11_MATERIALF (ES11_LOGICOP + 1) -#define ES11_MATERIALFV (ES11_MATERIALF + 1) -#define ES11_MATERIALX (ES11_MATERIALFV + 1) -#define ES11_MATERIALXV (ES11_MATERIALX + 1) -#define ES11_MATRIXMODE (ES11_MATERIALXV + 1) -#define ES11_MULTITEXCOORD4F (ES11_MATRIXMODE + 1) -#define ES11_MULTITEXCOORD4X (ES11_MULTITEXCOORD4F + 1) -#define ES11_MULTMATRIXF (ES11_MULTITEXCOORD4X + 1) -#define ES11_MULTMATRIXX (ES11_MULTMATRIXF + 1) -#define ES11_NORMAL3F (ES11_MULTMATRIXX + 1) -#define ES11_NORMAL3X (ES11_NORMAL3F + 1) -#define ES11_NORMALPOINTER (ES11_NORMAL3X + 1) -#define ES11_ORTHOF (ES11_NORMALPOINTER + 1) -#define ES11_ORTHOX (ES11_ORTHOF + 1) -#define ES11_PIXELSTOREI (ES11_ORTHOX + 1) -#define ES11_POINTPARAMETERF (ES11_PIXELSTOREI + 1) -#define ES11_POINTPARAMETERFV (ES11_POINTPARAMETERF + 1) -#define ES11_POINTPARAMETERX (ES11_POINTPARAMETERFV + 1) -#define ES11_POINTPARAMETERXV (ES11_POINTPARAMETERX + 1) -#define ES11_POINTSIZE (ES11_POINTPARAMETERXV + 1) -#define ES11_POINTSIZEX (ES11_POINTSIZE + 1) -#define ES11_POLYGONOFFSET (ES11_POINTSIZEX + 1) -#define ES11_POLYGONOFFSETX (ES11_POLYGONOFFSET + 1) -#define ES11_POPMATRIX (ES11_POLYGONOFFSETX + 1) -#define ES11_PUSHMATRIX (ES11_POPMATRIX + 1) -#define ES11_READPIXELS (ES11_PUSHMATRIX + 1) -#define ES11_ROTATEF (ES11_READPIXELS + 1) -#define ES11_ROTATEX (ES11_ROTATEF + 1) -#define ES11_SAMPLECOVERAGE (ES11_ROTATEX + 1) -#define ES11_SAMPLECOVERAGEX (ES11_SAMPLECOVERAGE + 1) -#define ES11_SCALEF (ES11_SAMPLECOVERAGEX + 1) -#define ES11_SCALEX (ES11_SCALEF + 1) -#define ES11_SCISSOR (ES11_SCALEX + 1) -#define ES11_SHADEMODEL (ES11_SCISSOR + 1) -#define ES11_STENCILFUNC (ES11_SHADEMODEL + 1) -#define ES11_STENCILMASK (ES11_STENCILFUNC + 1) -#define ES11_STENCILOP (ES11_STENCILMASK + 1) -#define ES11_TEXCOORDPOINTER (ES11_STENCILOP + 1) -#define ES11_TEXENVF (ES11_TEXCOORDPOINTER + 1) -#define ES11_TEXENVFV (ES11_TEXENVF + 1) -#define ES11_TEXENVI (ES11_TEXENVFV + 1) -#define ES11_TEXENVIV (ES11_TEXENVI + 1) -#define ES11_TEXENVX (ES11_TEXENVIV + 1) -#define ES11_TEXENVXV (ES11_TEXENVX + 1) -#define ES11_TEXIMAGE2D (ES11_TEXENVXV + 1) -#define ES11_TEXPARAMETERF (ES11_TEXIMAGE2D + 1) -#define ES11_TEXPARAMETERFV (ES11_TEXPARAMETERF + 1) -#define ES11_TEXPARAMETERI (ES11_TEXPARAMETERFV + 1) -#define ES11_TEXPARAMETERIV (ES11_TEXPARAMETERI + 1) -#define ES11_TEXPARAMETERX (ES11_TEXPARAMETERIV + 1) -#define ES11_TEXPARAMETERXV (ES11_TEXPARAMETERX + 1) -#define ES11_TEXSUBIMAGE2D (ES11_TEXPARAMETERXV + 1) -#define ES11_TRANSLATEF (ES11_TEXSUBIMAGE2D + 1) -#define ES11_TRANSLATEX (ES11_TRANSLATEF + 1) -#define ES11_VERTEXPOINTER (ES11_TRANSLATEX + 1) -#define ES11_VIEWPORT (ES11_VERTEXPOINTER + 1) -#define ES11_BLENDEQUATIONOES (ES11_VIEWPORT + 1) -#define ES11_BLENDFUNCSEPERATEOES (ES11_BLENDEQUATIONOES + 1) -#define ES11_BLENDEQUATIONSEPARATEOES (ES11_BLENDFUNCSEPERATEOES + 1) -#define ES11_GLMAPBUFFEROES (ES11_BLENDEQUATIONSEPARATEOES + 1) -#define ES11_GLUNMAPBUFFEROES (ES11_GLMAPBUFFEROES + 1) -#define ES11_GLGETBUFFERPOINTERVOES (ES11_GLUNMAPBUFFEROES + 1) -#define ES11_CALLS (ES11_GLGETBUFFERPOINTERVOES + 1) -#define ES11_DRAWCALLS (ES11_CALLS + 1) -#define ES11_STATECHANGECALLS (ES11_DRAWCALLS + 1) -#define ES11_POINTCOUNT (ES11_STATECHANGECALLS + 1) -#define ES11_LINECOUNT (ES11_POINTCOUNT + 1) -#define ES11_TRIANGLECOUNT (ES11_LINECOUNT + 1) - -/* OpenGL ES2X API IDs. */ -#define ES20_ACTIVETEXTURE 1 -#define ES20_ATTACHSHADER (ES20_ACTIVETEXTURE + 1) -#define ES20_BINDATTRIBLOCATION (ES20_ATTACHSHADER + 1) -#define ES20_BINDBUFFER (ES20_BINDATTRIBLOCATION + 1) -#define ES20_BINDFRAMEBUFFER (ES20_BINDBUFFER + 1) -#define ES20_BINDRENDERBUFFER (ES20_BINDFRAMEBUFFER + 1) -#define ES20_BINDTEXTURE (ES20_BINDRENDERBUFFER + 1) -#define ES20_BLENDCOLOR (ES20_BINDTEXTURE + 1) -#define ES20_BLENDEQUATION (ES20_BLENDCOLOR + 1) -#define ES20_BLENDEQUATIONSEPARATE (ES20_BLENDEQUATION + 1) -#define ES20_BLENDFUNC (ES20_BLENDEQUATIONSEPARATE + 1) -#define ES20_BLENDFUNCSEPARATE (ES20_BLENDFUNC + 1) -#define ES20_BUFFERDATA (ES20_BLENDFUNCSEPARATE + 1) -#define ES20_BUFFERSUBDATA (ES20_BUFFERDATA + 1) -#define ES20_CHECKFRAMEBUFFERSTATUS (ES20_BUFFERSUBDATA + 1) -#define ES20_CLEAR (ES20_CHECKFRAMEBUFFERSTATUS + 1) -#define ES20_CLEARCOLOR (ES20_CLEAR + 1) -#define ES20_CLEARDEPTHF (ES20_CLEARCOLOR + 1) -#define ES20_CLEARSTENCIL (ES20_CLEARDEPTHF + 1) -#define ES20_COLORMASK (ES20_CLEARSTENCIL + 1) -#define ES20_COMPILESHADER (ES20_COLORMASK + 1) -#define ES20_COMPRESSEDTEXIMAGE2D (ES20_COMPILESHADER + 1) -#define ES20_COMPRESSEDTEXSUBIMAGE2D (ES20_COMPRESSEDTEXIMAGE2D + 1) -#define ES20_COPYTEXIMAGE2D (ES20_COMPRESSEDTEXSUBIMAGE2D + 1) -#define ES20_COPYTEXSUBIMAGE2D (ES20_COPYTEXIMAGE2D + 1) -#define ES20_CREATEPROGRAM (ES20_COPYTEXSUBIMAGE2D + 1) -#define ES20_CREATESHADER (ES20_CREATEPROGRAM + 1) -#define ES20_CULLFACE (ES20_CREATESHADER + 1) -#define ES20_DELETEBUFFERS (ES20_CULLFACE + 1) -#define ES20_DELETEFRAMEBUFFERS (ES20_DELETEBUFFERS + 1) -#define ES20_DELETEPROGRAM (ES20_DELETEFRAMEBUFFERS + 1) -#define ES20_DELETERENDERBUFFERS (ES20_DELETEPROGRAM + 1) -#define ES20_DELETESHADER (ES20_DELETERENDERBUFFERS + 1) -#define ES20_DELETETEXTURES (ES20_DELETESHADER + 1) -#define ES20_DEPTHFUNC (ES20_DELETETEXTURES + 1) -#define ES20_DEPTHMASK (ES20_DEPTHFUNC + 1) -#define ES20_DEPTHRANGEF (ES20_DEPTHMASK + 1) -#define ES20_DETACHSHADER (ES20_DEPTHRANGEF + 1) -#define ES20_DISABLE (ES20_DETACHSHADER + 1) -#define ES20_DISABLEVERTEXATTRIBARRAY (ES20_DISABLE + 1) -#define ES20_DRAWARRAYS (ES20_DISABLEVERTEXATTRIBARRAY + 1) -#define ES20_DRAWELEMENTS (ES20_DRAWARRAYS + 1) -#define ES20_ENABLE (ES20_DRAWELEMENTS + 1) -#define ES20_ENABLEVERTEXATTRIBARRAY (ES20_ENABLE + 1) -#define ES20_FINISH (ES20_ENABLEVERTEXATTRIBARRAY + 1) -#define ES20_FLUSH (ES20_FINISH + 1) -#define ES20_FRAMEBUFFERRENDERBUFFER (ES20_FLUSH + 1) -#define ES20_FRAMEBUFFERTEXTURE2D (ES20_FRAMEBUFFERRENDERBUFFER + 1) -#define ES20_FRONTFACE (ES20_FRAMEBUFFERTEXTURE2D + 1) -#define ES20_GENBUFFERS (ES20_FRONTFACE + 1) -#define ES20_GENERATEMIPMAP (ES20_GENBUFFERS + 1) -#define ES20_GENFRAMEBUFFERS (ES20_GENERATEMIPMAP + 1) -#define ES20_GENRENDERBUFFERS (ES20_GENFRAMEBUFFERS + 1) -#define ES20_GENTEXTURES (ES20_GENRENDERBUFFERS + 1) -#define ES20_GETACTIVEATTRIB (ES20_GENTEXTURES + 1) -#define ES20_GETACTIVEUNIFORM (ES20_GETACTIVEATTRIB + 1) -#define ES20_GETATTACHEDSHADERS (ES20_GETACTIVEUNIFORM + 1) -#define ES20_GETATTRIBLOCATION (ES20_GETATTACHEDSHADERS + 1) -#define ES20_GETBOOLEANV (ES20_GETATTRIBLOCATION + 1) -#define ES20_GETBUFFERPARAMETERIV (ES20_GETBOOLEANV + 1) -#define ES20_GETERROR (ES20_GETBUFFERPARAMETERIV + 1) -#define ES20_GETFLOATV (ES20_GETERROR + 1) -#define ES20_GETFRAMEBUFFERATTACHMENTPARAMETERIV (ES20_GETFLOATV + 1) -#define ES20_GETINTEGERV (ES20_GETFRAMEBUFFERATTACHMENTPARAMETERIV + 1) -#define ES20_GETPROGRAMIV (ES20_GETINTEGERV + 1) -#define ES20_GETPROGRAMINFOLOG (ES20_GETPROGRAMIV + 1) -#define ES20_GETRENDERBUFFERPARAMETERIV (ES20_GETPROGRAMINFOLOG + 1) -#define ES20_GETSHADERIV (ES20_GETRENDERBUFFERPARAMETERIV + 1) -#define ES20_GETSHADERINFOLOG (ES20_GETSHADERIV + 1) -#define ES20_GETSHADERPRECISIONFORMAT (ES20_GETSHADERINFOLOG + 1) -#define ES20_GETSHADERSOURCE (ES20_GETSHADERPRECISIONFORMAT + 1) -#define ES20_GETSTRING (ES20_GETSHADERSOURCE + 1) -#define ES20_GETTEXPARAMETERFV (ES20_GETSTRING + 1) -#define ES20_GETTEXPARAMETERIV (ES20_GETTEXPARAMETERFV + 1) -#define ES20_GETUNIFORMFV (ES20_GETTEXPARAMETERIV + 1) -#define ES20_GETUNIFORMIV (ES20_GETUNIFORMFV + 1) -#define ES20_GETUNIFORMLOCATION (ES20_GETUNIFORMIV + 1) -#define ES20_GETVERTEXATTRIBFV (ES20_GETUNIFORMLOCATION + 1) -#define ES20_GETVERTEXATTRIBIV (ES20_GETVERTEXATTRIBFV + 1) -#define ES20_GETVERTEXATTRIBPOINTERV (ES20_GETVERTEXATTRIBIV + 1) -#define ES20_HINT (ES20_GETVERTEXATTRIBPOINTERV + 1) -#define ES20_ISBUFFER (ES20_HINT + 1) -#define ES20_ISENABLED (ES20_ISBUFFER + 1) -#define ES20_ISFRAMEBUFFER (ES20_ISENABLED + 1) -#define ES20_ISPROGRAM (ES20_ISFRAMEBUFFER + 1) -#define ES20_ISRENDERBUFFER (ES20_ISPROGRAM + 1) -#define ES20_ISSHADER (ES20_ISRENDERBUFFER + 1) -#define ES20_ISTEXTURE (ES20_ISSHADER + 1) -#define ES20_LINEWIDTH (ES20_ISTEXTURE + 1) -#define ES20_LINKPROGRAM (ES20_LINEWIDTH + 1) -#define ES20_PIXELSTOREI (ES20_LINKPROGRAM + 1) -#define ES20_POLYGONOFFSET (ES20_PIXELSTOREI + 1) -#define ES20_READPIXELS (ES20_POLYGONOFFSET + 1) -#define ES20_RELEASESHADERCOMPILER (ES20_READPIXELS + 1) -#define ES20_RENDERBUFFERSTORAGE (ES20_RELEASESHADERCOMPILER + 1) -#define ES20_SAMPLECOVERAGE (ES20_RENDERBUFFERSTORAGE + 1) -#define ES20_SCISSOR (ES20_SAMPLECOVERAGE + 1) -#define ES20_SHADERBINARY (ES20_SCISSOR + 1) -#define ES20_SHADERSOURCE (ES20_SHADERBINARY + 1) -#define ES20_STENCILFUNC (ES20_SHADERSOURCE + 1) -#define ES20_STENCILFUNCSEPARATE (ES20_STENCILFUNC + 1) -#define ES20_STENCILMASK (ES20_STENCILFUNCSEPARATE + 1) -#define ES20_STENCILMASKSEPARATE (ES20_STENCILMASK + 1) -#define ES20_STENCILOP (ES20_STENCILMASKSEPARATE + 1) -#define ES20_STENCILOPSEPARATE (ES20_STENCILOP + 1) -#define ES20_TEXIMAGE2D (ES20_STENCILOPSEPARATE + 1) -#define ES20_TEXPARAMETERF (ES20_TEXIMAGE2D + 1) -#define ES20_TEXPARAMETERFV (ES20_TEXPARAMETERF + 1) -#define ES20_TEXPARAMETERI (ES20_TEXPARAMETERFV + 1) -#define ES20_TEXPARAMETERIV (ES20_TEXPARAMETERI + 1) -#define ES20_TEXSUBIMAGE2D (ES20_TEXPARAMETERIV + 1) -#define ES20_UNIFORM1F (ES20_TEXSUBIMAGE2D + 1) -#define ES20_UNIFORM1FV (ES20_UNIFORM1F + 1) -#define ES20_UNIFORM1I (ES20_UNIFORM1FV + 1) -#define ES20_UNIFORM1IV (ES20_UNIFORM1I + 1) -#define ES20_UNIFORM2F (ES20_UNIFORM1IV + 1) -#define ES20_UNIFORM2FV (ES20_UNIFORM2F + 1) -#define ES20_UNIFORM2I (ES20_UNIFORM2FV + 1) -#define ES20_UNIFORM2IV (ES20_UNIFORM2I + 1) -#define ES20_UNIFORM3F (ES20_UNIFORM2IV + 1) -#define ES20_UNIFORM3FV (ES20_UNIFORM3F + 1) -#define ES20_UNIFORM3I (ES20_UNIFORM3FV + 1) -#define ES20_UNIFORM3IV (ES20_UNIFORM3I + 1) -#define ES20_UNIFORM4F (ES20_UNIFORM3IV + 1) -#define ES20_UNIFORM4FV (ES20_UNIFORM4F + 1) -#define ES20_UNIFORM4I (ES20_UNIFORM4FV + 1) -#define ES20_UNIFORM4IV (ES20_UNIFORM4I + 1) -#define ES20_UNIFORMMATRIX2FV (ES20_UNIFORM4IV + 1) -#define ES20_UNIFORMMATRIX3FV (ES20_UNIFORMMATRIX2FV + 1) -#define ES20_UNIFORMMATRIX4FV (ES20_UNIFORMMATRIX3FV + 1) -#define ES20_USEPROGRAM (ES20_UNIFORMMATRIX4FV + 1) -#define ES20_VALIDATEPROGRAM (ES20_USEPROGRAM + 1) -#define ES20_VERTEXATTRIB1F (ES20_VALIDATEPROGRAM + 1) -#define ES20_VERTEXATTRIB1FV (ES20_VERTEXATTRIB1F + 1) -#define ES20_VERTEXATTRIB2F (ES20_VERTEXATTRIB1FV + 1) -#define ES20_VERTEXATTRIB2FV (ES20_VERTEXATTRIB2F + 1) -#define ES20_VERTEXATTRIB3F (ES20_VERTEXATTRIB2FV + 1) -#define ES20_VERTEXATTRIB3FV (ES20_VERTEXATTRIB3F + 1) -#define ES20_VERTEXATTRIB4F (ES20_VERTEXATTRIB3FV + 1) -#define ES20_VERTEXATTRIB4FV (ES20_VERTEXATTRIB4F + 1) -#define ES20_VERTEXATTRIBPOINTER (ES20_VERTEXATTRIB4FV + 1) -#define ES20_VIEWPORT (ES20_VERTEXATTRIBPOINTER + 1) -#define ES20_GETPROGRAMBINARYOES (ES20_VIEWPORT + 1) -#define ES20_PROGRAMBINARYOES (ES20_GETPROGRAMBINARYOES + 1) -#define ES20_TEXIMAGE3DOES (ES20_PROGRAMBINARYOES + 1) -#define ES20_TEXSUBIMAGE3DOES (ES20_TEXIMAGE3DOES + 1) -#define ES20_COPYSUBIMAGE3DOES (ES20_TEXSUBIMAGE3DOES + 1) -#define ES20_COMPRESSEDTEXIMAGE3DOES (ES20_COPYSUBIMAGE3DOES + 1) -#define ES20_COMPRESSEDTEXSUBIMAGE3DOES (ES20_COMPRESSEDTEXIMAGE3DOES + 1) -#define ES20_FRAMEBUFFERTEXTURE3DOES (ES20_COMPRESSEDTEXSUBIMAGE3DOES + 1) -#define ES20_BINDVERTEXARRAYOES (ES20_FRAMEBUFFERTEXTURE3DOES + 1) -#define ES20_GENVERTEXARRAYOES (ES20_BINDVERTEXARRAYOES + 1) -#define ES20_ISVERTEXARRAYOES (ES20_GENVERTEXARRAYOES + 1) -#define ES20_DELETEVERTEXARRAYOES (ES20_ISVERTEXARRAYOES + 1) -#define ES20_GLMAPBUFFEROES (ES20_DELETEVERTEXARRAYOES + 1) -#define ES20_GLUNMAPBUFFEROES (ES20_GLMAPBUFFEROES + 1) -#define ES20_GLGETBUFFERPOINTERVOES (ES20_GLUNMAPBUFFEROES + 1) -#define ES20_DISCARDFRAMEBUFFEREXT (ES20_GLGETBUFFERPOINTERVOES + 1) -#define ES20_CALLS (ES20_DISCARDFRAMEBUFFEREXT + 1) -#define ES20_DRAWCALLS (ES20_CALLS + 1) -#define ES20_STATECHANGECALLS (ES20_DRAWCALLS + 1) -#define ES20_POINTCOUNT (ES20_STATECHANGECALLS + 1) -#define ES20_LINECOUNT (ES20_POINTCOUNT + 1) -#define ES20_TRIANGLECOUNT (ES20_LINECOUNT + 1) - -/* OpenVG API IDs. */ -#define VG11_APPENDPATH 1 -#define VG11_APPENDPATHDATA (VG11_APPENDPATH + 1) -#define VG11_CHILDIMAGE (VG11_APPENDPATHDATA + 1) -#define VG11_CLEAR (VG11_CHILDIMAGE + 1) -#define VG11_CLEARGLYPH (VG11_CLEAR + 1) -#define VG11_CLEARIMAGE (VG11_CLEARGLYPH + 1) -#define VG11_CLEARPATH (VG11_CLEARIMAGE + 1) -#define VG11_COLORMATRIX (VG11_CLEARPATH + 1) -#define VG11_CONVOLVE (VG11_COLORMATRIX + 1) -#define VG11_COPYIMAGE (VG11_CONVOLVE + 1) -#define VG11_COPYMASK (VG11_COPYIMAGE + 1) -#define VG11_COPYPIXELS (VG11_COPYMASK + 1) -#define VG11_CREATEFONT (VG11_COPYPIXELS + 1) -#define VG11_CREATEIMAGE (VG11_CREATEFONT + 1) -#define VG11_CREATEMASKLAYER (VG11_CREATEIMAGE + 1) -#define VG11_CREATEPAINT (VG11_CREATEMASKLAYER + 1) -#define VG11_CREATEPATH (VG11_CREATEPAINT + 1) -#define VG11_DESTROYFONT (VG11_CREATEPATH + 1) -#define VG11_DESTROYIMAGE (VG11_DESTROYFONT + 1) -#define VG11_DESTROYMASKLAYER (VG11_DESTROYIMAGE + 1) -#define VG11_DESTROYPAINT (VG11_DESTROYMASKLAYER + 1) -#define VG11_DESTROYPATH (VG11_DESTROYPAINT + 1) -#define VG11_DRAWGLYPH (VG11_DESTROYPATH + 1) -#define VG11_DRAWGLYPHS (VG11_DRAWGLYPH + 1) -#define VG11_DRAWIMAGE (VG11_DRAWGLYPHS + 1) -#define VG11_DRAWPATH (VG11_DRAWIMAGE + 1) -#define VG11_FILLMASKLAYER (VG11_DRAWPATH + 1) -#define VG11_FINISH (VG11_FILLMASKLAYER + 1) -#define VG11_FLUSH (VG11_FINISH + 1) -#define VG11_GAUSSIANBLUR (VG11_FLUSH + 1) -#define VG11_GETCOLOR (VG11_GAUSSIANBLUR + 1) -#define VG11_GETERROR (VG11_GETCOLOR + 1) -#define VG11_GETF (VG11_GETERROR + 1) -#define VG11_GETFV (VG11_GETF + 1) -#define VG11_GETI (VG11_GETFV + 1) -#define VG11_GETIMAGESUBDATA (VG11_GETI + 1) -#define VG11_GETIV (VG11_GETIMAGESUBDATA + 1) -#define VG11_GETMATRIX (VG11_GETIV + 1) -#define VG11_GETPAINT (VG11_GETMATRIX + 1) -#define VG11_GETPARAMETERF (VG11_GETPAINT + 1) -#define VG11_GETPARAMETERFV (VG11_GETPARAMETERF + 1) -#define VG11_GETPARAMETERI (VG11_GETPARAMETERFV + 1) -#define VG11_GETPARAMETERIV (VG11_GETPARAMETERI + 1) -#define VG11_GETPARAMETERVECTORSIZE (VG11_GETPARAMETERIV + 1) -#define VG11_GETPARENT (VG11_GETPARAMETERVECTORSIZE + 1) -#define VG11_GETPATHCAPABILITIES (VG11_GETPARENT + 1) -#define VG11_GETPIXELS (VG11_GETPATHCAPABILITIES + 1) -#define VG11_GETSTRING (VG11_GETPIXELS + 1) -#define VG11_GETVECTORSIZE (VG11_GETSTRING + 1) -#define VG11_HARDWAREQUERY (VG11_GETVECTORSIZE + 1) -#define VG11_IMAGESUBDATA (VG11_HARDWAREQUERY + 1) -#define VG11_INTERPOLATEPATH (VG11_IMAGESUBDATA + 1) -#define VG11_LOADIDENTITY (VG11_INTERPOLATEPATH + 1) -#define VG11_LOADMATRIX (VG11_LOADIDENTITY + 1) -#define VG11_LOOKUP (VG11_LOADMATRIX + 1) -#define VG11_LOOKUPSINGLE (VG11_LOOKUP + 1) -#define VG11_MASK (VG11_LOOKUPSINGLE + 1) -#define VG11_MODIFYPATHCOORDS (VG11_MASK + 1) -#define VG11_MULTMATRIX (VG11_MODIFYPATHCOORDS + 1) -#define VG11_PAINTPATTERN (VG11_MULTMATRIX + 1) -#define VG11_PATHBOUNDS (VG11_PAINTPATTERN + 1) -#define VG11_PATHLENGTH (VG11_PATHBOUNDS + 1) -#define VG11_PATHTRANSFORMEDBOUNDS (VG11_PATHLENGTH + 1) -#define VG11_POINTALONGPATH (VG11_PATHTRANSFORMEDBOUNDS + 1) -#define VG11_READPIXELS (VG11_POINTALONGPATH + 1) -#define VG11_REMOVEPATHCAPABILITIES (VG11_READPIXELS + 1) -#define VG11_RENDERTOMASK (VG11_REMOVEPATHCAPABILITIES + 1) -#define VG11_ROTATE (VG11_RENDERTOMASK + 1) -#define VG11_SCALE (VG11_ROTATE + 1) -#define VG11_SEPARABLECONVOLVE (VG11_SCALE + 1) -#define VG11_SETCOLOR (VG11_SEPARABLECONVOLVE + 1) -#define VG11_SETF (VG11_SETCOLOR + 1) -#define VG11_SETFV (VG11_SETF + 1) -#define VG11_SETGLYPHTOIMAGE (VG11_SETFV + 1) -#define VG11_SETGLYPHTOPATH (VG11_SETGLYPHTOIMAGE + 1) -#define VG11_SETI (VG11_SETGLYPHTOPATH + 1) -#define VG11_SETIV (VG11_SETI + 1) -#define VG11_SETPAINT (VG11_SETIV + 1) -#define VG11_SETPARAMETERF (VG11_SETPAINT + 1) -#define VG11_SETPARAMETERFV (VG11_SETPARAMETERF + 1) -#define VG11_SETPARAMETERI (VG11_SETPARAMETERFV + 1) -#define VG11_SETPARAMETERIV (VG11_SETPARAMETERI + 1) -#define VG11_SETPIXELS (VG11_SETPARAMETERIV + 1) -#define VG11_SHEAR (VG11_SETPIXELS + 1) -#define VG11_TRANSFORMPATH (VG11_SHEAR + 1) -#define VG11_TRANSLATE (VG11_TRANSFORMPATH + 1) -#define VG11_WRITEPIXELS (VG11_TRANSLATE + 1) -#define VG11_CALLS (VG11_WRITEPIXELS + 1) -#define VG11_DRAWCALLS (VG11_CALLS + 1) -#define VG11_STATECHANGECALLS (VG11_DRAWCALLS + 1) -#define VG11_FILLCOUNT (VG11_STATECHANGECALLS + 1) -#define VG11_STROKECOUNT (VG11_FILLCOUNT + 1) +#define ES11_CALLS 151 +#define ES11_DRAWCALLS (ES11_CALLS + 1) +#define ES11_STATECHANGECALLS (ES11_DRAWCALLS + 1) +#define ES11_POINTCOUNT (ES11_STATECHANGECALLS + 1) +#define ES11_LINECOUNT (ES11_POINTCOUNT + 1) +#define ES11_TRIANGLECOUNT (ES11_LINECOUNT + 1) + +#define ES20_CALLS 159 +#define ES20_DRAWCALLS (ES20_CALLS + 1) +#define ES20_STATECHANGECALLS (ES20_DRAWCALLS + 1) +#define ES20_POINTCOUNT (ES20_STATECHANGECALLS + 1) +#define ES20_LINECOUNT (ES20_POINTCOUNT + 1) +#define ES20_TRIANGLECOUNT (ES20_LINECOUNT + 1) + +#define VG11_CALLS 88 +#define VG11_DRAWCALLS (VG11_CALLS + 1) +#define VG11_STATECHANGECALLS (VG11_DRAWCALLS + 1) +#define VG11_FILLCOUNT (VG11_STATECHANGECALLS + 1) +#define VG11_STROKECOUNT (VG11_FILLCOUNT + 1) /* End of Driver API ID Definitions. */ /* HAL & MISC IDs. */ -#define HAL_VERTBUFNEWBYTEALLOC 1 -#define HAL_VERTBUFTOTALBYTEALLOC (HAL_VERTBUFNEWBYTEALLOC + 1) -#define HAL_VERTBUFNEWOBJALLOC (HAL_VERTBUFTOTALBYTEALLOC + 1) -#define HAL_VERTBUFTOTALOBJALLOC (HAL_VERTBUFNEWOBJALLOC + 1) -#define HAL_INDBUFNEWBYTEALLOC (HAL_VERTBUFTOTALOBJALLOC + 1) -#define HAL_INDBUFTOTALBYTEALLOC (HAL_INDBUFNEWBYTEALLOC + 1) -#define HAL_INDBUFNEWOBJALLOC (HAL_INDBUFTOTALBYTEALLOC + 1) -#define HAL_INDBUFTOTALOBJALLOC (HAL_INDBUFNEWOBJALLOC + 1) -#define HAL_TEXBUFNEWBYTEALLOC (HAL_INDBUFTOTALOBJALLOC + 1) -#define HAL_TEXBUFTOTALBYTEALLOC (HAL_TEXBUFNEWBYTEALLOC + 1) -#define HAL_TEXBUFNEWOBJALLOC (HAL_TEXBUFTOTALBYTEALLOC + 1) -#define HAL_TEXBUFTOTALOBJALLOC (HAL_TEXBUFNEWOBJALLOC + 1) - -#define GPU_CYCLES 1 -#define GPU_READ64BYTE (GPU_CYCLES + 1) -#define GPU_WRITE64BYTE (GPU_READ64BYTE + 1) -#define GPU_TOTALCYCLES (GPU_WRITE64BYTE + 1) -#define GPU_IDLECYCLES (GPU_TOTALCYCLES + 1) - -#define VS_INSTCOUNT 1 -#define VS_BRANCHINSTCOUNT (VS_INSTCOUNT + 1) -#define VS_TEXLDINSTCOUNT (VS_BRANCHINSTCOUNT + 1) -#define VS_RENDEREDVERTCOUNT (VS_TEXLDINSTCOUNT + 1) - -#define PS_INSTCOUNT 1 -#define PS_BRANCHINSTCOUNT (PS_INSTCOUNT + 1) -#define PS_TEXLDINSTCOUNT (PS_BRANCHINSTCOUNT + 1) -#define PS_RENDEREDPIXCOUNT (PS_TEXLDINSTCOUNT + 1) - -#define PA_INVERTCOUNT 1 -#define PA_INPRIMCOUNT (PA_INVERTCOUNT + 1) -#define PA_OUTPRIMCOUNT (PA_INPRIMCOUNT + 1) -#define PA_DEPTHCLIPCOUNT (PA_OUTPRIMCOUNT + 1) -#define PA_TRIVIALREJCOUNT (PA_DEPTHCLIPCOUNT + 1) -#define PA_CULLCOUNT (PA_TRIVIALREJCOUNT + 1) - -#define SE_TRIANGLECOUNT 1 -#define SE_LINECOUNT (SE_TRIANGLECOUNT + 1) - -#define RA_VALIDPIXCOUNT 1 -#define RA_TOTALQUADCOUNT (RA_VALIDPIXCOUNT + 1) -#define RA_VALIDQUADCOUNTEZ (RA_TOTALQUADCOUNT + 1) -#define RA_TOTALPRIMCOUNT (RA_VALIDQUADCOUNTEZ + 1) -#define RA_PIPECACHEMISSCOUNT (RA_TOTALPRIMCOUNT + 1) -#define RA_PREFCACHEMISSCOUNT (RA_PIPECACHEMISSCOUNT + 1) -#define RA_EEZCULLCOUNT (RA_PREFCACHEMISSCOUNT + 1) - -#define TX_TOTBILINEARREQ 1 -#define TX_TOTTRILINEARREQ (TX_TOTBILINEARREQ + 1) -#define TX_TOTDISCARDTEXREQ (TX_TOTTRILINEARREQ + 1) -#define TX_TOTTEXREQ (TX_TOTDISCARDTEXREQ + 1) -#define TX_MEMREADCOUNT (TX_TOTTEXREQ + 1) -#define TX_MEMREADIN8BCOUNT (TX_MEMREADCOUNT + 1) -#define TX_CACHEMISSCOUNT (TX_MEMREADIN8BCOUNT + 1) -#define TX_CACHEHITTEXELCOUNT (TX_CACHEMISSCOUNT + 1) -#define TX_CACHEMISSTEXELCOUNT (TX_CACHEHITTEXELCOUNT + 1) - -#define PE_KILLEDBYCOLOR 1 -#define PE_KILLEDBYDEPTH (PE_KILLEDBYCOLOR + 1) -#define PE_DRAWNBYCOLOR (PE_KILLEDBYDEPTH + 1) -#define PE_DRAWNBYDEPTH (PE_DRAWNBYCOLOR + 1) - -#define MC_READREQ8BPIPE 1 -#define MC_READREQ8BIP (MC_READREQ8BPIPE + 1) -#define MC_WRITEREQ8BPIPE (MC_READREQ8BIP + 1) - -#define AXI_READREQSTALLED 1 -#define AXI_WRITEREQSTALLED (AXI_READREQSTALLED + 1) -#define AXI_WRITEDATASTALLED (AXI_WRITEREQSTALLED + 1) - -#define PVS_INSTRCOUNT 1 -#define PVS_ALUINSTRCOUNT (PVS_INSTRCOUNT + 1) -#define PVS_TEXINSTRCOUNT (PVS_ALUINSTRCOUNT + 1) -#define PVS_ATTRIBCOUNT (PVS_TEXINSTRCOUNT + 1) -#define PVS_UNIFORMCOUNT (PVS_ATTRIBCOUNT + 1) -#define PVS_FUNCTIONCOUNT (PVS_UNIFORMCOUNT + 1) - -#define PPS_INSTRCOUNT 1 -#define PPS_ALUINSTRCOUNT (PPS_INSTRCOUNT + 1) -#define PPS_TEXINSTRCOUNT (PPS_ALUINSTRCOUNT + 1) -#define PPS_ATTRIBCOUNT (PPS_TEXINSTRCOUNT + 1) -#define PPS_UNIFORMCOUNT (PPS_ATTRIBCOUNT + 1) -#define PPS_FUNCTIONCOUNT (PPS_UNIFORMCOUNT + 1) +#define HAL_VERTBUFNEWBYTEALLOC 1 +#define HAL_VERTBUFTOTALBYTEALLOC (HAL_VERTBUFNEWBYTEALLOC + 1) +#define HAL_VERTBUFNEWOBJALLOC (HAL_VERTBUFTOTALBYTEALLOC + 1) +#define HAL_VERTBUFTOTALOBJALLOC (HAL_VERTBUFNEWOBJALLOC + 1) +#define HAL_INDBUFNEWBYTEALLOC (HAL_VERTBUFTOTALOBJALLOC + 1) +#define HAL_INDBUFTOTALBYTEALLOC (HAL_INDBUFNEWBYTEALLOC + 1) +#define HAL_INDBUFNEWOBJALLOC (HAL_INDBUFTOTALBYTEALLOC + 1) +#define HAL_INDBUFTOTALOBJALLOC (HAL_INDBUFNEWOBJALLOC + 1) +#define HAL_TEXBUFNEWBYTEALLOC (HAL_INDBUFTOTALOBJALLOC + 1) +#define HAL_TEXBUFTOTALBYTEALLOC (HAL_TEXBUFNEWBYTEALLOC + 1) +#define HAL_TEXBUFNEWOBJALLOC (HAL_TEXBUFTOTALBYTEALLOC + 1) +#define HAL_TEXBUFTOTALOBJALLOC (HAL_TEXBUFNEWOBJALLOC + 1) + +#define GPU_CYCLES 1 +#define GPU_READ64BYTE (GPU_CYCLES + 1) +#define GPU_WRITE64BYTE (GPU_READ64BYTE + 1) +#define GPU_TOTALCYCLES (GPU_WRITE64BYTE + 1) +#define GPU_IDLECYCLES (GPU_TOTALCYCLES + 1) + +#define VS_INSTCOUNT 1 +#define VS_BRANCHINSTCOUNT (VS_INSTCOUNT + 1) +#define VS_TEXLDINSTCOUNT (VS_BRANCHINSTCOUNT + 1) +#define VS_RENDEREDVERTCOUNT (VS_TEXLDINSTCOUNT + 1) +#define VS_SOURCE (VS_RENDEREDVERTCOUNT + 1) + +#define PS_INSTCOUNT 1 +#define PS_BRANCHINSTCOUNT (PS_INSTCOUNT + 1) +#define PS_TEXLDINSTCOUNT (PS_BRANCHINSTCOUNT + 1) +#define PS_RENDEREDPIXCOUNT (PS_TEXLDINSTCOUNT + 1) +#define PS_SOURCE (PS_RENDEREDPIXCOUNT + 1) + +#define PA_INVERTCOUNT 1 +#define PA_INPRIMCOUNT (PA_INVERTCOUNT + 1) +#define PA_OUTPRIMCOUNT (PA_INPRIMCOUNT + 1) +#define PA_DEPTHCLIPCOUNT (PA_OUTPRIMCOUNT + 1) +#define PA_TRIVIALREJCOUNT (PA_DEPTHCLIPCOUNT + 1) +#define PA_CULLCOUNT (PA_TRIVIALREJCOUNT + 1) + +#define SE_TRIANGLECOUNT 1 +#define SE_LINECOUNT (SE_TRIANGLECOUNT + 1) + +#define RA_VALIDPIXCOUNT 1 +#define RA_TOTALQUADCOUNT (RA_VALIDPIXCOUNT + 1) +#define RA_VALIDQUADCOUNTEZ (RA_TOTALQUADCOUNT + 1) +#define RA_TOTALPRIMCOUNT (RA_VALIDQUADCOUNTEZ + 1) +#define RA_PIPECACHEMISSCOUNT (RA_TOTALPRIMCOUNT + 1) +#define RA_PREFCACHEMISSCOUNT (RA_PIPECACHEMISSCOUNT + 1) +#define RA_EEZCULLCOUNT (RA_PREFCACHEMISSCOUNT + 1) + +#define TX_TOTBILINEARREQ 1 +#define TX_TOTTRILINEARREQ (TX_TOTBILINEARREQ + 1) +#define TX_TOTDISCARDTEXREQ (TX_TOTTRILINEARREQ + 1) +#define TX_TOTTEXREQ (TX_TOTDISCARDTEXREQ + 1) +#define TX_MEMREADCOUNT (TX_TOTTEXREQ + 1) +#define TX_MEMREADIN8BCOUNT (TX_MEMREADCOUNT + 1) +#define TX_CACHEMISSCOUNT (TX_MEMREADIN8BCOUNT + 1) +#define TX_CACHEHITTEXELCOUNT (TX_CACHEMISSCOUNT + 1) +#define TX_CACHEMISSTEXELCOUNT (TX_CACHEHITTEXELCOUNT + 1) + +#define PE_KILLEDBYCOLOR 1 +#define PE_KILLEDBYDEPTH (PE_KILLEDBYCOLOR + 1) +#define PE_DRAWNBYCOLOR (PE_KILLEDBYDEPTH + 1) +#define PE_DRAWNBYDEPTH (PE_DRAWNBYCOLOR + 1) + +#define MC_READREQ8BPIPE 1 +#define MC_READREQ8BIP (MC_READREQ8BPIPE + 1) +#define MC_WRITEREQ8BPIPE (MC_READREQ8BIP + 1) + +#define AXI_READREQSTALLED 1 +#define AXI_WRITEREQSTALLED (AXI_READREQSTALLED + 1) +#define AXI_WRITEDATASTALLED (AXI_WRITEREQSTALLED + 1) + +#define PVS_INSTRCOUNT 1 +#define PVS_ALUINSTRCOUNT (PVS_INSTRCOUNT + 1) +#define PVS_TEXINSTRCOUNT (PVS_ALUINSTRCOUNT + 1) +#define PVS_ATTRIBCOUNT (PVS_TEXINSTRCOUNT + 1) +#define PVS_UNIFORMCOUNT (PVS_ATTRIBCOUNT + 1) +#define PVS_FUNCTIONCOUNT (PVS_UNIFORMCOUNT + 1) +#define PVS_SOURCE (PVS_FUNCTIONCOUNT + 1) + +#define PPS_INSTRCOUNT 1 +#define PPS_ALUINSTRCOUNT (PPS_INSTRCOUNT + 1) +#define PPS_TEXINSTRCOUNT (PPS_ALUINSTRCOUNT + 1) +#define PPS_ATTRIBCOUNT (PPS_TEXINSTRCOUNT + 1) +#define PPS_UNIFORMCOUNT (PPS_ATTRIBCOUNT + 1) +#define PPS_FUNCTIONCOUNT (PPS_UNIFORMCOUNT + 1) +#define PPS_SOURCE (PPS_FUNCTIONCOUNT + 1) /* End of MISC Counter IDs. */ #ifdef gcdNEW_PROFILER_FILE @@ -578,8 +184,8 @@ extern "C" { #define VPG_ES11_TIME 0x170000 #define VPG_ES20_TIME 0x180000 #define VPG_FRAME 0x190000 -#define VPG_ES11_DRAW 0x200000 -#define VPG_ES20_DRAW 0x210000 +#define VPG_ES11_DRAW 0x200000 +#define VPG_ES20_DRAW 0x210000 #define VPG_END 0xff0000 /* Info. */ @@ -592,7 +198,7 @@ extern "C" { #define VPC_INFOSCREENSIZE (VPC_INFODRIVERMODE + 1) /* Counter Constants. */ -#define VPC_ELAPSETIME (VPG_TIME + 1) +#define VPC_ELAPSETIME (VPG_TIME + 1) #define VPC_CPUTIME (VPC_ELAPSETIME + 1) #define VPC_MEMMAXRES (VPG_MEM + 1) @@ -600,404 +206,28 @@ extern "C" { #define VPC_MEMUNSHAREDDATA (VPC_MEMSHARED + 1) #define VPC_MEMUNSHAREDSTACK (VPC_MEMUNSHAREDDATA + 1) -/* OpenGL ES11 Counters. */ -#define VPC_ES11ACTIVETEXTURE (VPG_ES11 + ES11_ACTIVETEXTURE) -#define VPC_ES11ALPHAFUNC (VPG_ES11 + ES11_ALPHAFUNC) -#define VPC_ES11ALPHAFUNCX (VPG_ES11 + ES11_ALPHAFUNCX) -#define VPC_ES11BINDBUFFER (VPG_ES11 + ES11_BINDBUFFER) -#define VPC_ES11BINDTEXTURE (VPG_ES11 + ES11_BINDTEXTURE) -#define VPC_ES11BLENDFUNC (VPG_ES11 + ES11_BLENDFUNC) -#define VPC_ES11BUFFERDATA (VPG_ES11 + ES11_BUFFERDATA) -#define VPC_ES11BUFFERSUBDATA (VPG_ES11 + ES11_BUFFERSUBDATA) -#define VPC_ES11CLEAR (VPG_ES11 + ES11_CLEAR) -#define VPC_ES11CLEARCOLOR (VPG_ES11 + ES11_CLEARCOLOR) -#define VPC_ES11CLEARCOLORX (VPG_ES11 + ES11_CLEARCOLORX) -#define VPC_ES11CLEARDEPTHF (VPG_ES11 + ES11_CLEARDEPTHF) -#define VPC_ES11CLEARDEPTHX (VPG_ES11 + ES11_CLEARDEPTHX) -#define VPC_ES11CLEARSTENCIL (VPG_ES11 + ES11_CLEARSTENCIL) -#define VPC_ES11CLIENTACTIVETEXTURE (VPG_ES11 + ES11_CLIENTACTIVETEXTURE) -#define VPC_ES11CLIPPLANEF (VPG_ES11 + ES11_CLIPPLANEF) -#define VPC_ES11CLIPPLANEX (VPG_ES11 + ES11_CLIPPLANEX) -#define VPC_ES11COLOR4F (VPG_ES11 + ES11_COLOR4F) -#define VPC_ES11COLOR4UB (VPG_ES11 + ES11_COLOR4UB) -#define VPC_ES11COLOR4X (VPG_ES11 + ES11_COLOR4X) -#define VPC_ES11COLORMASK (VPG_ES11 + ES11_COLORMASK) -#define VPC_ES11COLORPOINTER (VPG_ES11 + ES11_COLORPOINTER) -#define VPC_ES11COMPRESSEDTEXIMAGE2D (VPG_ES11 + ES11_COMPRESSEDTEXIMAGE2D) -#define VPC_ES11COMPRESSEDTEXSUBIMAGE2D (VPG_ES11 + ES11_COMPRESSEDTEXSUBIMAGE2D) -#define VPC_ES11COPYTEXIMAGE2D (VPG_ES11 + ES11_COPYTEXIMAGE2D) -#define VPC_ES11COPYTEXSUBIMAGE2D (VPG_ES11 + ES11_COPYTEXSUBIMAGE2D) -#define VPC_ES11CULLFACE (VPG_ES11 + ES11_CULLFACE) -#define VPC_ES11DELETEBUFFERS (VPG_ES11 + ES11_DELETEBUFFERS) -#define VPC_ES11DELETETEXTURES (VPG_ES11 + ES11_DELETETEXTURES) -#define VPC_ES11DEPTHFUNC (VPG_ES11 + ES11_DEPTHFUNC) -#define VPC_ES11DEPTHMASK (VPG_ES11 + ES11_DEPTHMASK) -#define VPC_ES11DEPTHRANGEF (VPG_ES11 + ES11_DEPTHRANGEF) -#define VPC_ES11DEPTHRANGEX (VPG_ES11 + ES11_DEPTHRANGEX) -#define VPC_ES11DISABLE (VPG_ES11 + ES11_DISABLE) -#define VPC_ES11DISABLECLIENTSTATE (VPG_ES11 + ES11_DISABLECLIENTSTATE) -#define VPC_ES11DRAWARRAYS (VPG_ES11 + ES11_DRAWARRAYS) -#define VPC_ES11DRAWELEMENTS (VPG_ES11 + ES11_DRAWELEMENTS) -#define VPC_ES11ENABLE (VPG_ES11 + ES11_ENABLE) -#define VPC_ES11ENABLECLIENTSTATE (VPG_ES11 + ES11_ENABLECLIENTSTATE) -#define VPC_ES11FINISH (VPG_ES11 + ES11_FINISH) -#define VPC_ES11FLUSH (VPG_ES11 + ES11_FLUSH) -#define VPC_ES11FOGF (VPG_ES11 + ES11_FOGF) -#define VPC_ES11FOGFV (VPG_ES11 + ES11_FOGFV) -#define VPC_ES11FOGX (VPG_ES11 + ES11_FOGX) -#define VPC_ES11FOGXV (VPG_ES11 + ES11_FOGXV) -#define VPC_ES11FRONTFACE (VPG_ES11 + ES11_FRONTFACE) -#define VPC_ES11FRUSTUMF (VPG_ES11 + ES11_FRUSTUMF) -#define VPC_ES11FRUSTUMX (VPG_ES11 + ES11_FRUSTUMX) -#define VPC_ES11GENBUFFERS (VPG_ES11 + ES11_GENBUFFERS) -#define VPC_ES11GENTEXTURES (VPG_ES11 + ES11_GENTEXTURES) -#define VPC_ES11GETBOOLEANV (VPG_ES11 + ES11_GETBOOLEANV) -#define VPC_ES11GETBUFFERPARAMETERIV (VPG_ES11 + ES11_GETBUFFERPARAMETERIV) -#define VPC_ES11GETCLIPPLANEF (VPG_ES11 + ES11_GETCLIPPLANEF) -#define VPC_ES11GETCLIPPLANEX (VPG_ES11 + ES11_GETCLIPPLANEX) -#define VPC_ES11GETERROR (VPG_ES11 + ES11_GETERROR) -#define VPC_ES11GETFIXEDV (VPG_ES11 + ES11_GETFIXEDV) -#define VPC_ES11GETFLOATV (VPG_ES11 + ES11_GETFLOATV) -#define VPC_ES11GETINTEGERV (VPG_ES11 + ES11_GETINTEGERV) -#define VPC_ES11GETLIGHTFV (VPG_ES11 + ES11_GETLIGHTFV) -#define VPC_ES11GETLIGHTXV (VPG_ES11 + ES11_GETLIGHTXV) -#define VPC_ES11GETMATERIALFV (VPG_ES11 + ES11_GETMATERIALFV) -#define VPC_ES11GETMATERIALXV (VPG_ES11 + ES11_GETMATERIALXV) -#define VPC_ES11GETPOINTERV (VPG_ES11 + ES11_GETPOINTERV) -#define VPC_ES11GETSTRING (VPG_ES11 + ES11_GETSTRING) -#define VPC_ES11GETTEXENVFV (VPG_ES11 + ES11_GETTEXENVFV) -#define VPC_ES11GETTEXENVIV (VPG_ES11 + ES11_GETTEXENVIV) -#define VPC_ES11GETTEXENVXV (VPG_ES11 + ES11_GETTEXENVXV) -#define VPC_ES11GETTEXPARAMETERFV (VPG_ES11 + ES11_GETTEXPARAMETERFV) -#define VPC_ES11GETTEXPARAMETERIV (VPG_ES11 + ES11_GETTEXPARAMETERIV) -#define VPC_ES11GETTEXPARAMETERXV (VPG_ES11 + ES11_GETTEXPARAMETERXV) -#define VPC_ES11HINT (VPG_ES11 + ES11_HINT) -#define VPC_ES11ISBUFFER (VPG_ES11 + ES11_ISBUFFER) -#define VPC_ES11ISENABLED (VPG_ES11 + ES11_ISENABLED) -#define VPC_ES11ISTEXTURE (VPG_ES11 + ES11_ISTEXTURE) -#define VPC_ES11LIGHTF (VPG_ES11 + ES11_LIGHTF) -#define VPC_ES11LIGHTFV (VPG_ES11 + ES11_LIGHTFV) -#define VPC_ES11LIGHTMODELF (VPG_ES11 + ES11_LIGHTMODELF) -#define VPC_ES11LIGHTMODELFV (VPG_ES11 + ES11_LIGHTMODELFV) -#define VPC_ES11LIGHTMODELX (VPG_ES11 + ES11_LIGHTMODELX) -#define VPC_ES11LIGHTMODELXV (VPG_ES11 + ES11_LIGHTMODELXV) -#define VPC_ES11LIGHTX (VPG_ES11 + ES11_LIGHTX) -#define VPC_ES11LIGHTXV (VPG_ES11 + ES11_LIGHTXV) -#define VPC_ES11LINEWIDTH (VPG_ES11 + ES11_LINEWIDTH) -#define VPC_ES11LINEWIDTHX (VPG_ES11 + ES11_LINEWIDTHX) -#define VPC_ES11LOADIDENTITY (VPG_ES11 + ES11_LOADIDENTITY) -#define VPC_ES11LOADMATRIXF (VPG_ES11 + ES11_LOADMATRIXF) -#define VPC_ES11LOADMATRIXX (VPG_ES11 + ES11_LOADMATRIXX) -#define VPC_ES11LOGICOP (VPG_ES11 + ES11_LOGICOP) -#define VPC_ES11MATERIALF (VPG_ES11 + ES11_MATERIALF) -#define VPC_ES11MATERIALFV (VPG_ES11 + ES11_MATERIALFV) -#define VPC_ES11MATERIALX (VPG_ES11 + ES11_MATERIALX) -#define VPC_ES11MATERIALXV (VPG_ES11 + ES11_MATERIALXV) -#define VPC_ES11MATRIXMODE (VPG_ES11 + ES11_MATRIXMODE) -#define VPC_ES11MULTITEXCOORD4F (VPG_ES11 + ES11_MULTITEXCOORD4F) -#define VPC_ES11MULTITEXCOORD4X (VPG_ES11 + ES11_MULTITEXCOORD4X) -#define VPC_ES11MULTMATRIXF (VPG_ES11 + ES11_MULTMATRIXF) -#define VPC_ES11MULTMATRIXX (VPG_ES11 + ES11_MULTMATRIXX) -#define VPC_ES11NORMAL3F (VPG_ES11 + ES11_NORMAL3F) -#define VPC_ES11NORMAL3X (VPG_ES11 + ES11_NORMAL3X) -#define VPC_ES11NORMALPOINTER (VPG_ES11 + ES11_NORMALPOINTER) -#define VPC_ES11ORTHOF (VPG_ES11 + ES11_ORTHOF) -#define VPC_ES11ORTHOX (VPG_ES11 + ES11_ORTHOX) -#define VPC_ES11PIXELSTOREI (VPG_ES11 + ES11_PIXELSTOREI) -#define VPC_ES11POINTPARAMETERF (VPG_ES11 + ES11_POINTPARAMETERF) -#define VPC_ES11POINTPARAMETERFV (VPG_ES11 + ES11_POINTPARAMETERFV) -#define VPC_ES11POINTPARAMETERX (VPG_ES11 + ES11_POINTPARAMETERX) -#define VPC_ES11POINTPARAMETERXV (VPG_ES11 + ES11_POINTPARAMETERXV) -#define VPC_ES11POINTSIZE (VPG_ES11 + ES11_POINTSIZE) -#define VPC_ES11POINTSIZEX (VPG_ES11 + ES11_POINTSIZEX) -#define VPC_ES11POLYGONOFFSET (VPG_ES11 + ES11_POLYGONOFFSET) -#define VPC_ES11POLYGONOFFSETX (VPG_ES11 + ES11_POLYGONOFFSETX) -#define VPC_ES11POPMATRIX (VPG_ES11 + ES11_POPMATRIX) -#define VPC_ES11PUSHMATRIX (VPG_ES11 + ES11_PUSHMATRIX) -#define VPC_ES11READPIXELS (VPG_ES11 + ES11_READPIXELS) -#define VPC_ES11ROTATEF (VPG_ES11 + ES11_ROTATEF) -#define VPC_ES11ROTATEX (VPG_ES11 + ES11_ROTATEX) -#define VPC_ES11SAMPLECOVERAGE (VPG_ES11 + ES11_SAMPLECOVERAGE) -#define VPC_ES11SAMPLECOVERAGEX (VPG_ES11 + ES11_SAMPLECOVERAGEX) -#define VPC_ES11SCALEF (VPG_ES11 + ES11_SCALEF) -#define VPC_ES11SCALEX (VPG_ES11 + ES11_SCALEX) -#define VPC_ES11SCISSOR (VPG_ES11 + ES11_SCISSOR) -#define VPC_ES11SHADEMODEL (VPG_ES11 + ES11_SHADEMODEL) -#define VPC_ES11STENCILFUNC (VPG_ES11 + ES11_STENCILFUNC) -#define VPC_ES11STENCILMASK (VPG_ES11 + ES11_STENCILMASK) -#define VPC_ES11STENCILOP (VPG_ES11 + ES11_STENCILOP) -#define VPC_ES11TEXCOORDPOINTER (VPG_ES11 + ES11_TEXCOORDPOINTER) -#define VPC_ES11TEXENVF (VPG_ES11 + ES11_TEXENVF) -#define VPC_ES11TEXENVFV (VPG_ES11 + ES11_TEXENVFV) -#define VPC_ES11TEXENVI (VPG_ES11 + ES11_TEXENVI) -#define VPC_ES11TEXENVIV (VPG_ES11 + ES11_TEXENVIV) -#define VPC_ES11TEXENVX (VPG_ES11 + ES11_TEXENVX) -#define VPC_ES11TEXENVXV (VPG_ES11 + ES11_TEXENVXV) -#define VPC_ES11TEXIMAGE2D (VPG_ES11 + ES11_TEXIMAGE2D) -#define VPC_ES11TEXPARAMETERF (VPG_ES11 + ES11_TEXPARAMETERF) -#define VPC_ES11TEXPARAMETERFV (VPG_ES11 + ES11_TEXPARAMETERFV) -#define VPC_ES11TEXPARAMETERI (VPG_ES11 + ES11_TEXPARAMETERI) -#define VPC_ES11TEXPARAMETERIV (VPG_ES11 + ES11_TEXPARAMETERIV) -#define VPC_ES11TEXPARAMETERX (VPG_ES11 + ES11_TEXPARAMETERX) -#define VPC_ES11TEXPARAMETERXV (VPG_ES11 + ES11_TEXPARAMETERXV) -#define VPC_ES11TEXSUBIMAGE2D (VPG_ES11 + ES11_TEXSUBIMAGE2D) -#define VPC_ES11TRANSLATEF (VPG_ES11 + ES11_TRANSLATEF) -#define VPC_ES11TRANSLATEX (VPG_ES11 + ES11_TRANSLATEX) -#define VPC_ES11VERTEXPOINTER (VPG_ES11 + ES11_VERTEXPOINTER) -#define VPC_ES11VIEWPORT (VPG_ES11 + ES11_VIEWPORT) /* OpenGL ES11 Statics Counter IDs. */ -#define VPC_ES11CALLS (VPG_ES11 + ES11_CALLS) -#define VPC_ES11DRAWCALLS (VPG_ES11 + ES11_DRAWCALLS) -#define VPC_ES11STATECHANGECALLS (VPG_ES11 + ES11_STATECHANGECALLS) -#define VPC_ES11POINTCOUNT (VPG_ES11 + ES11_POINTCOUNT) -#define VPC_ES11LINECOUNT (VPG_ES11 + ES11_LINECOUNT) -#define VPC_ES11TRIANGLECOUNT (VPG_ES11 + ES11_TRIANGLECOUNT) - -/* OpenGLES 2.x */ -#define VPC_ES20ACTIVETEXTURE (VPG_ES20 + ES20_ACTIVETEXTURE) -#define VPC_ES20ATTACHSHADER (VPG_ES20 + ES20_ATTACHSHADER) -#define VPC_ES20BINDATTRIBLOCATION (VPG_ES20 + ES20_BINDATTRIBLOCATION) -#define VPC_ES20BINDBUFFER (VPG_ES20 + ES20_BINDBUFFER) -#define VPC_ES20BINDFRAMEBUFFER (VPG_ES20 + ES20_BINDFRAMEBUFFER) -#define VPC_ES20BINDRENDERBUFFER (VPG_ES20 + ES20_BINDRENDERBUFFER) -#define VPC_ES20BINDTEXTURE (VPG_ES20 + ES20_BINDTEXTURE) -#define VPC_ES20BLENDCOLOR (VPG_ES20 + ES20_BLENDCOLOR) -#define VPC_ES20BLENDEQUATION (VPG_ES20 + ES20_BLENDEQUATION) -#define VPC_ES20BLENDEQUATIONSEPARATE (VPG_ES20 + ES20_BLENDEQUATIONSEPARATE) -#define VPC_ES20BLENDFUNC (VPG_ES20 + ES20_BLENDFUNC) -#define VPC_ES20BLENDFUNCSEPARATE (VPG_ES20 + ES20_BLENDFUNCSEPARATE) -#define VPC_ES20BUFFERDATA (VPG_ES20 + ES20_BUFFERDATA) -#define VPC_ES20BUFFERSUBDATA (VPG_ES20 + ES20_BUFFERSUBDATA) -#define VPC_ES20CHECKFRAMEBUFFERSTATUS (VPG_ES20 + ES20_CHECKFRAMEBUFFERSTATUS) -#define VPC_ES20CLEAR (VPG_ES20 + ES20_CLEAR) -#define VPC_ES20CLEARCOLOR (VPG_ES20 + ES20_CLEARCOLOR) -#define VPC_ES20CLEARDEPTHF (VPG_ES20 + ES20_CLEARDEPTHF) -#define VPC_ES20CLEARSTENCIL (VPG_ES20 + ES20_CLEARSTENCIL) -#define VPC_ES20COLORMASK (VPG_ES20 + ES20_COLORMASK) -#define VPC_ES20COMPILESHADER (VPG_ES20 + ES20_COMPILESHADER) -#define VPC_ES20COMPRESSEDTEXIMAGE2D (VPG_ES20 + ES20_COMPRESSEDTEXIMAGE2D) -#define VPC_ES20COMPRESSEDTEXSUBIMAGE2D (VPG_ES20 + ES20_COMPRESSEDTEXSUBIMAGE2D) -#define VPC_ES20COPYTEXIMAGE2D (VPG_ES20 + ES20_COPYTEXIMAGE2D) -#define VPC_ES20COPYTEXSUBIMAGE2D (VPG_ES20 + ES20_COPYTEXSUBIMAGE2D) -#define VPC_ES20CREATEPROGRAM (VPG_ES20 + ES20_CREATEPROGRAM) -#define VPC_ES20CREATESHADER (VPG_ES20 + ES20_CREATESHADER) -#define VPC_ES20CULLFACE (VPG_ES20 + ES20_CULLFACE) -#define VPC_ES20DELETEBUFFERS (VPG_ES20 + ES20_DELETEBUFFERS) -#define VPC_ES20DELETEFRAMEBUFFERS (VPG_ES20 + ES20_DELETEFRAMEBUFFERS) -#define VPC_ES20DELETEPROGRAM (VPG_ES20 + ES20_DELETEPROGRAM) -#define VPC_ES20DELETERENDERBUFFERS (VPG_ES20 + ES20_DELETERENDERBUFFERS) -#define VPC_ES20DELETESHADER (VPG_ES20 + ES20_DELETESHADER) -#define VPC_ES20DELETETEXTURES (VPG_ES20 + ES20_DELETETEXTURES) -#define VPC_ES20DEPTHFUNC (VPG_ES20 + ES20_DEPTHFUNC) -#define VPC_ES20DEPTHMASK (VPG_ES20 + ES20_DEPTHMASK) -#define VPC_ES20DEPTHRANGEF (VPG_ES20 + ES20_DEPTHRANGEF) -#define VPC_ES20DETACHSHADER (VPG_ES20 + ES20_DETACHSHADER) -#define VPC_ES20DISABLE (VPG_ES20 + ES20_DISABLE) -#define VPC_ES20DISABLEVERTEXATTRIBARRAY (VPG_ES20 + ES20_DISABLEVERTEXATTRIBARRAY) -#define VPC_ES20DRAWARRAYS (VPG_ES20 + ES20_DRAWARRAYS) -#define VPC_ES20DRAWELEMENTS (VPG_ES20 + ES20_DRAWELEMENTS) -#define VPC_ES20ENABLE (VPG_ES20 + ES20_ENABLE) -#define VPC_ES20ENABLEVERTEXATTRIBARRAY (VPG_ES20 + ES20_ENABLEVERTEXATTRIBARRAY) -#define VPC_ES20FINISH (VPG_ES20 + ES20_FINISH) -#define VPC_ES20FLUSH (VPG_ES20 + ES20_FLUSH) -#define VPC_ES20FRAMEBUFFERRENDERBUFFER (VPG_ES20 + ES20_FRAMEBUFFERRENDERBUFFER) -#define VPC_ES20FRAMEBUFFERTEXTURE2D (VPG_ES20 + ES20_FRAMEBUFFERTEXTURE2D) -#define VPC_ES20FRONTFACE (VPG_ES20 + ES20_FRONTFACE) -#define VPC_ES20GENBUFFERS (VPG_ES20 + ES20_GENBUFFERS) -#define VPC_ES20GENERATEMIPMAP (VPG_ES20 + ES20_GENERATEMIPMAP) -#define VPC_ES20GENFRAMEBUFFERS (VPG_ES20 + ES20_GENFRAMEBUFFERS) -#define VPC_ES20GENRENDERBUFFERS (VPG_ES20 + ES20_GENRENDERBUFFERS) -#define VPC_ES20GENTEXTURES (VPG_ES20 + ES20_GENTEXTURES) -#define VPC_ES20GETACTIVEATTRIB (VPG_ES20 + ES20_GETACTIVEATTRIB) -#define VPC_ES20GETACTIVEUNIFORM (VPG_ES20 + ES20_GETACTIVEUNIFORM) -#define VPC_ES20GETATTACHEDSHADERS (VPG_ES20 + ES20_GETATTACHEDSHADERS) -#define VPC_ES20GETATTRIBLOCATION (VPG_ES20 + ES20_GETATTRIBLOCATION) -#define VPC_ES20GETBOOLEANV (VPG_ES20 + ES20_GETBOOLEANV) -#define VPC_ES20GETBUFFERPARAMETERIV (VPG_ES20 + ES20_GETBUFFERPARAMETERIV) -#define VPC_ES20GETERROR (VPG_ES20 + ES20_GETERROR) -#define VPC_ES20GETFLOATV (VPG_ES20 + ES20_GETFLOATV) -#define VPC_ES20GETFRAMEBUFFERATTACHMENTPARAMETERIV (VPG_ES20 + ES20_GETFRAMEBUFFERATTACHMENTPARAMETERIV) -#define VPC_ES20GETINTEGERV (VPG_ES20 + ES20_GETINTEGERV) -#define VPC_ES20GETPROGRAMIV (VPG_ES20 + ES20_GETPROGRAMIV) -#define VPC_ES20GETPROGRAMINFOLOG (VPG_ES20 + ES20_GETPROGRAMINFOLOG) -#define VPC_ES20GETRENDERBUFFERPARAMETERIV (VPG_ES20 + ES20_GETRENDERBUFFERPARAMETERIV) -#define VPC_ES20GETSHADERIV (VPG_ES20 + ES20_GETSHADERIV) -#define VPC_ES20GETSHADERINFOLOG (VPG_ES20 + ES20_GETSHADERINFOLOG) -#define VPC_ES20GETSHADERPRECISIONFORMAT (VPG_ES20 + ES20_GETSHADERPRECISIONFORMAT) -#define VPC_ES20GETSHADERSOURCE (VPG_ES20 + ES20_GETSHADERSOURCE) -#define VPC_ES20GETSTRING (VPG_ES20 + ES20_GETSTRING) -#define VPC_ES20GETTEXPARAMETERFV (VPG_ES20 + ES20_GETTEXPARAMETERFV) -#define VPC_ES20GETTEXPARAMETERIV (VPG_ES20 + ES20_GETTEXPARAMETERIV) -#define VPC_ES20GETUNIFORMFV (VPG_ES20 + ES20_GETUNIFORMFV) -#define VPC_ES20GETUNIFORMIV (VPG_ES20 + ES20_GETUNIFORMIV) -#define VPC_ES20GETUNIFORMLOCATION (VPG_ES20 + ES20_GETUNIFORMLOCATION) -#define VPC_ES20GETVERTEXATTRIBFV (VPG_ES20 + ES20_GETVERTEXATTRIBFV) -#define VPC_ES20GETVERTEXATTRIBIV (VPG_ES20 + ES20_GETVERTEXATTRIBIV) -#define VPC_ES20GETVERTEXATTRIBPOINTERV (VPG_ES20 + ES20_GETVERTEXATTRIBPOINTERV) -#define VPC_ES20HINT (VPG_ES20 + ES20_HINT) -#define VPC_ES20ISBUFFER (VPG_ES20 + ES20_ISBUFFER) -#define VPC_ES20ISENABLED (VPG_ES20 + ES20_ISENABLED) -#define VPC_ES20ISFRAMEBUFFER (VPG_ES20 + ES20_ISFRAMEBUFFER) -#define VPC_ES20ISPROGRAM (VPG_ES20 + ES20_ISPROGRAM) -#define VPC_ES20ISRENDERBUFFER (VPG_ES20 + ES20_ISRENDERBUFFER) -#define VPC_ES20ISSHADER (VPG_ES20 + ES20_ISSHADER) -#define VPC_ES20ISTEXTURE (VPG_ES20 + ES20_ISTEXTURE) -#define VPC_ES20LINEWIDTH (VPG_ES20 + ES20_LINEWIDTH) -#define VPC_ES20LINKPROGRAM (VPG_ES20 + ES20_LINKPROGRAM) -#define VPC_ES20PIXELSTOREI (VPG_ES20 + ES20_PIXELSTOREI) -#define VPC_ES20POLYGONOFFSET (VPG_ES20 + ES20_POLYGONOFFSET) -#define VPC_ES20READPIXELS (VPG_ES20 + ES20_READPIXELS) -#define VPC_ES20RELEASESHADERCOMPILER (VPG_ES20 + ES20_RELEASESHADERCOMPILER) -#define VPC_ES20RENDERBUFFERSTORAGE (VPG_ES20 + ES20_RENDERBUFFERSTORAGE) -#define VPC_ES20SAMPLECOVERAGE (VPG_ES20 + ES20_SAMPLECOVERAGE) -#define VPC_ES20SCISSOR (VPG_ES20 + ES20_SCISSOR) -#define VPC_ES20SHADERBINARY (VPG_ES20 + ES20_SHADERBINARY) -#define VPC_ES20SHADERSOURCE (VPG_ES20 + ES20_SHADERSOURCE) -#define VPC_ES20STENCILFUNC (VPG_ES20 + ES20_STENCILFUNC) -#define VPC_ES20STENCILFUNCSEPARATE (VPG_ES20 + ES20_STENCILFUNCSEPARATE) -#define VPC_ES20STENCILMASK (VPG_ES20 + ES20_STENCILMASK) -#define VPC_ES20STENCILMASKSEPARATE (VPG_ES20 + ES20_STENCILMASKSEPARATE) -#define VPC_ES20STENCILOP (VPG_ES20 + ES20_STENCILOP) -#define VPC_ES20STENCILOPSEPARATE (VPG_ES20 + ES20_STENCILOPSEPARATE) -#define VPC_ES20TEXIMAGE2D (VPG_ES20 + ES20_TEXIMAGE2D) -#define VPC_ES20TEXPARAMETERF (VPG_ES20 + ES20_TEXPARAMETERF) -#define VPC_ES20TEXPARAMETERFV (VPG_ES20 + ES20_TEXPARAMETERFV) -#define VPC_ES20TEXPARAMETERI (VPG_ES20 + ES20_TEXPARAMETERI) -#define VPC_ES20TEXPARAMETERIV (VPG_ES20 + ES20_TEXPARAMETERIV) -#define VPC_ES20TEXSUBIMAGE2D (VPG_ES20 + ES20_TEXSUBIMAGE2D) -#define VPC_ES20UNIFORM1F (VPG_ES20 + ES20_UNIFORM1F) -#define VPC_ES20UNIFORM1FV (VPG_ES20 + ES20_UNIFORM1FV) -#define VPC_ES20UNIFORM1I (VPG_ES20 + ES20_UNIFORM1I) -#define VPC_ES20UNIFORM1IV (VPG_ES20 + ES20_UNIFORM1IV) -#define VPC_ES20UNIFORM2F (VPG_ES20 + ES20_UNIFORM2F) -#define VPC_ES20UNIFORM2FV (VPG_ES20 + ES20_UNIFORM2FV) -#define VPC_ES20UNIFORM2I (VPG_ES20 + ES20_UNIFORM2I) -#define VPC_ES20UNIFORM2IV (VPG_ES20 + ES20_UNIFORM2IV) -#define VPC_ES20UNIFORM3F (VPG_ES20 + ES20_UNIFORM3F) -#define VPC_ES20UNIFORM3FV (VPG_ES20 + ES20_UNIFORM3FV) -#define VPC_ES20UNIFORM3I (VPG_ES20 + ES20_UNIFORM3I) -#define VPC_ES20UNIFORM3IV (VPG_ES20 + ES20_UNIFORM3IV) -#define VPC_ES20UNIFORM4F (VPG_ES20 + ES20_UNIFORM4F) -#define VPC_ES20UNIFORM4FV (VPG_ES20 + ES20_UNIFORM4FV) -#define VPC_ES20UNIFORM4I (VPG_ES20 + ES20_UNIFORM4I) -#define VPC_ES20UNIFORM4IV (VPG_ES20 + ES20_UNIFORM4IV) -#define VPC_ES20UNIFORMMATRIX2FV (VPG_ES20 + ES20_UNIFORMMATRIX2FV) -#define VPC_ES20UNIFORMMATRIX3FV (VPG_ES20 + ES20_UNIFORMMATRIX3FV) -#define VPC_ES20UNIFORMMATRIX4FV (VPG_ES20 + ES20_UNIFORMMATRIX4FV) -#define VPC_ES20USEPROGRAM (VPG_ES20 + ES20_USEPROGRAM) -#define VPC_ES20VALIDATEPROGRAM (VPG_ES20 + ES20_VALIDATEPROGRAM) -#define VPC_ES20VERTEXATTRIB1F (VPG_ES20 + ES20_VERTEXATTRIB1F) -#define VPC_ES20VERTEXATTRIB1FV (VPG_ES20 + ES20_VERTEXATTRIB1FV) -#define VPC_ES20VERTEXATTRIB2F (VPG_ES20 + ES20_VERTEXATTRIB2F) -#define VPC_ES20VERTEXATTRIB2FV (VPG_ES20 + ES20_VERTEXATTRIB2FV) -#define VPC_ES20VERTEXATTRIB3F (VPG_ES20 + ES20_VERTEXATTRIB3F) -#define VPC_ES20VERTEXATTRIB3FV (VPG_ES20 + ES20_VERTEXATTRIB3FV) -#define VPC_ES20VERTEXATTRIB4F (VPG_ES20 + ES20_VERTEXATTRIB4F) -#define VPC_ES20VERTEXATTRIB4FV (VPG_ES20 + ES20_VERTEXATTRIB4FV) -#define VPC_ES20VERTEXATTRIBPOINTER (VPG_ES20 + ES20_VERTEXATTRIBPOINTER) -#define VPC_ES20VIEWPORT (VPG_ES20 + ES20_VIEWPORT) +#define VPC_ES11CALLS (VPG_ES11 + ES11_CALLS) +#define VPC_ES11DRAWCALLS (VPG_ES11 + ES11_DRAWCALLS) +#define VPC_ES11STATECHANGECALLS (VPG_ES11 + ES11_STATECHANGECALLS) +#define VPC_ES11POINTCOUNT (VPG_ES11 + ES11_POINTCOUNT) +#define VPC_ES11LINECOUNT (VPG_ES11 + ES11_LINECOUNT) +#define VPC_ES11TRIANGLECOUNT (VPG_ES11 + ES11_TRIANGLECOUNT) + /* OpenGL ES20 Statistics Counter IDs. */ -#define VPC_ES20CALLS (VPG_ES20 + ES20_CALLS) -#define VPC_ES20DRAWCALLS (VPG_ES20 + ES20_DRAWCALLS) -#define VPC_ES20STATECHANGECALLS (VPG_ES20 + ES20_STATECHANGECALLS) -#define VPC_ES20POINTCOUNT (VPG_ES20 + ES20_POINTCOUNT) -#define VPC_ES20LINECOUNT (VPG_ES20 + ES20_LINECOUNT) -#define VPC_ES20TRIANGLECOUNT (VPG_ES20 + ES20_TRIANGLECOUNT) - -/* VG11 Counters. */ -#define VPC_VG11APPENDPATH (VPG_VG11 + VG11_APPENDPATH) -#define VPC_VG11APPENDPATHDATA (VPG_VG11 + VG11_APPENDPATHDATA) -#define VPC_VG11CHILDIMAGE (VPG_VG11 + VG11_CHILDIMAGE) -#define VPC_VG11CLEAR (VPG_VG11 + VG11_CLEAR) -#define VPC_VG11CLEARGLYPH (VPG_VG11 + VG11_CLEARGLYPH) -#define VPC_VG11CLEARIMAGE (VPG_VG11 + VG11_CLEARIMAGE) -#define VPC_VG11CLEARPATH (VPG_VG11 + VG11_CLEARPATH) -#define VPC_VG11COLORMATRIX (VPG_VG11 + VG11_COLORMATRIX) -#define VPC_VG11CONVOLVE (VPG_VG11 + VG11_CONVOLVE) -#define VPC_VG11COPYIMAGE (VPG_VG11 + VG11_COPYIMAGE) -#define VPC_VG11COPYMASK (VPG_VG11 + VG11_COPYMASK) -#define VPC_VG11COPYPIXELS (VPG_VG11 + VG11_COPYPIXELS) -#define VPC_VG11CREATEFONT (VPG_VG11 + VG11_CREATEFONT) -#define VPC_VG11CREATEIMAGE (VPG_VG11 + VG11_CREATEIMAGE) -#define VPC_VG11CREATEMASKLAYER (VPG_VG11 + VG11_CREATEMASKLAYER) -#define VPC_VG11CREATEPAINT (VPG_VG11 + VG11_CREATEPAINT) -#define VPC_VG11CREATEPATH (VPG_VG11 + VG11_CREATEPATH) -#define VPC_VG11DESTROYFONT (VPG_VG11 + VG11_DESTROYFONT) -#define VPC_VG11DESTROYIMAGE (VPG_VG11 + VG11_DESTROYIMAGE) -#define VPC_VG11DESTROYMASKLAYER (VPG_VG11 + VG11_DESTROYMASKLAYER) -#define VPC_VG11DESTROYPAINT (VPG_VG11 + VG11_DESTROYPAINT) -#define VPC_VG11DESTROYPATH (VPG_VG11 + VG11_DESTROYPATH) -#define VPC_VG11DRAWGLYPH (VPG_VG11 + VG11_DRAWGLYPH) -#define VPC_VG11DRAWGLYPHS (VPG_VG11 + VG11_DRAWGLYPHS) -#define VPC_VG11DRAWIMAGE (VPG_VG11 + VG11_DRAWIMAGE) -#define VPC_VG11DRAWPATH (VPG_VG11 + VG11_DRAWPATH) -#define VPC_VG11FILLMASKLAYER (VPG_VG11 + VG11_FILLMASKLAYER) -#define VPC_VG11FINISH (VPG_VG11 + VG11_FINISH) -#define VPC_VG11FLUSH (VPG_VG11 + VG11_FLUSH) -#define VPC_VG11GAUSSIANBLUR (VPG_VG11 + VG11_GAUSSIANBLUR) -#define VPC_VG11GETCOLOR (VPG_VG11 + VG11_GETCOLOR) -#define VPC_VG11GETERROR (VPG_VG11 + VG11_GETERROR) -#define VPC_VG11GETF (VPG_VG11 + VG11_GETF) -#define VPC_VG11GETFV (VPG_VG11 + VG11_GETFV) -#define VPC_VG11GETI (VPG_VG11 + VG11_GETI) -#define VPC_VG11GETIMAGESUBDATA (VPG_VG11 + VG11_GETIMAGESUBDATA) -#define VPC_VG11GETIV (VPG_VG11 + VG11_GETIV) -#define VPC_VG11GETMATRIX (VPG_VG11 + VG11_GETMATRIX) -#define VPC_VG11GETPAINT (VPG_VG11 + VG11_GETPAINT) -#define VPC_VG11GETPARAMETERF (VPG_VG11 + VG11_GETPARAMETERF) -#define VPC_VG11GETPARAMETERFV (VPG_VG11 + VG11_GETPARAMETERFV) -#define VPC_VG11GETPARAMETERI (VPG_VG11 + VG11_GETPARAMETERI) -#define VPC_VG11GETPARAMETERIV (VPG_VG11 + VG11_GETPARAMETERIV) -#define VPC_VG11GETPARAMETERVECTORSIZE (VPG_VG11 + VG11_GETPARAMETERVECTORSIZE) -#define VPC_VG11GETPARENT (VPG_VG11 + VG11_GETPARENT) -#define VPC_VG11GETPATHCAPABILITIES (VPG_VG11 + VG11_GETPATHCAPABILITIES) -#define VPC_VG11GETPIXELS (VPG_VG11 + VG11_GETPIXELS) -#define VPC_VG11GETSTRING (VPG_VG11 + VG11_GETSTRING) -#define VPC_VG11GETVECTORSIZE (VPG_VG11 + VG11_GETVECTORSIZE) -#define VPC_VG11HARDWAREQUERY (VPG_VG11 + VG11_HARDWAREQUERY) -#define VPC_VG11IMAGESUBDATA (VPG_VG11 + VG11_IMAGESUBDATA) -#define VPC_VG11INTERPOLATEPATH (VPG_VG11 + VG11_INTERPOLATEPATH) -#define VPC_VG11LOADIDENTITY (VPG_VG11 + VG11_LOADIDENTITY) -#define VPC_VG11LOADMATRIX (VPG_VG11 + VG11_LOADMATRIX) -#define VPC_VG11LOOKUP (VPG_VG11 + VG11_LOOKUP) -#define VPC_VG11LOOKUPSINGLE (VPG_VG11 + VG11_LOOKUPSINGLE) -#define VPC_VG11MASK (VPG_VG11 + VG11_MASK) -#define VPC_VG11MODIFYPATHCOORDS (VPG_VG11 + VG11_MODIFYPATHCOORDS) -#define VPC_VG11MULTMATRIX (VPG_VG11 + VG11_MULTMATRIX) -#define VPC_VG11PAINTPATTERN (VPG_VG11 + VG11_PAINTPATTERN) -#define VPC_VG11PATHBOUNDS (VPG_VG11 + VG11_PATHBOUNDS) -#define VPC_VG11PATHLENGTH (VPG_VG11 + VG11_PATHLENGTH) -#define VPC_VG11PATHTRANSFORMEDBOUNDS (VPG_VG11 + VG11_PATHTRANSFORMEDBOUNDS) -#define VPC_VG11POINTALONGPATH (VPG_VG11 + VG11_POINTALONGPATH) -#define VPC_VG11READPIXELS (VPG_VG11 + VG11_READPIXELS) -#define VPC_VG11REMOVEPATHCAPABILITIES (VPG_VG11 + VG11_REMOVEPATHCAPABILITIES) -#define VPC_VG11RENDERTOMASK (VPG_VG11 + VG11_RENDERTOMASK) -#define VPC_VG11ROTATE (VPG_VG11 + VG11_ROTATE) -#define VPC_VG11SCALE (VPG_VG11 + VG11_SCALE) -#define VPC_VG11SEPARABLECONVOLVE (VPG_VG11 + VG11_SEPARABLECONVOLVE) -#define VPC_VG11SETCOLOR (VPG_VG11 + VG11_SETCOLOR) -#define VPC_VG11SETF (VPG_VG11 + VG11_SETF) -#define VPC_VG11SETFV (VPG_VG11 + VG11_SETFV) -#define VPC_VG11SETGLYPHTOIMAGE (VPG_VG11 + VG11_SETGLYPHTOIMAGE) -#define VPC_VG11SETGLYPHTOPATH (VPG_VG11 + VG11_SETGLYPHTOPATH) -#define VPC_VG11SETI (VPG_VG11 + VG11_SETI) -#define VPC_VG11SETIV (VPG_VG11 + VG11_SETIV) -#define VPC_VG11SETPAINT (VPG_VG11 + VG11_SETPAINT) -#define VPC_VG11SETPARAMETERF (VPG_VG11 + VG11_SETPARAMETERF) -#define VPC_VG11SETPARAMETERFV (VPG_VG11 + VG11_SETPARAMETERFV) -#define VPC_VG11SETPARAMETERI (VPG_VG11 + VG11_SETPARAMETERI) -#define VPC_VG11SETPARAMETERIV (VPG_VG11 + VG11_SETPARAMETERIV) -#define VPC_VG11SETPIXELS (VPG_VG11 + VG11_SETPIXELS) -#define VPC_VG11SHEAR (VPG_VG11 + VG11_SHEAR) -#define VPC_VG11TRANSFORMPATH (VPG_VG11 + VG11_TRANSFORMPATH) -#define VPC_VG11TRANSLATE (VPG_VG11 + VG11_TRANSLATE) -#define VPC_VG11WRITEPIXELS (VPG_VG11 + VG11_WRITEPIXELS) +#define VPC_ES20CALLS (VPG_ES20 + ES20_CALLS) +#define VPC_ES20DRAWCALLS (VPG_ES20 + ES20_DRAWCALLS) +#define VPC_ES20STATECHANGECALLS (VPG_ES20 + ES20_STATECHANGECALLS) +#define VPC_ES20POINTCOUNT (VPG_ES20 + ES20_POINTCOUNT) +#define VPC_ES20LINECOUNT (VPG_ES20 + ES20_LINECOUNT) +#define VPC_ES20TRIANGLECOUNT (VPG_ES20 + ES20_TRIANGLECOUNT) + /* OpenVG Statistics Counter IDs. */ -#define VPC_VG11CALLS (VPG_VG11 + VG11_CALLS) -#define VPC_VG11DRAWCALLS (VPG_VG11 + VG11_DRAWCALLS) -#define VPC_VG11STATECHANGECALLS (VPG_VG11 + VG11_STATECHANGECALLS) -#define VPC_VG11FILLCOUNT (VPG_VG11 + VG11_FILLCOUNT) -#define VPC_VG11STROKECOUNT (VPG_VG11 + VG11_STROKECOUNT) +#define VPC_VG11CALLS (VPG_VG11 + VG11_CALLS) +#define VPC_VG11DRAWCALLS (VPG_VG11 + VG11_DRAWCALLS) +#define VPC_VG11STATECHANGECALLS (VPG_VG11 + VG11_STATECHANGECALLS) +#define VPC_VG11FILLCOUNT (VPG_VG11 + VG11_FILLCOUNT) +#define VPC_VG11STROKECOUNT (VPG_VG11 + VG11_STROKECOUNT) /* HAL Counters. */ #define VPC_HALVERTBUFNEWBYTEALLOC (VPG_HAL + HAL_VERTBUFNEWBYTEALLOC) @@ -1018,7 +248,7 @@ extern "C" { #define VPC_GPUREAD64BYTE (VPG_GPU + GPU_READ64BYTE) #define VPC_GPUWRITE64BYTE (VPG_GPU + GPU_WRITE64BYTE) #define VPC_GPUTOTALCYCLES (VPG_GPU + GPU_TOTALCYCLES) -#define VPC_GPUIDLECYCLES (VPG_GPU + GPU_IDLECYCLES) +#define VPC_GPUIDLECYCLES (VPG_GPU + GPU_IDLECYCLES) /* HW: Shader Counters. */ #define VPC_VSINSTCOUNT (VPG_VS + VS_INSTCOUNT) @@ -1026,9 +256,9 @@ extern "C" { #define VPC_VSTEXLDINSTCOUNT (VPG_VS + VS_TEXLDINSTCOUNT) #define VPC_VSRENDEREDVERTCOUNT (VPG_VS + VS_RENDEREDVERTCOUNT) /* HW: PS Count. */ -#define VPC_PSINSTCOUNT (VPG_PS + PS_INSTCOUNT) -#define VPC_PSBRANCHINSTCOUNT (VPG_PS + PS_BRANCHINSTCOUNT) -#define VPC_PSTEXLDINSTCOUNT (VPG_PS + PS_TEXLDINSTCOUNT) +#define VPC_PSINSTCOUNT (VPG_PS + PS_INSTCOUNT) +#define VPC_PSBRANCHINSTCOUNT (VPG_PS + PS_BRANCHINSTCOUNT) +#define VPC_PSTEXLDINSTCOUNT (VPG_PS + PS_TEXLDINSTCOUNT) #define VPC_PSRENDEREDPIXCOUNT (VPG_PS + PS_RENDEREDPIXCOUNT) @@ -1071,7 +301,7 @@ extern "C" { #define VPC_PEDRAWNBYDEPTH (VPG_PE + PE_DRAWNBYDEPTH) /* HW: MC Counters. */ -#define VPC_MCREADREQ8BPIPE (VPG_MC + MC_READREQ8BPIPE) +#define VPC_MCREADREQ8BPIPE (VPG_MC + MC_READREQ8BPIPE) #define VPC_MCREADREQ8BIP (VPG_MC + MC_READREQ8BIP) #define VPC_MCWRITEREQ8BPIPE (VPG_MC + MC_WRITEREQ8BPIPE) @@ -1087,6 +317,7 @@ extern "C" { #define VPC_PVSATTRIBCOUNT (VPG_PVS + PVS_ATTRIBCOUNT) #define VPC_PVSUNIFORMCOUNT (VPG_PVS + PVS_UNIFORMCOUNT) #define VPC_PVSFUNCTIONCOUNT (VPG_PVS + PVS_FUNCTIONCOUNT) +#define VPC_PVSSOURCE (VPG_PVS + PVS_SOURCE) #define VPC_PPSINSTRCOUNT (VPG_PPS + PPS_INSTRCOUNT) #define VPC_PPSALUINSTRCOUNT (VPG_PPS + PPS_ALUINSTRCOUNT) @@ -1094,7 +325,9 @@ extern "C" { #define VPC_PPSATTRIBCOUNT (VPG_PPS + PPS_ATTRIBCOUNT) #define VPC_PPSUNIFORMCOUNT (VPG_PPS + PPS_UNIFORMCOUNT) #define VPC_PPSFUNCTIONCOUNT (VPG_PPS + PPS_FUNCTIONCOUNT) +#define VPC_PPSSOURCE (VPG_PPS + PPS_SOURCE) +#define VPC_PROGRAMHANDLE (VPG_PROG + 1) #define VPG_ES20_DRAW_NO (VPG_ES20_DRAW + 1) #define VPG_ES11_DRAW_NO (VPG_ES11_DRAW + 1) @@ -1118,8 +351,8 @@ typedef struct _gcsPROFILER_COUNTERS /* HW vairable counters. */ gctUINT32 gpuCyclesCounter; - gctUINT32 gpuTotalCyclesCounter; - gctUINT32 gpuIdleCyclesCounter; + gctUINT32 gpuTotalCyclesCounter; + gctUINT32 gpuIdleCyclesCounter; gctUINT32 gpuTotalRead64BytesPerFrame; gctUINT32 gpuTotalWrite64BytesPerFrame; @@ -1158,7 +391,7 @@ typedef struct _gcsPROFILER_COUNTERS gctUINT32 ra_total_primitive_count; gctUINT32 ra_pipe_cache_miss_counter; gctUINT32 ra_prefetch_cache_miss_counter; - gctUINT32 ra_eez_culled_counter; + gctUINT32 ra_eez_culled_counter; /* TX */ gctUINT32 tx_total_bilinear_requests; @@ -1190,7 +423,7 @@ typedef struct _gcsPROFILER gctBOOL enableHal; gctBOOL enableHW; gctBOOL enableSH; - gctBOOL isSyncMode; + gctBOOL isSyncMode; gctBOOL useSocket; gctINT sockFd; @@ -1234,14 +467,17 @@ typedef struct _gcsPROFILER gctUINT32 redundantStateChangeCalls; #endif - gctUINT32 prevVSInstCount; - gctUINT32 prevVSBranchInstCount; - gctUINT32 prevVSTexInstCount; - gctUINT32 prevVSVertexCount; - gctUINT32 prevPSInstCount; - gctUINT32 prevPSBranchInstCount; - gctUINT32 prevPSTexInstCount; - gctUINT32 prevPSPixelCount; + gctUINT32 prevVSInstCount; + gctUINT32 prevVSBranchInstCount; + gctUINT32 prevVSTexInstCount; + gctUINT32 prevVSVertexCount; + gctUINT32 prevPSInstCount; + gctUINT32 prevPSBranchInstCount; + gctUINT32 prevPSTexInstCount; + gctUINT32 prevPSPixelCount; + + char* psSource; + char* vsSource; } gcsPROFILER; @@ -1315,6 +551,18 @@ gcoPROFILER_Count( IN gctINT Value ); +gceSTATUS +gcoPROFILER_ShaderSourceFS( + IN gcoHAL Hal, + IN char* source + ); + +gceSTATUS +gcoPROFILER_ShaderSourceVS( + IN gcoHAL Hal, + IN char* source + ); + /* Profile input vertex shader. */ gceSTATUS gcoPROFILER_ShaderVS( diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h index bc4171e..6e4d830 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h @@ -568,6 +568,23 @@ gco2D_MonoBlit( IN gceSURF_FORMAT DestFormat ); +gceSTATUS +gco2D_MonoBlitEx( + IN gco2D Engine, + IN gctPOINTER StreamBits, + IN gctINT32 StreamStride, + IN gctINT32 StreamWidth, + IN gctINT32 StreamHeight, + IN gctINT32 StreamX, + IN gctINT32 StreamY, + IN gctUINT32 FgColor, + IN gctUINT32 BgColor, + IN gcsRECT_PTR SrcRect, + IN gcsRECT_PTR DstRect, + IN gctUINT8 FgRop, + IN gctUINT8 BgRop + ); + /* Set kernel size. */ gceSTATUS gco2D_SetKernelSize( @@ -942,6 +959,15 @@ gco2D_SetSourceTileStatus( ); gceSTATUS +gco2D_SetTargetTileStatus( + IN gco2D Engine, + IN gce2D_TILE_STATUS_CONFIG TileStatusConfig, + IN gceSURF_FORMAT CompressedFormat, + IN gctUINT32 ClearValue, + IN gctUINT32 GpuAddress + ); + +gceSTATUS gco2D_QueryU32( IN gco2D Engine, IN gce2D_QUERY Item, @@ -955,6 +981,28 @@ gco2D_SetStateU32( IN gctUINT32 Value ); +gceSTATUS +gco2D_SetStateArrayI32( + IN gco2D Engine, + IN gce2D_STATE State, + IN gctINT32_PTR Array, + IN gctINT32 ArraySize + ); + +gceSTATUS +gco2D_SetStateArrayU32( + IN gco2D Engine, + IN gce2D_STATE State, + IN gctUINT32_PTR Array, + IN gctINT32 ArraySize + ); + +gceSTATUS +gco2D_SetTargetRect( + IN gco2D Engine, + IN gcsRECT_PTR Rect + ); + #ifdef __cplusplus } #endif diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h index 5c0877d..14801aa 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h @@ -128,6 +128,7 @@ typedef int gctBOOL; typedef gctBOOL * gctBOOL_PTR; typedef int gctINT; +typedef long gctLONG; typedef signed char gctINT8; typedef signed short gctINT16; typedef signed int gctINT32; @@ -171,6 +172,7 @@ typedef void * gctFILE; typedef void * gctSIGNAL; typedef void * gctWINDOW; typedef void * gctIMAGE; +typedef void * gctSYNC_POINT; typedef void * gctSEMAPHORE; @@ -941,12 +943,19 @@ typedef struct _gcsHAL_FRAME_INFO OUT gctUINT readRequests[8]; OUT gctUINT writeRequests[8]; + /* FE counters. */ + OUT gctUINT drawCount; + OUT gctUINT vertexOutCount; + OUT gctUINT vertexMissCount; + /* 3D counters. */ OUT gctUINT vertexCount; OUT gctUINT primitiveCount; OUT gctUINT rejectedPrimitives; OUT gctUINT culledPrimitives; OUT gctUINT clippedPrimitives; + OUT gctUINT droppedPrimitives; + OUT gctUINT frustumClippedPrimitives; OUT gctUINT outPrimitives; OUT gctUINT inPrimitives; OUT gctUINT culledQuadCount; @@ -964,18 +973,86 @@ typedef struct _gcsHAL_FRAME_INFO OUT gctUINT shaderCycles; OUT gctUINT vsInstructionCount; OUT gctUINT vsTextureCount; + OUT gctUINT vsBranchCount; + OUT gctUINT vsVertices; OUT gctUINT psInstructionCount; OUT gctUINT psTextureCount; + OUT gctUINT psBranchCount; + OUT gctUINT psPixels; /* Texture counters. */ OUT gctUINT bilinearRequests; OUT gctUINT trilinearRequests; - OUT gctUINT txBytes8; + OUT gctUINT txBytes8[2]; OUT gctUINT txHitCount; OUT gctUINT txMissCount; } gcsHAL_FRAME_INFO; +typedef enum _gcePATCH_ID +{ + gcePATCH_UNKNOWN = 0xFFFFFFFF, + + /* Benchmark list*/ + gcePATCH_GLB11 = 0x0, + gcePATCH_GLB21, + gcePATCH_GLB25, + gcePATCH_GLB27, + + gcePATCH_BM21, + gcePATCH_MM, + gcePATCH_MM06, + gcePATCH_MM07, + gcePATCH_QUADRANT, + gcePATCH_ANTUTU, + gcePATCH_SMARTBENCH, + gcePATCH_JPCT, + gcePATCH_NENAMARK, + gcePATCH_NENAMARK2, + gcePATCH_NEOCORE, + gcePATCH_GLB, + gcePATCH_GB, + gcePATCH_RTESTVA, + gcePATCH_BMX, + gcePATCH_BMGUI, + + /* Game list */ + gcePATCH_NBA2013, + gcePATCH_BARDTALE, + gcePATCH_BUSPARKING3D, + gcePATCH_FISHBOODLE, + gcePATCH_SUBWAYSURFER, + gcePATCH_HIGHWAYDRIVER, + gcePATCH_PREMIUM, + gcePATCH_RACEILLEGAL, + gcePATCH_BLABLA, + gcePATCH_MEGARUN, + gcePATCH_GALAXYONFIRE2, + gcePATCH_GLOFTR3HM, + gcePATCH_GLOFTSXHM, + gcePATCH_GLOFTF3HM, + gcePATCH_GLOFTGANG, + gcePATCH_XRUNNER, + gcePATCH_WP, + gcePATCH_DEVIL, + gcePATCH_HOLYARCH, + gcePATCH_MUSE, + gcePATCH_SG, + gcePATCH_SIEGECRAFT, + gcePATCH_CARCHALLENGE, + gcePATCH_HEROESCALL, + gcePATCH_MONOPOLY, + gcePATCH_CTGL20, + gcePATCH_FIREFOX, + gcePATCH_CHORME, + gcePATCH_DUOKANTV, + gcePATCH_TESTAPP, + + /* Count enum*/ + gcePATCH_COUNT, +} +gcePATCH_ID; + #if gcdLINK_QUEUE_SIZE typedef struct _gckLINKDATA * gckLINKDATA; struct _gckLINKDATA diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h index 03cb4d6..2eab666 100644 --- a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h +++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h @@ -28,7 +28,7 @@ #define gcvVERSION_PATCH 9 -#define gcvVERSION_BUILD 6622 +#define gcvVERSION_BUILD 9754 #define gcvVERSION_DATE __DATE__ diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c index 4d48bd5..b029428 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c @@ -25,7 +25,9 @@ #include #include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) #include +#endif #include #define _GC_OBJ_ZONE gcvZONE_DEVICE @@ -305,6 +307,7 @@ gckGALDEVICE_Construct( IN gctUINT LogFileSize, IN struct device *pdev, IN gctINT PowerManagement, + IN gctINT GpuProfiler, OUT gckGALDEVICE *Device ) { @@ -369,6 +372,10 @@ gckGALDEVICE_Construct( #if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) /*get gpu regulator*/ device->gpu_regulator = regulator_get(pdev, "cpu_vddgpu"); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + device->gpu_regulator = regulator_get(pdev, "vddpu"); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) if (IS_ERR(device->gpu_regulator)) { gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DRIVER, "%s(%d): Failed to get gpu regulator %s/%s \n", @@ -541,6 +548,10 @@ gckGALDEVICE_Construct( device->kernels[gcvCORE_MAJOR]->hardware, PowerManagement )); + gcmkONERROR(gckHARDWARE_SetGpuProfiler( + device->kernels[gcvCORE_MAJOR]->hardware, GpuProfiler + )); + #if COMMAND_PROCESSOR_VERSION == 1 /* Start the command queue. */ gcmkONERROR(gckCOMMAND_Start(device->kernels[gcvCORE_MAJOR]->command)); @@ -599,6 +610,7 @@ gckGALDEVICE_Construct( device->kernels[gcvCORE_2D]->hardware, PowerManagement )); + #if COMMAND_PROCESSOR_VERSION == 1 /* Start the command queue. */ gcmkONERROR(gckCOMMAND_Start(device->kernels[gcvCORE_2D]->command)); @@ -635,6 +647,7 @@ gckGALDEVICE_Construct( device->kernels[gcvCORE_VG]->vg->hardware, PowerManagement )); + #endif } else @@ -849,6 +862,7 @@ gckGALDEVICE_Construct( } else { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) mem_region = request_mem_region( ContiguousBase, ContiguousSize, "galcore managed memory" ); @@ -864,6 +878,7 @@ gckGALDEVICE_Construct( gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); } +#endif device->requestedContiguousBase = ContiguousBase; device->requestedContiguousSize = ContiguousSize; @@ -1107,7 +1122,7 @@ gckGALDEVICE_Destroy( pm_runtime_disable(Device->pmdev); #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) if (Device->gpu_regulator) { regulator_put(Device->gpu_regulator); Device->gpu_regulator = NULL; diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h index dde4f03..c51432f 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h @@ -26,6 +26,15 @@ ******************************* gckGALDEVICE Structure ******************************* \******************************************************************************/ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) +struct contiguous_mem_pool { + struct dma_attrs attrs; + dma_addr_t phys; + void *virt; + size_t size; +}; +#endif + typedef struct _gckGALDEVICE { /* Objects. */ @@ -91,12 +100,16 @@ typedef struct _gckGALDEVICE struct clk *clk_2d_axi; struct clk *clk_vg_axi; -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) /*Power management.*/ struct regulator *gpu_regulator; #endif /*Run time pm*/ struct device *pmdev; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + struct contiguous_mem_pool *pool; + struct reset_control *rstc[gcdMAX_GPU_COUNT]; +#endif } * gckGALDEVICE; @@ -171,6 +184,7 @@ gceSTATUS gckGALDEVICE_Construct( IN gctUINT LogFileSize, IN struct device *pdev, IN gctINT PowerManagement, + IN gctINT GpuProfiler, OUT gckGALDEVICE *Device ); diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c index bacd531..88a7e4e6 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c @@ -1,7 +1,7 @@ /**************************************************************************** * * Copyright (C) 2005 - 2013 by Vivante Corp. -* Copyright (C) 2011-2012 Freescale Semiconductor, Inc. +* Copyright (C) 2011-2013 Freescale Semiconductor, Inc. * * 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 @@ -69,14 +69,26 @@ task_notify_func(struct notifier_block *self, unsigned long val, void *data) #include #else #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) #include +#else +#include +#endif #endif /* Zone used for header/footer. */ #define _GC_OBJ_ZONE gcvZONE_DRIVER #if gcdENABLE_FSCALE_VAL_ADJUST +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) +#include +#define REG_THERMAL_NOTIFIER(a) register_devfreq_cooling_notifier(a); +#define UNREG_THERMAL_NOTIFIER(a) unregister_devfreq_cooling_notifier(a); +#else extern int register_thermal_notifier(struct notifier_block *nb); extern int unregister_thermal_notifier(struct notifier_block *nb); +#define REG_THERMAL_NOTIFIER(a) register_thermal_notifier(a); +#define UNREG_THERMAL_NOTIFIER(a) unregister_thermal_notifier(a); +#endif #endif MODULE_DESCRIPTION("Vivante Graphics Driver"); @@ -116,7 +128,11 @@ module_param(registerMemBaseVG, ulong, 0644); static ulong registerMemSizeVG = 2 << 10; module_param(registerMemSizeVG, ulong, 0644); +#if gcdENABLE_FSCALE_VAL_ADJUST +static ulong contiguousSize = 128 << 20; +#else static ulong contiguousSize = 4 << 20; +#endif module_param(contiguousSize, ulong, 0644); static ulong contiguousBase = 0; @@ -134,6 +150,9 @@ module_param(compression, int, 0644); static int powerManagement = 1; module_param(powerManagement, int, 0644); +static int gpuProfiler = 0; +module_param(gpuProfiler, int, 0644); + static int signal = 48; module_param(signal, int, 0644); @@ -786,7 +805,9 @@ static int drv_init(struct device *pdev) printk(KERN_INFO "Galcore version %d.%d.%d.%d\n", gcvVERSION_MAJOR, gcvVERSION_MINOR, gcvVERSION_PATCH, gcvVERSION_BUILD); - + /* when enable gpu profiler, we need to turn off gpu powerMangement */ + if(gpuProfiler) + powerManagement = 0; if (showArgs) { printk("galcore options:\n"); @@ -818,6 +839,7 @@ static int drv_init(struct device *pdev) printk(" physSize = 0x%08lX\n", physSize); printk(" logFileSize = %d KB \n", logFileSize); printk(" powerManagement = %d\n", powerManagement); + printk(" gpuProfiler = %d\n", gpuProfiler); #if ENABLE_GPU_CLOCK_BY_DRIVER printk(" coreClock = %lu\n", coreClock); #endif @@ -841,9 +863,14 @@ static int drv_init(struct device *pdev) logFileSize, pdev, powerManagement, + gpuProfiler, &device )); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + device->pool = dev_get_drvdata(pdev); +#endif + /* Start the GAL device. */ gcmkONERROR(gckGALDEVICE_Start(device)); @@ -1028,11 +1055,18 @@ static struct notifier_block thermal_hot_pm_notifier = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) +static int gpu_probe(struct platform_device *pdev) +#else static int __devinit gpu_probe(struct platform_device *pdev) +#endif { int ret = -ENODEV; struct resource* res; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + struct contiguous_mem_pool *pool; + struct reset_control *rstc; +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) struct device_node *dn =pdev->dev.of_node; const u32 *prop; #else @@ -1077,7 +1111,22 @@ static int __devinit gpu_probe(struct platform_device *pdev) registerMemSizeVG = res->end - res->start + 1; } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + pool = devm_kzalloc(&pdev->dev, sizeof(*pool), GFP_KERNEL); + if (!pool) + return -ENOMEM; + pool->size = contiguousSize; + init_dma_attrs(&pool->attrs); + dma_set_attr(DMA_ATTR_WRITE_COMBINE, &pool->attrs); + pool->virt = dma_alloc_attrs(&pdev->dev, pool->size, &pool->phys, + GFP_KERNEL, &pool->attrs); + if (!pool->virt) { + dev_err(&pdev->dev, "Failed to allocate contiguous memory\n"); + return -ENOMEM; + } + contiguousBase = pool->phys; + dev_set_drvdata(&pdev->dev, pool); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) prop = of_get_property(dn, "contiguousbase", NULL); if(prop) contiguousBase = *prop; @@ -1095,30 +1144,56 @@ static int __devinit gpu_probe(struct platform_device *pdev) if (!ret) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + rstc = devm_reset_control_get(&pdev->dev, "gpu3d"); + galDevice->rstc[gcvCORE_MAJOR] = IS_ERR(rstc) ? NULL : rstc; + + rstc = devm_reset_control_get(&pdev->dev, "gpu2d"); + galDevice->rstc[gcvCORE_2D] = IS_ERR(rstc) ? NULL : rstc; + + rstc = devm_reset_control_get(&pdev->dev, "gpuvg"); + galDevice->rstc[gcvCORE_VG] = IS_ERR(rstc) ? NULL : rstc; +#endif platform_set_drvdata(pdev, galDevice); #if gcdENABLE_FSCALE_VAL_ADJUST - if(galDevice->kernels[gcvCORE_MAJOR]) - register_thermal_notifier(&thermal_hot_pm_notifier); + if (galDevice->kernels[gcvCORE_MAJOR]) + REG_THERMAL_NOTIFIER(&thermal_hot_pm_notifier); #endif gcmkFOOTER_NO(); return ret; } #if gcdENABLE_FSCALE_VAL_ADJUST - unregister_thermal_notifier(&thermal_hot_pm_notifier); + UNREG_THERMAL_NOTIFIER(&thermal_hot_pm_notifier); +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + dma_free_attrs(&pdev->dev, pool->size, pool->virt, pool->phys, + &pool->attrs); #endif gcmkFOOTER_ARG(KERN_INFO "Failed to register gpu driver: %d\n", ret); return ret; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) +static int gpu_remove(struct platform_device *pdev) +#else static int __devexit gpu_remove(struct platform_device *pdev) +#endif { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + gckGALDEVICE device = platform_get_drvdata(pdev); + struct contiguous_mem_pool *pool = device->pool; +#endif gcmkHEADER(); #if gcdENABLE_FSCALE_VAL_ADJUST if(galDevice->kernels[gcvCORE_MAJOR]) - unregister_thermal_notifier(&thermal_hot_pm_notifier); + UNREG_THERMAL_NOTIFIER(&thermal_hot_pm_notifier); #endif drv_exit(); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + dma_free_attrs(&pdev->dev, pool->size, pool->virt, pool->phys, + &pool->attrs); +#endif gcmkFOOTER_NO(); return 0; } @@ -1254,13 +1329,17 @@ MODULE_DEVICE_TABLE(of, mxs_gpu_dt_ids); #ifdef CONFIG_PM static int gpu_runtime_suspend(struct device *dev) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) release_bus_freq(BUS_FREQ_HIGH); +#endif return 0; } static int gpu_runtime_resume(struct device *dev) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) request_bus_freq(BUS_FREQ_HIGH); +#endif return 0; } @@ -1284,7 +1363,11 @@ static const struct dev_pm_ops gpu_pm_ops = { static struct platform_driver gpu_driver = { .probe = gpu_probe, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + .remove = gpu_remove, +#else .remove = __devexit_p(gpu_remove), +#endif .suspend = gpu_suspend, .resume = gpu_resume, diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c index e7edc39..331c73f 100644 --- a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c @@ -30,19 +30,30 @@ #include #include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) #include +#endif #include #include #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23) #include #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) +#include +static inline void imx_gpc_power_up_pu(bool flag) {} +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) #include #endif #include #include +#if gcdANDROID_NATIVE_FENCE_SYNC +#include +#include "gc_hal_kernel_sync.h" +#endif + + #define _GC_OBJ_ZONE gcvZONE_OS /******************************************************************************* @@ -148,6 +159,7 @@ typedef struct _gcsINTEGER_DB { struct idr idr; spinlock_t lock; + gctINT curr; } gcsINTEGER_DB; @@ -180,6 +192,14 @@ struct _gckOS /* signal id database. */ gcsINTEGER_DB signalDB; +#if gcdANDROID_NATIVE_FENCE_SYNC + /* Lock. */ + gctPOINTER syncPointMutex; + + /* sync point id database. */ + gcsINTEGER_DB syncPointDB; +#endif + gcsUSER_MAPPING_PTR userMap; gctPOINTER debugLock; @@ -215,6 +235,25 @@ typedef struct _gcsSIGNAL } gcsSIGNAL; +#if gcdANDROID_NATIVE_FENCE_SYNC +typedef struct _gcsSYNC_POINT * gcsSYNC_POINT_PTR; +typedef struct _gcsSYNC_POINT +{ + /* The reference counter. */ + atomic_t ref; + + /* State. */ + atomic_t state; + + /* timeline. */ + struct sync_timeline * timeline; + + /* ID. */ + gctUINT32 id; +} +gcsSYNC_POINT; +#endif + typedef struct _gcsPageInfo * gcsPageInfo_PTR; typedef struct _gcsPageInfo { @@ -767,7 +806,32 @@ _AllocateIntegerId( ) { int result; + gctINT next; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + idr_preload(GFP_KERNEL | gcdNOWARN); + spin_lock(&Database->lock); + + next = (Database->curr + 1 <= 0) ? 1 : Database->curr + 1; + result = idr_alloc(&Database->idr, KernelPointer, next, 0, GFP_ATOMIC); + + if (!result) + { + Database->curr = *Id; + } + + spin_unlock(&Database->lock); + + idr_preload_end(); + + if (result < 0) + { + return gcvSTATUS_OUT_OF_RESOURCES; + } + + *Id = result; +#else again: if (idr_pre_get(&Database->idr, GFP_KERNEL | gcdNOWARN) == 0) { @@ -776,8 +840,15 @@ again: spin_lock(&Database->lock); - /* Try to get a id greater than 0. */ - result = idr_get_new_above(&Database->idr, KernelPointer, 1, Id); + next = (Database->curr + 1 <= 0) ? 1 : Database->curr + 1; + + /* Try to get a id greater than current id. */ + result = idr_get_new_above(&Database->idr, KernelPointer, next, Id); + + if (!result) + { + Database->curr = *Id; + } spin_unlock(&Database->lock); @@ -790,6 +861,7 @@ again: { return gcvSTATUS_OUT_OF_RESOURCES; } +#endif return gcvSTATUS_OK; } @@ -1008,6 +1080,21 @@ gckOS_Construct( /* Initialize signal id database. */ idr_init(&os->signalDB.idr); +#if gcdANDROID_NATIVE_FENCE_SYNC + /* + * Initialize the sync point manager. + */ + + /* Initialize mutex. */ + gcmkONERROR(gckOS_CreateMutex(os, &os->syncPointMutex)); + + /* Initialize sync point id database lock. */ + spin_lock_init(&os->syncPointDB.lock); + + /* Initialize sync point id database. */ + idr_init(&os->syncPointDB.idr); +#endif + #if gcdUSE_NON_PAGED_MEMORY_CACHE os->cacheSize = 0; os->cacheHead = gcvNULL; @@ -1031,6 +1118,15 @@ gckOS_Construct( return gcvSTATUS_OK; OnError: + +#if gcdANDROID_NATIVE_FENCE_SYNC + if (os->syncPointMutex != gcvNULL) + { + gcmkVERIFY_OK( + gckOS_DeleteMutex(os, os->syncPointMutex)); + } +#endif + if (os->signalMutex != gcvNULL) { gcmkVERIFY_OK( @@ -1104,6 +1200,15 @@ gckOS_Destroy( _FreeAllNonPagedMemoryCache(Os); #endif +#if gcdANDROID_NATIVE_FENCE_SYNC + /* + * Destroy the sync point manager. + */ + + /* Destroy the mutex. */ + gcmkVERIFY_OK(gckOS_DeleteMutex(Os, Os->syncPointMutex)); +#endif + /* * Destroy the signal manager. */ @@ -1961,12 +2066,6 @@ gckOS_AllocateNonPagedMemory( gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); } - if ((Os->device->baseAddress & 0x80000000) != (mdl->dmaHandle & 0x80000000)) - { - mdl->dmaHandle = (mdl->dmaHandle & ~0x80000000) - | (Os->device->baseAddress & 0x80000000); - } - mdl->addr = addr; /* Return allocated memory. */ @@ -2307,6 +2406,7 @@ gckOS_ReadRegisterEx( /* Verify the arguments. */ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); + gcmkVERIFY_ARGUMENT(Address < Os->device->requestedRegisterMemSizes[Core]); gcmkVERIFY_ARGUMENT(Data != gcvNULL); *Data = readl((gctUINT8 *)Os->device->registerBases[Core] + Address); @@ -2357,6 +2457,8 @@ gckOS_WriteRegisterEx( { gcmkHEADER_ARG("Os=0x%X Core=%d Address=0x%X Data=0x%08x", Os, Core, Address, Data); + gcmkVERIFY_ARGUMENT(Address < Os->device->requestedRegisterMemSizes[Core]); + writel(Data, (gctUINT8 *)Os->device->registerBases[Core] + Address); /* Success. */ @@ -2799,16 +2901,25 @@ gckOS_MapPhysical( if (mdl == gcvNULL) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + struct contiguous_mem_pool *pool = Os->device->pool; + + if (Physical >= pool->phys && Physical < pool->phys + pool->size) + logical = (gctPOINTER)(Physical - pool->phys + pool->virt); + else + logical = gcvNULL; +#else /* Map memory as cached memory. */ request_mem_region(physical, Bytes, "MapRegion"); logical = (gctPOINTER) ioremap_nocache(physical, Bytes); +#endif if (logical == gcvNULL) { gcmkTRACE_ZONE( gcvLEVEL_INFO, gcvZONE_OS, - "%s(%d): Failed to ioremap", - __FUNCTION__, __LINE__ + "%s(%d): Failed to map physical address 0x%08x", + __FUNCTION__, __LINE__, Physical ); MEMORY_UNLOCK(Os); @@ -3621,7 +3732,7 @@ gckOS_Delay( if (Delay > 0) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28) - ktime_t delay = ktime_set(0, Delay * NSEC_PER_MSEC); + ktime_t delay = ktime_set(Delay/1000, (Delay%1000) * NSEC_PER_MSEC); __set_current_state(TASK_UNINTERRUPTIBLE); schedule_hrtimeout(&delay, HRTIMER_MODE_REL); #else @@ -3881,8 +3992,13 @@ gckOS_AllocatePagedMemoryEx( if (Contiguous) { - /* Get contiguous pages, and suppress warning (stack dump) from kernel when - we run out of memory. */ + gctUINT32 order = get_order(bytes); + + if (order >= MAX_ORDER) + { + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) addr = alloc_pages_exact(numPages * PAGE_SIZE, GFP_KERNEL | gcdNOWARN | __GFP_NORETRY); @@ -3894,12 +4010,12 @@ gckOS_AllocatePagedMemoryEx( mdl->exact = gcvTRUE; #else mdl->u.contiguousPages = - alloc_pages(GFP_KERNEL | gcdNOWARN | __GFP_NORETRY, GetOrder(numPages)); + alloc_pages(GFP_KERNEL | gcdNOWARN | __GFP_NORETRY, order); #endif if (mdl->u.contiguousPages == gcvNULL) { mdl->u.contiguousPages = - alloc_pages(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN, GetOrder(numPages)); + alloc_pages(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN, order); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27) mdl->exact = gcvFALSE; @@ -4239,13 +4355,13 @@ gckOS_LockPages( } mdlMap->vma->vm_flags |= gcdVM_FLAGS; -#if !gcdPAGED_MEMORY_CACHEABLE + if (Cacheable == gcvFALSE) { /* Make this mapping non-cached. */ mdlMap->vma->vm_page_prot = gcmkPAGED_MEMROY_PROT(mdlMap->vma->vm_page_prot); } -#endif + addr = mdl->addr; /* Now map all the vmalloc pages to this user address. */ @@ -5336,6 +5452,7 @@ OnError: { /* Get the user pages. */ down_read(¤t->mm->mmap_sem); + result = get_user_pages(current, current->mm, memory & PAGE_MASK, @@ -5345,105 +5462,127 @@ OnError: pages, gcvNULL ); + up_read(¤t->mm->mmap_sem); if (result <=0 || result < pageCount) { struct vm_area_struct *vma; - /* Free the page table. */ - if (pages != gcvNULL) + /* Release the pages if any. */ + if (result > 0) { - /* Release the pages if any. */ - if (result > 0) + for (i = 0; i < result; i++) { - for (i = 0; i < result; i++) + if (pages[i] == gcvNULL) { - if (pages[i] == gcvNULL) - { - break; - } - - page_cache_release(pages[i]); + break; } + + page_cache_release(pages[i]); + pages[i] = gcvNULL; } - kfree(pages); - pages = gcvNULL; + result = 0; } vma = find_vma(current->mm, memory); - if (vma && (vma->vm_flags & VM_PFNMAP) ) + if (vma && (vma->vm_flags & VM_PFNMAP)) { pte_t * pte; spinlock_t * ptl; - unsigned long pfn; + gctUINTPTR_T logical = memory; - pgd_t * pgd = pgd_offset(current->mm, memory); - pud_t * pud = pud_offset(pgd, memory); - if (pud) + for (i = 0; i < pageCount; i++) { - pmd_t * pmd = pmd_offset(pud, memory); - pte = pte_offset_map_lock(current->mm, pmd, memory, &ptl); - if (!pte) + pgd_t * pgd = pgd_offset(current->mm, logical); + pud_t * pud = pud_offset(pgd, logical); + + if (pud) + { + pmd_t * pmd = pmd_offset(pud, logical); + pte = pte_offset_map_lock(current->mm, pmd, logical, &ptl); + if (!pte) + { + gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); + } + } + else { gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); } + + pages[i] = pte_page(*pte); + pte_unmap_unlock(pte, ptl); + + /* Advance to next. */ + logical += PAGE_SIZE; } - else + } + else + { + gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); + } + + /* Check if this memory is contiguous for old mmu. */ + if (Os->device->kernels[Core]->hardware->mmuVersion == 0) + { + for (i = 1; i < pageCount; i++) { - gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); + if (pages[i] != nth_page(pages[0], i)) + { + /* Non-contiguous. */ + break; + } } - pfn = pte_pfn(*pte); - - physical = (pfn << PAGE_SHIFT) | (memory & ~PAGE_MASK); + if (i == pageCount) + { + /* Contiguous memory. */ + physical = page_to_phys(pages[0]) | (memory & ~PAGE_MASK); - pte_unmap_unlock(pte, ptl); + if (!((physical - Os->device->baseAddress) & 0x80000000)) + { + kfree(pages); + pages = gcvNULL; - if ((Os->device->kernels[Core]->hardware->mmuVersion == 0) - && !((physical - Os->device->baseAddress) & 0x80000000)) - { - info->pages = gcvNULL; - info->pageTable = gcvNULL; + info->pages = gcvNULL; + info->pageTable = gcvNULL; - MEMORY_MAP_UNLOCK(Os); + MEMORY_MAP_UNLOCK(Os); - *Address = physical - Os->device->baseAddress; - *Info = info; + *Address = physical - Os->device->baseAddress; + *Info = info; - gcmkFOOTER_ARG("*Info=0x%X *Address=0x%08x", - *Info, *Address); + gcmkFOOTER_ARG("*Info=0x%X *Address=0x%08x", + *Info, *Address); - return gcvSTATUS_OK; + return gcvSTATUS_OK; + } } } - else + + /* Reference pages. */ + for (i = 0; i < pageCount; i++) { - gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); + get_page(pages[i]); } } } - if (pages) - { - for (i = 0; i < pageCount; i++) - { - /* Flush(clean) the data cache. */ - gcmkONERROR(gckOS_CacheFlush(Os, _GetProcessID(), gcvNULL, - (gctPOINTER)(gctUINTPTR_T)page_to_phys(pages[i]), - (gctPOINTER)(memory & PAGE_MASK) + i*PAGE_SIZE, - PAGE_SIZE)); - } - } - else + for (i = 0; i < pageCount; i++) { +#ifdef CONFIG_ARM + gctUINT32 data; + get_user(data, (gctUINT32*)((memory & PAGE_MASK) + i * PAGE_SIZE)); +#endif + /* Flush(clean) the data cache. */ gcmkONERROR(gckOS_CacheFlush(Os, _GetProcessID(), gcvNULL, - (gctPOINTER)(gctUINTPTR_T)(physical & PAGE_MASK), - (gctPOINTER)(memory & PAGE_MASK), - PAGE_SIZE * pageCount)); + (gctPOINTER)(gctUINTPTR_T)page_to_phys(pages[i]), + (gctPOINTER)(memory & PAGE_MASK) + i*PAGE_SIZE, + PAGE_SIZE)); } #if gcdENABLE_VG @@ -5464,20 +5603,14 @@ OnError: (gctPOINTER *) &pageTable, &address)); } + /* Fill the page table. */ for (i = 0; i < pageCount; i++) { gctUINT32 phys; gctUINT32_PTR tab = pageTable + i * (PAGE_SIZE/4096); - if (pages) - { - phys = page_to_phys(pages[i]); - } - else - { - phys = (physical & PAGE_MASK) + i * PAGE_SIZE; - } + phys = page_to_phys(pages[i]); #if gcdENABLE_VG if (Core == gcvCORE_VG) @@ -6126,7 +6259,7 @@ gckOS_CacheClean( #else dma_sync_single_for_device( gcvNULL, - Physical, + (dma_addr_t)Physical, Bytes, DMA_TO_DEVICE); #endif @@ -6205,7 +6338,7 @@ gckOS_CacheInvalidate( #else dma_sync_single_for_device( gcvNULL, - Physical, + (dma_addr_t)Physical, Bytes, DMA_FROM_DEVICE); #endif @@ -6279,7 +6412,7 @@ gckOS_CacheFlush( #else dma_sync_single_for_device( gcvNULL, - Physical, + (dma_addr_t)Physical, Bytes, DMA_BIDIRECTIONAL); #endif @@ -6827,6 +6960,9 @@ gckOS_SetGPUPower( struct clk *clk_2dcore = Os->device->clk_2d_core; struct clk *clk_2d_axi = Os->device->clk_2d_axi; struct clk *clk_vg_axi = Os->device->clk_vg_axi; +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + int ret; +#endif gctBOOL oldClockState = gcvFALSE; gctBOOL oldPowerState = gcvFALSE; @@ -6852,9 +6988,13 @@ gckOS_SetGPUPower( } if((Power == gcvTRUE) && (oldPowerState == gcvFALSE)) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) - if(!IS_ERR(Os->device->gpu_regulator)) - regulator_enable(Os->device->gpu_regulator); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + if(!IS_ERR(Os->device->gpu_regulator)) { + ret = regulator_enable(Os->device->gpu_regulator); + if (ret != 0) + gckOS_Print("%s(%d): fail to enable pu regulator %d!\n", + __FUNCTION__, __LINE__, ret); + } #else imx_gpc_power_up_pu(true); #endif @@ -6969,7 +7109,7 @@ gckOS_SetGPUPower( pm_runtime_put_sync(Os->device->pmdev); #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) if(!IS_ERR(Os->device->gpu_regulator)) regulator_disable(Os->device->gpu_regulator); #else @@ -7033,6 +7173,10 @@ gckOS_ResetGPU( } gcmkFOOTER_NO(); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + struct reset_control *rstc = Os->device->rstc[Core]; + if (rstc) + reset_control_reset(rstc); #else imx_src_reset_gpu((int)Core); #endif @@ -8529,3 +8673,338 @@ gckOS_GetProcessNameByPid( return gcvSTATUS_OK; } +#if gcdANDROID_NATIVE_FENCE_SYNC + +gceSTATUS +gckOS_CreateSyncPoint( + IN gckOS Os, + OUT gctSYNC_POINT * SyncPoint + ) +{ + gceSTATUS status; + gcsSYNC_POINT_PTR syncPoint; + + gcmkHEADER_ARG("Os=0x%X", Os); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); + + /* Create an sync point structure. */ + syncPoint = (gcsSYNC_POINT_PTR) kmalloc( + sizeof(gcsSYNC_POINT), GFP_KERNEL | gcdNOWARN); + + if (syncPoint == gcvNULL) + { + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + + /* Initialize the sync point. */ + atomic_set(&syncPoint->ref, 1); + atomic_set(&syncPoint->state, 0); + + gcmkONERROR(_AllocateIntegerId(&Os->syncPointDB, syncPoint, &syncPoint->id)); + + *SyncPoint = (gctSYNC_POINT)(gctUINTPTR_T)syncPoint->id; + + gcmkFOOTER_ARG("*SyncPonint=%d", syncPoint->id); + return gcvSTATUS_OK; + +OnError: + if (syncPoint != gcvNULL) + { + kfree(syncPoint); + } + + gcmkFOOTER(); + return status; +} + +gceSTATUS +gckOS_ReferenceSyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint + ) +{ + gceSTATUS status; + gcsSYNC_POINT_PTR syncPoint; + + gcmkHEADER_ARG("Os=0x%X", Os); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); + gcmkVERIFY_ARGUMENT(SyncPoint != gcvNULL); + + gcmkONERROR( + _QueryIntegerId(&Os->syncPointDB, + (gctUINT32)(gctUINTPTR_T)SyncPoint, + (gctPOINTER)&syncPoint)); + + /* Initialize the sync point. */ + atomic_inc(&syncPoint->ref); + + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + +OnError: + gcmkFOOTER(); + return status; +} + +gceSTATUS +gckOS_DestroySyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint + ) +{ + gceSTATUS status; + gcsSYNC_POINT_PTR syncPoint; + gctBOOL acquired = gcvFALSE; + + gcmkHEADER_ARG("Os=0x%X SyncPoint=%d", Os, (gctUINT32)(gctUINTPTR_T)SyncPoint); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); + gcmkVERIFY_ARGUMENT(SyncPoint != gcvNULL); + + gcmkONERROR(gckOS_AcquireMutex(Os, Os->syncPointMutex, gcvINFINITE)); + acquired = gcvTRUE; + + gcmkONERROR( + _QueryIntegerId(&Os->syncPointDB, + (gctUINT32)(gctUINTPTR_T)SyncPoint, + (gctPOINTER)&syncPoint)); + + gcmkASSERT(syncPoint->id == (gctUINT32)(gctUINTPTR_T)SyncPoint); + + if (atomic_dec_and_test(&syncPoint->ref)) + { + gcmkVERIFY_OK(_DestroyIntegerId(&Os->syncPointDB, syncPoint->id)); + + /* Free the sgianl. */ + syncPoint->timeline = gcvNULL; + kfree(syncPoint); + } + + gcmkVERIFY_OK(gckOS_ReleaseMutex(Os, Os->syncPointMutex)); + acquired = gcvFALSE; + + /* Success. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + +OnError: + if (acquired) + { + /* Release the mutex. */ + gcmkVERIFY_OK(gckOS_ReleaseMutex(Os, Os->syncPointMutex)); + } + + gcmkFOOTER(); + return status; +} + +gceSTATUS +gckOS_SignalSyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint + ) +{ + gceSTATUS status; + gcsSYNC_POINT_PTR syncPoint; + gctBOOL acquired = gcvFALSE; + + gcmkHEADER_ARG("Os=0x%X SyncPoint=%d", Os, (gctUINT32)(gctUINTPTR_T)SyncPoint); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); + gcmkVERIFY_ARGUMENT(SyncPoint != gcvNULL); + + gcmkONERROR(gckOS_AcquireMutex(Os, Os->syncPointMutex, gcvINFINITE)); + acquired = gcvTRUE; + + gcmkONERROR( + _QueryIntegerId(&Os->syncPointDB, + (gctUINT32)(gctUINTPTR_T)SyncPoint, + (gctPOINTER)&syncPoint)); + + gcmkASSERT(syncPoint->id == (gctUINT32)(gctUINTPTR_T)SyncPoint); + + /* Get state. */ + atomic_set(&syncPoint->state, gcvTRUE); + + /* Signal timeline. */ + if (syncPoint->timeline) + { + sync_timeline_signal(syncPoint->timeline); + } + + gcmkVERIFY_OK(gckOS_ReleaseMutex(Os, Os->syncPointMutex)); + acquired = gcvFALSE; + + /* Success. */ + gcmkFOOTER_NO(); + return gcvSTATUS_OK; + +OnError: + if (acquired) + { + /* Release the mutex. */ + gcmkVERIFY_OK(gckOS_ReleaseMutex(Os, Os->syncPointMutex)); + } + + gcmkFOOTER(); + return status; +} + +gceSTATUS +gckOS_QuerySyncPoint( + IN gckOS Os, + IN gctSYNC_POINT SyncPoint, + OUT gctBOOL_PTR State + ) +{ + gceSTATUS status; + gcsSYNC_POINT_PTR syncPoint; + + gcmkHEADER_ARG("Os=0x%X SyncPoint=%d", Os, (gctUINT32)(gctUINTPTR_T)SyncPoint); + + /* Verify the arguments. */ + gcmkVERIFY_OBJECT(Os, gcvOBJ_OS); + gcmkVERIFY_ARGUMENT(SyncPoint != gcvNULL); + + gcmkONERROR( + _QueryIntegerId(&Os->syncPointDB, + (gctUINT32)(gctUINTPTR_T)SyncPoint, + (gctPOINTER)&syncPoint)); + + gcmkASSERT(syncPoint->id == (gctUINT32)(gctUINTPTR_T)SyncPoint); + + /* Get state. */ + *State = atomic_read(&syncPoint->state); + + /* Success. */ + gcmkFOOTER_ARG("*State=%d", *State); + return gcvSTATUS_OK; + +OnError: + gcmkFOOTER(); + return status; +} + +gceSTATUS +gckOS_CreateSyncTimeline( + IN gckOS Os, + OUT gctHANDLE * Timeline + ) +{ + struct viv_sync_timeline * timeline; + + /* Create viv sync timeline. */ + timeline = viv_sync_timeline_create("viv timeline", Os); + + if (timeline == gcvNULL) + { + /* Out of memory. */ + return gcvSTATUS_OUT_OF_MEMORY; + } + + *Timeline = (gctHANDLE) timeline; + return gcvSTATUS_OK; +} + +gceSTATUS +gckOS_DestroySyncTimeline( + IN gckOS Os, + IN gctHANDLE Timeline + ) +{ + struct viv_sync_timeline * timeline; + gcmkASSERT(Timeline != gcvNULL); + + /* Destroy timeline. */ + timeline = (struct viv_sync_timeline *) Timeline; + sync_timeline_destroy(&timeline->obj); + + return gcvSTATUS_OK; +} + +gceSTATUS +gckOS_CreateNativeFence( + IN gckOS Os, + IN gctHANDLE Timeline, + IN gctSYNC_POINT SyncPoint, + OUT gctINT * FenceFD + ) +{ + int fd = -1; + struct viv_sync_timeline *timeline; + struct sync_pt * pt = gcvNULL; + struct sync_fence * fence; + char name[32]; + gcsSYNC_POINT_PTR syncPoint; + gceSTATUS status; + + gcmkHEADER_ARG("Os=0x%X Timeline=0x%X SyncPoint=%d", + Os, Timeline, (gctUINT)(gctUINTPTR_T)SyncPoint); + + gcmkONERROR( + _QueryIntegerId(&Os->syncPointDB, + (gctUINT32)(gctUINTPTR_T)SyncPoint, + (gctPOINTER)&syncPoint)); + + /* Cast timeline. */ + timeline = (struct viv_sync_timeline *) Timeline; + + fd = get_unused_fd(); + + if (fd < 0) + { + /* Out of resources. */ + gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES); + } + + /* Create viv_sync_pt. */ + pt = viv_sync_pt_create(timeline, SyncPoint); + + if (pt == gcvNULL) + { + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + + /* Reference sync_timeline. */ + syncPoint->timeline = &timeline->obj; + + /* Build fence name. */ + snprintf(name, 32, "viv sync_fence-%u", (gctUINT)(gctUINTPTR_T)SyncPoint); + + /* Create sync_fence. */ + fence = sync_fence_create(name, pt); + + if (fence == NULL) + { + gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY); + } + + /* Install fence to fd. */ + sync_fence_install(fence, fd); + + *FenceFD = fd; + gcmkFOOTER_ARG("*FenceFD=%d", fd); + return gcvSTATUS_OK; + +OnError: + /* Error roll back. */ + if (pt) + { + sync_pt_free(pt); + } + + if (fd > 0) + { + put_unused_fd(fd); + } + + gcmkFOOTER(); + return status; +} +#endif diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c new file mode 100644 index 0000000..7efae1c --- /dev/null +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c @@ -0,0 +1,174 @@ +/**************************************************************************** +* +* Copyright (C) 2005 - 2013 by Vivante Corp. +* +* 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., 675 Mass Ave, Cambridge, MA 02139, USA. +* +*****************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include + +#include "gc_hal_kernel_sync.h" + +#if gcdANDROID_NATIVE_FENCE_SYNC + +static struct sync_pt * +viv_sync_pt_dup( + struct sync_pt * sync_pt + ) +{ + gceSTATUS status; + struct viv_sync_pt *pt; + struct viv_sync_pt *src; + struct viv_sync_timeline *obj; + + src = (struct viv_sync_pt *) sync_pt; + obj = (struct viv_sync_timeline *) sync_pt->parent; + + /* Create the new sync_pt. */ + pt = (struct viv_sync_pt *) + sync_pt_create(&obj->obj, sizeof(struct viv_sync_pt)); + + pt->stamp = src->stamp; + pt->sync = src->sync; + + /* Reference sync point. */ + status = gckOS_ReferenceSyncPoint(obj->os, pt->sync); + + if (gcmIS_ERROR(status)) + { + sync_pt_free((struct sync_pt *)pt); + return NULL; + } + + return (struct sync_pt *)pt; +} + +static int +viv_sync_pt_has_signaled( + struct sync_pt * sync_pt + ) +{ + gceSTATUS status; + gctBOOL state; + struct viv_sync_pt * pt; + struct viv_sync_timeline * obj; + + pt = (struct viv_sync_pt *)sync_pt; + obj = (struct viv_sync_timeline *)sync_pt->parent; + + status = gckOS_QuerySyncPoint(obj->os, pt->sync, &state); + + if (gcmIS_ERROR(status)) + { + /* Error. */ + return -1; + } + + return state; +} + +static int +viv_sync_pt_compare( + struct sync_pt * a, + struct sync_pt * b + ) +{ + int ret; + struct viv_sync_pt * pt1 = (struct viv_sync_pt *) a; + struct viv_sync_pt * pt2 = (struct viv_sync_pt *) b; + + ret = (pt1->stamp < pt2->stamp) ? -1 + : (pt1->stamp == pt2->stamp) ? 0 + : 1; + + return ret; +} + +static void +viv_sync_pt_free( + struct sync_pt * sync_pt + ) +{ + struct viv_sync_pt * pt; + struct viv_sync_timeline * obj; + + pt = (struct viv_sync_pt *) sync_pt; + obj = (struct viv_sync_timeline *) sync_pt->parent; + + gckOS_DestroySyncPoint(obj->os, pt->sync); +} + +static struct sync_timeline_ops viv_timeline_ops = +{ + .driver_name = "viv_sync", + .dup = viv_sync_pt_dup, + .has_signaled = viv_sync_pt_has_signaled, + .compare = viv_sync_pt_compare, + .free_pt = viv_sync_pt_free, +}; + +struct viv_sync_timeline * +viv_sync_timeline_create( + const char * name, + gckOS os + ) +{ + struct viv_sync_timeline * obj; + + obj = (struct viv_sync_timeline *) + sync_timeline_create(&viv_timeline_ops, sizeof(struct viv_sync_timeline), name); + + obj->os = os; + obj->stamp = 0; + + return obj; +} + +struct sync_pt * +viv_sync_pt_create( + struct viv_sync_timeline * obj, + gctSYNC_POINT SyncPoint + ) +{ + gceSTATUS status; + struct viv_sync_pt * pt; + + pt = (struct viv_sync_pt *) + sync_pt_create(&obj->obj, sizeof(struct viv_sync_pt)); + + pt->stamp = obj->stamp++; + pt->sync = SyncPoint; + + /* Dup signal. */ + status = gckOS_ReferenceSyncPoint(obj->os, SyncPoint); + + if (gcmIS_ERROR(status)) + { + sync_pt_free((struct sync_pt *)pt); + return NULL; + } + + return (struct sync_pt *) pt; +} + +#endif diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h new file mode 100644 index 0000000..6fc12e5 --- /dev/null +++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h @@ -0,0 +1,71 @@ +/**************************************************************************** +* +* Copyright (C) 2005 - 2013 by Vivante Corp. +* +* 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., 675 Mass Ave, Cambridge, MA 02139, USA. +* +*****************************************************************************/ + + +#ifndef __gc_hal_kernel_sync_h_ +#define __gc_hal_kernel_sync_h_ + +#include + +#include + +#include +#include + +struct viv_sync_timeline +{ + /* Parent object. */ + struct sync_timeline obj; + + /* Timestamp when sync_pt is created. */ + gctUINT stamp; + + /* Pointer to os struct. */ + gckOS os; +}; + + +struct viv_sync_pt +{ + /* Parent object. */ + struct sync_pt pt; + + /* Reference sync point*/ + gctSYNC_POINT sync; + + /* Timestamp when sync_pt is created. */ + gctUINT stamp; +}; + +/* Create viv_sync_timeline object. */ +struct viv_sync_timeline * +viv_sync_timeline_create( + const char * Name, + gckOS Os + ); + +/* Create viv_sync_pt object. */ +struct sync_pt * +viv_sync_pt_create( + struct viv_sync_timeline * Obj, + gctSYNC_POINT SyncPoint + ); + +#endif /* __gc_hal_kernel_sync_h_ */ -- 1.7.9.5