1 | #include <d3d9.h>
|
---|
2 |
|
---|
3 | #include "../test_utils.h"
|
---|
4 |
|
---|
5 | using namespace dxvk;
|
---|
6 |
|
---|
7 | struct Extent2D {
|
---|
8 | uint32_t w, h;
|
---|
9 | };
|
---|
10 |
|
---|
11 | class ClearApp {
|
---|
12 |
|
---|
13 | public:
|
---|
14 |
|
---|
15 | ClearApp(HINSTANCE instance, HWND window)
|
---|
16 | : m_window(window) {
|
---|
17 | HRESULT status = Direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d);
|
---|
18 |
|
---|
19 | if (FAILED(status))
|
---|
20 | throw DxvkError("Failed to create D3D9 interface");
|
---|
21 |
|
---|
22 | D3DPRESENT_PARAMETERS params;
|
---|
23 | getPresentParams(params);
|
---|
24 |
|
---|
25 | status = m_d3d->CreateDeviceEx(
|
---|
26 | D3DADAPTER_DEFAULT,
|
---|
27 | D3DDEVTYPE_HAL,
|
---|
28 | m_window,
|
---|
29 | D3DCREATE_HARDWARE_VERTEXPROCESSING,
|
---|
30 | ¶ms,
|
---|
31 | nullptr,
|
---|
32 | &m_device);
|
---|
33 |
|
---|
34 | if (FAILED(status))
|
---|
35 | throw DxvkError("Failed to create D3D9 device");
|
---|
36 | }
|
---|
37 |
|
---|
38 | void run() {
|
---|
39 | this->adjustBackBuffer();
|
---|
40 |
|
---|
41 | m_device->BeginScene();
|
---|
42 |
|
---|
43 | m_device->Clear(
|
---|
44 | 0,
|
---|
45 | nullptr,
|
---|
46 | D3DCLEAR_TARGET,
|
---|
47 | D3DCOLOR_RGBA(255, 0, 0, 0),
|
---|
48 | 0.0f,
|
---|
49 | 0);
|
---|
50 |
|
---|
51 | m_device->EndScene();
|
---|
52 |
|
---|
53 | m_device->PresentEx(
|
---|
54 | nullptr,
|
---|
55 | nullptr,
|
---|
56 | nullptr,
|
---|
57 | nullptr,
|
---|
58 | 0);
|
---|
59 | }
|
---|
60 |
|
---|
61 | void adjustBackBuffer() {
|
---|
62 | RECT windowRect = { 0, 0, 1024, 600 };
|
---|
63 | GetClientRect(m_window, &windowRect);
|
---|
64 |
|
---|
65 | Extent2D newSize = {
|
---|
66 | static_cast<uint32_t>(windowRect.right - windowRect.left),
|
---|
67 | static_cast<uint32_t>(windowRect.bottom - windowRect.top),
|
---|
68 | };
|
---|
69 |
|
---|
70 | if (m_windowSize.w != newSize.w
|
---|
71 | || m_windowSize.h != newSize.h) {
|
---|
72 | m_windowSize = newSize;
|
---|
73 |
|
---|
74 | D3DPRESENT_PARAMETERS params;
|
---|
75 | getPresentParams(params);
|
---|
76 | HRESULT status = m_device->ResetEx(¶ms, nullptr);
|
---|
77 |
|
---|
78 | if (FAILED(status))
|
---|
79 | throw DxvkError("Device reset failed");
|
---|
80 | }
|
---|
81 | }
|
---|
82 |
|
---|
83 | void getPresentParams(D3DPRESENT_PARAMETERS& params) {
|
---|
84 | params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
|
---|
85 | params.BackBufferCount = 1;
|
---|
86 | params.BackBufferFormat = D3DFMT_X8R8G8B8;
|
---|
87 | params.BackBufferWidth = m_windowSize.w;
|
---|
88 | params.BackBufferHeight = m_windowSize.h;
|
---|
89 | params.EnableAutoDepthStencil = FALSE;
|
---|
90 | params.Flags = 0;
|
---|
91 | params.FullScreen_RefreshRateInHz = 0;
|
---|
92 | params.hDeviceWindow = m_window;
|
---|
93 | params.MultiSampleQuality = 0;
|
---|
94 | params.MultiSampleType = D3DMULTISAMPLE_NONE;
|
---|
95 | params.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
|
---|
96 | params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
---|
97 | params.Windowed = TRUE;
|
---|
98 | }
|
---|
99 |
|
---|
100 | private:
|
---|
101 |
|
---|
102 | HWND m_window;
|
---|
103 | Extent2D m_windowSize = { 1024, 600 };
|
---|
104 |
|
---|
105 | Com<IDirect3D9Ex> m_d3d;
|
---|
106 | Com<IDirect3DDevice9Ex> m_device;
|
---|
107 |
|
---|
108 | };
|
---|
109 |
|
---|
110 | LRESULT CALLBACK WindowProc(HWND hWnd,
|
---|
111 | UINT message,
|
---|
112 | WPARAM wParam,
|
---|
113 | LPARAM lParam);
|
---|
114 |
|
---|
115 | int WINAPI WinMain(HINSTANCE hInstance,
|
---|
116 | HINSTANCE hPrevInstance,
|
---|
117 | LPSTR lpCmdLine,
|
---|
118 | int nCmdShow) {
|
---|
119 | HWND hWnd;
|
---|
120 | WNDCLASSEXW wc;
|
---|
121 | ZeroMemory(&wc, sizeof(WNDCLASSEX));
|
---|
122 | wc.cbSize = sizeof(WNDCLASSEX);
|
---|
123 | wc.style = CS_HREDRAW | CS_VREDRAW;
|
---|
124 | wc.lpfnWndProc = WindowProc;
|
---|
125 | wc.hInstance = hInstance;
|
---|
126 | wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
|
---|
127 | wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
|
---|
128 | wc.lpszClassName = L"WindowClass1";
|
---|
129 | RegisterClassExW(&wc);
|
---|
130 |
|
---|
131 | hWnd = CreateWindowExW(0,
|
---|
132 | L"WindowClass1",
|
---|
133 | L"Our First Windowed Program",
|
---|
134 | WS_OVERLAPPEDWINDOW,
|
---|
135 | 300, 300,
|
---|
136 | 640, 480,
|
---|
137 | nullptr,
|
---|
138 | nullptr,
|
---|
139 | hInstance,
|
---|
140 | nullptr);
|
---|
141 | ShowWindow(hWnd, nCmdShow);
|
---|
142 |
|
---|
143 | MSG msg;
|
---|
144 |
|
---|
145 | try {
|
---|
146 | ClearApp app(hInstance, hWnd);
|
---|
147 |
|
---|
148 | while (true) {
|
---|
149 | if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
|
---|
150 | TranslateMessage(&msg);
|
---|
151 | DispatchMessage(&msg);
|
---|
152 |
|
---|
153 | if (msg.message == WM_QUIT)
|
---|
154 | return msg.wParam;
|
---|
155 | } else {
|
---|
156 | app.run();
|
---|
157 | }
|
---|
158 | }
|
---|
159 | } catch (const dxvk::DxvkError& e) {
|
---|
160 | std::cerr << e.message() << std::endl;
|
---|
161 | return msg.wParam;
|
---|
162 | }
|
---|
163 | }
|
---|
164 |
|
---|
165 | LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
---|
166 | switch (message) {
|
---|
167 | case WM_CLOSE:
|
---|
168 | PostQuitMessage(0);
|
---|
169 | return 0;
|
---|
170 | }
|
---|
171 |
|
---|
172 | return DefWindowProc(hWnd, message, wParam, lParam);
|
---|
173 | }
|
---|