2 * Copyright 2008 Henri Verbeet for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/test.h"
24 HRESULT WINAPI D3D10CoreCreateDevice(IDXGIFactory *factory, IDXGIAdapter *adapter,
25 UINT flags, void *unknown0, ID3D10Device **device);
27 static ID3D10Device *create_device(void)
29 IDXGIFactory *factory = NULL;
30 IDXGIAdapter *adapter = NULL;
31 ID3D10Device *device = NULL;
34 hr = CreateDXGIFactory(&IID_IDXGIFactory, (void *)&factory);
35 if (FAILED(hr)) goto cleanup;
37 hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter);
38 ok(SUCCEEDED(hr) || hr == DXGI_ERROR_NOT_FOUND, /* Some VMware and VirtualBox */
39 "EnumAdapters failed, hr %#x.\n", hr);
42 hr = D3D10CoreCreateDevice(factory, adapter, 0, NULL, &device);
49 trace("Failed to create a HW device, trying REF\n");
50 if (adapter) IDXGIAdapter_Release(adapter);
53 d3d10ref = LoadLibraryA("d3d10ref.dll");
56 trace("d3d10ref.dll not available, unable to create a REF device\n");
60 hr = IDXGIFactory_CreateSoftwareAdapter(factory, d3d10ref, &adapter);
61 FreeLibrary(d3d10ref);
62 ok(SUCCEEDED(hr), "CreateSoftwareAdapter failed, hr %#x\n", hr);
63 if (FAILED(hr)) goto cleanup;
65 hr = D3D10CoreCreateDevice(factory, adapter, 0, NULL, &device);
66 ok(SUCCEEDED(hr), "Failed to create a REF device, hr %#x\n", hr);
67 if (FAILED(hr)) goto cleanup;
71 if (adapter) IDXGIAdapter_Release(adapter);
72 if (factory) IDXGIFactory_Release(factory);
77 static void test_device_interfaces(ID3D10Device *device)
82 if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_IUnknown, (void **)&obj)))
83 IUnknown_Release(obj);
84 ok(SUCCEEDED(hr), "ID3D10Device does not implement IUnknown\n");
86 if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_IDXGIObject, (void **)&obj)))
87 IUnknown_Release(obj);
88 ok(SUCCEEDED(hr), "ID3D10Device does not implement IDXGIObject\n");
90 if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_IDXGIDevice, (void **)&obj)))
91 IUnknown_Release(obj);
92 ok(SUCCEEDED(hr), "ID3D10Device does not implement IDXGIDevice\n");
94 if (SUCCEEDED(hr = ID3D10Device_QueryInterface(device, &IID_ID3D10Device, (void **)&obj)))
95 IUnknown_Release(obj);
96 ok(SUCCEEDED(hr), "ID3D10Device does not implement ID3D10Device\n");
99 static void test_create_texture2d(ID3D10Device *device)
101 D3D10_TEXTURE2D_DESC desc;
102 ID3D10Texture2D *texture;
103 IDXGISurface *surface;
110 desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
111 desc.SampleDesc.Count = 1;
112 desc.SampleDesc.Quality = 0;
113 desc.Usage = D3D10_USAGE_DEFAULT;
114 desc.BindFlags = D3D10_BIND_RENDER_TARGET;
115 desc.CPUAccessFlags = 0;
118 hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture);
119 ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr);
121 hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
122 ok(SUCCEEDED(hr), "Texture should implement IDXGISurface\n");
123 if (SUCCEEDED(hr)) IDXGISurface_Release(surface);
124 ID3D10Texture2D_Release(texture);
127 hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture);
128 ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr);
130 ID3D10Texture2D_GetDesc(texture, &desc);
131 ok(desc.Width == 512, "Got unexpected Width %u.\n", desc.Width);
132 ok(desc.Height == 512, "Got unexpected Height %u.\n", desc.Height);
133 ok(desc.MipLevels == 10, "Got unexpected MipLevels %u.\n", desc.MipLevels);
134 ok(desc.ArraySize == 1, "Got unexpected ArraySize %u.\n", desc.ArraySize);
135 ok(desc.Format == DXGI_FORMAT_R8G8B8A8_UNORM, "Got unexpected Format %#x.\n", desc.Format);
136 ok(desc.SampleDesc.Count == 1, "Got unexpected SampleDesc.Count %u.\n", desc.SampleDesc.Count);
137 ok(desc.SampleDesc.Quality == 0, "Got unexpected SampleDesc.Quality %u.\n", desc.SampleDesc.Quality);
138 ok(desc.Usage == D3D10_USAGE_DEFAULT, "Got unexpected MipLevels %u.\n", desc.Usage);
139 ok(desc.BindFlags == D3D10_BIND_RENDER_TARGET, "Got unexpected BindFlags %u.\n", desc.BindFlags);
140 ok(desc.CPUAccessFlags == 0, "Got unexpected CPUAccessFlags %u.\n", desc.CPUAccessFlags);
141 ok(desc.MiscFlags == 0, "Got unexpected MiscFlags %u.\n", desc.MiscFlags);
143 hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
144 ok(FAILED(hr), "Texture should not implement IDXGISurface\n");
145 if (SUCCEEDED(hr)) IDXGISurface_Release(surface);
146 ID3D10Texture2D_Release(texture);
150 hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &texture);
151 ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr);
153 hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
154 ok(FAILED(hr), "Texture should not implement IDXGISurface\n");
155 if (SUCCEEDED(hr)) IDXGISurface_Release(surface);
156 ID3D10Texture2D_Release(texture);
159 static void test_create_texture3d(ID3D10Device *device)
161 D3D10_TEXTURE3D_DESC desc;
162 ID3D10Texture3D *texture;
163 IDXGISurface *surface;
170 desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
171 desc.Usage = D3D10_USAGE_DEFAULT;
172 desc.BindFlags = D3D10_BIND_RENDER_TARGET;
173 desc.CPUAccessFlags = 0;
176 hr = ID3D10Device_CreateTexture3D(device, &desc, NULL, &texture);
177 ok(SUCCEEDED(hr), "Failed to create a 3d texture, hr %#x.\n", hr);
179 hr = ID3D10Texture3D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
180 ok(FAILED(hr), "Texture should not implement IDXGISurface.\n");
181 if (SUCCEEDED(hr)) IDXGISurface_Release(surface);
182 ID3D10Texture3D_Release(texture);
185 hr = ID3D10Device_CreateTexture3D(device, &desc, NULL, &texture);
186 ok(SUCCEEDED(hr), "Failed to create a 3d texture, hr %#x.\n", hr);
188 ID3D10Texture3D_GetDesc(texture, &desc);
189 ok(desc.Width == 64, "Got unexpected Width %u.\n", desc.Width);
190 ok(desc.Height == 64, "Got unexpected Height %u.\n", desc.Height);
191 ok(desc.Depth == 64, "Got unexpected Depth %u.\n", desc.Depth);
192 ok(desc.MipLevels == 7, "Got unexpected MipLevels %u.\n", desc.MipLevels);
193 ok(desc.Format == DXGI_FORMAT_R8G8B8A8_UNORM, "Got unexpected Format %#x.\n", desc.Format);
194 ok(desc.Usage == D3D10_USAGE_DEFAULT, "Got unexpected MipLevels %u.\n", desc.Usage);
195 ok(desc.BindFlags == D3D10_BIND_RENDER_TARGET, "Got unexpected BindFlags %u.\n", desc.BindFlags);
196 ok(desc.CPUAccessFlags == 0, "Got unexpected CPUAccessFlags %u.\n", desc.CPUAccessFlags);
197 ok(desc.MiscFlags == 0, "Got unexpected MiscFlags %u.\n", desc.MiscFlags);
199 hr = ID3D10Texture3D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
200 ok(FAILED(hr), "Texture should not implement IDXGISurface.\n");
201 if (SUCCEEDED(hr)) IDXGISurface_Release(surface);
202 ID3D10Texture3D_Release(texture);
205 static void test_create_rendertarget_view(ID3D10Device *device)
207 D3D10_RENDER_TARGET_VIEW_DESC rtv_desc;
208 D3D10_TEXTURE2D_DESC texture_desc;
209 D3D10_BUFFER_DESC buffer_desc;
210 ID3D10RenderTargetView *rtview;
211 ID3D10Texture2D *texture;
212 ID3D10Buffer *buffer;
215 buffer_desc.ByteWidth = 1024;
216 buffer_desc.Usage = D3D10_USAGE_DEFAULT;
217 buffer_desc.BindFlags = D3D10_BIND_RENDER_TARGET;
218 buffer_desc.CPUAccessFlags = 0;
219 buffer_desc.MiscFlags = 0;
221 hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &buffer);
222 ok(SUCCEEDED(hr), "Failed to create a buffer, hr %#x\n", hr);
224 rtv_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
225 rtv_desc.ViewDimension = D3D10_RTV_DIMENSION_BUFFER;
226 U(rtv_desc).Buffer.ElementOffset = 0;
227 U(rtv_desc).Buffer.ElementWidth = 64;
229 hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)buffer, &rtv_desc, &rtview);
230 ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x\n", hr);
232 ID3D10RenderTargetView_Release(rtview);
233 ID3D10Buffer_Release(buffer);
235 texture_desc.Width = 512;
236 texture_desc.Height = 512;
237 texture_desc.MipLevels = 1;
238 texture_desc.ArraySize = 1;
239 texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
240 texture_desc.SampleDesc.Count = 1;
241 texture_desc.SampleDesc.Quality = 0;
242 texture_desc.Usage = D3D10_USAGE_DEFAULT;
243 texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET;
244 texture_desc.CPUAccessFlags = 0;
245 texture_desc.MiscFlags = 0;
247 hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture);
248 ok(SUCCEEDED(hr), "Failed to create a 2d texture, hr %#x\n", hr);
250 /* For texture resources it's allowed to specify NULL as desc */
251 hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)texture, NULL, &rtview);
252 ok(SUCCEEDED(hr), "Failed to create a rendertarget view, hr %#x\n", hr);
254 ID3D10RenderTargetView_GetDesc(rtview, &rtv_desc);
255 ok(rtv_desc.Format == texture_desc.Format, "Expected format %#x, got %#x\n", texture_desc.Format, rtv_desc.Format);
256 ok(rtv_desc.ViewDimension == D3D10_RTV_DIMENSION_TEXTURE2D,
257 "Expected view dimension D3D10_RTV_DIMENSION_TEXTURE2D, got %#x\n", rtv_desc.ViewDimension);
258 ok(U(rtv_desc).Texture2D.MipSlice == 0, "Expected mip slice 0, got %#x\n", U(rtv_desc).Texture2D.MipSlice);
260 ID3D10RenderTargetView_Release(rtview);
261 ID3D10Texture2D_Release(texture);
264 static void test_create_shader(ID3D10Device *device)
272 float4 position : POSITION;
273 float3 normal : NORMAL;
278 float4 position : POSITION;
279 float4 diffuse : COLOR;
282 output main(const input v)
286 o.position = mul(v.position, mat);
287 o.diffuse = dot((float3)light, v.normal);
292 static const DWORD vs_4_0[] =
294 0x43425844, 0x3ae813ca, 0x0f034b91, 0x790f3226, 0x6b4a718a, 0x00000001, 0x000001c0,
295 0x00000003, 0x0000002c, 0x0000007c, 0x000000cc, 0x4e475349, 0x00000048, 0x00000002,
296 0x00000008, 0x00000038, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f,
297 0x00000041, 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x00000707, 0x49534f50,
298 0x4e4f4954, 0x524f4e00, 0x004c414d, 0x4e47534f, 0x00000048, 0x00000002, 0x00000008,
299 0x00000038, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x0000000f, 0x00000041,
300 0x00000000, 0x00000000, 0x00000003, 0x00000001, 0x0000000f, 0x49534f50, 0x4e4f4954,
301 0x4c4f4300, 0xab00524f, 0x52444853, 0x000000ec, 0x00010040, 0x0000003b, 0x04000059,
302 0x00208e46, 0x00000000, 0x00000005, 0x0300005f, 0x001010f2, 0x00000000, 0x0300005f,
303 0x00101072, 0x00000001, 0x03000065, 0x001020f2, 0x00000000, 0x03000065, 0x001020f2,
304 0x00000001, 0x08000011, 0x00102012, 0x00000000, 0x00101e46, 0x00000000, 0x00208e46,
305 0x00000000, 0x00000001, 0x08000011, 0x00102022, 0x00000000, 0x00101e46, 0x00000000,
306 0x00208e46, 0x00000000, 0x00000002, 0x08000011, 0x00102042, 0x00000000, 0x00101e46,
307 0x00000000, 0x00208e46, 0x00000000, 0x00000003, 0x08000011, 0x00102082, 0x00000000,
308 0x00101e46, 0x00000000, 0x00208e46, 0x00000000, 0x00000004, 0x08000010, 0x001020f2,
309 0x00000001, 0x00208246, 0x00000000, 0x00000000, 0x00101246, 0x00000001, 0x0100003e,
312 static const DWORD vs_2_0[] =
314 0xfffe0200, 0x002bfffe, 0x42415443, 0x0000001c, 0x00000077, 0xfffe0200, 0x00000002,
315 0x0000001c, 0x00000100, 0x00000070, 0x00000044, 0x00040002, 0x00000001, 0x0000004c,
316 0x00000000, 0x0000005c, 0x00000002, 0x00000004, 0x00000060, 0x00000000, 0x6867696c,
317 0xabab0074, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x0074616d, 0x00030003,
318 0x00040004, 0x00000001, 0x00000000, 0x325f7376, 0x4d00305f, 0x6f726369, 0x74666f73,
319 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
320 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f,
321 0x80000003, 0x900f0001, 0x03000009, 0xc0010000, 0x90e40000, 0xa0e40000, 0x03000009,
322 0xc0020000, 0x90e40000, 0xa0e40001, 0x03000009, 0xc0040000, 0x90e40000, 0xa0e40002,
323 0x03000009, 0xc0080000, 0x90e40000, 0xa0e40003, 0x03000008, 0xd00f0000, 0xa0e40004,
324 0x90e40001, 0x0000ffff,
327 static const DWORD vs_3_0[] =
329 0xfffe0300, 0x002bfffe, 0x42415443, 0x0000001c, 0x00000077, 0xfffe0300, 0x00000002,
330 0x0000001c, 0x00000100, 0x00000070, 0x00000044, 0x00040002, 0x00000001, 0x0000004c,
331 0x00000000, 0x0000005c, 0x00000002, 0x00000004, 0x00000060, 0x00000000, 0x6867696c,
332 0xabab0074, 0x00030001, 0x00040001, 0x00000001, 0x00000000, 0x0074616d, 0x00030003,
333 0x00040004, 0x00000001, 0x00000000, 0x335f7376, 0x4d00305f, 0x6f726369, 0x74666f73,
334 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x2e392072,
335 0x392e3932, 0x332e3235, 0x00313131, 0x0200001f, 0x80000000, 0x900f0000, 0x0200001f,
336 0x80000003, 0x900f0001, 0x0200001f, 0x80000000, 0xe00f0000, 0x0200001f, 0x8000000a,
337 0xe00f0001, 0x03000009, 0xe0010000, 0x90e40000, 0xa0e40000, 0x03000009, 0xe0020000,
338 0x90e40000, 0xa0e40001, 0x03000009, 0xe0040000, 0x90e40000, 0xa0e40002, 0x03000009,
339 0xe0080000, 0x90e40000, 0xa0e40003, 0x03000008, 0xe00f0001, 0xa0e40004, 0x90e40001,
344 float4 main(const float4 color : COLOR) : SV_TARGET
353 static const DWORD ps_4_0[] =
355 0x43425844, 0x4da9446f, 0xfbe1f259, 0x3fdb3009, 0x517521fa, 0x00000001, 0x000001ac,
356 0x00000005, 0x00000034, 0x0000008c, 0x000000bc, 0x000000f0, 0x00000130, 0x46454452,
357 0x00000050, 0x00000000, 0x00000000, 0x00000000, 0x0000001c, 0xffff0400, 0x00000100,
358 0x0000001c, 0x7263694d, 0x666f736f, 0x52282074, 0x4c482029, 0x53204c53, 0x65646168,
359 0x6f432072, 0x6c69706d, 0x39207265, 0x2e39322e, 0x2e323539, 0x31313133, 0xababab00,
360 0x4e475349, 0x00000028, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
361 0x00000003, 0x00000000, 0x00000f0f, 0x4f4c4f43, 0xabab0052, 0x4e47534f, 0x0000002c,
362 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
363 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054, 0x52444853, 0x00000038, 0x00000040,
364 0x0000000e, 0x03001062, 0x001010f2, 0x00000000, 0x03000065, 0x001020f2, 0x00000000,
365 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e, 0x54415453,
366 0x00000074, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
367 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
368 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
369 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
370 0x00000000, 0x00000000,
373 ID3D10VertexShader *vs = NULL;
374 ID3D10PixelShader *ps = NULL;
377 hr = ID3D10Device_CreateVertexShader(device, vs_4_0, sizeof(vs_4_0), &vs);
378 ok(SUCCEEDED(hr), "Failed to create SM4 vertex shader, hr %#x\n", hr);
380 ID3D10VertexShader_Release(vs);
382 hr = ID3D10Device_CreateVertexShader(device, vs_2_0, sizeof(vs_2_0), &vs);
383 ok(hr == E_INVALIDARG, "Created a SM2 vertex shader, hr %#x\n", hr);
385 hr = ID3D10Device_CreateVertexShader(device, vs_3_0, sizeof(vs_3_0), &vs);
386 ok(hr == E_INVALIDARG, "Created a SM3 vertex shader, hr %#x\n", hr);
388 hr = ID3D10Device_CreateVertexShader(device, ps_4_0, sizeof(ps_4_0), &vs);
389 ok(hr == E_INVALIDARG, "Created a SM4 vertex shader from a pixel shader source, hr %#x\n", hr);
391 hr = ID3D10Device_CreatePixelShader(device, ps_4_0, sizeof(ps_4_0), &ps);
392 ok(SUCCEEDED(hr), "Failed to create SM4 vertex shader, hr %#x\n", hr);
394 ID3D10PixelShader_Release(ps);
399 ID3D10Device *device;
402 device = create_device();
405 skip("Failed to create device, skipping tests\n");
409 test_device_interfaces(device);
410 test_create_texture2d(device);
411 test_create_texture3d(device);
412 test_create_rendertarget_view(device);
413 test_create_shader(device);
415 refcount = ID3D10Device_Release(device);
416 ok(!refcount, "Device has %u references left\n", refcount);