VirtualBox

source: vbox/trunk/src/libs/dxvk-native-1.9.2a/tests/d3d9/test_d3d9_up.cpp@ 104739

最後變更 在這個檔案從104739是 96497,由 vboxsync 提交於 3 年 前

libs/dxvk-native-1.9.2a: export to OSE

  • 屬性 svn:eol-style 設為 native
檔案大小: 12.4 KB
 
1#include <cstring>
2
3#include <d3d9.h>
4#include <d3dcompiler.h>
5
6#include "../test_utils.h"
7
8using namespace dxvk;
9
10struct Extent2D {
11 uint32_t w, h;
12};
13
14const std::string g_vertexShaderCode = R"(
15
16struct VS_INPUT {
17 float3 Position : POSITION;
18 float3 TexCoord : TEXCOORD0;
19};
20
21struct VS_OUTPUT {
22 float4 Position : POSITION;
23 float3 TexCoord : TEXCOORD0;
24};
25
26VS_OUTPUT main( VS_INPUT IN ) {
27 VS_OUTPUT OUT;
28 OUT.Position = float4(IN.Position, 0.6f);
29 OUT.TexCoord = IN.TexCoord;
30
31 return OUT;
32}
33
34)";
35
36const std::string g_pixelShaderCode = R"(
37
38struct VS_OUTPUT {
39 float4 Position : POSITION;
40 float3 TexCoord : TEXCOORD0;
41};
42
43struct PS_OUTPUT {
44 float4 Colour : COLOR;
45};
46
47sampler g_texDepth : register( s0 );
48
49PS_OUTPUT main( VS_OUTPUT IN ) {
50 PS_OUTPUT OUT;
51
52 //OUT.Colour = tex2D(g_texDepth, float2(0, 0));
53 //OUT.Colour = 1.0;
54
55 OUT.Colour = float4(IN.TexCoord.xyz, 1.0);
56
57 return OUT;
58}
59
60
61)";
62
63Logger Logger::s_instance("triangle.log");
64
65class TriangleApp {
66
67public:
68
69 TriangleApp(HINSTANCE instance, HWND window)
70 : m_window(window) {
71 HRESULT status = Direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d);
72
73 if (FAILED(status))
74 throw DxvkError("Failed to create D3D9 interface");
75
76 UINT adapter = D3DADAPTER_DEFAULT;
77
78 D3DADAPTER_IDENTIFIER9 adapterId;
79 m_d3d->GetAdapterIdentifier(adapter, 0, &adapterId);
80
81 Logger::info(str::format("Using adapter: ", adapterId.Description));
82
83 auto CheckSRGBFormat = [&](D3DFORMAT fmt, const char* name) {
84 HRESULT status = m_d3d->CheckDeviceFormat(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, D3DRTYPE_TEXTURE, fmt);
85 Logger::warn(str::format("(linear) ", name, ": ", SUCCEEDED(status) ? "ok" : "nope"));
86
87 status = m_d3d->CheckDeviceFormat(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_SRGBREAD, D3DRTYPE_TEXTURE, fmt);
88 Logger::warn(str::format("(srgb) ", name, ": ", SUCCEEDED(status) ? "ok" : "nope"));
89 };
90
91 CheckSRGBFormat(D3DFMT_R5G6B5, "R5G6B5");
92 CheckSRGBFormat(D3DFMT_X1R5G5B5, "X1R5G5B5");
93 CheckSRGBFormat(D3DFMT_A1R5G5B5, "A1R5G5B5");
94 CheckSRGBFormat(D3DFMT_A4R4G4B4, "A4R4G4B4");
95 CheckSRGBFormat(D3DFMT_X4R4G4B4, "X4R4G4B4");
96 CheckSRGBFormat(D3DFMT_G16R16, "G16R16");
97 CheckSRGBFormat(D3DFMT_A2R10G10B10, "A2R10G10B10");
98 CheckSRGBFormat(D3DFMT_A16B16G16R16, "A16B16G16R16");
99
100 //
101
102 DWORD quality;
103 status = m_d3d->CheckDepthStencilMatch(adapter, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, D3DFMT_D24S8);
104 status = m_d3d->CheckDeviceFormat(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, D3DRTYPE_SURFACE, D3DFMT_A8R8G8B8);
105 status = m_d3d->CheckDeviceFormatConversion(adapter, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8);
106 status = m_d3d->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, FALSE, D3DMULTISAMPLE_NONE, &quality);
107 status = m_d3d->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, TRUE, D3DMULTISAMPLE_NONE, &quality);
108 status = m_d3d->CheckDeviceType(adapter, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, FALSE);
109 status = m_d3d->CheckDeviceType(adapter, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, D3DFMT_A8R8G8B8, TRUE);
110
111 // NULL
112 constexpr D3DFORMAT NullFormat = D3DFORMAT(MAKEFOURCC('N', 'U', 'L', 'L'));
113
114 status = m_d3d->CheckDepthStencilMatch(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, NullFormat, D3DFMT_D24S8);
115 status = m_d3d->CheckDeviceFormat(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, NullFormat);
116 status = m_d3d->CheckDeviceFormat(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, NullFormat);
117 status = m_d3d->CheckDeviceFormatConversion(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, NullFormat);
118 status = m_d3d->CheckDeviceType(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, NullFormat, false);
119 status = m_d3d->CheckDeviceType(adapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, NullFormat, true);
120 //
121
122 D3DPRESENT_PARAMETERS params;
123 getPresentParams(params);
124
125 status = m_d3d->CreateDeviceEx(
126 adapter,
127 D3DDEVTYPE_HAL,
128 m_window,
129 D3DCREATE_HARDWARE_VERTEXPROCESSING,
130 &params,
131 nullptr,
132 &m_device);
133
134 if (FAILED(status))
135 throw DxvkError("Failed to create D3D9 device");
136
137 // Funny Swapchain Refcounting
138 // "One of the things COM does really well, is lifecycle management"
139 // Implicit Swapchain
140 {
141 IDirect3DSurface9* pSurface1 = nullptr;
142 IDirect3DSurface9* pSurface2 = nullptr;
143 status = m_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface1);
144 D3DPRESENT_PARAMETERS newParams = params;
145 newParams.BackBufferWidth = 10;
146 newParams.BackBufferHeight = 10;
147 status = m_device->Reset(&newParams);
148 status = m_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface2);
149
150 IDirect3DSwapChain9* pSwapChain2 = nullptr;
151 IDirect3DSwapChain9* pSwapChain3 = nullptr;
152 status = pSurface1->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast<void**>(&pSwapChain2));
153 status = pSurface2->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast<void**>(&pSwapChain3));
154
155 printf("E_NOINTERFACE! for pSwapchain2");
156 status = m_device->Reset(&params);
157 }
158 // Additional swapchain
159 {
160 IDirect3DSwapChain9* pSwapChain2 = nullptr;
161 IDirect3DSwapChain9* pSwapChain3 = nullptr;
162 IDirect3DSwapChain9* pSwapChain4 = nullptr;
163 IDirect3DSurface9* pSurface = nullptr;
164 status = m_device->CreateAdditionalSwapChain(&params, &pSwapChain2);
165 status = pSwapChain2->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
166 status = pSurface->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast<void**>(&pSwapChain3));
167 pSwapChain2->Release();
168 UINT count = pSwapChain2->Release();
169 printf("Count: %u - Should be 0 and swapchain dead!", count);
170 status = pSurface->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast<void**>(&pSwapChain4));
171 // E_NOINTERFACE !
172 printf("E_NOINTERFACE!");
173 }
174
175 m_device->AddRef();
176
177 Com<IDirect3DSurface9> backbuffer;
178 m_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
179
180 m_device->AddRef();
181
182 Com<IDirect3DSwapChain9> swapchain;
183 m_device->GetSwapChain(0, &swapchain);
184
185 m_device->AddRef();
186
187 DWORD bias = 0xDEADBEEF;
188 status = m_device->GetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, &bias);
189 status = m_device->SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, MAKEFOURCC('G', 'E', 'T', '4'));
190 status = m_device->GetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, &bias);
191 status = m_device->SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, MAKEFOURCC('G', 'E', 'T', '1'));
192 status = m_device->GetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, &bias);
193
194 // Vertex Shader
195 {
196 Com<ID3DBlob> blob;
197
198 status = D3DCompile(
199 g_vertexShaderCode.data(),
200 g_vertexShaderCode.length(),
201 nullptr, nullptr, nullptr,
202 "main",
203 "vs_2_0",
204 0, 0, &blob,
205 nullptr);
206
207 if (FAILED(status))
208 throw DxvkError("Failed to compile vertex shader");
209
210 status = m_device->CreateVertexShader(reinterpret_cast<const DWORD*>(blob->GetBufferPointer()), &m_vs);
211
212 if (FAILED(status))
213 throw DxvkError("Failed to create vertex shader");
214 }
215
216 // Pixel Shader
217 {
218 Com<ID3DBlob> blob;
219
220 status = D3DCompile(
221 g_pixelShaderCode.data(),
222 g_pixelShaderCode.length(),
223 nullptr, nullptr, nullptr,
224 "main",
225 "ps_2_0",
226 0, 0, &blob,
227 nullptr);
228
229 if (FAILED(status))
230 throw DxvkError("Failed to compile pixel shader");
231
232 status = m_device->CreatePixelShader(reinterpret_cast<const DWORD*>(blob->GetBufferPointer()), &m_ps);
233
234 if (FAILED(status))
235 throw DxvkError("Failed to create pixel shader");
236 }
237
238 m_device->SetVertexShader(m_vs.ptr());
239 m_device->SetPixelShader(m_ps.ptr());
240
241 m_device->AddRef();
242 }
243
244 void run() {
245 this->adjustBackBuffer();
246
247 m_device->BeginScene();
248
249 m_device->Clear(
250 0,
251 nullptr,
252 D3DCLEAR_TARGET,
253 D3DCOLOR_RGBA(44, 62, 80, 0),
254 0,
255 0);
256
257 m_device->Clear(
258 0,
259 nullptr,
260 D3DCLEAR_ZBUFFER,
261 0,
262 0.5f,
263 0);
264
265 m_decl = nullptr;
266
267 std::array<D3DVERTEXELEMENT9, 3> elements;
268
269 elements[0].Method = 0;
270 elements[0].Offset = 0;
271 elements[0].Stream = 0;
272 elements[0].Type = D3DDECLTYPE_FLOAT3;
273 elements[0].Usage = D3DDECLUSAGE_POSITION;
274 elements[0].UsageIndex = 0;
275
276 elements[1].Method = 0;
277 elements[1].Offset = 12;
278 elements[1].Stream = 0;
279 elements[1].Type = D3DDECLTYPE_FLOAT3;
280 elements[1].Usage = D3DDECLUSAGE_TEXCOORD;
281 elements[1].UsageIndex = 0;
282
283 elements[2] = D3DDECL_END();
284
285 HRESULT result = m_device->CreateVertexDeclaration(elements.data(), &m_decl);
286 if (FAILED(result))
287 throw DxvkError("Failed to create vertex decl");
288
289 m_device->SetVertexDeclaration(m_decl.ptr());
290
291 float vertexData[] = {
292 -1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, -1, 0, 1, 1, -1, -1, 0, 0, 1,
293
294 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
295 };
296
297 m_device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertexData, 20);
298 //m_device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 3, vertexData, 20);
299
300 //m_device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
301
302 m_device->EndScene();
303
304 m_device->PresentEx(
305 nullptr,
306 nullptr,
307 nullptr,
308 nullptr,
309 0);
310 }
311
312 void adjustBackBuffer() {
313 RECT windowRect = { 0, 0, 1024, 600 };
314 GetClientRect(m_window, &windowRect);
315
316 Extent2D newSize = {
317 static_cast<uint32_t>(windowRect.right - windowRect.left),
318 static_cast<uint32_t>(windowRect.bottom - windowRect.top),
319 };
320
321 if (m_windowSize.w != newSize.w
322 || m_windowSize.h != newSize.h) {
323 m_windowSize = newSize;
324
325 D3DPRESENT_PARAMETERS params;
326 getPresentParams(params);
327 HRESULT status = m_device->ResetEx(&params, nullptr);
328
329 if (FAILED(status))
330 throw DxvkError("Device reset failed");
331 }
332 }
333
334 void getPresentParams(D3DPRESENT_PARAMETERS& params) {
335 params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
336 params.BackBufferCount = 1;
337 params.BackBufferFormat = D3DFMT_X8R8G8B8;
338 params.BackBufferWidth = m_windowSize.w;
339 params.BackBufferHeight = m_windowSize.h;
340 params.EnableAutoDepthStencil = 0;
341 params.Flags = 0;
342 params.FullScreen_RefreshRateInHz = 0;
343 params.hDeviceWindow = m_window;
344 params.MultiSampleQuality = 0;
345 params.MultiSampleType = D3DMULTISAMPLE_NONE;
346 params.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
347 params.SwapEffect = D3DSWAPEFFECT_DISCARD;
348 params.Windowed = TRUE;
349 }
350
351private:
352
353 HWND m_window;
354 Extent2D m_windowSize = { 1024, 600 };
355
356 Com<IDirect3D9Ex> m_d3d;
357 Com<IDirect3DDevice9Ex> m_device;
358
359 Com<IDirect3DVertexShader9> m_vs;
360 Com<IDirect3DPixelShader9> m_ps;
361 Com<IDirect3DVertexBuffer9> m_vb;
362 Com<IDirect3DVertexDeclaration9> m_decl;
363
364};
365
366LRESULT CALLBACK WindowProc(HWND hWnd,
367 UINT message,
368 WPARAM wParam,
369 LPARAM lParam);
370
371int WINAPI WinMain(HINSTANCE hInstance,
372 HINSTANCE hPrevInstance,
373 LPSTR lpCmdLine,
374 int nCmdShow) {
375 HWND hWnd;
376 WNDCLASSEXW wc;
377 ZeroMemory(&wc, sizeof(WNDCLASSEX));
378 wc.cbSize = sizeof(WNDCLASSEX);
379 wc.style = CS_HREDRAW | CS_VREDRAW;
380 wc.lpfnWndProc = WindowProc;
381 wc.hInstance = hInstance;
382 wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
383 wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
384 wc.lpszClassName = L"WindowClass1";
385 RegisterClassExW(&wc);
386
387 hWnd = CreateWindowExW(0,
388 L"WindowClass1",
389 L"Our First Windowed Program",
390 WS_OVERLAPPEDWINDOW,
391 300, 300,
392 640, 480,
393 nullptr,
394 nullptr,
395 hInstance,
396 nullptr);
397 ShowWindow(hWnd, nCmdShow);
398
399 MSG msg;
400
401 try {
402 TriangleApp app(hInstance, hWnd);
403
404 while (true) {
405 if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
406 TranslateMessage(&msg);
407 DispatchMessage(&msg);
408
409 if (msg.message == WM_QUIT)
410 return msg.wParam;
411 } else {
412 app.run();
413 }
414 }
415 } catch (const dxvk::DxvkError& e) {
416 std::cerr << e.message() << std::endl;
417 return msg.wParam;
418 }
419}
420
421LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
422 switch (message) {
423 case WM_CLOSE:
424 PostQuitMessage(0);
425 return 0;
426 }
427
428 return DefWindowProc(hWnd, message, wParam, lParam);
429}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette