d3dx9/tests: Add ID3DXEffectCompiler test.
[wine] / dlls / d3dx9_36 / tests / effect.c
1 /*
2  * Copyright 2010 Christian Costa
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #define COBJMACROS
20 #include "initguid.h"
21 #include "wine/test.h"
22 #include "d3dx9.h"
23
24 static const char effect_desc[] =
25 "Technique\n"
26 "{\n"
27 "}\n";
28
29 static void test_create_effect_and_pool(IDirect3DDevice9 *device)
30 {
31     HRESULT hr;
32     ID3DXEffect *effect;
33     ID3DXBaseEffect *base;
34     ULONG count;
35     IDirect3DDevice9 *device2;
36     ID3DXEffectPool *pool = (ID3DXEffectPool *)0xdeadbeef, *pool2;
37
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);
40
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);
43
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);
46
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);
49
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);
52
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);
55
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);
59
60     hr = effect->lpVtbl->GetPool(effect, NULL);
61     ok(hr == D3DERR_INVALIDCALL, "GetPool failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
62
63     hr = effect->lpVtbl->GetDevice(effect, &device2);
64     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
65
66     hr = effect->lpVtbl->GetDevice(effect, NULL);
67     ok(hr == D3DERR_INVALIDCALL, "GetDevice failed, got %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
68
69     count = IDirect3DDevice9_Release(device2);
70     ok(count == 2, "Release failed, got %u, expected 2\n", count);
71
72     count = effect->lpVtbl->Release(effect);
73     ok(count == 0, "Release failed %u\n", count);
74
75     hr = D3DXCreateEffectPool(NULL);
76     ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
77
78     hr = D3DXCreateEffectPool(&pool);
79     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
80
81     count = pool->lpVtbl->Release(pool);
82     ok(count == 0, "Release failed %u\n", count);
83
84     hr = D3DXCreateEffectPool(&pool);
85     ok(hr == S_OK, "Got result %x, expected 0 (S_OK)\n", hr);
86
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);
89
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);
93
94     count = pool2->lpVtbl->Release(pool2);
95     ok(count == 1, "Release failed, got %u, expected 1\n", count);
96
97     hr = IDirect3DDevice9_QueryInterface(device, &IID_IDirect3DDevice9, (void **)&device2);
98     ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
99
100     count = IDirect3DDevice9_Release(device2);
101     ok(count == 1, "Release failed, got %u, expected 1\n", count);
102
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);
105
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);
109
110     count = pool2->lpVtbl->Release(pool2);
111     ok(count == 2, "Release failed, got %u, expected 2\n", count);
112
113     count = effect->lpVtbl->Release(effect);
114     ok(count == 0, "Release failed %u\n", count);
115
116     count = pool->lpVtbl->Release(pool);
117     ok(count == 0, "Release failed %u\n", count);
118 }
119
120 static void test_create_effect_compiler(void)
121 {
122     HRESULT hr;
123     ID3DXEffectCompiler *compiler, *compiler2;
124     ID3DXBaseEffect *base;
125     IUnknown *unknown;
126     ULONG count;
127
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);
130
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);
133
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);
136
137     count = compiler->lpVtbl->Release(compiler);
138     ok(count == 0, "Release failed %u\n", count);
139
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);
142
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);
145
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);
148
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);
151
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);
154
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);
157
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);
160
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);
163
164     count = unknown->lpVtbl->Release(unknown);
165     ok(count == 2, "Release failed, got %u, expected %u\n", count, 2);
166
167     count = compiler2->lpVtbl->Release(compiler2);
168     ok(count == 1, "Release failed, got %u, expected %u\n", count, 1);
169
170     count = compiler->lpVtbl->Release(compiler);
171     ok(count == 0, "Release failed %u\n", count);
172 }
173
174 START_TEST(effect)
175 {
176     HWND wnd;
177     IDirect3D9 *d3d;
178     IDirect3DDevice9 *device;
179     D3DPRESENT_PARAMETERS d3dpp;
180     HRESULT hr;
181     ULONG count;
182
183     wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
184     d3d = Direct3DCreate9(D3D_SDK_VERSION);
185     if (!wnd) {
186         skip("Couldn't create application window\n");
187         return;
188     }
189     if (!d3d) {
190         skip("Couldn't create IDirect3D9 object\n");
191         DestroyWindow(wnd);
192         return;
193     }
194
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);
199     if (FAILED(hr)) {
200         skip("Failed to create IDirect3DDevice9 object %#x\n", hr);
201         IDirect3D9_Release(d3d);
202         DestroyWindow(wnd);
203         return;
204     }
205
206     test_create_effect_and_pool(device);
207     test_create_effect_compiler();
208
209     count = IDirect3DDevice9_Release(device);
210     ok(count == 0, "The device was not properly freed: refcount %u\n", count);
211
212     count = IDirect3D9_Release(d3d);
213     ok(count == 0, "Release failed %u\n", count);
214
215     DestroyWindow(wnd);
216 }