wined3d: Handle the sampler type shift in the frontend.
[wine] / dlls / d3d10core / shader.c
1 /*
2  * Copyright 2009 Henri Verbeet for CodeWeavers
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
20 #include "config.h"
21 #include "wine/port.h"
22
23 #include "d3d10core_private.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d10core);
26
27 static HRESULT shdr_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
28 {
29     const DWORD **shader_data = ctx;
30     char tag_str[5];
31
32     switch(tag)
33     {
34         case TAG_SHDR:
35             *shader_data = (const DWORD *)data;
36             return S_OK;
37
38         default:
39             memcpy(tag_str, &tag, 4);
40             tag_str[4] = '\0';
41             FIXME("Unhandled chunk %s\n", tag_str);
42             return S_OK;
43     }
44 }
45
46 HRESULT shader_extract_from_dxbc(const void *dxbc, SIZE_T dxbc_length, const DWORD **shader_code)
47 {
48     HRESULT hr;
49
50     hr = parse_dxbc(dxbc, dxbc_length, shdr_handler, shader_code);
51     if (!*shader_code) hr = E_FAIL;
52
53     if (FAILED(hr)) ERR("Failed to parse shader, hr %#x\n", hr);
54
55     return hr;
56 }
57
58 /* IUnknown methods */
59
60 static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_QueryInterface(ID3D10VertexShader *iface,
61         REFIID riid, void **object)
62 {
63     TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
64
65     if (IsEqualGUID(riid, &IID_ID3D10VertexShader)
66             || IsEqualGUID(riid, &IID_ID3D10DeviceChild)
67             || IsEqualGUID(riid, &IID_IUnknown))
68     {
69         IUnknown_AddRef(iface);
70         *object = iface;
71         return S_OK;
72     }
73
74     WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
75
76     *object = NULL;
77     return E_NOINTERFACE;
78 }
79
80 static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_AddRef(ID3D10VertexShader *iface)
81 {
82     struct d3d10_vertex_shader *This = (struct d3d10_vertex_shader *)iface;
83     ULONG refcount = InterlockedIncrement(&This->refcount);
84
85     TRACE("%p increasing refcount to %u\n", This, refcount);
86
87     return refcount;
88 }
89
90 static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *iface)
91 {
92     struct d3d10_vertex_shader *This = (struct d3d10_vertex_shader *)iface;
93     ULONG refcount = InterlockedDecrement(&This->refcount);
94
95     TRACE("%p decreasing refcount to %u\n", This, refcount);
96
97     if (!refcount)
98     {
99         HeapFree(GetProcessHeap(), 0, This);
100     }
101
102     return refcount;
103 }
104
105 /* ID3D10DeviceChild methods */
106
107 static void STDMETHODCALLTYPE d3d10_vertex_shader_GetDevice(ID3D10VertexShader *iface, ID3D10Device **device)
108 {
109     FIXME("iface %p, device %p stub!\n", iface, device);
110 }
111
112 static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_GetPrivateData(ID3D10VertexShader *iface,
113         REFGUID guid, UINT *data_size, void *data)
114 {
115     FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
116             iface, debugstr_guid(guid), data_size, data);
117
118     return E_NOTIMPL;
119 }
120
121 static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_SetPrivateData(ID3D10VertexShader *iface,
122         REFGUID guid, UINT data_size, const void *data)
123 {
124     FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
125             iface, debugstr_guid(guid), data_size, data);
126
127     return E_NOTIMPL;
128 }
129
130 static HRESULT STDMETHODCALLTYPE d3d10_vertex_shader_SetPrivateDataInterface(ID3D10VertexShader *iface,
131         REFGUID guid, const IUnknown *data)
132 {
133     FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
134
135     return E_NOTIMPL;
136 }
137
138 const struct ID3D10VertexShaderVtbl d3d10_vertex_shader_vtbl =
139 {
140     /* IUnknown methods */
141     d3d10_vertex_shader_QueryInterface,
142     d3d10_vertex_shader_AddRef,
143     d3d10_vertex_shader_Release,
144     /* ID3D10DeviceChild methods */
145     d3d10_vertex_shader_GetDevice,
146     d3d10_vertex_shader_GetPrivateData,
147     d3d10_vertex_shader_SetPrivateData,
148     d3d10_vertex_shader_SetPrivateDataInterface,
149 };
150
151 /* IUnknown methods */
152
153 static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_QueryInterface(ID3D10GeometryShader *iface,
154         REFIID riid, void **object)
155 {
156     TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
157
158     if (IsEqualGUID(riid, &IID_ID3D10GeometryShader)
159             || IsEqualGUID(riid, &IID_ID3D10DeviceChild)
160             || IsEqualGUID(riid, &IID_IUnknown))
161     {
162         IUnknown_AddRef(iface);
163         *object = iface;
164         return S_OK;
165     }
166
167     WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
168
169     *object = NULL;
170     return E_NOINTERFACE;
171 }
172
173 static ULONG STDMETHODCALLTYPE d3d10_geometry_shader_AddRef(ID3D10GeometryShader *iface)
174 {
175     struct d3d10_geometry_shader *This = (struct d3d10_geometry_shader *)iface;
176     ULONG refcount = InterlockedIncrement(&This->refcount);
177
178     TRACE("%p increasing refcount to %u\n", This, refcount);
179
180     return refcount;
181 }
182
183 static ULONG STDMETHODCALLTYPE d3d10_geometry_shader_Release(ID3D10GeometryShader *iface)
184 {
185     struct d3d10_geometry_shader *This = (struct d3d10_geometry_shader *)iface;
186     ULONG refcount = InterlockedDecrement(&This->refcount);
187
188     TRACE("%p decreasing refcount to %u\n", This, refcount);
189
190     if (!refcount)
191     {
192         HeapFree(GetProcessHeap(), 0, This);
193     }
194
195     return refcount;
196 }
197
198 /* ID3D10DeviceChild methods */
199
200 static void STDMETHODCALLTYPE d3d10_geometry_shader_GetDevice(ID3D10GeometryShader *iface, ID3D10Device **device)
201 {
202     FIXME("iface %p, device %p stub!\n", iface, device);
203 }
204
205 static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_GetPrivateData(ID3D10GeometryShader *iface,
206         REFGUID guid, UINT *data_size, void *data)
207 {
208     FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
209             iface, debugstr_guid(guid), data_size, data);
210
211     return E_NOTIMPL;
212 }
213
214 static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_SetPrivateData(ID3D10GeometryShader *iface,
215         REFGUID guid, UINT data_size, const void *data)
216 {
217     FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
218             iface, debugstr_guid(guid), data_size, data);
219
220     return E_NOTIMPL;
221 }
222
223 static HRESULT STDMETHODCALLTYPE d3d10_geometry_shader_SetPrivateDataInterface(ID3D10GeometryShader *iface,
224         REFGUID guid, const IUnknown *data)
225 {
226     FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
227
228     return E_NOTIMPL;
229 }
230
231 const struct ID3D10GeometryShaderVtbl d3d10_geometry_shader_vtbl =
232 {
233     /* IUnknown methods */
234     d3d10_geometry_shader_QueryInterface,
235     d3d10_geometry_shader_AddRef,
236     d3d10_geometry_shader_Release,
237     /* ID3D10DeviceChild methods */
238     d3d10_geometry_shader_GetDevice,
239     d3d10_geometry_shader_GetPrivateData,
240     d3d10_geometry_shader_SetPrivateData,
241     d3d10_geometry_shader_SetPrivateDataInterface,
242 };
243
244 /* IUnknown methods */
245
246 static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_QueryInterface(ID3D10PixelShader *iface,
247         REFIID riid, void **object)
248 {
249     TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
250
251     if (IsEqualGUID(riid, &IID_ID3D10PixelShader)
252             || IsEqualGUID(riid, &IID_ID3D10DeviceChild)
253             || IsEqualGUID(riid, &IID_IUnknown))
254     {
255         IUnknown_AddRef(iface);
256         *object = iface;
257         return S_OK;
258     }
259
260     WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
261
262     *object = NULL;
263     return E_NOINTERFACE;
264 }
265
266 static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_AddRef(ID3D10PixelShader *iface)
267 {
268     struct d3d10_pixel_shader *This = (struct d3d10_pixel_shader *)iface;
269     ULONG refcount = InterlockedIncrement(&This->refcount);
270
271     TRACE("%p increasing refcount to %u\n", This, refcount);
272
273     return refcount;
274 }
275
276 static ULONG STDMETHODCALLTYPE d3d10_pixel_shader_Release(ID3D10PixelShader *iface)
277 {
278     struct d3d10_pixel_shader *This = (struct d3d10_pixel_shader *)iface;
279     ULONG refcount = InterlockedDecrement(&This->refcount);
280
281     TRACE("%p decreasing refcount to %u\n", This, refcount);
282
283     if (!refcount)
284     {
285         HeapFree(GetProcessHeap(), 0, This);
286     }
287
288     return refcount;
289 }
290
291 /* ID3D10DeviceChild methods */
292
293 static void STDMETHODCALLTYPE d3d10_pixel_shader_GetDevice(ID3D10PixelShader *iface, ID3D10Device **device)
294 {
295     FIXME("iface %p, device %p stub!\n", iface, device);
296 }
297
298 static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_GetPrivateData(ID3D10PixelShader *iface,
299         REFGUID guid, UINT *data_size, void *data)
300 {
301     FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
302             iface, debugstr_guid(guid), data_size, data);
303
304     return E_NOTIMPL;
305 }
306
307 static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_SetPrivateData(ID3D10PixelShader *iface,
308         REFGUID guid, UINT data_size, const void *data)
309 {
310     FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
311             iface, debugstr_guid(guid), data_size, data);
312
313     return E_NOTIMPL;
314 }
315
316 static HRESULT STDMETHODCALLTYPE d3d10_pixel_shader_SetPrivateDataInterface(ID3D10PixelShader *iface,
317         REFGUID guid, const IUnknown *data)
318 {
319     FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
320
321     return E_NOTIMPL;
322 }
323
324 const struct ID3D10PixelShaderVtbl d3d10_pixel_shader_vtbl =
325 {
326     /* IUnknown methods */
327     d3d10_pixel_shader_QueryInterface,
328     d3d10_pixel_shader_AddRef,
329     d3d10_pixel_shader_Release,
330     /* ID3D10DeviceChild methods */
331     d3d10_pixel_shader_GetDevice,
332     d3d10_pixel_shader_GetPrivateData,
333     d3d10_pixel_shader_SetPrivateData,
334     d3d10_pixel_shader_SetPrivateDataInterface,
335 };