benchmark.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:7k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: benchmark.c 332 2005-11-06 14:31:57Z picard $
  18.  *
  19.  ****************************************************************************/
  20. #include "../common/common.h"
  21. #include "counter.h"
  22. #include <windows.h>
  23. #undef malloc
  24. #undef free
  25. #ifdef UNICODE
  26. #define tcsicmp _wcsicmp
  27. #else
  28. #define tcsicmp stricmp;
  29. #endif
  30. void Swap( int* a, int* b)
  31. {
  32. int t = *a;
  33. *a = *b;
  34. *b = t;
  35. }
  36. void SlowVideo(char* Video,int BPP,int Width,int Height,int StrideX,int StrideY,int32_t* Result)
  37. {
  38. if (BPP == 16)
  39. {
  40. int64_t t0,t1,t;
  41. int nv,ns;
  42. int Mul,Len;
  43. int SystemLength = 512*1024;
  44. char* System = (char*) malloc( SystemLength ); //hopefully cpu cache will be smaller
  45. if (System)
  46. {
  47. TRY_BEGIN
  48. if (StrideX < 0)
  49. {
  50. StrideX = -StrideX;
  51. Video -= StrideX * (Width - 1);
  52. }
  53. if (StrideY < 0)
  54. {
  55. StrideY = -StrideY;
  56. Video -= StrideY * (Height - 1);
  57. }
  58. if (StrideX > StrideY)
  59. {
  60. Swap(&Width,&Height);
  61. Swap(&StrideX,&StrideY);
  62. }
  63. Len = (Width*BPP) >> 3;
  64. if (Len>32 && !IsBadWritePtr(Video,Len) && !IsBadReadPtr(Video,Len))
  65. {
  66. int i;
  67. int Rows = SystemLength / Len;
  68. memset(System,0,Rows*Len);
  69. memcpy(System,Video,Len);
  70. BeginCounter(&t);
  71. t >>= 1; // 0.5 sec
  72. SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
  73. nv=0;
  74. GetCounter(&t0);
  75. t0 += t;
  76. do
  77. {
  78. for (i=0;i<Rows;++i)
  79. memcpy(Video,System,Len);
  80. nv++;
  81. GetCounter(&t1);
  82. } while (t1 < t0);
  83. ns=0;
  84. GetCounter(&t0);
  85. t0 += t;
  86. do
  87. {
  88. for (i=0;i<Rows;i++)
  89. memcpy(System+i*Len,System,Len);
  90. ns++;
  91. GetCounter(&t1);
  92. } while (t1 < t0);
  93. Mul = 6;
  94. if (nv*Mul >= ns)
  95. *Result = 0; // fast
  96. else
  97. *Result = 1; // slow (video memory or in general)
  98. SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
  99. EndCounter();
  100. #ifdef BENCH
  101. {
  102. tchar_t Msg[256];
  103. stprintf_s(Msg,TSIZEOF(Msg),T("Video %dnSystem %dnResult %d"),nv,ns,*Result);
  104. MessageBox(NULL,Msg,T(""),MB_OK|MB_SETFOREGROUND);
  105. }
  106. #endif
  107. }
  108. TRY_END
  109. free(System);
  110. }
  111. }
  112. }
  113. //----------------------------------------------------------------------
  114. void SlowVideoRAW(int32_t* Result)
  115. {
  116. RawFrameBufferInfo Info;
  117. HDC DC = GetDC(NULL);
  118. memset(&Info,0,sizeof(Info));
  119. if (ExtEscape(DC, GETRAWFRAMEBUFFER, 0, NULL, sizeof(RawFrameBufferInfo), (char*)&Info) >= 0 && Info.pFramePointer)
  120. SlowVideo(Info.pFramePointer,Info.wBPP,Info.cxPixels,Info.cyPixels,Info.cxStride,Info.cyStride,Result);
  121. else
  122. {
  123. tchar_t PlatformType[256];
  124. int SmartPhone = 0;
  125. OSVERSIONINFO Ver;
  126. Ver.dwOSVersionInfoSize = sizeof(Ver);
  127. GetVersionEx(&Ver);
  128. if (SystemParametersInfo(SPI_GETPLATFORMTYPE,sizeof(PlatformType),PlatformType,0)!=0)
  129. {
  130. if (tcsicmp(PlatformType,T("Smartphone"))==0)
  131. SmartPhone = 1;
  132. }
  133. else
  134. if (GetLastError()==ERROR_ACCESS_DENIED)
  135. SmartPhone = 1;
  136. if (Ver.dwMajorVersion*100 + Ver.dwMinorVersion >= 421 && !SmartPhone)
  137. {
  138. //try gxinfo
  139. DWORD Code = GETGXINFO;
  140. if (ExtEscape(DC, ESC_QUERYESCSUPPORT, sizeof(DWORD), (char*)&Code, 0, NULL) > 0)
  141. {
  142. DWORD DCWidth = GetDeviceCaps(DC,HORZRES);
  143. DWORD DCHeight = GetDeviceCaps(DC,VERTRES);
  144. GXDeviceInfo Info;
  145. memset(&Info,0,sizeof(Info));
  146. Info.Version = 100;
  147. ExtEscape(DC, GETGXINFO, 0, NULL, sizeof(Info), (char*)&Info);
  148. if (Info.cbStride>0 && !(Info.ffFormat & kfLandscape) &&
  149. ((DCWidth == Info.cxWidth && DCHeight == Info.cyHeight) ||
  150.  (DCWidth == Info.cyHeight && DCHeight == Info.cxWidth)))
  151. SlowVideo(Info.pvFrameBuffer,Info.cBPP,Info.cxWidth,Info.cyHeight,Info.cBPP >> 3,Info.cbStride,Result);
  152. }
  153. }
  154. }
  155. ReleaseDC(NULL,DC);
  156. }
  157. //----------------------------------------------------------------------
  158. typedef struct GXDisplayProperties 
  159. {
  160. int32_t cxWidth;
  161. int32_t cyHeight;
  162. int32_t cbxPitch;
  163. int32_t cbyPitch;
  164. int32_t cBPP;
  165. int32_t ffFormat;
  166. } GXDisplayProperties;
  167. #define GX_FULLSCREEN 0x01
  168. void SlowVideoGAPI(HMODULE GAPI,HWND Wnd,int32_t* Result)
  169. {
  170. int (*GXOpenDisplay)(HWND hWnd, DWORD dwFlags);
  171. int (*GXCloseDisplay)();
  172. char* (*GXBeginDraw)();
  173. int (*GXEndDraw)();
  174. GXDisplayProperties (*GXGetDisplayProperties)();
  175. BOOL (*GXIsDisplayDRAMBuffer)();
  176. *(FARPROC*)&GXOpenDisplay = GetProcAddress(GAPI,T("?GXOpenDisplay@@YAHPAUHWND__@@K@Z"));
  177. *(FARPROC*)&GXCloseDisplay = GetProcAddress(GAPI,T("?GXCloseDisplay@@YAHXZ"));
  178. *(FARPROC*)&GXBeginDraw = GetProcAddress(GAPI,T("?GXBeginDraw@@YAPAXXZ"));
  179. *(FARPROC*)&GXEndDraw = GetProcAddress(GAPI,T("?GXEndDraw@@YAHXZ"));
  180. *(FARPROC*)&GXGetDisplayProperties = GetProcAddress(GAPI,T("?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ"));
  181. *(FARPROC*)&GXIsDisplayDRAMBuffer = GetProcAddress(GAPI,T("?GXIsDisplayDRAMBuffer@@YAHXZ"));
  182. if (GXOpenDisplay && GXCloseDisplay &&
  183. GXBeginDraw && GXEndDraw && GXGetDisplayProperties &&
  184. GXOpenDisplay(Wnd,GX_FULLSCREEN) != 0)
  185. {
  186. if (!GXIsDisplayDRAMBuffer || !GXIsDisplayDRAMBuffer())
  187. {
  188. char* Ptr;
  189. GXDisplayProperties Info = GXGetDisplayProperties();
  190. Ptr = GXBeginDraw();
  191. if (Ptr)
  192. {
  193. SlowVideo(Ptr,Info.cBPP,Info.cxWidth,Info.cyHeight,Info.cbxPitch,Info.cbyPitch,Result);
  194. GXEndDraw();
  195. }
  196. }
  197. GXCloseDisplay();
  198. }
  199. }
  200. #ifdef BENCH
  201. #define SRAM_BASE 0x5c000000
  202. #define TBL_CACHE 0x08
  203. #define TBL_BUFFER 0x04
  204. extern BOOL WINAPI VirtualSetAttributes( LPVOID lpvAddress, DWORD cbSize, DWORD dwNewFlags, DWORD dwMask, LPDWORD lpdwOldFlags );
  205. extern BOOL WINAPI VirtualCopy(LPVOID, LPVOID, DWORD, DWORD);
  206. void SlowSDRAM(int32_t* Result)
  207. {
  208. char* Buffer = malloc(320*240*2);
  209. SlowVideo(Buffer,16,240,320,2,480,Result);
  210. free(Buffer);
  211. }
  212. void SlowSRAM(int32_t* Result)
  213. {
  214. DWORD Size = (320*240*2 + 4095) & ~4095;
  215. int BufferPhy = SRAM_BASE;
  216. void* Buffer = VirtualAlloc(0, Size, MEM_RESERVE, PAGE_NOACCESS);
  217. if (!Buffer)
  218. return;
  219. if (!VirtualCopy(Buffer,(LPVOID)(BufferPhy >> 8), Size, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL))
  220. return;
  221. if (!VirtualSetAttributes(Buffer,320*240*2,TBL_BUFFER,TBL_CACHE|TBL_BUFFER,NULL))
  222. return;
  223. SlowVideo(Buffer,16,240,320,2,480,Result);
  224. VirtualFree(Buffer,0,MEM_RELEASE);
  225. }
  226. int WinMain(HINSTANCE Instance,HINSTANCE Parent,TCHAR* Cmd,int CmdShow)
  227. {
  228. int32_t Result;
  229. //SAFE_BEGIN
  230. /* HMODULE GAPI = LoadLibrary(T("gx.dll"));
  231. if (GAPI)
  232. {
  233. SlowVideoGAPI(GAPI,NULL,&Result);
  234. FreeLibrary(GAPI);
  235. }
  236. */
  237. //SlowSDRAM(&Result);
  238. //SlowSRAM(&Result);
  239. SlowVideoRAW(&Result);
  240. //SAFE_END
  241. return 0;
  242. }
  243. #endif