ReactOS 0.4.15-dev-8102-g108db8f
shader.c
Go to the documentation of this file.
1/*
2 * Copyright 2002-2003 Jason Edmeades
3 * Raphael Junqueira
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include "config.h"
21#include "d3d9_private.h"
22
24
25static inline struct d3d9_vertexshader *impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface)
26{
28}
29
30static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *iface, REFIID riid, void **out)
31{
32 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
33
34 if (IsEqualGUID(riid, &IID_IDirect3DVertexShader9)
36 {
38 *out = iface;
39 return S_OK;
40 }
41
42 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
43
44 *out = NULL;
45 return E_NOINTERFACE;
46}
47
48static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface)
49{
52
53 TRACE("%p increasing refcount to %u.\n", iface, refcount);
54
55 if (refcount == 1)
56 {
57 IDirect3DDevice9Ex_AddRef(shader->parent_device);
59 wined3d_shader_incref(shader->wined3d_shader);
61 }
62
63 return refcount;
64}
65
66static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface)
67{
70
71 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
72
73 if (!refcount)
74 {
75 IDirect3DDevice9Ex *device = shader->parent_device;
76
78 wined3d_shader_decref(shader->wined3d_shader);
80
81 /* Release the device last, as it may cause the device to be destroyed. */
83 }
84
85 return refcount;
86}
87
88static HRESULT WINAPI d3d9_vertexshader_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device)
89{
91
92 TRACE("iface %p, device %p.\n", iface, device);
93
94 *device = (IDirect3DDevice9 *)shader->parent_device;
96
97 TRACE("Returning device %p.\n", *device);
98
99 return D3D_OK;
100}
101
102static HRESULT WINAPI d3d9_vertexshader_GetFunction(IDirect3DVertexShader9 *iface, void *data, UINT *data_size)
103{
105 HRESULT hr;
106
107 TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
108
110 hr = wined3d_shader_get_byte_code(shader->wined3d_shader, data, data_size);
112
113 return hr;
114}
115
116static const IDirect3DVertexShader9Vtbl d3d9_vertexshader_vtbl =
117{
118 /* IUnknown */
122 /* IDirect3DVertexShader9 */
125};
126
128{
130}
131
133{
135};
136
138{
140 HRESULT hr;
141
142 shader->refcount = 1;
143 shader->IDirect3DVertexShader9_iface.lpVtbl = &d3d9_vertexshader_vtbl;
144
145 desc.byte_code = byte_code;
146 desc.byte_code_size = ~(size_t)0;
148 desc.input_signature.element_count = 0;
149 desc.output_signature.element_count = 0;
150 desc.patch_constant_signature.element_count = 0;
151 desc.max_version = 3;
152
154 hr = wined3d_shader_create_vs(device->wined3d_device, &desc, shader,
157 if (FAILED(hr))
158 {
159 WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr);
160 return hr;
161 }
162
163 shader->parent_device = &device->IDirect3DDevice9Ex_iface;
164 IDirect3DDevice9Ex_AddRef(shader->parent_device);
165
166 return D3D_OK;
167}
168
169struct d3d9_vertexshader *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface)
170{
171 if (!iface)
172 return NULL;
173 if (iface->lpVtbl != &d3d9_vertexshader_vtbl)
174 WARN("Vertex shader %p with the wrong vtbl %p\n", iface, iface->lpVtbl);
175
177}
178
179static inline struct d3d9_pixelshader *impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface)
180{
182}
183
184static HRESULT WINAPI d3d9_pixelshader_QueryInterface(IDirect3DPixelShader9 *iface, REFIID riid, void **out)
185{
186 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
187
188 if (IsEqualGUID(riid, &IID_IDirect3DPixelShader9)
190 {
192 *out = iface;
193 return S_OK;
194 }
195
196 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
197
198 *out = NULL;
199 return E_NOINTERFACE;
200}
201
202static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface)
203{
206
207 TRACE("%p increasing refcount to %u.\n", iface, refcount);
208
209 if (refcount == 1)
210 {
211 IDirect3DDevice9Ex_AddRef(shader->parent_device);
213 wined3d_shader_incref(shader->wined3d_shader);
215 }
216
217 return refcount;
218}
219
220static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface)
221{
224
225 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
226
227 if (!refcount)
228 {
229 IDirect3DDevice9Ex *device = shader->parent_device;
230
232 wined3d_shader_decref(shader->wined3d_shader);
234
235 /* Release the device last, as it may cause the device to be destroyed. */
237 }
238
239 return refcount;
240}
241
242static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device)
243{
245
246 TRACE("iface %p, device %p.\n", iface, device);
247
248 *device = (IDirect3DDevice9 *)shader->parent_device;
250
251 TRACE("Returning device %p.\n", *device);
252
253 return D3D_OK;
254}
255
256static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface, void *data, UINT *data_size)
257{
259 HRESULT hr;
260
261 TRACE("iface %p, data %p, data_size %p.\n", iface, data, data_size);
262
264 hr = wined3d_shader_get_byte_code(shader->wined3d_shader, data, data_size);
266
267 return hr;
268}
269
270static const IDirect3DPixelShader9Vtbl d3d9_pixelshader_vtbl =
271{
272 /* IUnknown */
276 /* IDirect3DPixelShader9 */
279};
280
282{
284}
285
287{
289};
290
292{
294 HRESULT hr;
295
296 shader->refcount = 1;
297 shader->IDirect3DPixelShader9_iface.lpVtbl = &d3d9_pixelshader_vtbl;
298
299 desc.byte_code = byte_code;
300 desc.byte_code_size = ~(size_t)0;
302 desc.input_signature.element_count = 0;
303 desc.output_signature.element_count = 0;
304 desc.patch_constant_signature.element_count = 0;
305 desc.max_version = 3;
306
308 hr = wined3d_shader_create_ps(device->wined3d_device, &desc, shader,
311 if (FAILED(hr))
312 {
313 WARN("Failed to created wined3d pixel shader, hr %#x.\n", hr);
314 return hr;
315 }
316
317 shader->parent_device = &device->IDirect3DDevice9Ex_iface;
318 IDirect3DDevice9Ex_AddRef(shader->parent_device);
319
320 return D3D_OK;
321}
322
323struct d3d9_pixelshader *unsafe_impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface)
324{
325 if (!iface)
326 return NULL;
327 if (iface->lpVtbl != &d3d9_pixelshader_vtbl)
328 WARN("Pixel shader %p with the wrong vtbl %p\n", iface, iface->lpVtbl);
329
331}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define WARN(fmt,...)
Definition: debug.h:115
#define IDirect3DDevice9Ex_Release(p)
Definition: d3d9.h:1917
#define IDirect3DVertexShader9_AddRef(p)
Definition: d3d9.h:1222
#define IDirect3DDevice9Ex_AddRef(p)
Definition: d3d9.h:1916
#define IDirect3DDevice9_AddRef(p)
Definition: d3d9.h:1507
#define IDirect3DPixelShader9_AddRef(p)
Definition: d3d9.h:1260
#define D3D_OK
Definition: d3d.h:106
#define NULL
Definition: types.h:112
static HRESULT WINAPI d3d9_pixelshader_QueryInterface(IDirect3DPixelShader9 *iface, REFIID riid, void **out)
Definition: shader.c:184
HRESULT vertexshader_init(struct d3d9_vertexshader *shader, struct d3d9_device *device, const DWORD *byte_code)
Definition: shader.c:137
static const struct wined3d_parent_ops d3d9_vertexshader_wined3d_parent_ops
Definition: shader.c:132
static HRESULT WINAPI d3d9_vertexshader_GetFunction(IDirect3DVertexShader9 *iface, void *data, UINT *data_size)
Definition: shader.c:102
struct d3d9_vertexshader * unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface)
Definition: shader.c:169
static HRESULT WINAPI d3d9_vertexshader_QueryInterface(IDirect3DVertexShader9 *iface, REFIID riid, void **out)
Definition: shader.c:30
static ULONG WINAPI d3d9_pixelshader_AddRef(IDirect3DPixelShader9 *iface)
Definition: shader.c:202
struct d3d9_pixelshader * unsafe_impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface)
Definition: shader.c:323
static void STDMETHODCALLTYPE d3d9_pixelshader_wined3d_object_destroyed(void *parent)
Definition: shader.c:281
static ULONG WINAPI d3d9_pixelshader_Release(IDirect3DPixelShader9 *iface)
Definition: shader.c:220
static HRESULT WINAPI d3d9_pixelshader_GetDevice(IDirect3DPixelShader9 *iface, IDirect3DDevice9 **device)
Definition: shader.c:242
static const IDirect3DPixelShader9Vtbl d3d9_pixelshader_vtbl
Definition: shader.c:270
static struct d3d9_pixelshader * impl_from_IDirect3DPixelShader9(IDirect3DPixelShader9 *iface)
Definition: shader.c:179
static HRESULT WINAPI d3d9_pixelshader_GetFunction(IDirect3DPixelShader9 *iface, void *data, UINT *data_size)
Definition: shader.c:256
static void STDMETHODCALLTYPE d3d9_vertexshader_wined3d_object_destroyed(void *parent)
Definition: shader.c:127
static ULONG WINAPI d3d9_vertexshader_AddRef(IDirect3DVertexShader9 *iface)
Definition: shader.c:48
static const IDirect3DVertexShader9Vtbl d3d9_vertexshader_vtbl
Definition: shader.c:116
static const struct wined3d_parent_ops d3d9_pixelshader_wined3d_parent_ops
Definition: shader.c:286
static struct d3d9_vertexshader * impl_from_IDirect3DVertexShader9(IDirect3DVertexShader9 *iface)
Definition: shader.c:25
HRESULT pixelshader_init(struct d3d9_pixelshader *shader, struct d3d9_device *device, const DWORD *byte_code)
Definition: shader.c:291
static HRESULT WINAPI d3d9_vertexshader_GetDevice(IDirect3DVertexShader9 *iface, IDirect3DDevice9 **device)
Definition: shader.c:88
static ULONG WINAPI d3d9_vertexshader_Release(IDirect3DVertexShader9 *iface)
Definition: shader.c:66
HRESULT CDECL wined3d_shader_create_vs(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:4230
ULONG CDECL wined3d_shader_incref(struct wined3d_shader *shader)
Definition: shader.c:3339
HRESULT CDECL wined3d_shader_create_ps(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:4205
HRESULT CDECL wined3d_shader_get_byte_code(const struct wined3d_shader *shader, void *byte_code, UINT *byte_code_size)
Definition: shader.c:3386
ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
Definition: shader.c:3364
r parent
Definition: btrfs.c:3010
__kernel_size_t size_t
Definition: linux.h:237
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint shader
Definition: glext.h:6030
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
static const WCHAR desc[]
Definition: protectdata.c:36
unsigned int UINT
Definition: ndis.h:50
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
static FILE * out
Definition: regtests2xml.c:44
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
IDirect3DPixelShader9 IDirect3DPixelShader9_iface
Definition: d3d9_private.h:268
IDirect3DVertexShader9 IDirect3DVertexShader9_iface
Definition: d3d9_private.h:256
Definition: devices.h:37
const DWORD * byte_code
Definition: wined3d.h:2051
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
@ WINED3D_SHADER_BYTE_CODE_FORMAT_SM1
Definition: wined3d.h:848
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:373
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:368
#define E_NOINTERFACE
Definition: winerror.h:2364