DisplayConfig.cpp
上传用户:fjqzjn
上传日期:2008-01-21
资源大小:2764k
文件大小:15k
源码类别:

Windows CE

开发平台:

Visual C++

  1. /******************************************************************************
  2. ** Copyright (C) 2004. Intel Corporation. All Rights Reserved. 
  3. **
  4. ** The source code contained or described herein and all documents related to the
  5. ** source code ("Material") are owned by Intel Corporation or its suppliers or 
  6. ** licensors. Title to the Material remains with Intel Corporation or its suppliers
  7. ** and licensors. The Material contains trade secrets and proprietary and 
  8. ** confidential information of Intel or its suppliers and licensors. The Material 
  9. ** is protected by worldwide copyright and trade secret laws and treaty provisions.
  10. ** No part of the Material may be used, copied, reproduced, modified, published, 
  11. ** uploaded, posted, transmitted, distributed, or disclosed in any way without 
  12. ** Intel抯 prior express written permission.
  13. ** 
  14. ** No license under any patent, copyright, trade secret or other intellectual 
  15. ** property right is granted to or conferred upon you by disclosure or delivery 
  16. ** of the Materials, either expressly, by implication, inducement, estoppel or 
  17. ** otherwise. Any license under such intellectual property rights must be express 
  18. ** and approved by Intel in writing.
  19. ******************************************************************************/
  20. // DisplayConfig.cpp: implementation of the CDisplayConfig class.
  21. //
  22. //////////////////////////////////////////////////////////////////////
  23. #include "stdafx.h"
  24. #include "DispDemo1.h"
  25. #include "DisplayConfig.h"
  26. #ifdef _DEBUG
  27. #undef THIS_FILE
  28. static char THIS_FILE[]=__FILE__;
  29. #define new DEBUG_NEW
  30. #endif
  31. extern "C" BOOL VirtualCopy( 
  32. LPVOID lpvDest, 
  33. LPVOID lpvSrc, 
  34. DWORD cbSize, 
  35. DWORD fdwProtect 
  36. );
  37. //////////////////////////////////////////////////////////////////////
  38. // Construction/Destruction
  39. //////////////////////////////////////////////////////////////////////
  40. CDisplayConfig::CDisplayConfig()
  41. {
  42. m_hdcMarathon = GetDC(NULL);
  43. m_hdcXScale = CreateDC(L"ddi.dll", NULL, NULL, NULL);
  44. memset(&m_RFBDesktop, 0, sizeof(RawFrameBufferInfo));
  45. memset(&m_RFBXScale, 0, sizeof(RawFrameBufferInfo));
  46. memset(&m_RFBSecondary, 0, sizeof(RawFrameBufferInfo));
  47. m_pBufDesktop = NULL;
  48. m_pBufXScale = NULL;
  49. m_pBufSecondary = NULL;
  50. m_hbmSecondary = NULL;
  51. m_hdcSecondaryMem = NULL;
  52. AcquireLock(TRUE);
  53. // get info about desktop surface, so we can save the rotation
  54. DISPCFG_GET_SURFACE_INFO surfinfo;
  55. surfinfo.eDisplaySurface = DCFG_DESKTOP;
  56. int nEscRtn = ExtEscape(m_hdcMarathon, 
  57.   DRVESC_GET_SURFACEINFO, 
  58.   sizeof(DISPCFG_GET_SURFACE_INFO),
  59.   (LPSTR) &surfinfo,
  60.   sizeof(DISPCFG_GET_SURFACE_INFO),
  61.   (LPSTR) &surfinfo);
  62. if (0 > nEscRtn)
  63. {
  64. TRACE(L"nrCDisplayConfig constructor************* DRVESC_GET_SURFACEINFO Failed!!!  Returned %d**********nr", nEscRtn);
  65. }
  66. m_dwOrigPhysRotation = surfinfo.sPhysSurfaceInfo.lPhysicalRotation;
  67. }
  68. CDisplayConfig::~CDisplayConfig()
  69. {
  70. FreeMarathonFrameBufferResources();
  71. if (m_pBufSecondary) 
  72. {
  73.     VirtualFree(m_pBufSecondary, 0, MEM_RELEASE);
  74. }
  75. if (m_pBufXScale) 
  76. {
  77.     VirtualFree(m_pBufXScale, 0, MEM_RELEASE);
  78. }
  79. if (m_pBufDesktop) 
  80. {
  81.     VirtualFree(m_pBufDesktop, 0, MEM_RELEASE);
  82. }
  83. AcquireLock(FALSE);
  84.     if (m_hdcMarathon)
  85.     {
  86.         ReleaseDC(NULL, m_hdcMarathon);
  87.         m_hdcMarathon = NULL;
  88.     }
  89. }
  90. void CDisplayConfig::SetInternalSource(DCFG_LCD_SOURCE eSource)
  91. {
  92. DISPCFG_DISPLAY_SYSTEM cfg;
  93. memset(&cfg, 0, sizeof(DISPCFG_DISPLAY_SYSTEM));
  94. cfg.bSet = 1;
  95. cfg.sLcdInternal.bValid = TRUE;
  96. cfg.sLcdInternal.bActivate = (DCFG_SOURCE_NOT_APPLICABLE==eSource) ? FALSE : TRUE;
  97. cfg.sLcdInternal.eLcdSource = eSource;
  98. cfg.sConnectSurface.eSurface = DCFG_DESKTOP;
  99. cfg.sConnectSurface.ulPhysRotation = m_dwOrigPhysRotation;
  100. cfg.sConnectSurface.ulRefreshRate = 60;
  101. #if 0
  102. // hack for Carbonado demos
  103. // If setting intenral to be Marathon, drive it out exteranl as well
  104. // This can only be done on devices that use a panel that accelpts the
  105. // same display timings as the external display.  Most do not.
  106. if (eSource == DCFG_SOURCE_MARATHON)
  107. {
  108. cfg.sLcdExternal.bValid = TRUE;
  109. cfg.sLcdExternal.bActivate = TRUE;
  110. cfg.sLcdExternal.eLcdSource = DCFG_SOURCE_MARATHON;
  111. }
  112. #endif
  113. int nEscRtn = ExtEscape(
  114. m_hdcMarathon,
  115. DRVESC_CONFIG_DISPLAYSYSTEM, 
  116. sizeof(DISPCFG_DISPLAY_SYSTEM),
  117. (LPSTR) &cfg,
  118. 0,
  119. NULL);
  120.     if (0 >nEscRtn)
  121. {
  122. TRACE(L"nrCDisplayConfig::SetInternalSource - Trying to set to %snr ****DRVESC_CONFIG_DISPLAYSYSTEM Failed!!! Returned %d**********nr", 
  123. (eSource==DCFG_SOURCE_MARATHON) ? L"Marathon":L"XScale",
  124. nEscRtn);
  125. return;
  126. }
  127. }
  128. void CDisplayConfig::SetExternalSource(DCFG_LCD_SOURCE eSource)
  129. {
  130. DISPCFG_DISPLAY_SYSTEM cfg;
  131. memset(&cfg, 0, sizeof(DISPCFG_DISPLAY_SYSTEM));
  132. cfg.bSet = 1;
  133. cfg.sLcdExternal.bValid = TRUE;
  134. cfg.sLcdExternal.bActivate = (DCFG_SOURCE_NOT_APPLICABLE==eSource) ? FALSE : TRUE;
  135. cfg.sLcdExternal.eLcdSource = eSource;
  136. cfg.sLcdExternal.eXScaleFormat = (DCFG_SOURCE_NOT_APPLICABLE==eSource) ? DCFG_FORMAT_NOT_APPLICABLE : DCFG_LCD_IN_565 ;
  137. cfg.sConnectSurface.eSurface = (DCFG_SOURCE_NOT_APPLICABLE==eSource) ? DCFG_DESKTOP : DCFG_SECONDARYSURFACE;
  138. cfg.sConnectSurface.ulPhysRotation = 0; // don't really need to re-state this, since the memset allready zero'd the struct
  139. int nEscRtn = ExtEscape(
  140. m_hdcMarathon,
  141. DRVESC_CONFIG_DISPLAYSYSTEM, 
  142. sizeof(DISPCFG_DISPLAY_SYSTEM),
  143. (LPSTR) &cfg,
  144. 0,
  145. NULL);
  146. if (0 >nEscRtn)
  147. {
  148. TRACE(L"nrCDisplayConfig::SetExternalSource - Trying to set to %snr ****DRVESC_CONFIG_DISPLAYSYSTEM Failed!!! Returned %d**********nr", 
  149. (eSource==DCFG_SOURCE_MARATHON) ? L"Marathon":L"XScale",
  150. nEscRtn);
  151. return;
  152. }
  153. }
  154. HDC CDisplayConfig::CreateSecondMarathonHDC(WORD wWidth, WORD wHeight)
  155. {
  156. if (CreateMarathonFrameBuffer(wWidth, wHeight))
  157. {
  158. return m_hdcSecondaryMem;
  159. }
  160. return NULL;
  161. }
  162. RawFrameBufferInfo* CDisplayConfig::CreateMarathonFrameBuffer(WORD wWidth, WORD wHeight)
  163. {
  164. if (m_pBufSecondary)
  165. {
  166. TRACE(L"nrCDisplayConfig::CreateMarathonFrameBuffernr ** Secondary Frame Buffer already existed!!!!****nr");
  167. ASSERT(NULL == m_pBufSecondary);
  168. }
  169. // alloc external buffer / surface
  170. DISPCFG_CREATE_SURFACE sCreateSurface;
  171. sCreateSurface.wWidth = wWidth;
  172. sCreateSurface.wHeight = wHeight;
  173. int nEscRtn = ExtEscape(m_hdcMarathon, 
  174.    DRVESC_CREATE_OFFSCREENSURFACE, 
  175.    sizeof(DISPCFG_CREATE_SURFACE),
  176.    (LPSTR) &sCreateSurface,
  177.    0,
  178.    NULL);
  179. if (0 >nEscRtn)
  180. {
  181. TRACE(L"nrCDisplayConfig::SetExternalCustomnr ************* DRVESC_CREATE_OFFSCREENSURFACE Failed!!!  Returned %d**********nr", nEscRtn);
  182. return NULL;
  183. }
  184. // Create (Allocate) the secondary surface
  185. m_hdcSecondaryMem = CreateCompatibleDC(m_hdcMarathon);
  186.     m_hbmSecondary = CreateCompatibleBitmap(m_hdcMarathon, wWidth, wHeight);
  187. m_hbmOldBitmap = (HBITMAP)GetCurrentObject(m_hdcSecondaryMem, OBJ_BITMAP);
  188.     SelectObject(m_hdcSecondaryMem, m_hbmSecondary);
  189. // provide info about surface
  190. DISPCFG_GET_SURFACE_INFO surfinfo;
  191. surfinfo.eDisplaySurface = DCFG_SECONDARYSURFACE;
  192. nEscRtn = ExtEscape(m_hdcMarathon, 
  193.   DRVESC_GET_SURFACEINFO, 
  194.   sizeof(DISPCFG_GET_SURFACE_INFO),
  195.   (LPSTR) &surfinfo,
  196.   sizeof(DISPCFG_GET_SURFACE_INFO),
  197.   (LPSTR) &surfinfo);
  198. if (0 >nEscRtn)
  199. {
  200. TRACE(L"nrCDisplayConfig::SetExternalCustom ************* DRVESC_GET_SURFACEINFO Failed!!!  Returned %d**********nr", nEscRtn);
  201. return NULL;
  202. }
  203. m_pBufSecondary = ConvertSurfaceInfoToRawFrameBuffer(surfinfo, m_RFBSecondary);
  204. return &m_RFBSecondary;
  205. }
  206. void CDisplayConfig::FreeMarathonFrameBufferResources()
  207. {
  208. if (m_pBufSecondary)
  209. {
  210.         SelectObject(m_hdcSecondaryMem, m_hbmOldBitmap);
  211.         DeleteObject(m_hbmSecondary);
  212.         m_hbmSecondary = NULL;
  213.     DeleteDC(m_hdcSecondaryMem);
  214.         m_hdcSecondaryMem = NULL;
  215. }
  216. }
  217. void CDisplayConfig::AcquireLock(BOOL bAcquire)
  218. {
  219. int nEscRtn;
  220. DISPCFG_ACQUIRE_LOCK LockIn;
  221. DISPCFG_ACQUIRE_LOCK LockOut;
  222. memset(&LockIn, 0, sizeof(DISPCFG_ACQUIRE_LOCK));
  223. memset(&LockOut, 0, sizeof(DISPCFG_ACQUIRE_LOCK));
  224. if (bAcquire)
  225. {
  226. LockIn.bAcquire = TRUE;
  227. }
  228. else
  229. {
  230. LockIn.bRelease = TRUE;
  231. }
  232. nEscRtn = ExtEscape(m_hdcMarathon, 
  233.   DRVESC_ACQUIRE_DUALDISPLAY,
  234.   sizeof(DISPCFG_ACQUIRE_LOCK), 
  235.   (LPSTR)&LockIn, 
  236.   sizeof(DISPCFG_ACQUIRE_LOCK),(LPSTR)&LockOut);
  237. if (0 >nEscRtn)
  238. {
  239. TRACE(L"nrCDisplayConfig::AcquireLocknr ************* DRVESC_ACQUIRE_DUALDISPLAY Failed!!!  Returned %d**********nr", nEscRtn);
  240. return;
  241. }
  242. TRACE(L"nrCDisplayConfig::AcquireLock %s success = %dnr", bAcquire ? L"Lock" : L"Unlock", LockOut.bSuccess);
  243. }
  244. DWORD CDisplayConfig::GetCurrentOSOrientation()
  245. {
  246. DEVMODE sDevMode;
  247. memset(&sDevMode, 0, sizeof (DEVMODE));
  248. sDevMode.dmSize = sizeof (DEVMODE);
  249. ChangeDisplaySettingsEx(NULL, &sDevMode, NULL, 0, NULL);
  250. return sDevMode.dmDisplayOrientation;
  251. }
  252. void CDisplayConfig::CopyDesktopToXScale()
  253. {
  254. GetDesktopFrameBuffer();
  255. GetXScaleFrameBuffer();
  256. ASSERT(m_pBufDesktop);
  257. ASSERT(m_pBufXScale);
  258. // TODO, rotation!!!
  259. memcpy(m_pBufXScale, 
  260.    m_pBufDesktop, 
  261.    m_RFBXScale.cxStride * m_RFBXScale.cyPixels);
  262. }
  263. RawFrameBufferInfo* CDisplayConfig::GetDesktopFrameBuffer()
  264. {
  265. if (!m_RFBDesktop.pFramePointer) // already known?
  266. {
  267. // lets get info and map it into Virtual memory
  268. DISPCFG_GET_SURFACE_INFO surfinfo;
  269. // get size info 
  270. memset(&surfinfo, 0, sizeof (DISPCFG_GET_SURFACE_INFO));
  271. surfinfo.eDisplaySurface = DCFG_DESKTOP;
  272. int nEscRtn = ExtEscape( m_hdcMarathon,
  273.  DRVESC_GET_SURFACEINFO,
  274.  sizeof(DISPCFG_GET_SURFACE_INFO),
  275.  (LPSTR) &surfinfo,
  276.  sizeof(DISPCFG_GET_SURFACE_INFO),
  277.  (LPSTR) &surfinfo
  278.  );
  279. TRACE(L"Desktop FB appears to be at Physical Mem: 0x%08Xnr", surfinfo.sPhysSurfaceInfo.ulPhysAddress);
  280. ASSERT(NULL == m_pBufDesktop); // if m_RFBDesktop.pFrameBuffer was null, pointer to mem should be too
  281. m_pBufDesktop = ConvertSurfaceInfoToRawFrameBuffer(surfinfo, m_RFBDesktop);
  282. }
  283. return &m_RFBDesktop;
  284. }
  285. RawFrameBufferInfo* CDisplayConfig::GetXScaleFrameBuffer()
  286. {
  287. // Note:  This rountine should simply use the GETRAWFRAMEBUFFER escape fo the XScale display driver
  288. // when it is implemented
  289. if (!m_RFBXScale.pFramePointer) // already known?
  290. {
  291. #define PAGE_SIZE 0x1000
  292. #define ALIGNMENT_MASK (PAGE_SIZE-1)
  293. #ifndef GETVFRAMEPHYSICAL
  294. #define GETVFRAMEPHYSICAL 6144
  295. #define GETVFRAMELEN 6145
  296. #endif //GETVFRAMEPHYSICAL
  297. int nEscRtn;
  298. PBYTE pVXScaleFB = NULL;
  299. PVOID pv;
  300. PBYTE pSrc;
  301. ULONG ulOffset;
  302. ASSERT(m_hdcXScale);
  303. /* Get XScale Frame Buffer */
  304. nEscRtn = ExtEscape(m_hdcXScale,
  305. GETVFRAMEPHYSICAL, 
  306. 0, 
  307. NULL, 
  308. sizeof(PBYTE),
  309. (LPSTR) &pVXScaleFB);
  310. if (nEscRtn < 0) 
  311. {
  312. TRACE(L"Failed to get XScale Frame Buffer Address!rn");
  313. return NULL;
  314. }
  315. ULONG nVGABufferSize;
  316. nEscRtn = ExtEscape(m_hdcXScale,
  317. GETVFRAMELEN, 
  318. 0, 
  319. NULL, 
  320. sizeof(PBYTE),
  321. (LPSTR) &nVGABufferSize);
  322. if (nEscRtn < 0) 
  323. {
  324. TRACE(L"Failed to get XScale Frame Buffer size!rn");
  325. return NULL;
  326. }
  327. ulOffset = (ULONG)pVXScaleFB & ALIGNMENT_MASK;
  328. nVGABufferSize += ulOffset ? PAGE_SIZE : 0;
  329. pv = VirtualAlloc(0, nVGABufferSize, MEM_RESERVE, PAGE_NOACCESS);
  330. if (!pv) {
  331. TRACE(L"**** Could not allocate view of buffer!!! ****rn");
  332. return NULL;
  333. }
  334. pSrc = pVXScaleFB - ulOffset;
  335. ///////////////////////////////////// Map virtual address to linear
  336. if(!VirtualCopy(pv, pSrc, nVGABufferSize, PAGE_READWRITE)) 
  337. {
  338. VirtualFree(pv, 0, MEM_RELEASE);
  339. TRACE(L"Failed to map XScale Frame Buffer to linear space!rn");
  340. return NULL;
  341. }
  342. ASSERT(NULL == m_pBufXScale); // if m_RFBXScale.pFrameBuffer was null, pointer to mem should be too
  343. m_pBufXScale = (PWORD)((PBYTE)pv + ulOffset);
  344. // strides of XScale display will match the strides of OS "desktop" display.
  345. m_RFBXScale = *GetDesktopFrameBuffer(); // copy desktop info into xscale info and then fixup pointer
  346. m_RFBXScale.pFramePointer = (PVOID) (
  347. (LONG)m_RFBXScale.pFramePointer - 
  348. (LONG)m_pBufDesktop + 
  349. (LONG)m_pBufXScale); 
  350. // in other words, 
  351. // m_RFBXScale.pFramePointer is to m_pBufXScale
  352. // as
  353. // m_RFBDesktop.pFramePointer is to m_pBufDesktop
  354. }
  355. return &m_RFBXScale;
  356. }
  357. PWORD CDisplayConfig::ConvertSurfaceInfoToRawFrameBuffer(const DISPCFG_GET_SURFACE_INFO &surfinfo, RawFrameBufferInfo &raw)
  358. {
  359. // Get frame buffer address */
  360. ULONG ulAddr = surfinfo.sPhysSurfaceInfo.ulPhysAddress;
  361. ULONG ulSize = surfinfo.sPhysSurfaceInfo.ulStride * surfinfo.sPhysSurfaceInfo.ulHeight;
  362. // Make Physical Memory available to Virtual Memory
  363. void* pvMemc = VirtualAlloc(0, ulSize, MEM_RESERVE, PAGE_NOACCESS);
  364. if (!VirtualCopy(pvMemc, (PVOID)(ulAddr / 256), 
  365.    ulSize, PAGE_READWRITE | PAGE_PHYSICAL)) 
  366. {
  367. VirtualFree(pvMemc, 0, MEM_RELEASE);
  368. TRACE(L"Failed to map Marathon's Desktop Frame Buffer to linear space!");
  369. return NULL;
  370. }
  371. raw.wFormat = FORMAT_565;
  372. raw.wBPP = (WORD)surfinfo.sPhysSurfaceInfo.ulBpp;
  373. // pvMemc = Virtual Address of surface memory
  374. switch(surfinfo.sPhysSurfaceInfo.lPhysicalRotation)
  375. {
  376. default:
  377. case 0:
  378. raw.pFramePointer = pvMemc;
  379. raw.cxStride = surfinfo.sPhysSurfaceInfo.ulBpp/8;
  380. raw.cyStride = surfinfo.sPhysSurfaceInfo.ulStride;
  381. raw.cxPixels = surfinfo.sPhysSurfaceInfo.ulWidth;
  382. raw.cyPixels = surfinfo.sPhysSurfaceInfo.ulHeight;
  383. break;
  384. case 90:
  385. raw.pFramePointer = (LPBYTE)pvMemc + (surfinfo.sPhysSurfaceInfo.ulHeight * (surfinfo.sPhysSurfaceInfo.ulStride-1));
  386. raw.cxStride = -(int)surfinfo.sPhysSurfaceInfo.ulStride;
  387. raw.cyStride = surfinfo.sPhysSurfaceInfo.ulBpp/8;
  388. raw.cxPixels = surfinfo.sPhysSurfaceInfo.ulHeight;
  389. raw.cyPixels = surfinfo.sPhysSurfaceInfo.ulWidth;
  390. break;
  391. case 180:
  392. raw.pFramePointer = (LPBYTE)pvMemc + (surfinfo.sPhysSurfaceInfo.ulHeight * surfinfo.sPhysSurfaceInfo.ulStride)
  393. - (surfinfo.sPhysSurfaceInfo.ulBpp/8); // point to last pixel
  394. raw.cxStride = -(int)(surfinfo.sPhysSurfaceInfo.ulBpp/8);
  395. raw.cyStride = -(int)surfinfo.sPhysSurfaceInfo.ulStride;
  396. raw.cxPixels = surfinfo.sPhysSurfaceInfo.ulWidth;
  397. raw.cyPixels = surfinfo.sPhysSurfaceInfo.ulHeight;
  398. break;
  399. case 270:
  400. raw.pFramePointer = (LPBYTE)pvMemc + surfinfo.sPhysSurfaceInfo.ulStride
  401. - surfinfo.sPhysSurfaceInfo.ulBpp/8;
  402. raw.cxStride = surfinfo.sPhysSurfaceInfo.ulStride;
  403. raw.cyStride = -(int)(surfinfo.sPhysSurfaceInfo.ulBpp/8);
  404. raw.cxPixels = surfinfo.sPhysSurfaceInfo.ulHeight;
  405. raw.cyPixels = surfinfo.sPhysSurfaceInfo.ulWidth;
  406. break;
  407. }
  408. return (PWORD)pvMemc;
  409. }