Advertisement
Guest User

dx9test for input lag

a guest
Nov 29th, 2016
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1. //msys2 mingw64: gcc -O3 -march=native -Wall -Wextra -pedantic test.cpp -o test.exe -O3 -mconsole -DUNICODE -ld3d9
  2.  
  3. #define WINVER 0x0501
  4. #define _WIN32_WINNT 0x0501
  5.  
  6. #include <windows.h>
  7. #include <d3d9.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. #define WIDTH 800
  12. #define HEIGHT 600
  13. #define REFRESH_RATE 160
  14.  
  15. int move = 0;
  16. int click = 0;
  17. int stop = 0;
  18.  
  19. LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  20. {
  21.     switch(message) {
  22.     case WM_CLOSE:
  23.         DestroyWindow(hWnd);
  24.         stop = 1;
  25.         break;
  26.     case WM_DESTROY:
  27.         PostQuitMessage(0);
  28.         stop = 1;
  29.         break;
  30.     case WM_INPUT: {
  31.         UINT dwSize;
  32.         GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
  33.         LPBYTE lpb = (LPBYTE)malloc(dwSize * sizeof(BYTE)); //new BYTE[dwSize];
  34.         if (lpb == NULL) return 0;
  35.         GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
  36.         RAWINPUT* raw = (RAWINPUT*)lpb;
  37.         if (raw->header.dwType == RIM_TYPEMOUSE) {
  38.             LONG x = raw->data.mouse.lLastX;
  39.             LONG y = raw->data.mouse.lLastY;
  40.             //if (x || y) move = 1;
  41.             USHORT b = raw->data.mouse.usButtonFlags;
  42.             if (b & RI_MOUSE_LEFT_BUTTON_DOWN)
  43.                 stop = 1;
  44.             #define THRESH (0)
  45.             if (x > THRESH)
  46.                 move = 1;
  47.             else if (x < -THRESH)
  48.                 move = 0;
  49.         }
  50.         free(lpb);//delete[] lpb;
  51.     }
  52.     default:
  53.         return DefWindowProc(hWnd, message, wParam, lParam);
  54.     }
  55.     return 0;
  56. }
  57.  
  58. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  59. {
  60.    
  61.     HWND hWnd;
  62.     WNDCLASSEX wc;
  63.     MSG msg;
  64.     UINT width, height, refresh_rate;
  65.     sscanf(lpCmdLine, "%u %u %u", &width, &height, &refresh_rate);
  66.     if (!width || !height || !refresh_rate) {
  67.         printf("run from command line: test.exe <width> <height> <refresh rate>\npress enter to exit\n");
  68.         fflush(stdout);
  69.         getchar();
  70.         return 0;
  71.     }
  72.     ZeroMemory(&wc, sizeof(WNDCLASSEX));
  73.  
  74.     wc.cbSize = sizeof(WNDCLASSEX);
  75.     wc.style = CS_HREDRAW | CS_VREDRAW;
  76.     wc.lpfnWndProc = WindowProc;
  77.     wc.hInstance = hInstance;
  78.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  79.     wc.lpszClassName = L"somewindowclass";
  80.  
  81.     RegisterClassEx(&wc);
  82.  
  83.     hWnd = CreateWindowEx(0, L"somewindowclass", L"test",
  84.                 WS_EX_TOPMOST | WS_POPUP,
  85.                 0, 0, width, height,
  86.                 NULL, NULL, hInstance, NULL);
  87.     ShowWindow(hWnd, nCmdShow);
  88.  
  89.     LPDIRECT3D9 d3d;
  90.     LPDIRECT3DDEVICE9 d3ddev;
  91.  
  92.     d3d = Direct3DCreate9(D3D_SDK_VERSION);
  93.  
  94.     D3DPRESENT_PARAMETERS d3dpp;
  95.  
  96.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  97.     d3dpp.Windowed = FALSE;
  98.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  99.     d3dpp.hDeviceWindow = hWnd;
  100.     d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
  101.     d3dpp.BackBufferWidth = width;
  102.     d3dpp.BackBufferHeight = height;
  103.     d3dpp.FullScreen_RefreshRateInHz = refresh_rate;
  104.  
  105.     d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  106.                 D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
  107.  
  108.     RAWINPUTDEVICE Rid[1];
  109.     Rid[0].usUsagePage = 0x01;
  110.     Rid[0].usUsage = 0x02;
  111.     Rid[0].dwFlags = RIDEV_NOLEGACY;
  112.     Rid[0].hwndTarget = 0;
  113.     RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
  114.  
  115.     SetCursor( NULL );
  116.     d3ddev->ShowCursor( FALSE );
  117.     int fps = 0;
  118.     DWORD n, p;
  119.     p = (1 + GetTickCount()/1000) * 1000;
  120.     while(!stop) {
  121.         while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
  122.             TranslateMessage(&msg);
  123.             DispatchMessage(&msg);
  124.         }
  125.  
  126.         if(msg.message == WM_QUIT)
  127.             stop = 1;
  128.  
  129.         d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(move * 255, move * 255, move * 255), 1.0f, 0);
  130.         d3ddev->Present(NULL, NULL, NULL, NULL);
  131.         //move = 0;
  132.         //Sleep(20);
  133.         fps++;
  134.         if ((n=GetTickCount()) > p) {
  135.             p = (1 + n/1000) * 1000;
  136.             printf("%d\n", fps);
  137.             fps = 0;
  138.         }
  139.     }
  140.  
  141.     d3ddev->Release();
  142.     d3d->Release();
  143.  
  144.     return msg.wParam;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement