📄 control.cpp
字号:
/***************************************************************************
* Name : control.cpp
* Title : MBX WinCE driver DrvEscmodule
* Author(s) : Imagination Technologies
* Created : 19th June 2003
*
* Copyright : 2003 by Imagination Technologies. All rights reserved.
* : No part of this software, either material or conceptual
* : may be copied or distributed, transmitted, transcribed,
* : stored in a retrieval system or translated into any
* : human or computer language in any form by any means,
* : electronic, mechanical, manual or other-wise, or
* : disclosed to third parties without the express written
* : permission of Imagination Technologies Limited, Unit 8,
* : HomePark Industrial Estate, King's Langley, Hertfordshire,
* : WD4 8LZ, U.K.
*
* Description : MBX WinCE driver DrvEscape handler.
*
* Platform : WinCE
*
* Modifications:-
* $Log: control.cpp $
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
* --- Revision Logs Removed ---
*
****************************************************************************/
#include "precomp.h"
// profiling
#include "dispperf.h"
extern "C"
{
#include "drvescape.h"
#include "pvrdispconfig.h"
#include "pvrextescapes.h"
#include "memchk.h"
#include "pvr_bridge.h"
}
#include "gamex.h"
#define ESC_FAILED -1
#define ESC_SUCCESS 1
#ifdef SUPPORT_CLEARTYPE
extern GetGammaValue(ULONG * pGamma);
extern SetGammaValue(ULONG ulGamma, BOOL bUpdateReg);
#endif
/*
* function prototypes -------------------------------------------------------
*/
static VIDEO_POWER_STATE PmToVideoPowerState( CEDEVICE_POWER_STATE Dx );
static CEDEVICE_POWER_STATE VideoToPmPowerState( VIDEO_POWER_STATE PowerState );
ULONG MBX::DrvEscape(
SURFOBJ *pso,
ULONG ulEsc,
ULONG ulSizeIn,
PVOID pvIn,
ULONG ulSizeOut,
PVOID pvOut)
{
ULONG ulRetVal = 0; // Default to "unsupported"
PVRSRV_BRIDGE_RETURN *psRet; /* general return packet */
////////DPFENTER ((L"->DrvEscape"));
switch (ulEsc)
{
#ifdef SUPPORT_CLEARTYPE
case DRVESC_GETGAMMAVALUE:
ulRetVal = GetGammaValue((ULONG *)pvOut);
break;
case DRVESC_SETGAMMAVALUE:
ulRetVal = SetGammaValue(ulSizeIn, *(BOOL *)pvIn);
break;
#endif // SUPPORT_CLEARTYPE
#ifdef ROTATE_ENABLE
case DRVESC_GETSCREENROTATION:
*(int *)pvOut = ((BYTE)PhysToLogicalRotEnum(m_iRotate));
if (m_bDisableDynScrnRotation == FALSE)
{
/*
* top byte goes to devMode.dmDisplayOrientation
* CETestkit uses this field to determine if rotation is available
*/
*(int *)pvOut |= ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8);
}
ulRetVal = DISP_CHANGE_SUCCESSFUL;
break;
case DRVESC_SETSCREENROTATION:
if ((ulSizeIn == DMDO_0) ||
(ulSizeIn == DMDO_90) ||
(ulSizeIn == DMDO_180) ||
(ulSizeIn == DMDO_270) )
{
if (m_bDisableDynScrnRotation == FALSE)
{
ulRetVal = DynRotate(LogicalToPhysRotEnum(ulSizeIn));
}
}
break;
case DRVESC_GET_PHYS_ROTATION:
{
// Returns the physical rotation of the screen in DMDO_xxx format.
// This is necessary because for PocketPC DRVESC_GETSCREENROTATION gives the logical rotation.
//
*(DWORD*)pvOut = (DWORD)m_iRotate; // DMDO_xxx format
ulRetVal = ESC_SUCCESS;
break;
}
#endif // ROTATE_ENABLE
// App is querying to see if a code is supported.
case QUERYESCSUPPORT:
{
ULONG ulSupportChk;
if (ulSizeIn == sizeof(ULONG))
{
// Code to check is pointed to by InBuffer.
ulSupportChk = *(ULONG *)pvIn;
switch (ulSupportChk)
{
// PowerVR codes.
case DRVESC_PDUMP_ON:
case DRVESC_PDUMP_OFF:
case DRVESC_DISPLAY_GAMMA:
case DRVESC_DISPLAY_BRIGHTNESS:
case DRVESC_DISPLAY_CONTRAST:
case DRVESC_OVERLAY_GAMMA:
case DRVESC_OVERLAY_BRIGHTNESS:
case DRVESC_OVERLAY_CONTRAST:
case DRVESC_CURSOR_ROTATE:
case DRVESC_COLOR_COEFFS:
case DRVESC_RESTOREVIDEOMEM:
case DRVESC_SAVEVIDEOMEM:
case DRVESC_QUERYVIDEOMEMUSED:
case DRVESC_HWVERIFY:
case DRVESC_BACKLIGHT:
#ifdef LOCAL_MEMORY_SELF_REFRESH
case DRVESC_LOCAL_MEMORY:
#endif // LOCAL_MEMORY_SELF_REFRESH
case DRVESC_MEMCHK:
// power management
case SETPOWERMANAGEMENT:
case GETPOWERMANAGEMENT:
case IOCTL_POWER_CAPABILITIES:
case IOCTL_POWER_QUERY:
case IOCTL_POWER_SET:
case IOCTL_POWER_GET:
//Resource management
case DRVESC_RESMAN_THREAD_TERMINATED:
// PocketPC GameX Escape code
case GETGXINFO:
#if defined(GETRAWFRAMEBUFFER) || defined (OSV_PPC)
case GETRAWFRAMEBUFFER:
#endif
// system codes
#ifdef SUPPORT_CLEARTYPE
case DRVESC_GETGAMMAVALUE:
case DRVESC_SETGAMMAVALUE:
#endif
case CONTRASTCOMMAND:
#if 0 // bcb: Do these make sense on a UMA system?
case GETVFRAMEPHYSICAL:
case GETVFRAMELEN:
#endif
#ifdef SUPPORT_M24VA
case DRVESC_M24VA_ACQUIRE:
case DRVESC_OVERLAY_ATTRIBUTE:
case DRVESC_OVERLAY_FLIP:
#endif
#ifdef SUPPORT_MARATHON_DEVICE
case DRVESC_DIRTY:
case DRVESC_CONFIG_DISPLAYSYSTEM:
case DRVESC_CREATE_OFFSCREENSURFACE:
case DRVESC_GET_SURFACEINFO:
case DRVESC_READREG:
case DRVESC_FORCE_EXTERNAL_SECONDARY_FULLSCREEN:
case DRVESC_ACQUIRE_DUALDISPLAY:
case DRVESC_ACTIVE_RECT:
case DRVESC_PIXCLK:
case DRVESC_OUTPUTMASK:
case DRVESC_DISPLAY_REFRESH:
#endif
#ifndef DEBUG
case DRVESC_GET_EXCEPTION_COUNTS:
#endif
ulRetVal = ESC_SUCCESS;
break;
#ifdef ROTATE_ENABLE
case DRVESC_GETSCREENROTATION:
case DRVESC_SETSCREENROTATION:
{
if (m_bDisableDynScrnRotation == FALSE)
{
ulRetVal = ESC_SUCCESS;
}
break;
}
case DRVESC_GET_PHYS_ROTATION:
{
ulRetVal = ESC_SUCCESS;
break;
}
#endif//ROTATE_ENABLE
#ifdef ENABLE_2D_PROFILE
case DRVESC_2D_PROFILE:
{
ulRetVal = ESC_SUCCESS;
break;
}
#endif
// Pass any unrecognised codes to DispPerf.
default:
ulRetVal = DispPerfQueryEsc(ulSupportChk);
}
}
else
{
SetLastError (ERROR_INVALID_PARAMETER);
ulRetVal = ESC_FAILED;
}
}
break;
case CONTRASTCOMMAND:
{
ContrastCmdInputParm* psContrast = (ContrastCmdInputParm*)pvIn;
int *nContrast;
if(pvOut)
{
nContrast = (int*)pvOut;
*nContrast = psContrast->parm;
}
else
{
nContrast = &psContrast->parm;
}
if (ulSizeIn < sizeof(ContrastCmdInputParm))
{
ulRetVal = ESC_FAILED;
}
else
{
ulRetVal = ContrastControl (psContrast->command, (ULONG*) nContrast);
psContrast->parm=*nContrast;
}
break;
}
#if 0 // bcb: Do these make sense on a UMA system?
case GETVFRAMEPHYSICAL:
{
if (ulSizeOut < sizeof(DWORD))
{
ulRetVal = ESC_FAILED;
}
else
{
// Get phys address of video memory
*(DWORD*)pvOut = (DWORD)m_pbyFBPhysBase;
ulRetVal = ESC_SUCCESS;
}
break;
}
case GETVFRAMELEN:
{
if (ulSizeOut < sizeof(DWORD))
{
ulRetVal = ESC_FAILED;
}
else
{
// Get amount of video memory
*(DWORD*)pvOut = m_sDevData.psDevInfoKM->sDevLocation.ui32FBMemorySize;
ulRetVal = ESC_SUCCESS;
}
break;
}
#endif
// PowerVR codes.
case DRVESC_PDUMP_ON:
#if PDUMP
DPFINFO((L"-----------Switching PDUMP on-----------"));
PDumpStart();
#endif /* PDUMP */
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_PDUMP_OFF:
#if PDUMP
DPFINFO((L"-----------Switching PDUMP off----------"));
PDumpStop();
#endif /* PDUMP */
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_MEMCHK:
#if FIXME
MemChkCheckAllHeaps(TRUE);
#endif
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_HWVERIFY:
{
PDRVESC_HWVERIFY_PARAMS psHwVerIn = (PDRVESC_HWVERIFY_PARAMS)pvIn;
PDRVESC_HWVERIFY_PARAMS psHwVerOut = (PDRVESC_HWVERIFY_PARAMS)pvOut;
if ( (ulSizeIn != sizeof(DRVESC_HWVERIFY_PARAMS)) || !psHwVerIn)
{
SetLastError (ERROR_INVALID_PARAMETER);
ulRetVal = ESC_FAILED;
}
else if ( (psHwVerIn->dwFlags & DRVESC_HWVERIFY_FLAG_GET)
&& ((ulSizeOut != sizeof(DRVESC_HWVERIFY_PARAMS)) || !psHwVerOut) )
{
SetLastError (ERROR_INVALID_PARAMETER);
ulRetVal = ESC_FAILED;
}
else
{
#if HW_VERIFY
m_clHwVer.DrvEscapeHWVerify (psHwVerIn, psHwVerOut);
#else
SetLastError (ERROR_INVALID_PARAMETER);
ulRetVal = ESC_FAILED;
#endif
}
break;
}
case DRVESC_DISPLAY_GAMMA:
if(ulSizeIn == sizeof(PDP_GAMMA))
{
m_clDisplay.PDP_Gamma((PPDP_GAMMA)pvIn, FALSE);
}
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_DISPLAY_BRIGHTNESS:
if(ulSizeIn == sizeof(PDP_BRIGHTNESS))
{
m_clDisplay.PDP_Brightness((PPDP_BRIGHTNESS)pvIn, FALSE);
}
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_DISPLAY_CONTRAST:
if(ulSizeIn == sizeof(PDP_CONTRAST))
{
m_clDisplay.PDP_Contrast((PPDP_CONTRAST)pvIn, FALSE);
}
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_OVERLAY_GAMMA:
if(ulSizeIn == sizeof(PDP_GAMMA))
{
m_clDisplay.PDP_OverlayGamma((PPDP_GAMMA)pvIn, FALSE);
}
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_OVERLAY_BRIGHTNESS:
if(ulSizeIn == sizeof(PDP_BRIGHTNESS))
{
m_clDisplay.PDP_OverlayBrightness((PPDP_BRIGHTNESS)pvIn, FALSE);
}
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_OVERLAY_CONTRAST:
if(ulSizeIn == sizeof(PDP_CONTRAST))
{
m_clDisplay.PDP_OverlayContrast((PPDP_CONTRAST)pvIn, FALSE);
}
ulRetVal = ESC_SUCCESS;
break;
case DRVESC_COLOR_COEFFS:
{
if(ulSizeIn==sizeof(PDP_CSCCoeffs))
{
m_clDisplay.PDP_SetColorspaceConversion ((PPDP_CSCCoeffs)pvIn);
}
ulRetVal = ESC_SUCCESS;
break;
}
#ifdef SUPPORT_MARATHON_DEVICE
case DRVESC_OUTPUTMASK:
{
PDRVESC_OUTPUTMASK_STRUCT psOutputMaskIn;
PDRVESC_OUTPUTMASK_STRUCT psOutputMaskOut;
DWORD dwLowPowerMask;
DWORD dwFullPowerMask;
ulRetVal = ESC_SUCCESS;
psOutputMaskIn=(PDRVESC_OUTPUTMASK_STRUCT)pvIn;
psOutputMaskOut=(PDRVESC_OUTPUTMASK_STRUCT)pvOut;
if(ulSizeIn!=sizeof(*psOutputMaskIn))
{
SetLastError (ERROR_INVALID_PARAMETER); /* no in buffer or too small */
ulRetVal = ESC_FAILED;
break;
}
if(psOutputMaskIn->bGet)
{
// we should verify that we have an output struct
if((psOutputMaskOut) && ulSizeOut==sizeof(*psOutputMaskOut))
{
m_clDisplay.PDP_OutputMask(&dwLowPowerMask,&dwFullPowerMask,FALSE,TRUE);
psOutputMaskOut->ui32FullPowerMask=dwFullPowerMask;
psOutputMaskOut->ui32LowPowerMask=dwLowPowerMask;
}
else
{
SetLastError (ERROR_INVALID_PARAMETER); /* no in buffer or too small */
ulRetVal = ESC_FAILED;
break;
}
}
else
{
dwFullPowerMask=psOutputMaskIn->ui32FullPowerMask;
dwLowPowerMask=psOutputMaskIn->ui32LowPowerMask;
m_clDisplay.PDP_OutputMask(&dwLowPowerMask,&dwFullPowerMask,psOutputMaskIn->bReset,FALSE);
}
break;
}
case DRVESC_DISPLAY_REFRESH:
{
PDRVESC_DISPLAY_REFRESH_STRUCT psRefreshStructIn;
PDRVESC_DISPLAY_REFRESH_STRUCT psRefreshStructOut;
BOOL bSingleShot;
BYTE byUpdateRate;
ulRetVal = ESC_SUCCESS;
psRefreshStructIn=(PDRVESC_DISPLAY_REFRESH_STRUCT)pvIn;
psRefreshStructOut=(PDRVESC_DISPLAY_REFRESH_STRUCT)pvOut;
if(ulSizeIn!=sizeof(*psRefreshStructIn))
{
SetLastError (ERROR_INVALID_PARAMETER); /* no in buffer or too small */
ulRetVal = ESC_FAILED;
break;
}
if(psRefreshStructIn->bGet)
{
// we should verify that we have an output struct
if((psRefreshStructOut) && ulSizeOut==sizeof(*psRefreshStructOut))
{
m_clDisplay.PDP_ReducedRefresh(&byUpdateRate,&bSingleShot,TRUE);
if(bSingleShot)
{
psRefreshStructOut->bFullRefresh=IMG_FALSE;
}
else
{
psRefreshStructOut->bFullRefresh=IMG_TRUE;
}
psRefreshStructOut->ui32RefreshDelay=byUpdateRate;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -