VirtualBox

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

Last change on this file since 104448 was 96497, checked in by vboxsync, 3 years ago

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

  • Property svn:eol-style set to native
File size: 8.6 KB
Line 
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};
19
20struct VS_OUTPUT {
21 float4 Position : POSITION;
22 float2 Texcoord : TEXCOORD0;
23};
24
25VS_OUTPUT main( VS_INPUT IN ) {
26 VS_OUTPUT OUT;
27 OUT.Position = float4(IN.Position, 0.6f);
28 OUT.Texcoord = IN.Position.xy + float2(0.5, 0.5);
29 OUT.Texcoord.y = 1.0 - OUT.Texcoord.y;
30
31 return OUT;
32}
33
34)";
35
36const std::string g_pixelShaderCode = R"(
37
38struct VS_OUTPUT {
39 float4 Position : POSITION;
40 float2 Texcoord : TEXCOORD0;
41};
42
43struct PS_OUTPUT {
44 float4 Colour : COLOR;
45};
46
47sampler g_frogTex : register( s0 );
48
49PS_OUTPUT main( VS_OUTPUT IN ) {
50 PS_OUTPUT OUT;
51
52 OUT.Colour = float4(1, 0, 0, 1);
53
54 return OUT;
55}
56
57
58)";
59
60Logger Logger::s_instance("triangle.log");
61
62class TriangleApp {
63
64public:
65
66 TriangleApp(HINSTANCE instance, HWND window)
67 : m_window(window) {
68 HRESULT status = Direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d);
69
70 if (FAILED(status))
71 throw DxvkError("Failed to create D3D9 interface");
72
73 UINT adapter = D3DADAPTER_DEFAULT;
74
75 D3DADAPTER_IDENTIFIER9 adapterId;
76 m_d3d->GetAdapterIdentifier(adapter, 0, &adapterId);
77
78 Logger::info(str::format("Using adapter: ", adapterId.Description));
79
80 D3DPRESENT_PARAMETERS params;
81 getPresentParams(params);
82
83 status = m_d3d->CreateDeviceEx(
84 adapter,
85 D3DDEVTYPE_HAL,
86 m_window,
87 D3DCREATE_HARDWARE_VERTEXPROCESSING,
88 &params,
89 nullptr,
90 &m_device);
91
92 if (FAILED(status))
93 throw DxvkError("Failed to create D3D9 device");
94
95
96 // Vertex Shader
97 {
98 Com<ID3DBlob> blob;
99
100 status = D3DCompile(
101 g_vertexShaderCode.data(),
102 g_vertexShaderCode.length(),
103 nullptr, nullptr, nullptr,
104 "main",
105 "vs_2_0",
106 0, 0, &blob,
107 nullptr);
108
109 if (FAILED(status))
110 throw DxvkError("Failed to compile vertex shader");
111
112 status = m_device->CreateVertexShader(reinterpret_cast<const DWORD*>(blob->GetBufferPointer()), &m_vs);
113
114 if (FAILED(status))
115 throw DxvkError("Failed to create vertex shader");
116 }
117
118 // Pixel Shader
119 {
120 Com<ID3DBlob> blob;
121
122 status = D3DCompile(
123 g_pixelShaderCode.data(),
124 g_pixelShaderCode.length(),
125 nullptr, nullptr, nullptr,
126 "main",
127 "ps_3_0",
128 0, 0, &blob,
129 nullptr);
130
131 if (FAILED(status))
132 throw DxvkError("Failed to compile pixel shader");
133
134 status = m_device->CreatePixelShader(reinterpret_cast<const DWORD*>(blob->GetBufferPointer()), &m_ps);
135
136 if (FAILED(status))
137 throw DxvkError("Failed to create pixel shader");
138 }
139
140 m_device->SetVertexShader(m_vs.ptr());
141 m_device->SetPixelShader(m_ps.ptr());
142
143 m_device->AddRef();
144
145
146 std::array<float, 9> vertices = {
147 0.0f, 0.5f, 0.0f,
148 0.5f, -0.5f, 0.0f,
149 -0.5f, -0.5f, 0.0f,
150 };
151
152 const size_t vbSize = vertices.size() * sizeof(float);
153
154 status = m_device->CreateVertexBuffer(vbSize, 0, 0, D3DPOOL_DEFAULT, &m_vb, nullptr);
155 if (FAILED(status))
156 throw DxvkError("Failed to create vertex buffer");
157
158 void* data = nullptr;
159 status = m_vb->Lock(0, 0, &data, 0);
160 if (FAILED(status))
161 throw DxvkError("Failed to lock vertex buffer");
162
163 std::memcpy(data, vertices.data(), vbSize);
164
165 status = m_vb->Unlock();
166 if (FAILED(status))
167 throw DxvkError("Failed to unlock vertex buffer");
168
169 m_device->SetStreamSource(0, m_vb.ptr(), 0, 3 * sizeof(float));
170
171 std::array<D3DVERTEXELEMENT9, 2> elements;
172
173 elements[0].Method = 0;
174 elements[0].Offset = 0;
175 elements[0].Stream = 0;
176 elements[0].Type = D3DDECLTYPE_FLOAT3;
177 elements[0].Usage = D3DDECLUSAGE_POSITION;
178 elements[0].UsageIndex = 0;
179
180 elements[1] = D3DDECL_END();
181
182 HRESULT result = m_device->CreateVertexDeclaration(elements.data(), &m_decl);
183 if (FAILED(result))
184 throw DxvkError("Failed to create vertex decl");
185
186 m_device->SetVertexDeclaration(m_decl.ptr());
187
188 const uint32_t imageSize = 8;
189
190 Com<IDirect3DTexture9> texDefault;
191 Com<IDirect3DSurface9> texDefaultSurf;
192 status = m_device->CreateTexture(imageSize, imageSize, 4, 0, D3DFMT_DXT1, D3DPOOL_DEFAULT, &texDefault, nullptr);
193 status = texDefault->GetSurfaceLevel(2, &texDefaultSurf);
194
195 Com<IDirect3DTexture9> texSysmem;
196 Com<IDirect3DSurface9> texSysmemSurf;
197 status = m_device->CreateTexture(imageSize, imageSize, 4, 0, D3DFMT_DXT1, D3DPOOL_SYSTEMMEM, &texSysmem, nullptr);
198 status = texSysmem->GetSurfaceLevel(2, &texSysmemSurf);
199
200 D3DLOCKED_RECT rect = {};
201 status = texSysmemSurf->LockRect(&rect, nullptr, 0);
202 std::memset(rect.pBits, 0xF0, 2 * rect.Pitch);
203 status = texSysmemSurf->UnlockRect();
204
205 // 1 returns invalid call
206 // 2 succeeds
207 RECT sourceRect = { 0, 0, 2, 2 };
208 POINT destPoint = { 0, 0 };
209 status = m_device->UpdateSurface(texSysmemSurf.ptr(), &sourceRect, texDefaultSurf.ptr(), &destPoint);
210 }
211
212 void run() {
213 this->adjustBackBuffer();
214
215 m_device->BeginScene();
216
217 m_device->Clear(
218 0,
219 nullptr,
220 D3DCLEAR_TARGET,
221 D3DCOLOR_RGBA(44, 62, 80, 0),
222 0,
223 0);
224
225 m_device->Clear(
226 0,
227 nullptr,
228 D3DCLEAR_ZBUFFER,
229 0,
230 0.5f,
231 0);
232
233 m_device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
234
235 m_device->EndScene();
236
237 m_device->PresentEx(
238 nullptr,
239 nullptr,
240 nullptr,
241 nullptr,
242 0);
243 }
244
245 void adjustBackBuffer() {
246 RECT windowRect = { 0, 0, 1024, 600 };
247 GetClientRect(m_window, &windowRect);
248
249 Extent2D newSize = {
250 static_cast<uint32_t>(windowRect.right - windowRect.left),
251 static_cast<uint32_t>(windowRect.bottom - windowRect.top),
252 };
253
254 if (m_windowSize.w != newSize.w
255 || m_windowSize.h != newSize.h) {
256 m_windowSize = newSize;
257
258 D3DPRESENT_PARAMETERS params;
259 getPresentParams(params);
260 HRESULT status = m_device->ResetEx(&params, nullptr);
261
262 if (FAILED(status))
263 throw DxvkError("Device reset failed");
264 }
265 }
266
267 void getPresentParams(D3DPRESENT_PARAMETERS& params) {
268 params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
269 params.BackBufferCount = 1;
270 params.BackBufferFormat = D3DFMT_X8R8G8B8;
271 params.BackBufferWidth = m_windowSize.w;
272 params.BackBufferHeight = m_windowSize.h;
273 params.EnableAutoDepthStencil = 0;
274 params.Flags = 0;
275 params.FullScreen_RefreshRateInHz = 0;
276 params.hDeviceWindow = m_window;
277 params.MultiSampleQuality = 0;
278 params.MultiSampleType = D3DMULTISAMPLE_NONE;
279 params.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
280 params.SwapEffect = D3DSWAPEFFECT_DISCARD;
281 params.Windowed = TRUE;
282 }
283
284private:
285
286 HWND m_window;
287 Extent2D m_windowSize = { 1024, 600 };
288
289 Com<IDirect3D9Ex> m_d3d;
290 Com<IDirect3DDevice9Ex> m_device;
291
292 Com<IDirect3DVertexShader9> m_vs;
293 Com<IDirect3DPixelShader9> m_ps;
294 Com<IDirect3DVertexBuffer9> m_vb;
295 Com<IDirect3DVertexDeclaration9> m_decl;
296
297};
298
299LRESULT CALLBACK WindowProc(HWND hWnd,
300 UINT message,
301 WPARAM wParam,
302 LPARAM lParam);
303
304int WINAPI WinMain(HINSTANCE hInstance,
305 HINSTANCE hPrevInstance,
306 LPSTR lpCmdLine,
307 int nCmdShow) {
308 HWND hWnd;
309 WNDCLASSEXW wc;
310 ZeroMemory(&wc, sizeof(WNDCLASSEX));
311 wc.cbSize = sizeof(WNDCLASSEX);
312 wc.style = CS_HREDRAW | CS_VREDRAW;
313 wc.lpfnWndProc = WindowProc;
314 wc.hInstance = hInstance;
315 wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
316 wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
317 wc.lpszClassName = L"WindowClass1";
318 RegisterClassExW(&wc);
319
320 hWnd = CreateWindowExW(0,
321 L"WindowClass1",
322 L"Our First Windowed Program",
323 WS_OVERLAPPEDWINDOW,
324 300, 300,
325 640, 480,
326 nullptr,
327 nullptr,
328 hInstance,
329 nullptr);
330 ShowWindow(hWnd, nCmdShow);
331
332 MSG msg;
333
334 try {
335 TriangleApp app(hInstance, hWnd);
336
337 while (true) {
338 if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
339 TranslateMessage(&msg);
340 DispatchMessage(&msg);
341
342 if (msg.message == WM_QUIT)
343 return msg.wParam;
344 } else {
345 app.run();
346 }
347 }
348 } catch (const dxvk::DxvkError& e) {
349 std::cerr << e.message() << std::endl;
350 return msg.wParam;
351 }
352}
353
354LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
355 switch (message) {
356 case WM_CLOSE:
357 PostQuitMessage(0);
358 return 0;
359 }
360
361 return DefWindowProc(hWnd, message, wParam, lParam);
362}
Note: See TracBrowser for help on using the repository browser.

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