2 * Copyright 2010 Christian Costa
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
21 #include "wine/test.h"
24 static const char effect_desc[] =
29 static void test_create_effect_and_pool(IDirect3DDevice9 *device)
33 ID3DXBaseEffect *base;
35 IDirect3DDevice9 *device2;
36 ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2;
38 hr = D3DXCreateEffect(NULL, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
39 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
41 hr = D3DXCreateEffect(device, NULL, 0, NULL, NULL, 0, NULL, NULL, NULL);
42 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
44 hr = D3DXCreateEffect(device, effect_desc, 0, NULL, NULL, 0, NULL, NULL, NULL);
45 ok(hr == E_FAIL, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, E_FAIL);
47 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL, NULL);
48 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
50 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
51 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
53 hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
54 ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
56 hr = effect->lpVtbl->GetPool(effect, &pool);
57 ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
58 ok(!pool, "GetPool failed, got %p\n", pool);
60 hr = effect->lpVtbl->GetPool(effect, NULL);
61 ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
63 hr = effect->lpVtbl->GetDevice(effect, &device2);
64 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
66 hr = effect->lpVtbl->GetDevice(effect, NULL);
67 ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
69 count = IDirect3DDevice9_Release(device2);
70 ok(count == 2, "Release failed, got %u, expected 2\n", count);
72 count = effect->lpVtbl->Release(effect);
73 ok(count == 0, "Release failed %u\n", count);
75 hr = D3DXCreateEffectPool(NULL);
76 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
78 hr = D3DXCreateEffectPool(&pool);
79 ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
81 count = pool->lpVtbl->Release(pool);
82 ok(count == 0, "Release failed %u\n", count);
84 hr = D3DXCreateEffectPool(&pool);
85 ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
87 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, NULL, NULL);
88 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
90 hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3DXEffectPool, (void **)&pool2);
91 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
92 ok(pool == pool2, "Release failed, got %p, expected %p\n", pool2, pool);
94 count = pool2->lpVtbl->Release(pool2);
95 ok(count == 1, "Release failed, got %u, expected 1\n", count);
97 hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2);
98 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
100 count = IDirect3DDevice9_Release(device2);
101 ok(count == 1, "Release failed, got %u, expected 1\n", count);
103 hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, pool, &effect, NULL);
104 ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
106 hr = effect->lpVtbl->GetPool(effect, &pool);
107 ok(hr == D3D_OK, "GetPool failed, got %x, expected 0 (D3D_OK)\n", hr);
108 ok(pool == pool2, "GetPool failed, got %p, expected %p\n", pool2, pool);
110 count = pool2->lpVtbl->Release(pool2);
111 ok(count == 2, "Release failed, got %u, expected 2\n", count);
113 count = effect->lpVtbl->Release(effect);
114 ok(count == 0, "Release failed %u\n", count);
116 count = pool->lpVtbl->Release(pool);
117 ok(count == 0, "Release failed %u\n", count);
120 static void test_create_effect_compiler(void)
123 ID3DXEffectCompiler *compiler, *compiler2;
124 ID3DXBaseEffect *base;
128 hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, &compiler, NULL);
129 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
131 hr = D3DXCreateEffectCompiler(NULL, 0, NULL, NULL, 0, NULL, NULL);
132 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
134 hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL);
135 ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
137 count = compiler->lpVtbl->Release(compiler);
138 ok(count == 0, "Release failed %u\n", count);
140 hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, NULL, NULL);
141 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
143 hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
144 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
146 hr = D3DXCreateEffectCompiler(NULL, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
147 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
149 hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, NULL);
150 ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
152 hr = D3DXCreateEffectCompiler(effect_desc, sizeof(effect_desc), NULL, NULL, 0, &compiler, NULL);
153 ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
155 hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXBaseEffect, (void **)&base);
156 ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
158 hr = compiler->lpVtbl->QueryInterface(compiler, &IID_ID3DXEffectCompiler, (void **)&compiler2);
159 ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
161 hr = compiler->lpVtbl->QueryInterface(compiler, &IID_IUnknown, (void **)&unknown);
162 ok(hr == D3D_OK, "QueryInterface failed, got %x, expected %x (D3D_OK)\n", hr, D3D_OK);
164 count = unknown->lpVtbl->Release(unknown);
165 ok(count == 2, "Release failed, got %u, expected %u\n", count, 2);
167 count = compiler2->lpVtbl->Release(compiler2);
168 ok(count == 1, "Release failed, got %u, expected %u\n", count, 1);
170 count = compiler->lpVtbl->Release(compiler);
171 ok(count == 0, "Release failed %u\n", count);
178 IDirect3DDevice9 *device;
179 D3DPRESENT_PARAMETERS d3dpp;
183 wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
184 d3d = Direct3DCreate9(D3D_SDK_VERSION);
186 skip("Couldn't create application window\n");
190 skip("Couldn't create IDirect3D9 object\n");
195 ZeroMemory(&d3dpp, sizeof(d3dpp));
196 d3dpp.Windowed = TRUE;
197 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
198 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device);
200 skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
201 IDirect3D9_Release(d3d);
206 test_create_effect_and_pool(device);
207 test_create_effect_compiler();
209 count = IDirect3DDevice9_Release(device);
210 ok(count == 0, "The device was not properly freed: refcount %u\n", count);
212 count = IDirect3D9_Release(d3d);
213 ok(count == 0, "Release failed %u\n", count);