#include #include #include #include #include "test/check.h" #define debug_print(...) fprintf(stderr, __VA_ARGS__) static const int render_loop_iterations = 100; static LRESULT CALLBACK wnd_proc(HWND wnd, UINT msg, WPARAM w_param, LPARAM l_param); static HWND create_window() { WNDCLASS wc; HRESULT hr; memset(&wc, 0, sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.hbrBackground = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpfnWndProc = (WNDPROC) wnd_proc; wc.hInstance = NULL; wc.lpszClassName = "d3d9hook"; hr = RegisterClass(&wc); check_int_neq(hr, 0); return CreateWindow( "d3d9hook", "d3d9hook test", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, NULL, NULL, NULL, 0); } static D3DPRESENT_PARAMETERS create_presenter_params(HWND window) { D3DPRESENT_PARAMETERS pp; memset(&pp, 0, sizeof(D3DPRESENT_PARAMETERS)); pp.BackBufferWidth = 640; pp.BackBufferHeight = 480; pp.BackBufferFormat = D3DFMT_A8R8G8B8; pp.BackBufferCount = 1; pp.MultiSampleType = D3DMULTISAMPLE_NONE; pp.MultiSampleQuality = 0; pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.hDeviceWindow = window; pp.Windowed = TRUE; pp.EnableAutoDepthStencil = TRUE; pp.AutoDepthStencilFormat = D3DFMT_D24S8; pp.Flags = 0; pp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; return pp; } static IDirect3DTexture9 *create_texture(IDirect3DDevice9 *dev) { HRESULT hr; IDirect3DTexture9 *texture; hr = IDirect3DDevice9_CreateTexture( dev, 320, 240, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture, NULL); check_int_eq(hr, S_OK); return texture; } int main(int argc, char **argv) { DISPLAY_DEVICEA display_device; BOOL res; HWND window; RECT rect; MSG msg; IDirect3D9 *d3d9; HRESULT hr; D3DPRESENT_PARAMETERS pp; IDirect3DDevice9 *dev; int loop_count; IDirect3DTexture9 *texture; res = EnumDisplayDevicesA( NULL, 0, &display_device, EDD_GET_DEVICE_INTERFACE_NAME); check_int_eq(res, TRUE); window = create_window(); check_non_null(window); res = GetClientRect(window, &rect); check_int_eq(res, TRUE); d3d9 = Direct3DCreate9(D3D_SDK_VERSION); check_non_null(d3d9); pp = create_presenter_params(window); hr = IDirect3D9_CreateDevice( d3d9, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &dev); check_int_eq(hr, S_OK); IDirect3DDevice9_Release(d3d9); d3d9 = NULL; texture = create_texture(dev); ShowWindow(window, SW_SHOW); UpdateWindow(window); memset(&msg, 0, sizeof(MSG)); loop_count = 0; // TODO create vertex buffer, upload and render while (msg.message != WM_QUIT) { if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { hr = IDirect3DDevice9_Clear( dev, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff0000ff, 1.0f, 0); check_int_eq(hr, S_OK); hr = IDirect3DDevice9_SetRenderState( dev, D3DRS_FILLMODE, D3DFILL_POINT); check_int_eq(hr, S_OK); hr = IDirect3DDevice9_BeginScene(dev); check_int_eq(hr, S_OK); hr = IDirect3DDevice9_EndScene(dev); check_int_eq(hr, S_OK); hr = IDirect3DDevice9_Present(dev, NULL, NULL, NULL, NULL); check_int_eq(hr, S_OK); loop_count++; if (loop_count > render_loop_iterations) { PostQuitMessage(0); } } } IDirect3DTexture9_Release(texture); IDirect3DDevice9_Release(dev); return 0; } LRESULT CALLBACK wnd_proc(HWND wnd, UINT msg, WPARAM w_param, LPARAM l_param) { switch (msg) { case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(wnd, msg, w_param, l_param); }