|
|
/************************************************************************/ /* */ /* ESCAPE.C */ /* */ /* Copyright (c) 1994, 1995 ATI Technologies Incorporated. */ /************************************************************************/
#include "precomp.h"
#if (TARGET_BUILD == 351)
/*
* DCI support requires the use of structures and defined values * found in a header file that is only present in versions of * the DDK that support DCI, rather than having these items * in a DCI section of one of the standard header files. For this * reason, we can't do conditional compilation based on whether * the DCI-specific values are defined, because our first indication * would be an error due to the header file not being found. * * Explicit DCI support is only needed when building for NT 3.51, * since it was added for this version, but for version 4.0 (next * version) and above it is incorporated into Direct Draw rather * than being handled separately. */ #include <dciddi.h>
#include "dci.h"
#endif
/**************************************************************************
* * ULONG DrvEscape(pso, iEsc, cjIn, pvIn, cjOut, pvOut); * * SURFOBJ *pso; Surface that the call is directed to * ULONG iEsc; Specifies the particular function to be performed. * Currently, only the following are supported: * QUERYESCSUPPORT: * Determine if a function is supported * ESC_SET_POWER_MANAGEMENT: * Set the DPMS state * DCICOMMAND: * Command to allow apps direct access to video memory * ULONG cjIn; Size, in bytes, of the buffer pointed to by pvIn * PVOID pvIn; Input data for the call. Format depends on function * specified by iEsc * ULONG cjOut; Size, in bytes, of the buffer pointed to by pvOut * PVOID pvOut; Output buffer for the call. Format depends on function * specified by iEsc * * DESCRIPTION: * Entry point for driver-defined functions. * * RETURN VALUE: * ESC_IS_SUPPORTED if successful * ESC_NOT_IMPLEMENTED if QUERYESCSUPPORT called for unimplemented function * ESC_NOT_SUPPORTED if unimplemented function requested * * GLOBALS CHANGED: * None * * CALLED BY: * This is an entry point * * AUTHOR: * Robert Wolff * * CHANGE HISTORY: * * TEST HISTORY: * ***************************************************************************/
ULONG DrvEscape (SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut) { ULONG RetVal; /* Value to be returned */ PDEV *ppdev; /* Pointer to video PDEV */ DWORD dwRet; /* Output bytes from DeviceIoControl() */ VIDEO_POWER_MANAGEMENT DpmsData; /* Structure used in DeviceIoControl() call */ #if (TARGET_BUILD == 351)
DCICMD *pDciCmd; #endif
DISPDBG((DEBUG_ENTRY_EXIT, "--> DrvEscape"));
/*
* Get the PDEV for the video card (used for calling IOCTLs). */ ppdev = (PDEV *) pso->dhpdev;
/*
* Handle each case depending on which escape function was requested. */ switch (iEsc) { /*
* Check whether a given function is supported. */ case QUERYESCSUPPORT: /*
* When querying escape support, the function in question * is passed in the ULONG passed in pvIn. */ if(!pvIn) RetVal = ESC_NOT_IMPLEMENTED; break;
switch (*(PULONG)pvIn) { case QUERYESCSUPPORT: DISPDBG((DEBUG_DETAIL, "Querying QUERYESCSUPPORT")); RetVal = ESC_IS_SUPPORTED; break;
case ESC_SET_POWER_MANAGEMENT: DISPDBG((DEBUG_DETAIL, "Querying ESC_SET_POWER_MANAGEMENT")); RetVal = ESC_IS_SUPPORTED; break;
#if (TARGET_BUILD == 351)
case DCICOMMAND: DISPDBG((DEBUG_DETAIL, "Querying DCICOMMAND")); RetVal = ESC_IS_SUPPORTED; break; #endif
#if PAL_SUPPORT
case ESC_INIT_PAL_SUPPORT: { DWORD value; // the first time ATIPlayer is calling us
DISPDBG( (DEBUG_ESC,"PAL: ESC_INIT_PAL_SUPPORT " )); RetVal= DeallocOffscreenMem(ppdev) ; ppdev->pal_str.Palindrome_flag=FALSE;
//init the VT regs in block 1 (BUS_CNTL)
MemR32(0x28,&value); value=value|0x08000000; MemW32(0x28,value); // initialize some overlay/scaler regs on RAGEIII
if (ppdev->iAsic>=CI_M64_GTC_UMC) { WriteVTReg(0x54, 0x101000); //DD_SCALER_COLOUR_CNTL
WriteVTReg(0x55, 0x2000); //DD_SCALER_H_COEFF0
WriteVTReg(0x56, 0x0D06200D); //DD_SCALER_H_COEFF1
WriteVTReg(0x57, 0x0D0A1C0D); //DD_SCALER_H_COEFF2
WriteVTReg(0x58, 0x0C0E1A0C); //DD_SCALER_H_COEFF3
WriteVTReg(0x59, 0x0C14140C); //DD_SCALER_H_COEFF4
}
// problems with ACCESS DEVICE due to inconcistencies in Palindrome (Due to the fact that Palindrome is inconsistent in
// using the same pointer to ACCESSDEVICE struct for QUERY, ALLOC and FREE) :
(ppdev->pal_str.lpOwnerAccessStructConnector)=NULL; // no owner at this time
(ppdev->pal_str.lpOwnerAccessStructOverlay)=NULL; // no owner at this time
if(ppdev->semph_overlay==2) // = 0 resource free; = 1 in use by DDraw; = 2 in use by Palindrome;
{ ppdev->semph_overlay=0; } } break;
//Functions for CWDDE support
//Display mode group
case Control_DisplaymodeIsSupported: DISPDBG( (DEBUG_ESC,"PAL: Control_DisplaymodeIsSupported " )); RetVal=1; break; case Control_DisplaymodeIsEnabled: DISPDBG( (DEBUG_ESC,"PAL: Control_DisplaymodeIsEnabled " )); RetVal=1; break; case Control_GetDisplaymode: DISPDBG( (DEBUG_ESC," PAL: Control_GetDisplaymode" )); RetVal=GetDisplayMode(ppdev,pvOut) ; break; //End display mode group
// DCI control group
case Control_DCIIsSupported: DISPDBG( (DEBUG_ESC,"PAL: Control_DCIIsSupported " )); RetVal=1; break; case Control_DCIIsEnabled: DISPDBG( (DEBUG_ESC,"PAL: Control_DCIIsEnabled " )); if(ppdev->pal_str.Flag_DCIIsEnabled) RetVal=1; else RetVal=0; break; case Control_DCIEnable: DISPDBG( (DEBUG_ESC," PAL: Control_DCIEnable" )); // this flag will be also used for activation of the mode switch detection code
// this function will be called in the case of mode switch
ppdev->pal_str.CallBackFnct=(PVOID)pvIn; ppdev->pal_str.pData=(PVOID)pvOut;
ppdev->pal_str.Flag_DCIIsEnabled=TRUE; ppdev->pal_str.Counter_DCIIsEnabled++; RetVal=1; break; case Control_DCIDisable: DISPDBG( (DEBUG_ESC," PAL: Control_DCIDisable " )); if(ppdev->pal_str.Counter_DCIIsEnabled>0) if(--ppdev->pal_str.Counter_DCIIsEnabled==0) ppdev->pal_str.Flag_DCIIsEnabled=FALSE; RetVal=1; break; case Control_DCIAccessDevice: DISPDBG( (DEBUG_ESC,"PAL: Control_DCIAccessDevice " )); RetVal=AccessDevice(ppdev,pvIn, pvOut); DISPDBG( (DEBUG_ESC,"PAL: EXIT Control_DCIAccessDevice " )); break;
case Control_DCIVideoCapture: DISPDBG( (DEBUG_ESC_2,"PAL: Control_DCIVideoCapture " )); RetVal=VideoCaptureFnct(ppdev,pvIn, pvOut); break; case Control_ConfigIsSupported: DISPDBG( (DEBUG_ESC,"PAL: Control_ConfigIsSupported" )); RetVal=1; break; case Control_ConfigIsEnabled: DISPDBG( (DEBUG_ESC,"PAL:Control_ConfigIsEnabled " )); if(ppdev->pal_str.Flag_Control_ConfigIsEnabled) RetVal=1; else RetVal=0; break; //end of DCI feature group
// Configuration Group
case Control_GetConfiguration: DISPDBG( (DEBUG_ESC,"PAL: Control_GetConfiguration " )); RetVal=GetConfiguration(ppdev,pvOut); break; //end GetConfiguration
//Functions for direct palindrome support
case ESC_WRITE_REG: DISPDBG( (DEBUG_ESC," PAL: ESC_WRITE_REG" )); RetVal=WriteRegFnct(ppdev,pvIn); break;
case ESC_READ_REG: DISPDBG( (DEBUG_ESC,"PAL: ESC_READ_REG " )); RetVal=ReadRegFnct(ppdev,pvIn, pvOut); break;
case ESC_I2C_ACCESS: DISPDBG( (DEBUG_ESC,"PAL:ESC_I2C_ACCESS " )); I2CAccess_New(ppdev,(LPI2CSTRUCT_NEW)pvIn,(LPI2CSTRUCT_NEW)pvOut); RetVal=ESC_IS_SUPPORTED; break;
case ESC_ALLOC_OFFSCREEN: // this call is palindrome specific and it is seldomly used
if(ppdev->pal_str.Palindrome_flag==FALSE) { ppdev->pal_str.Palindrome_flag=TRUE; ppdev->pal_str.no_lines_allocated=0; // number of lines already allocated by "alloc mem" in offscreen mem
//flags for palindrome
ppdev->pal_str.dos_flag=FALSE; ppdev->pal_str.Realloc_mem_flag=FALSE; ppdev->pal_str.Mode_Switch_flag=FALSE; ppdev->pal_str.No_mem_allocated_flag=FALSE; ppdev->pal_str.preg=NULL; } DISPDBG( (DEBUG_ESC,"PAL:ESC_ALLOC_OFFSCREEN " )); RetVal=AllocOffscreenMem(ppdev, pvIn, pvOut); break;
case ESC_DEALLOC_OFFSCREEN: DISPDBG( (DEBUG_ESC,"PAL: ESC_DEALLOC_OFFSCREEN " )); RetVal= DeallocOffscreenMem(ppdev) ; ppdev->pal_str.Palindrome_flag=FALSE; break;
// end escapes for palindrome support
#endif // PALINDROME_SUPPORT
default: DISPDBG((DEBUG_ERROR, "Querying unimplemented function")); RetVal = ESC_NOT_IMPLEMENTED; break; } break;
/*
* Switch into the specified DPMS state. */ case ESC_SET_POWER_MANAGEMENT: DISPDBG((DEBUG_DETAIL, "Function ESC_SET_POWER_MANAGEMENT"));
/*
* The desired power management state is passed * in the ULONG passed in pvIn. */ if(!pvIn) RetVal = ESC_NOT_IMPLEMENTED; break;
switch (*(PULONG)pvIn) { case VideoPowerOn: DISPDBG((DEBUG_DETAIL, "State selected = ON")); RetVal = ESC_IS_SUPPORTED; break;
case VideoPowerStandBy: DISPDBG((DEBUG_DETAIL, "State selected = STAND-BY")); RetVal = ESC_IS_SUPPORTED; break;
case VideoPowerSuspend: DISPDBG((DEBUG_DETAIL, "State selected = SUSPEND")); RetVal = ESC_IS_SUPPORTED; break;
case VideoPowerOff: DISPDBG((DEBUG_DETAIL, "State selected = OFF")); RetVal = ESC_IS_SUPPORTED; break;
default: DISPDBG((DEBUG_ERROR, "Invalid state selected")); RetVal = ESC_NOT_SUPPORTED; break; }
DpmsData.Length = sizeof(struct _VIDEO_POWER_MANAGEMENT); DpmsData.DPMSVersion = 0; /* Not used for "set" packet */ DpmsData.PowerState = *(PULONG)pvIn;
/*
* Tell the miniport to set the DPMS mode. If the miniport * either doesn't support this packet, or reports that the * video card doesn't, tell the calling application that * we failed. */ if (AtiDeviceIoControl( ppdev->hDriver, IOCTL_VIDEO_SET_POWER_MANAGEMENT, &DpmsData, sizeof (struct _VIDEO_POWER_MANAGEMENT), NULL, 0, &dwRet) == FALSE) { DISPDBG((DEBUG_ERROR, "Unable to set desired state")); RetVal = ESC_NOT_SUPPORTED; }
break;
#if (TARGET_BUILD == 351)
case DCICOMMAND: pDciCmd = (DCICMD*) pvIn;
if ((cjIn < sizeof(DCICMD)) || (pDciCmd->dwVersion != DCI_VERSION)) { RetVal = (ULONG)DCI_FAIL_UNSUPPORTED; } else { switch(pDciCmd->dwCommand) { case DCICREATEPRIMARYSURFACE: RetVal = DCICreatePrimarySurface(ppdev, cjIn, pvIn, cjOut, pvOut); break;
default: RetVal = (ULONG)DCI_FAIL_UNSUPPORTED; break; } } break; #endif
/*
* Unimplemented function requested. */ default: DISPDBG((DEBUG_ERROR, "Unimplemented function requested")); RetVal = ESC_NOT_SUPPORTED; break;
}
DISPDBG((DEBUG_ENTRY_EXIT, "<-- DrvEscape")); return RetVal;
} /* DrvEscape() */
|