gdi32: Avoid computing grayscale glyph intensities when not needed.
[wine] / dlls / d3d10core / device.c
1 /*
2  * Copyright 2008-2012 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 void STDMETHODCALLTYPE d3d10_null_wined3d_object_destroyed(void *parent) {}
28
29 const struct wined3d_parent_ops d3d10_null_wined3d_parent_ops =
30 {
31     d3d10_null_wined3d_object_destroyed,
32 };
33
34 /* Inner IUnknown methods */
35
36 static inline struct d3d10_device *impl_from_IUnknown(IUnknown *iface)
37 {
38     return CONTAINING_RECORD(iface, struct d3d10_device, IUnknown_inner);
39 }
40
41 static HRESULT STDMETHODCALLTYPE d3d10_device_inner_QueryInterface(IUnknown *iface, REFIID riid,
42         void **ppv)
43 {
44     struct d3d10_device *This = impl_from_IUnknown(iface);
45
46     TRACE("iface %p, riid %s, ppv %p\n", iface, debugstr_guid(riid), ppv);
47
48     if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ID3D10Device))
49         *ppv = &This->ID3D10Device_iface;
50     else if (IsEqualGUID(riid, &IID_IWineDXGIDeviceParent))
51         *ppv = &This->IWineDXGIDeviceParent_iface;
52     else
53     {
54         WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
55         *ppv = NULL;
56         return E_NOINTERFACE;
57     }
58
59     IUnknown_AddRef((IUnknown*)*ppv);
60     return S_OK;
61 }
62
63 static ULONG STDMETHODCALLTYPE d3d10_device_inner_AddRef(IUnknown *iface)
64 {
65     struct d3d10_device *This = impl_from_IUnknown(iface);
66     ULONG refcount = InterlockedIncrement(&This->refcount);
67
68     TRACE("%p increasing refcount to %u\n", This, refcount);
69
70     return refcount;
71 }
72
73 static ULONG STDMETHODCALLTYPE d3d10_device_inner_Release(IUnknown *iface)
74 {
75     struct d3d10_device *This = impl_from_IUnknown(iface);
76     ULONG refcount = InterlockedDecrement(&This->refcount);
77
78     TRACE("%p decreasing refcount to %u\n", This, refcount);
79
80     if (!refcount)
81     {
82         if (This->wined3d_device)
83             wined3d_device_decref(This->wined3d_device);
84     }
85
86     return refcount;
87 }
88
89 /* IUnknown methods */
90
91 static inline struct d3d10_device *impl_from_ID3D10Device(ID3D10Device *iface)
92 {
93     return CONTAINING_RECORD(iface, struct d3d10_device, ID3D10Device_iface);
94 }
95
96 static HRESULT STDMETHODCALLTYPE d3d10_device_QueryInterface(ID3D10Device *iface, REFIID riid,
97         void **ppv)
98 {
99     struct d3d10_device *This = impl_from_ID3D10Device(iface);
100     return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
101 }
102
103 static ULONG STDMETHODCALLTYPE d3d10_device_AddRef(ID3D10Device *iface)
104 {
105     struct d3d10_device *This = impl_from_ID3D10Device(iface);
106     return IUnknown_AddRef(This->outer_unk);
107 }
108
109 static ULONG STDMETHODCALLTYPE d3d10_device_Release(ID3D10Device *iface)
110 {
111     struct d3d10_device *This = impl_from_ID3D10Device(iface);
112     return IUnknown_Release(This->outer_unk);
113 }
114
115 /* ID3D10Device methods */
116
117 static void STDMETHODCALLTYPE d3d10_device_VSSetConstantBuffers(ID3D10Device *iface,
118         UINT start_slot, UINT buffer_count, ID3D10Buffer *const *buffers)
119 {
120     struct d3d10_device *device = impl_from_ID3D10Device(iface);
121     unsigned int i;
122
123     TRACE("iface %p, start_slot %u, buffer_count %u, buffers %p.\n",
124             iface, start_slot, buffer_count, buffers);
125
126     for (i = 0; i < buffer_count; ++i)
127     {
128         struct d3d10_buffer *buffer = unsafe_impl_from_ID3D10Buffer(buffers[i]);
129
130         wined3d_device_set_vs_cb(device->wined3d_device, start_slot + i,
131                 buffer ? buffer->wined3d_buffer : NULL);
132     }
133 }
134
135 static void STDMETHODCALLTYPE d3d10_device_PSSetShaderResources(ID3D10Device *iface,
136         UINT start_slot, UINT view_count, ID3D10ShaderResourceView *const *views)
137 {
138     FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n",
139             iface, start_slot, view_count, views);
140 }
141
142 static void STDMETHODCALLTYPE d3d10_device_PSSetShader(ID3D10Device *iface,
143         ID3D10PixelShader *shader)
144 {
145     struct d3d10_device *This = impl_from_ID3D10Device(iface);
146     struct d3d10_pixel_shader *ps = unsafe_impl_from_ID3D10PixelShader(shader);
147
148     TRACE("iface %p, shader %p\n", iface, shader);
149
150     wined3d_device_set_pixel_shader(This->wined3d_device, ps ? ps->wined3d_shader : NULL);
151 }
152
153 static void STDMETHODCALLTYPE d3d10_device_PSSetSamplers(ID3D10Device *iface,
154         UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers)
155 {
156     FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n",
157             iface, start_slot, sampler_count, samplers);
158 }
159
160 static void STDMETHODCALLTYPE d3d10_device_VSSetShader(ID3D10Device *iface,
161         ID3D10VertexShader *shader)
162 {
163     struct d3d10_device *This = impl_from_ID3D10Device(iface);
164     struct d3d10_vertex_shader *vs = unsafe_impl_from_ID3D10VertexShader(shader);
165
166     TRACE("iface %p, shader %p\n", iface, shader);
167
168     wined3d_device_set_vertex_shader(This->wined3d_device, vs ? vs->wined3d_shader : NULL);
169 }
170
171 static void STDMETHODCALLTYPE d3d10_device_DrawIndexed(ID3D10Device *iface, UINT index_count,
172         UINT start_index_location, INT base_vertex_location)
173 {
174     struct d3d10_device *This = impl_from_ID3D10Device(iface);
175
176     TRACE("iface %p, index_count %u, start_index_location %u, base_vertex_location %d.\n",
177             iface, index_count, start_index_location, base_vertex_location);
178
179     wined3d_device_set_base_vertex_index(This->wined3d_device, base_vertex_location);
180     wined3d_device_draw_indexed_primitive(This->wined3d_device, start_index_location, index_count);
181 }
182
183 static void STDMETHODCALLTYPE d3d10_device_Draw(ID3D10Device *iface, UINT vertex_count,
184         UINT start_vertex_location)
185 {
186     struct d3d10_device *This = impl_from_ID3D10Device(iface);
187
188     TRACE("iface %p, vertex_count %u, start_vertex_location %u\n",
189             iface, vertex_count, start_vertex_location);
190
191     wined3d_device_draw_primitive(This->wined3d_device, start_vertex_location, vertex_count);
192 }
193
194 static void STDMETHODCALLTYPE d3d10_device_PSSetConstantBuffers(ID3D10Device *iface,
195         UINT start_slot, UINT buffer_count, ID3D10Buffer *const *buffers)
196 {
197     FIXME("iface %p, start_slot %u, buffer_count %u, buffers %p stub!\n",
198             iface, start_slot, buffer_count, buffers);
199 }
200
201 static void STDMETHODCALLTYPE d3d10_device_IASetInputLayout(ID3D10Device *iface,
202         ID3D10InputLayout *input_layout)
203 {
204     struct d3d10_device *This = impl_from_ID3D10Device(iface);
205     struct d3d10_input_layout *layout = unsafe_impl_from_ID3D10InputLayout(input_layout);
206
207     TRACE("iface %p, input_layout %p\n", iface, input_layout);
208
209     wined3d_device_set_vertex_declaration(This->wined3d_device,
210             layout ? layout->wined3d_decl : NULL);
211 }
212
213 static void STDMETHODCALLTYPE d3d10_device_IASetVertexBuffers(ID3D10Device *iface, UINT start_slot,
214         UINT buffer_count, ID3D10Buffer *const *buffers, const UINT *strides, const UINT *offsets)
215 {
216     struct d3d10_device *This = impl_from_ID3D10Device(iface);
217     unsigned int i;
218
219     TRACE("iface %p, start_slot %u, buffer_count %u, buffers %p, strides %p, offsets %p\n",
220             iface, start_slot, buffer_count, buffers, strides, offsets);
221
222     for (i = 0; i < buffer_count; ++i)
223     {
224         struct d3d10_buffer *buffer = unsafe_impl_from_ID3D10Buffer(buffers[i]);
225
226         wined3d_device_set_stream_source(This->wined3d_device, start_slot + i,
227                 buffer ? buffer->wined3d_buffer : NULL, offsets[i], strides[i]);
228     }
229 }
230
231 static void STDMETHODCALLTYPE d3d10_device_IASetIndexBuffer(ID3D10Device *iface,
232         ID3D10Buffer *buffer, DXGI_FORMAT format, UINT offset)
233 {
234     struct d3d10_device *This = impl_from_ID3D10Device(iface);
235     struct d3d10_buffer *buffer_impl = unsafe_impl_from_ID3D10Buffer(buffer);
236
237     TRACE("iface %p, buffer %p, format %s, offset %u.\n",
238             iface, buffer, debug_dxgi_format(format), offset);
239
240     wined3d_device_set_index_buffer(This->wined3d_device,
241             buffer_impl ? buffer_impl->wined3d_buffer : NULL,
242             wined3dformat_from_dxgi_format(format));
243     if (offset) FIXME("offset %u not supported.\n", offset);
244 }
245
246 static void STDMETHODCALLTYPE d3d10_device_DrawIndexedInstanced(ID3D10Device *iface,
247         UINT instance_index_count, UINT instance_count, UINT start_index_location,
248         INT base_vertex_location, UINT start_instance_location)
249 {
250     struct d3d10_device *device = impl_from_ID3D10Device(iface);
251
252     TRACE("iface %p, instance_index_count %u, instance_count %u, start_index_location %u,\n"
253             "\tbase_vertex_location %d, start_instance_location %u.\n",
254             iface, instance_index_count, instance_count, start_index_location,
255             base_vertex_location, start_instance_location);
256
257     wined3d_device_set_base_vertex_index(device->wined3d_device, base_vertex_location);
258     wined3d_device_draw_indexed_primitive_instanced(device->wined3d_device, start_index_location,
259             instance_index_count, start_instance_location, instance_count);
260 }
261
262 static void STDMETHODCALLTYPE d3d10_device_DrawInstanced(ID3D10Device *iface,
263         UINT instance_vertex_count, UINT instance_count,
264         UINT start_vertex_location, UINT start_instance_location)
265 {
266     FIXME("iface %p, instance_vertex_count %u, instance_count %u, start_vertex_location %u,\n"
267             "\tstart_instance_location %u stub!\n", iface, instance_vertex_count, instance_count,
268             start_vertex_location, start_instance_location);
269 }
270
271 static void STDMETHODCALLTYPE d3d10_device_GSSetConstantBuffers(ID3D10Device *iface,
272         UINT start_slot, UINT buffer_count, ID3D10Buffer *const *buffers)
273 {
274     FIXME("iface %p, start_slot %u, buffer_count %u, buffers %p stub!\n",
275             iface, start_slot, buffer_count, buffers);
276 }
277
278 static void STDMETHODCALLTYPE d3d10_device_GSSetShader(ID3D10Device *iface, ID3D10GeometryShader *shader)
279 {
280     struct d3d10_device *device = impl_from_ID3D10Device(iface);
281     struct d3d10_geometry_shader *gs = unsafe_impl_from_ID3D10GeometryShader(shader);
282
283     TRACE("iface %p, shader %p.\n", iface, shader);
284
285     wined3d_device_set_geometry_shader(device->wined3d_device, gs ? gs->wined3d_shader : NULL);
286 }
287
288 static void STDMETHODCALLTYPE d3d10_device_IASetPrimitiveTopology(ID3D10Device *iface,
289         D3D10_PRIMITIVE_TOPOLOGY topology)
290 {
291     struct d3d10_device *This = impl_from_ID3D10Device(iface);
292
293     TRACE("iface %p, topology %s\n", iface, debug_d3d10_primitive_topology(topology));
294
295     wined3d_device_set_primitive_type(This->wined3d_device, (enum wined3d_primitive_type)topology);
296 }
297
298 static void STDMETHODCALLTYPE d3d10_device_VSSetShaderResources(ID3D10Device *iface,
299         UINT start_slot, UINT view_count, ID3D10ShaderResourceView *const *views)
300 {
301     FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n",
302             iface, start_slot, view_count, views);
303 }
304
305 static void STDMETHODCALLTYPE d3d10_device_VSSetSamplers(ID3D10Device *iface,
306         UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers)
307 {
308     FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n",
309             iface, start_slot, sampler_count, samplers);
310 }
311
312 static void STDMETHODCALLTYPE d3d10_device_SetPredication(ID3D10Device *iface, ID3D10Predicate *predicate, BOOL value)
313 {
314     FIXME("iface %p, predicate %p, value %d stub!\n", iface, predicate, value);
315 }
316
317 static void STDMETHODCALLTYPE d3d10_device_GSSetShaderResources(ID3D10Device *iface,
318         UINT start_slot, UINT view_count, ID3D10ShaderResourceView *const *views)
319 {
320     FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n",
321             iface, start_slot, view_count, views);
322 }
323
324 static void STDMETHODCALLTYPE d3d10_device_GSSetSamplers(ID3D10Device *iface,
325         UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers)
326 {
327     FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n",
328             iface, start_slot, sampler_count, samplers);
329 }
330
331 static void STDMETHODCALLTYPE d3d10_device_OMSetRenderTargets(ID3D10Device *iface,
332         UINT render_target_view_count, ID3D10RenderTargetView *const *render_target_views,
333         ID3D10DepthStencilView *depth_stencil_view)
334 {
335     FIXME("iface %p, render_target_view_count %u, render_target_views %p, depth_stencil_view %p\n",
336             iface, render_target_view_count, render_target_views, depth_stencil_view);
337 }
338
339 static void STDMETHODCALLTYPE d3d10_device_OMSetBlendState(ID3D10Device *iface,
340         ID3D10BlendState *blend_state, const FLOAT blend_factor[4], UINT sample_mask)
341 {
342     struct d3d10_device *device = impl_from_ID3D10Device(iface);
343
344     TRACE("iface %p, blend_state %p, blend_factor [%f %f %f %f], sample_mask 0x%08x.\n",
345             iface, blend_state, blend_factor[0], blend_factor[1], blend_factor[2], blend_factor[3], sample_mask);
346
347     device->blend_state = unsafe_impl_from_ID3D10BlendState(blend_state);
348     memcpy(device->blend_factor, blend_factor, 4 * sizeof(*blend_factor));
349     device->sample_mask = sample_mask;
350 }
351
352 static void STDMETHODCALLTYPE d3d10_device_OMSetDepthStencilState(ID3D10Device *iface,
353         ID3D10DepthStencilState *depth_stencil_state, UINT stencil_ref)
354 {
355     struct d3d10_device *device = impl_from_ID3D10Device(iface);
356
357     TRACE("iface %p, depth_stencil_state %p, stencil_ref %u.\n",
358             iface, depth_stencil_state, stencil_ref);
359
360     device->depth_stencil_state = unsafe_impl_from_ID3D10DepthStencilState(depth_stencil_state);
361     device->stencil_ref = stencil_ref;
362 }
363
364 static void STDMETHODCALLTYPE d3d10_device_SOSetTargets(ID3D10Device *iface,
365         UINT target_count, ID3D10Buffer *const *targets, const UINT *offsets)
366 {
367     struct d3d10_device *device = impl_from_ID3D10Device(iface);
368     unsigned int count, i;
369
370     TRACE("iface %p, target_count %u, targets %p, offsets %p.\n", iface, target_count, targets, offsets);
371
372     count = min(target_count, 4);
373     for (i = 0; i < count; ++i)
374     {
375         struct d3d10_buffer *buffer = unsafe_impl_from_ID3D10Buffer(targets[i]);
376
377         wined3d_device_set_stream_output(device->wined3d_device, i,
378                 buffer ? buffer->wined3d_buffer : NULL, offsets[i]);
379     }
380
381     for (i = count; i < 4; ++i)
382     {
383         wined3d_device_set_stream_output(device->wined3d_device, i, NULL, 0);
384     }
385 }
386
387 static void STDMETHODCALLTYPE d3d10_device_DrawAuto(ID3D10Device *iface)
388 {
389     FIXME("iface %p stub!\n", iface);
390 }
391
392 static void STDMETHODCALLTYPE d3d10_device_RSSetState(ID3D10Device *iface, ID3D10RasterizerState *rasterizer_state)
393 {
394     struct d3d10_device *device = impl_from_ID3D10Device(iface);
395
396     TRACE("iface %p, rasterizer_state %p.\n", iface, rasterizer_state);
397
398     device->rasterizer_state = unsafe_impl_from_ID3D10RasterizerState(rasterizer_state);
399 }
400
401 static void STDMETHODCALLTYPE d3d10_device_RSSetViewports(ID3D10Device *iface,
402         UINT viewport_count, const D3D10_VIEWPORT *viewports)
403 {
404     struct d3d10_device *device = impl_from_ID3D10Device(iface);
405     struct wined3d_viewport wined3d_vp;
406
407     TRACE("iface %p, viewport_count %u, viewports %p.\n", iface, viewport_count, viewports);
408
409     if (viewport_count > 1)
410         FIXME("Multiple viewports not implemented.\n");
411
412     if (!viewport_count)
413         return;
414
415     wined3d_vp.x = viewports[0].TopLeftX;
416     wined3d_vp.y = viewports[0].TopLeftY;
417     wined3d_vp.width = viewports[0].Width;
418     wined3d_vp.height = viewports[0].Height;
419     wined3d_vp.min_z = viewports[0].MinDepth;
420     wined3d_vp.max_z = viewports[0].MaxDepth;
421
422     wined3d_device_set_viewport(device->wined3d_device, &wined3d_vp);
423 }
424
425 static void STDMETHODCALLTYPE d3d10_device_RSSetScissorRects(ID3D10Device *iface,
426         UINT rect_count, const D3D10_RECT *rects)
427 {
428     struct d3d10_device *device = impl_from_ID3D10Device(iface);
429
430     TRACE("iface %p, rect_count %u, rects %p.\n", iface, rect_count, rects);
431
432     if (rect_count > 1)
433         FIXME("Multiple scissor rects not implemented.\n");
434
435     if (!rect_count)
436         return;
437
438     wined3d_device_set_scissor_rect(device->wined3d_device, rects);
439 }
440
441 static void STDMETHODCALLTYPE d3d10_device_CopySubresourceRegion(ID3D10Device *iface,
442         ID3D10Resource *dst_resource, UINT dst_subresource_idx, UINT dst_x, UINT dst_y, UINT dst_z,
443         ID3D10Resource *src_resource, UINT src_subresource_idx, const D3D10_BOX *src_box)
444 {
445     FIXME("iface %p, dst_resource %p, dst_subresource_idx %u, dst_x %u, dst_y %u, dst_z %u,\n"
446             "\tsrc_resource %p, src_subresource_idx %u, src_box %p stub!\n",
447             iface, dst_resource, dst_subresource_idx, dst_x, dst_y, dst_z,
448             src_resource, src_subresource_idx, src_box);
449 }
450
451 static void STDMETHODCALLTYPE d3d10_device_CopyResource(ID3D10Device *iface,
452         ID3D10Resource *dst_resource, ID3D10Resource *src_resource)
453 {
454     FIXME("iface %p, dst_resource %p, src_resource %p stub!\n", iface, dst_resource, src_resource);
455 }
456
457 static void STDMETHODCALLTYPE d3d10_device_UpdateSubresource(ID3D10Device *iface,
458         ID3D10Resource *resource, UINT subresource_idx, const D3D10_BOX *box,
459         const void *data, UINT row_pitch, UINT depth_pitch)
460 {
461     FIXME("iface %p, resource %p, subresource_idx %u, box %p, data %p, row_pitch %u, depth_pitch %u stub!\n",
462             iface, resource, subresource_idx, box, data, row_pitch, depth_pitch);
463 }
464
465 static void STDMETHODCALLTYPE d3d10_device_ClearRenderTargetView(ID3D10Device *iface,
466         ID3D10RenderTargetView *render_target_view, const FLOAT color_rgba[4])
467 {
468     struct d3d10_device *This = impl_from_ID3D10Device(iface);
469     struct d3d10_rendertarget_view *view = unsafe_impl_from_ID3D10RenderTargetView(render_target_view);
470     const struct wined3d_color color = {color_rgba[0], color_rgba[1], color_rgba[2], color_rgba[3]};
471
472     TRACE("iface %p, render_target_view %p, color_rgba [%f %f %f %f]\n",
473             iface, render_target_view, color_rgba[0], color_rgba[1], color_rgba[2], color_rgba[3]);
474
475     wined3d_device_clear_rendertarget_view(This->wined3d_device, view->wined3d_view, &color);
476 }
477
478 static void STDMETHODCALLTYPE d3d10_device_ClearDepthStencilView(ID3D10Device *iface,
479         ID3D10DepthStencilView *depth_stencil_view, UINT flags, FLOAT depth, UINT8 stencil)
480 {
481     FIXME("iface %p, depth_stencil_view %p, flags %#x, depth %f, stencil %u stub!\n",
482             iface, depth_stencil_view, flags, depth, stencil);
483 }
484
485 static void STDMETHODCALLTYPE d3d10_device_GenerateMips(ID3D10Device *iface, ID3D10ShaderResourceView *shader_resource_view)
486 {
487     FIXME("iface %p, shader_resource_view %p stub!\n", iface, shader_resource_view);
488 }
489
490 static void STDMETHODCALLTYPE d3d10_device_ResolveSubresource(ID3D10Device *iface,
491         ID3D10Resource *dst_resource, UINT dst_subresource_idx,
492         ID3D10Resource *src_resource, UINT src_subresource_idx, DXGI_FORMAT format)
493 {
494     FIXME("iface %p, dst_resource %p, dst_subresource_idx %u,\n"
495             "\tsrc_resource %p, src_subresource_idx %u, format %s stub!\n",
496             iface, dst_resource, dst_subresource_idx,
497             src_resource, src_subresource_idx, debug_dxgi_format(format));
498 }
499
500 static void STDMETHODCALLTYPE d3d10_device_VSGetConstantBuffers(ID3D10Device *iface,
501         UINT start_slot, UINT buffer_count, ID3D10Buffer **buffers)
502 {
503     struct d3d10_device *device = impl_from_ID3D10Device(iface);
504     unsigned int i;
505
506     TRACE("iface %p, start_slot %u, buffer_count %u, buffers %p.\n",
507             iface, start_slot, buffer_count, buffers);
508
509     for (i = 0; i < buffer_count; ++i)
510     {
511         struct wined3d_buffer *wined3d_buffer;
512         struct d3d10_buffer *buffer_impl;
513
514         if (!(wined3d_buffer = wined3d_device_get_vs_cb(device->wined3d_device, start_slot + i)))
515         {
516             buffers[i] = NULL;
517             continue;
518         }
519
520         buffer_impl = wined3d_buffer_get_parent(wined3d_buffer);
521         buffers[i] = &buffer_impl->ID3D10Buffer_iface;
522         ID3D10Buffer_AddRef(buffers[i]);
523     }
524 }
525
526 static void STDMETHODCALLTYPE d3d10_device_PSGetShaderResources(ID3D10Device *iface,
527         UINT start_slot, UINT view_count, ID3D10ShaderResourceView **views)
528 {
529     FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n",
530             iface, start_slot, view_count, views);
531 }
532
533 static void STDMETHODCALLTYPE d3d10_device_PSGetShader(ID3D10Device *iface, ID3D10PixelShader **shader)
534 {
535     struct d3d10_device *device = impl_from_ID3D10Device(iface);
536     struct d3d10_pixel_shader *shader_impl;
537     struct wined3d_shader *wined3d_shader;
538
539     TRACE("iface %p, shader %p.\n", iface, shader);
540
541     if (!(wined3d_shader = wined3d_device_get_pixel_shader(device->wined3d_device)))
542     {
543         *shader = NULL;
544         return;
545     }
546
547     shader_impl = wined3d_shader_get_parent(wined3d_shader);
548     *shader = &shader_impl->ID3D10PixelShader_iface;
549     ID3D10PixelShader_AddRef(*shader);
550 }
551
552 static void STDMETHODCALLTYPE d3d10_device_PSGetSamplers(ID3D10Device *iface,
553         UINT start_slot, UINT sampler_count, ID3D10SamplerState **samplers)
554 {
555     FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n",
556             iface, start_slot, sampler_count, samplers);
557 }
558
559 static void STDMETHODCALLTYPE d3d10_device_VSGetShader(ID3D10Device *iface, ID3D10VertexShader **shader)
560 {
561     struct d3d10_device *device = impl_from_ID3D10Device(iface);
562     struct d3d10_vertex_shader *shader_impl;
563     struct wined3d_shader *wined3d_shader;
564
565     TRACE("iface %p, shader %p.\n", iface, shader);
566
567     if (!(wined3d_shader = wined3d_device_get_vertex_shader(device->wined3d_device)))
568     {
569         *shader = NULL;
570         return;
571     }
572
573     shader_impl = wined3d_shader_get_parent(wined3d_shader);
574     *shader = &shader_impl->ID3D10VertexShader_iface;
575     ID3D10VertexShader_AddRef(*shader);
576 }
577
578 static void STDMETHODCALLTYPE d3d10_device_PSGetConstantBuffers(ID3D10Device *iface,
579         UINT start_slot, UINT buffer_count, ID3D10Buffer **buffers)
580 {
581     FIXME("iface %p, start_slot %u, buffer_count %u, buffer %p stub!\n",
582             iface, start_slot, buffer_count, buffers);
583 }
584
585 static void STDMETHODCALLTYPE d3d10_device_IAGetInputLayout(ID3D10Device *iface, ID3D10InputLayout **input_layout)
586 {
587     struct d3d10_device *device = impl_from_ID3D10Device(iface);
588     struct wined3d_vertex_declaration *wined3d_declaration;
589     struct d3d10_input_layout *input_layout_impl;
590
591     TRACE("iface %p, input_layout %p.\n", iface, input_layout);
592
593     if (!(wined3d_declaration = wined3d_device_get_vertex_declaration(device->wined3d_device)))
594     {
595         *input_layout = NULL;
596         return;
597     }
598
599     input_layout_impl = wined3d_vertex_declaration_get_parent(wined3d_declaration);
600     *input_layout = &input_layout_impl->ID3D10InputLayout_iface;
601     ID3D10InputLayout_AddRef(*input_layout);
602 }
603
604 static void STDMETHODCALLTYPE d3d10_device_IAGetVertexBuffers(ID3D10Device *iface,
605         UINT start_slot, UINT buffer_count, ID3D10Buffer **buffers, UINT *strides, UINT *offsets)
606 {
607     struct d3d10_device *device = impl_from_ID3D10Device(iface);
608     unsigned int i;
609
610     TRACE("iface %p, start_slot %u, buffer_count %u, buffers %p, strides %p, offsets %p.\n",
611             iface, start_slot, buffer_count, buffers, strides, offsets);
612
613     for (i = 0; i < buffer_count; ++i)
614     {
615         struct wined3d_buffer *wined3d_buffer;
616         struct d3d10_buffer *buffer_impl;
617
618         if (FAILED(wined3d_device_get_stream_source(device->wined3d_device, start_slot + i,
619                 &wined3d_buffer, &offsets[i], &strides[i])))
620             ERR("Failed to get vertex buffer.\n");
621
622         if (!wined3d_buffer)
623         {
624             buffers[i] = NULL;
625             continue;
626         }
627
628         buffer_impl = wined3d_buffer_get_parent(wined3d_buffer);
629         buffers[i] = &buffer_impl->ID3D10Buffer_iface;
630         ID3D10Buffer_AddRef(buffers[i]);
631     }
632 }
633
634 static void STDMETHODCALLTYPE d3d10_device_IAGetIndexBuffer(ID3D10Device *iface,
635         ID3D10Buffer **buffer, DXGI_FORMAT *format, UINT *offset)
636 {
637     struct d3d10_device *device = impl_from_ID3D10Device(iface);
638     enum wined3d_format_id wined3d_format;
639     struct wined3d_buffer *wined3d_buffer;
640     struct d3d10_buffer *buffer_impl;
641
642     TRACE("iface %p, buffer %p, format %p, offset %p.\n", iface, buffer, format, offset);
643
644     wined3d_buffer = wined3d_device_get_index_buffer(device->wined3d_device, &wined3d_format);
645     *format = dxgi_format_from_wined3dformat(wined3d_format);
646     *offset = 0; /* FIXME */
647     if (!wined3d_buffer)
648     {
649         *buffer = NULL;
650         return;
651     }
652
653     buffer_impl = wined3d_buffer_get_parent(wined3d_buffer);
654     *buffer = &buffer_impl->ID3D10Buffer_iface;
655     ID3D10Buffer_AddRef(*buffer);
656 }
657
658 static void STDMETHODCALLTYPE d3d10_device_GSGetConstantBuffers(ID3D10Device *iface,
659         UINT start_slot, UINT buffer_count, ID3D10Buffer **buffers)
660 {
661     FIXME("iface %p, start_slot %u, buffer_count %u, buffers %p stub!\n",
662             iface, start_slot, buffer_count, buffers);
663 }
664
665 static void STDMETHODCALLTYPE d3d10_device_GSGetShader(ID3D10Device *iface, ID3D10GeometryShader **shader)
666 {
667     struct d3d10_device *device = impl_from_ID3D10Device(iface);
668     struct d3d10_geometry_shader *shader_impl;
669     struct wined3d_shader *wined3d_shader;
670
671     TRACE("iface %p, shader %p.\n", iface, shader);
672
673     if (!(wined3d_shader = wined3d_device_get_geometry_shader(device->wined3d_device)))
674     {
675         *shader = NULL;
676         return;
677     }
678
679     shader_impl = wined3d_shader_get_parent(wined3d_shader);
680     *shader = &shader_impl->ID3D10GeometryShader_iface;
681     ID3D10GeometryShader_AddRef(*shader);
682 }
683
684 static void STDMETHODCALLTYPE d3d10_device_IAGetPrimitiveTopology(ID3D10Device *iface,
685         D3D10_PRIMITIVE_TOPOLOGY *topology)
686 {
687     struct d3d10_device *This = impl_from_ID3D10Device(iface);
688
689     TRACE("iface %p, topology %p\n", iface, topology);
690
691     wined3d_device_get_primitive_type(This->wined3d_device, (enum wined3d_primitive_type *)topology);
692 }
693
694 static void STDMETHODCALLTYPE d3d10_device_VSGetShaderResources(ID3D10Device *iface,
695         UINT start_slot, UINT view_count, ID3D10ShaderResourceView **views)
696 {
697     FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n",
698             iface, start_slot, view_count, views);
699 }
700
701 static void STDMETHODCALLTYPE d3d10_device_VSGetSamplers(ID3D10Device *iface,
702         UINT start_slot, UINT sampler_count, ID3D10SamplerState **samplers)
703 {
704     FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n",
705             iface, start_slot, sampler_count, samplers);
706 }
707
708 static void STDMETHODCALLTYPE d3d10_device_GetPredication(ID3D10Device *iface,
709         ID3D10Predicate **predicate, BOOL *value)
710 {
711     FIXME("iface %p, predicate %p, value %p stub!\n", iface, predicate, value);
712 }
713
714 static void STDMETHODCALLTYPE d3d10_device_GSGetShaderResources(ID3D10Device *iface,
715         UINT start_slot, UINT view_count, ID3D10ShaderResourceView **views)
716 {
717     FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n",
718             iface, start_slot, view_count, views);
719 }
720
721 static void STDMETHODCALLTYPE d3d10_device_GSGetSamplers(ID3D10Device *iface,
722         UINT start_slot, UINT sampler_count, ID3D10SamplerState **samplers)
723 {
724     FIXME("iface %p, start_slot %u, sampler_count %u, samplers %p stub!\n",
725             iface, start_slot, sampler_count, samplers);
726 }
727
728 static void STDMETHODCALLTYPE d3d10_device_OMGetRenderTargets(ID3D10Device *iface,
729         UINT view_count, ID3D10RenderTargetView **render_target_views, ID3D10DepthStencilView **depth_stencil_view)
730 {
731     FIXME("iface %p, view_count %u, render_target_views %p, depth_stencil_view %p stub!\n",
732             iface, view_count, render_target_views, depth_stencil_view);
733 }
734
735 static void STDMETHODCALLTYPE d3d10_device_OMGetBlendState(ID3D10Device *iface,
736         ID3D10BlendState **blend_state, FLOAT blend_factor[4], UINT *sample_mask)
737 {
738     struct d3d10_device *device = impl_from_ID3D10Device(iface);
739
740     TRACE("iface %p, blend_state %p, blend_factor %p, sample_mask %p.\n",
741             iface, blend_state, blend_factor, sample_mask);
742
743     if ((*blend_state = device->blend_state ? &device->blend_state->ID3D10BlendState_iface : NULL))
744         ID3D10BlendState_AddRef(*blend_state);
745     memcpy(blend_factor, device->blend_factor, 4 * sizeof(*blend_factor));
746     *sample_mask = device->sample_mask;
747 }
748
749 static void STDMETHODCALLTYPE d3d10_device_OMGetDepthStencilState(ID3D10Device *iface,
750         ID3D10DepthStencilState **depth_stencil_state, UINT *stencil_ref)
751 {
752     struct d3d10_device *device = impl_from_ID3D10Device(iface);
753
754     TRACE("iface %p, depth_stencil_state %p, stencil_ref %p.\n",
755             iface, depth_stencil_state, stencil_ref);
756
757     if ((*depth_stencil_state = device->depth_stencil_state
758             ? &device->depth_stencil_state->ID3D10DepthStencilState_iface : NULL))
759         ID3D10DepthStencilState_AddRef(*depth_stencil_state);
760     *stencil_ref = device->stencil_ref;
761 }
762
763 static void STDMETHODCALLTYPE d3d10_device_SOGetTargets(ID3D10Device *iface,
764         UINT buffer_count, ID3D10Buffer **buffers, UINT *offsets)
765 {
766     struct d3d10_device *device = impl_from_ID3D10Device(iface);
767     unsigned int i;
768
769     TRACE("iface %p, buffer_count %u, buffers %p, offsets %p.\n",
770             iface, buffer_count, buffers, offsets);
771
772     for (i = 0; i < buffer_count; ++i)
773     {
774         struct wined3d_buffer *wined3d_buffer;
775         struct d3d10_buffer *buffer_impl;
776
777         if (!(wined3d_buffer = wined3d_device_get_stream_output(device->wined3d_device, i, &offsets[i])))
778         {
779             buffers[i] = NULL;
780             continue;
781         }
782
783         buffer_impl = wined3d_buffer_get_parent(wined3d_buffer);
784         buffers[i] = &buffer_impl->ID3D10Buffer_iface;
785         ID3D10Buffer_AddRef(buffers[i]);
786     }
787 }
788
789 static void STDMETHODCALLTYPE d3d10_device_RSGetState(ID3D10Device *iface, ID3D10RasterizerState **rasterizer_state)
790 {
791     struct d3d10_device *device = impl_from_ID3D10Device(iface);
792
793     TRACE("iface %p, rasterizer_state %p.\n", iface, rasterizer_state);
794
795     if ((*rasterizer_state = device->rasterizer_state ? &device->rasterizer_state->ID3D10RasterizerState_iface : NULL))
796         ID3D10RasterizerState_AddRef(*rasterizer_state);
797 }
798
799 static void STDMETHODCALLTYPE d3d10_device_RSGetViewports(ID3D10Device *iface,
800         UINT *viewport_count, D3D10_VIEWPORT *viewports)
801 {
802     struct d3d10_device *device = impl_from_ID3D10Device(iface);
803     struct wined3d_viewport wined3d_vp;
804
805     TRACE("iface %p, viewport_count %p, viewports %p.\n", iface, viewport_count, viewports);
806
807     if (!viewports)
808     {
809         *viewport_count = 1;
810         return;
811     }
812
813     if (!*viewport_count)
814         return;
815
816     wined3d_device_get_viewport(device->wined3d_device, &wined3d_vp);
817
818     viewports[0].TopLeftX = wined3d_vp.x;
819     viewports[0].TopLeftY = wined3d_vp.y;
820     viewports[0].Width = wined3d_vp.width;
821     viewports[0].Height = wined3d_vp.height;
822     viewports[0].MinDepth = wined3d_vp.min_z;
823     viewports[0].MaxDepth = wined3d_vp.max_z;
824
825     if (*viewport_count > 1)
826         memset(&viewports[1], 0, (*viewport_count - 1) * sizeof(*viewports));
827 }
828
829 static void STDMETHODCALLTYPE d3d10_device_RSGetScissorRects(ID3D10Device *iface, UINT *rect_count, D3D10_RECT *rects)
830 {
831     struct d3d10_device *device = impl_from_ID3D10Device(iface);
832
833     TRACE("iface %p, rect_count %p, rects %p.\n", iface, rect_count, rects);
834
835     if (!rects)
836     {
837         *rect_count = 1;
838         return;
839     }
840
841     if (!*rect_count)
842         return;
843
844     wined3d_device_get_scissor_rect(device->wined3d_device, rects);
845     if (*rect_count > 1)
846         memset(&rects[1], 0, (*rect_count - 1) * sizeof(*rects));
847 }
848
849 static HRESULT STDMETHODCALLTYPE d3d10_device_GetDeviceRemovedReason(ID3D10Device *iface)
850 {
851     FIXME("iface %p stub!\n", iface);
852
853     return E_NOTIMPL;
854 }
855
856 static HRESULT STDMETHODCALLTYPE d3d10_device_SetExceptionMode(ID3D10Device *iface, UINT flags)
857 {
858     FIXME("iface %p, flags %#x stub!\n", iface, flags);
859
860     return E_NOTIMPL;
861 }
862
863 static UINT STDMETHODCALLTYPE d3d10_device_GetExceptionMode(ID3D10Device *iface)
864 {
865     FIXME("iface %p stub!\n", iface);
866
867     return 0;
868 }
869
870 static HRESULT STDMETHODCALLTYPE d3d10_device_GetPrivateData(ID3D10Device *iface,
871         REFGUID guid, UINT *data_size, void *data)
872 {
873     FIXME("iface %p, guid %s, data_size %p, data %p stub!\n",
874             iface, debugstr_guid(guid), data_size, data);
875
876     return E_NOTIMPL;
877 }
878
879 static HRESULT STDMETHODCALLTYPE d3d10_device_SetPrivateData(ID3D10Device *iface,
880         REFGUID guid, UINT data_size, const void *data)
881 {
882     FIXME("iface %p, guid %s, data_size %u, data %p stub!\n",
883             iface, debugstr_guid(guid), data_size, data);
884
885     return E_NOTIMPL;
886 }
887
888 static HRESULT STDMETHODCALLTYPE d3d10_device_SetPrivateDataInterface(ID3D10Device *iface,
889         REFGUID guid, const IUnknown *data)
890 {
891     FIXME("iface %p, guid %s, data %p stub!\n", iface, debugstr_guid(guid), data);
892
893     return E_NOTIMPL;
894 }
895
896 static void STDMETHODCALLTYPE d3d10_device_ClearState(ID3D10Device *iface)
897 {
898     FIXME("iface %p stub!\n", iface);
899 }
900
901 static void STDMETHODCALLTYPE d3d10_device_Flush(ID3D10Device *iface)
902 {
903     FIXME("iface %p stub!\n", iface);
904 }
905
906 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateBuffer(ID3D10Device *iface,
907         const D3D10_BUFFER_DESC *desc, const D3D10_SUBRESOURCE_DATA *data, ID3D10Buffer **buffer)
908 {
909     struct d3d10_device *This = impl_from_ID3D10Device(iface);
910     struct d3d10_buffer *object;
911     HRESULT hr;
912
913     FIXME("iface %p, desc %p, data %p, buffer %p partial stub!\n", iface, desc, data, buffer);
914
915     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
916     if (!object)
917     {
918         ERR("Failed to allocate D3D10 buffer object memory\n");
919         return E_OUTOFMEMORY;
920     }
921
922     hr = d3d10_buffer_init(object, This, desc, data);
923     if (FAILED(hr))
924     {
925         WARN("Failed to initialize buffer, hr %#x.\n", hr);
926         HeapFree(GetProcessHeap(), 0, object);
927         return hr;
928     }
929
930     *buffer = &object->ID3D10Buffer_iface;
931
932     TRACE("Created ID3D10Buffer %p\n", object);
933
934     return S_OK;
935 }
936
937 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture1D(ID3D10Device *iface,
938         const D3D10_TEXTURE1D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data, ID3D10Texture1D **texture)
939 {
940     FIXME("iface %p, desc %p, data %p, texture %p stub!\n", iface, desc, data, texture);
941
942     return E_NOTIMPL;
943 }
944
945 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture2D(ID3D10Device *iface,
946         const D3D10_TEXTURE2D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data,
947         ID3D10Texture2D **texture)
948 {
949     struct d3d10_device *This = impl_from_ID3D10Device(iface);
950     struct d3d10_texture2d *object;
951     HRESULT hr;
952
953     FIXME("iface %p, desc %p, data %p, texture %p partial stub!\n", iface, desc, data, texture);
954
955     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
956     if (!object)
957     {
958         ERR("Failed to allocate D3D10 texture2d object memory\n");
959         return E_OUTOFMEMORY;
960     }
961
962     hr = d3d10_texture2d_init(object, This, desc);
963     if (FAILED(hr))
964     {
965         WARN("Failed to initialize texture, hr %#x.\n", hr);
966         HeapFree(GetProcessHeap(), 0, object);
967         return hr;
968     }
969
970     *texture = &object->ID3D10Texture2D_iface;
971
972     TRACE("Created ID3D10Texture2D %p\n", object);
973
974     return S_OK;
975 }
976
977 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture3D(ID3D10Device *iface,
978         const D3D10_TEXTURE3D_DESC *desc, const D3D10_SUBRESOURCE_DATA *data,
979         ID3D10Texture3D **texture)
980 {
981     struct d3d10_device *device = impl_from_ID3D10Device(iface);
982     struct d3d10_texture3d *object;
983     HRESULT hr;
984
985     TRACE("iface %p, desc %p, data %p, texture %p.\n", iface, desc, data, texture);
986
987     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
988     if (!object)
989     {
990         ERR("Failed to allocate D3D10 texture3d object memory.\n");
991         return E_OUTOFMEMORY;
992     }
993
994     hr = d3d10_texture3d_init(object, device, desc);
995     if (FAILED(hr))
996     {
997         WARN("Failed to initialize texture, hr %#x.\n", hr);
998         HeapFree(GetProcessHeap(), 0, object);
999         return hr;
1000     }
1001
1002     TRACE("Created 3D texture %p.\n", object);
1003     *texture = &object->ID3D10Texture3D_iface;
1004
1005     return S_OK;
1006 }
1007
1008 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateShaderResourceView(ID3D10Device *iface,
1009         ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc, ID3D10ShaderResourceView **view)
1010 {
1011     struct d3d10_shader_resource_view *object;
1012     HRESULT hr;
1013
1014     TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view);
1015
1016     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1017     if (!object)
1018     {
1019         ERR("Failed to allocate D3D10 shader resource view object memory.\n");
1020         return E_OUTOFMEMORY;
1021     }
1022
1023     if (FAILED(hr = d3d10_shader_resource_view_init(object, resource, desc)))
1024     {
1025         WARN("Failed to initialize shader resource view, hr %#x.\n", hr);
1026         HeapFree(GetProcessHeap(), 0, object);
1027         return hr;
1028     }
1029
1030     TRACE("Created shader resource view %p.\n", object);
1031     *view = &object->ID3D10ShaderResourceView_iface;
1032
1033     return S_OK;
1034 }
1035
1036 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRenderTargetView(ID3D10Device *iface,
1037         ID3D10Resource *resource, const D3D10_RENDER_TARGET_VIEW_DESC *desc, ID3D10RenderTargetView **view)
1038 {
1039     struct d3d10_rendertarget_view *object;
1040     HRESULT hr;
1041
1042     TRACE("iface %p, resource %p, desc %p, view %p stub!\n", iface, resource, desc, view);
1043
1044     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1045     if (!object)
1046     {
1047         ERR("Failed to allocate D3D10 rendertarget view object memory\n");
1048         return E_OUTOFMEMORY;
1049     }
1050
1051     hr = d3d10_rendertarget_view_init(object, resource, desc);
1052     if (FAILED(hr))
1053     {
1054         WARN("Failed to initialize rendertarget view, hr %#x.\n", hr);
1055         HeapFree(GetProcessHeap(), 0, object);
1056         return hr;
1057     }
1058
1059     TRACE("Created rendertarget view %p.\n", object);
1060     *view = &object->ID3D10RenderTargetView_iface;
1061
1062     return S_OK;
1063 }
1064
1065 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateDepthStencilView(ID3D10Device *iface,
1066         ID3D10Resource *resource, const D3D10_DEPTH_STENCIL_VIEW_DESC *desc, ID3D10DepthStencilView **view)
1067 {
1068     struct d3d10_depthstencil_view *object;
1069     HRESULT hr;
1070
1071     TRACE("iface %p, resource %p, desc %p, view %p.\n", iface, resource, desc, view);
1072
1073     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1074     if (!object)
1075     {
1076         ERR("Failed to allocate D3D10 depthstencil view object memory.\n");
1077         return E_OUTOFMEMORY;
1078     }
1079
1080     if (FAILED(hr = d3d10_depthstencil_view_init(object, resource, desc)))
1081     {
1082         WARN("Failed to initialize depthstencil view, hr %#x.\n", hr);
1083         HeapFree(GetProcessHeap(), 0, object);
1084         return hr;
1085     }
1086
1087     TRACE("Created depthstencil view %p.\n", object);
1088     *view = &object->ID3D10DepthStencilView_iface;
1089
1090     return S_OK;
1091 }
1092
1093 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateInputLayout(ID3D10Device *iface,
1094         const D3D10_INPUT_ELEMENT_DESC *element_descs, UINT element_count,
1095         const void *shader_byte_code, SIZE_T shader_byte_code_length,
1096         ID3D10InputLayout **input_layout)
1097 {
1098     struct d3d10_device *This = impl_from_ID3D10Device(iface);
1099     struct d3d10_input_layout *object;
1100     HRESULT hr;
1101
1102     TRACE("iface %p, element_descs %p, element_count %u, shader_byte_code %p,"
1103             "\tshader_byte_code_length %lu, input_layout %p\n",
1104             iface, element_descs, element_count, shader_byte_code,
1105             shader_byte_code_length, input_layout);
1106
1107     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1108     if (!object)
1109     {
1110         ERR("Failed to allocate D3D10 input layout object memory\n");
1111         return E_OUTOFMEMORY;
1112     }
1113
1114     hr = d3d10_input_layout_init(object, This, element_descs, element_count,
1115             shader_byte_code, shader_byte_code_length);
1116     if (FAILED(hr))
1117     {
1118         WARN("Failed to initialize input layout, hr %#x.\n", hr);
1119         HeapFree(GetProcessHeap(), 0, object);
1120         return hr;
1121     }
1122
1123     TRACE("Created input layout %p.\n", object);
1124     *input_layout = &object->ID3D10InputLayout_iface;
1125
1126     return S_OK;
1127 }
1128
1129 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateVertexShader(ID3D10Device *iface,
1130         const void *byte_code, SIZE_T byte_code_length, ID3D10VertexShader **shader)
1131 {
1132     struct d3d10_device *This = impl_from_ID3D10Device(iface);
1133     struct d3d10_vertex_shader *object;
1134     HRESULT hr;
1135
1136     TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n",
1137             iface, byte_code, byte_code_length, shader);
1138
1139     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1140     if (!object)
1141     {
1142         ERR("Failed to allocate D3D10 vertex shader object memory\n");
1143         return E_OUTOFMEMORY;
1144     }
1145
1146     hr = d3d10_vertex_shader_init(object, This, byte_code, byte_code_length);
1147     if (FAILED(hr))
1148     {
1149         WARN("Failed to initialize vertex shader, hr %#x.\n", hr);
1150         HeapFree(GetProcessHeap(), 0, object);
1151         return hr;
1152     }
1153
1154     TRACE("Created vertex shader %p.\n", object);
1155     *shader = &object->ID3D10VertexShader_iface;
1156
1157     return S_OK;
1158 }
1159
1160 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShader(ID3D10Device *iface,
1161         const void *byte_code, SIZE_T byte_code_length, ID3D10GeometryShader **shader)
1162 {
1163     struct d3d10_device *This = impl_from_ID3D10Device(iface);
1164     struct d3d10_geometry_shader *object;
1165     HRESULT hr;
1166
1167     FIXME("iface %p, byte_code %p, byte_code_length %lu, shader %p stub!\n",
1168             iface, byte_code, byte_code_length, shader);
1169
1170     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1171     if (!object)
1172     {
1173         ERR("Failed to allocate D3D10 geometry shader object memory\n");
1174         return E_OUTOFMEMORY;
1175     }
1176
1177     hr = d3d10_geometry_shader_init(object, This, byte_code, byte_code_length);
1178     if (FAILED(hr))
1179     {
1180         WARN("Failed to initialize geometry shader, hr %#x.\n", hr);
1181         HeapFree(GetProcessHeap(), 0, object);
1182         return hr;
1183     }
1184
1185     TRACE("Created geometry shader %p.\n", object);
1186     *shader = &object->ID3D10GeometryShader_iface;
1187
1188     return S_OK;
1189 }
1190
1191 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateGeometryShaderWithStreamOutput(ID3D10Device *iface,
1192         const void *byte_code, SIZE_T byte_code_length, const D3D10_SO_DECLARATION_ENTRY *output_stream_decls,
1193         UINT output_stream_decl_count, UINT output_stream_stride, ID3D10GeometryShader **shader)
1194 {
1195     FIXME("iface %p, byte_code %p, byte_code_length %lu, output_stream_decls %p,\n"
1196             "\toutput_stream_decl_count %u, output_stream_stride %u, shader %p stub!\n",
1197             iface, byte_code, byte_code_length, output_stream_decls,
1198             output_stream_decl_count, output_stream_stride, shader);
1199
1200     return E_NOTIMPL;
1201 }
1202
1203 static HRESULT STDMETHODCALLTYPE d3d10_device_CreatePixelShader(ID3D10Device *iface,
1204         const void *byte_code, SIZE_T byte_code_length, ID3D10PixelShader **shader)
1205 {
1206     struct d3d10_device *This = impl_from_ID3D10Device(iface);
1207     struct d3d10_pixel_shader *object;
1208     HRESULT hr;
1209
1210     TRACE("iface %p, byte_code %p, byte_code_length %lu, shader %p\n",
1211             iface, byte_code, byte_code_length, shader);
1212
1213     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1214     if (!object)
1215     {
1216         ERR("Failed to allocate D3D10 pixel shader object memory\n");
1217         return E_OUTOFMEMORY;
1218     }
1219
1220     hr = d3d10_pixel_shader_init(object, This, byte_code, byte_code_length);
1221     if (FAILED(hr))
1222     {
1223         WARN("Failed to initialize pixel shader, hr %#x.\n", hr);
1224         HeapFree(GetProcessHeap(), 0, object);
1225         return hr;
1226     }
1227
1228     TRACE("Created pixel shader %p.\n", object);
1229     *shader = &object->ID3D10PixelShader_iface;
1230
1231     return S_OK;
1232 }
1233
1234 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateBlendState(ID3D10Device *iface,
1235         const D3D10_BLEND_DESC *desc, ID3D10BlendState **blend_state)
1236 {
1237     struct d3d10_blend_state *object;
1238     HRESULT hr;
1239
1240     TRACE("iface %p, desc %p, blend_state %p.\n", iface, desc, blend_state);
1241
1242     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1243     if (!object)
1244     {
1245         ERR("Failed to allocate D3D10 blend state object memory.\n");
1246         return E_OUTOFMEMORY;
1247     }
1248
1249     hr = d3d10_blend_state_init(object);
1250     if (FAILED(hr))
1251     {
1252         WARN("Failed to initialize blend state, hr %#x.\n", hr);
1253         HeapFree(GetProcessHeap(), 0, object);
1254         return hr;
1255     }
1256
1257     TRACE("Created blend state %p.\n", object);
1258     *blend_state = &object->ID3D10BlendState_iface;
1259
1260     return S_OK;
1261 }
1262
1263 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateDepthStencilState(ID3D10Device *iface,
1264         const D3D10_DEPTH_STENCIL_DESC *desc, ID3D10DepthStencilState **depth_stencil_state)
1265 {
1266     struct d3d10_depthstencil_state *object;
1267     HRESULT hr;
1268
1269     TRACE("iface %p, desc %p, depth_stencil_state %p.\n", iface, desc, depth_stencil_state);
1270
1271     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1272     if (!object)
1273     {
1274         ERR("Failed to allocate D3D10 depthstencil state object memory.\n");
1275         return E_OUTOFMEMORY;
1276     }
1277
1278     hr = d3d10_depthstencil_state_init(object);
1279     if (FAILED(hr))
1280     {
1281         WARN("Failed to initialize depthstencil state, hr %#x.\n", hr);
1282         HeapFree(GetProcessHeap(), 0, object);
1283         return hr;
1284     }
1285
1286     TRACE("Created depthstencil state %p.\n", object);
1287     *depth_stencil_state = &object->ID3D10DepthStencilState_iface;
1288
1289     return S_OK;
1290 }
1291
1292 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateRasterizerState(ID3D10Device *iface,
1293         const D3D10_RASTERIZER_DESC *desc, ID3D10RasterizerState **rasterizer_state)
1294 {
1295     struct d3d10_rasterizer_state *object;
1296     HRESULT hr;
1297
1298     TRACE("iface %p, desc %p, rasterizer_state %p.\n", iface, desc, rasterizer_state);
1299
1300     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1301     if (!object)
1302     {
1303         ERR("Failed to allocate D3D10 rasterizer state object memory.\n");
1304         return E_OUTOFMEMORY;
1305     }
1306
1307     hr = d3d10_rasterizer_state_init(object);
1308     if (FAILED(hr))
1309     {
1310         WARN("Failed to initialize rasterizer state, hr %#x.\n", hr);
1311         HeapFree(GetProcessHeap(), 0, object);
1312         return hr;
1313     }
1314
1315     TRACE("Created rasterizer state %p.\n", object);
1316     *rasterizer_state = &object->ID3D10RasterizerState_iface;
1317
1318     return S_OK;
1319 }
1320
1321 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateSamplerState(ID3D10Device *iface,
1322         const D3D10_SAMPLER_DESC *desc, ID3D10SamplerState **sampler_state)
1323 {
1324     struct d3d10_sampler_state *object;
1325     HRESULT hr;
1326
1327     TRACE("iface %p, desc %p, sampler_state %p.\n", iface, desc, sampler_state);
1328
1329     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1330     if (!object)
1331     {
1332         ERR("Failed to allocate D3D10 sampler state object memory.\n");
1333         return E_OUTOFMEMORY;
1334     }
1335
1336     hr = d3d10_sampler_state_init(object);
1337     if (FAILED(hr))
1338     {
1339         WARN("Failed to initialize sampler state, hr %#x.\n", hr);
1340         HeapFree(GetProcessHeap(), 0, object);
1341         return hr;
1342     }
1343
1344     TRACE("Created sampler state %p.\n", object);
1345     *sampler_state = &object->ID3D10SamplerState_iface;
1346
1347     return S_OK;
1348 }
1349
1350 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateQuery(ID3D10Device *iface,
1351         const D3D10_QUERY_DESC *desc, ID3D10Query **query)
1352 {
1353     struct d3d10_query *object;
1354     HRESULT hr;
1355
1356     TRACE("iface %p, desc %p, query %p.\n", iface, desc, query);
1357
1358     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1359     if (!object)
1360     {
1361         ERR("Failed to allocate D3D10 query object memory.\n");
1362         return E_OUTOFMEMORY;
1363     }
1364
1365     hr = d3d10_query_init(object);
1366     if (FAILED(hr))
1367     {
1368         WARN("Failed to initialize query, hr %#x.\n", hr);
1369         HeapFree(GetProcessHeap(), 0, object);
1370         return hr;
1371     }
1372
1373     TRACE("Created query %p.\n", object);
1374     *query = &object->ID3D10Query_iface;
1375
1376     return S_OK;
1377 }
1378
1379 static HRESULT STDMETHODCALLTYPE d3d10_device_CreatePredicate(ID3D10Device *iface,
1380         const D3D10_QUERY_DESC *desc, ID3D10Predicate **predicate)
1381 {
1382     FIXME("iface %p, desc %p, predicate %p stub!\n", iface, desc, predicate);
1383
1384     return E_NOTIMPL;
1385 }
1386
1387 static HRESULT STDMETHODCALLTYPE d3d10_device_CreateCounter(ID3D10Device *iface,
1388         const D3D10_COUNTER_DESC *desc, ID3D10Counter **counter)
1389 {
1390     FIXME("iface %p, desc %p, counter %p stub!\n", iface, desc, counter);
1391
1392     return E_NOTIMPL;
1393 }
1394
1395 static HRESULT STDMETHODCALLTYPE d3d10_device_CheckFormatSupport(ID3D10Device *iface,
1396         DXGI_FORMAT format, UINT *format_support)
1397 {
1398     FIXME("iface %p, format %s, format_support %p stub!\n",
1399             iface, debug_dxgi_format(format), format_support);
1400
1401     return E_NOTIMPL;
1402 }
1403
1404 static HRESULT STDMETHODCALLTYPE d3d10_device_CheckMultisampleQualityLevels(ID3D10Device *iface,
1405         DXGI_FORMAT format, UINT sample_count, UINT *quality_level_count)
1406 {
1407     FIXME("iface %p, format %s, sample_count %u, quality_level_count %p stub!\n",
1408             iface, debug_dxgi_format(format), sample_count, quality_level_count);
1409
1410     return E_NOTIMPL;
1411 }
1412
1413 static void STDMETHODCALLTYPE d3d10_device_CheckCounterInfo(ID3D10Device *iface, D3D10_COUNTER_INFO *counter_info)
1414 {
1415     FIXME("iface %p, counter_info %p stub!\n", iface, counter_info);
1416 }
1417
1418 static HRESULT STDMETHODCALLTYPE d3d10_device_CheckCounter(ID3D10Device *iface,
1419         const D3D10_COUNTER_DESC *desc, D3D10_COUNTER_TYPE *type, UINT *active_counters, LPSTR name,
1420         UINT *name_length, LPSTR units, UINT *units_length, LPSTR description, UINT *description_length)
1421 {
1422     FIXME("iface %p, desc %p, type %p, active_counters %p, name %p, name_length %p,\n"
1423             "\tunits %p, units_length %p, description %p, description_length %p stub!\n",
1424             iface, desc, type, active_counters, name, name_length,
1425             units, units_length, description, description_length);
1426
1427     return E_NOTIMPL;
1428 }
1429
1430 static UINT STDMETHODCALLTYPE d3d10_device_GetCreationFlags(ID3D10Device *iface)
1431 {
1432     FIXME("iface %p stub!\n", iface);
1433
1434     return 0;
1435 }
1436
1437 static HRESULT STDMETHODCALLTYPE d3d10_device_OpenSharedResource(ID3D10Device *iface,
1438         HANDLE resource_handle, REFIID guid, void **resource)
1439 {
1440     FIXME("iface %p, resource_handle %p, guid %s, resource %p stub!\n",
1441             iface, resource_handle, debugstr_guid(guid), resource);
1442
1443     return E_NOTIMPL;
1444 }
1445
1446 static void STDMETHODCALLTYPE d3d10_device_SetTextFilterSize(ID3D10Device *iface, UINT width, UINT height)
1447 {
1448     FIXME("iface %p, width %u, height %u stub!\n", iface, width, height);
1449 }
1450
1451 static void STDMETHODCALLTYPE d3d10_device_GetTextFilterSize(ID3D10Device *iface, UINT *width, UINT *height)
1452 {
1453     FIXME("iface %p, width %p, height %p stub!\n", iface, width, height);
1454 }
1455
1456 static const struct ID3D10DeviceVtbl d3d10_device_vtbl =
1457 {
1458     /* IUnknown methods */
1459     d3d10_device_QueryInterface,
1460     d3d10_device_AddRef,
1461     d3d10_device_Release,
1462     /* ID3D10Device methods */
1463     d3d10_device_VSSetConstantBuffers,
1464     d3d10_device_PSSetShaderResources,
1465     d3d10_device_PSSetShader,
1466     d3d10_device_PSSetSamplers,
1467     d3d10_device_VSSetShader,
1468     d3d10_device_DrawIndexed,
1469     d3d10_device_Draw,
1470     d3d10_device_PSSetConstantBuffers,
1471     d3d10_device_IASetInputLayout,
1472     d3d10_device_IASetVertexBuffers,
1473     d3d10_device_IASetIndexBuffer,
1474     d3d10_device_DrawIndexedInstanced,
1475     d3d10_device_DrawInstanced,
1476     d3d10_device_GSSetConstantBuffers,
1477     d3d10_device_GSSetShader,
1478     d3d10_device_IASetPrimitiveTopology,
1479     d3d10_device_VSSetShaderResources,
1480     d3d10_device_VSSetSamplers,
1481     d3d10_device_SetPredication,
1482     d3d10_device_GSSetShaderResources,
1483     d3d10_device_GSSetSamplers,
1484     d3d10_device_OMSetRenderTargets,
1485     d3d10_device_OMSetBlendState,
1486     d3d10_device_OMSetDepthStencilState,
1487     d3d10_device_SOSetTargets,
1488     d3d10_device_DrawAuto,
1489     d3d10_device_RSSetState,
1490     d3d10_device_RSSetViewports,
1491     d3d10_device_RSSetScissorRects,
1492     d3d10_device_CopySubresourceRegion,
1493     d3d10_device_CopyResource,
1494     d3d10_device_UpdateSubresource,
1495     d3d10_device_ClearRenderTargetView,
1496     d3d10_device_ClearDepthStencilView,
1497     d3d10_device_GenerateMips,
1498     d3d10_device_ResolveSubresource,
1499     d3d10_device_VSGetConstantBuffers,
1500     d3d10_device_PSGetShaderResources,
1501     d3d10_device_PSGetShader,
1502     d3d10_device_PSGetSamplers,
1503     d3d10_device_VSGetShader,
1504     d3d10_device_PSGetConstantBuffers,
1505     d3d10_device_IAGetInputLayout,
1506     d3d10_device_IAGetVertexBuffers,
1507     d3d10_device_IAGetIndexBuffer,
1508     d3d10_device_GSGetConstantBuffers,
1509     d3d10_device_GSGetShader,
1510     d3d10_device_IAGetPrimitiveTopology,
1511     d3d10_device_VSGetShaderResources,
1512     d3d10_device_VSGetSamplers,
1513     d3d10_device_GetPredication,
1514     d3d10_device_GSGetShaderResources,
1515     d3d10_device_GSGetSamplers,
1516     d3d10_device_OMGetRenderTargets,
1517     d3d10_device_OMGetBlendState,
1518     d3d10_device_OMGetDepthStencilState,
1519     d3d10_device_SOGetTargets,
1520     d3d10_device_RSGetState,
1521     d3d10_device_RSGetViewports,
1522     d3d10_device_RSGetScissorRects,
1523     d3d10_device_GetDeviceRemovedReason,
1524     d3d10_device_SetExceptionMode,
1525     d3d10_device_GetExceptionMode,
1526     d3d10_device_GetPrivateData,
1527     d3d10_device_SetPrivateData,
1528     d3d10_device_SetPrivateDataInterface,
1529     d3d10_device_ClearState,
1530     d3d10_device_Flush,
1531     d3d10_device_CreateBuffer,
1532     d3d10_device_CreateTexture1D,
1533     d3d10_device_CreateTexture2D,
1534     d3d10_device_CreateTexture3D,
1535     d3d10_device_CreateShaderResourceView,
1536     d3d10_device_CreateRenderTargetView,
1537     d3d10_device_CreateDepthStencilView,
1538     d3d10_device_CreateInputLayout,
1539     d3d10_device_CreateVertexShader,
1540     d3d10_device_CreateGeometryShader,
1541     d3d10_device_CreateGeometryShaderWithStreamOutput,
1542     d3d10_device_CreatePixelShader,
1543     d3d10_device_CreateBlendState,
1544     d3d10_device_CreateDepthStencilState,
1545     d3d10_device_CreateRasterizerState,
1546     d3d10_device_CreateSamplerState,
1547     d3d10_device_CreateQuery,
1548     d3d10_device_CreatePredicate,
1549     d3d10_device_CreateCounter,
1550     d3d10_device_CheckFormatSupport,
1551     d3d10_device_CheckMultisampleQualityLevels,
1552     d3d10_device_CheckCounterInfo,
1553     d3d10_device_CheckCounter,
1554     d3d10_device_GetCreationFlags,
1555     d3d10_device_OpenSharedResource,
1556     d3d10_device_SetTextFilterSize,
1557     d3d10_device_GetTextFilterSize,
1558 };
1559
1560 static const struct IUnknownVtbl d3d10_device_inner_unknown_vtbl =
1561 {
1562     /* IUnknown methods */
1563     d3d10_device_inner_QueryInterface,
1564     d3d10_device_inner_AddRef,
1565     d3d10_device_inner_Release,
1566 };
1567
1568 static void STDMETHODCALLTYPE d3d10_subresource_destroyed(void *parent) {}
1569
1570 static const struct wined3d_parent_ops d3d10_subresource_parent_ops =
1571 {
1572     d3d10_subresource_destroyed,
1573 };
1574
1575 /* IWineDXGIDeviceParent IUnknown methods */
1576
1577 static inline struct d3d10_device *device_from_dxgi_device_parent(IWineDXGIDeviceParent *iface)
1578 {
1579     return CONTAINING_RECORD(iface, struct d3d10_device, IWineDXGIDeviceParent_iface);
1580 }
1581
1582 static HRESULT STDMETHODCALLTYPE dxgi_device_parent_QueryInterface(IWineDXGIDeviceParent *iface,
1583         REFIID riid, void **ppv)
1584 {
1585     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
1586     return IUnknown_QueryInterface(device->outer_unk, riid, ppv);
1587 }
1588
1589 static ULONG STDMETHODCALLTYPE dxgi_device_parent_AddRef(IWineDXGIDeviceParent *iface)
1590 {
1591     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
1592     return IUnknown_AddRef(device->outer_unk);
1593 }
1594
1595 static ULONG STDMETHODCALLTYPE dxgi_device_parent_Release(IWineDXGIDeviceParent *iface)
1596 {
1597     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
1598     return IUnknown_Release(device->outer_unk);
1599 }
1600
1601 static struct wined3d_device_parent * STDMETHODCALLTYPE dxgi_device_parent_get_wined3d_device_parent(
1602         IWineDXGIDeviceParent *iface)
1603 {
1604     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
1605     return &device->device_parent;
1606 }
1607
1608 static const struct IWineDXGIDeviceParentVtbl d3d10_dxgi_device_parent_vtbl =
1609 {
1610     /* IUnknown methods */
1611     dxgi_device_parent_QueryInterface,
1612     dxgi_device_parent_AddRef,
1613     dxgi_device_parent_Release,
1614     /* IWineDXGIDeviceParent methods */
1615     dxgi_device_parent_get_wined3d_device_parent,
1616 };
1617
1618 static inline struct d3d10_device *device_from_wined3d_device_parent(struct wined3d_device_parent *device_parent)
1619 {
1620     return CONTAINING_RECORD(device_parent, struct d3d10_device, device_parent);
1621 }
1622
1623 static void CDECL device_parent_wined3d_device_created(struct wined3d_device_parent *device_parent,
1624         struct wined3d_device *wined3d_device)
1625 {
1626     struct d3d10_device *device = device_from_wined3d_device_parent(device_parent);
1627
1628     TRACE("device_parent %p, wined3d_device %p.\n", device_parent, wined3d_device);
1629
1630     wined3d_device_incref(wined3d_device);
1631     device->wined3d_device = wined3d_device;
1632 }
1633
1634 static void CDECL device_parent_mode_changed(struct wined3d_device_parent *device_parent)
1635 {
1636     TRACE("device_parent %p.\n", device_parent);
1637 }
1638
1639 static HRESULT CDECL device_parent_create_texture_surface(struct wined3d_device_parent *device_parent,
1640         void *container_parent, UINT width, UINT height, enum wined3d_format_id format, DWORD usage,
1641         enum wined3d_pool pool, UINT sub_resource_idx, struct wined3d_surface **surface)
1642 {
1643     struct d3d10_device *device = device_from_wined3d_device_parent(device_parent);
1644
1645     TRACE("device_parent %p, container_parent %p, width %u, height %u, format %#x, usage %#x,\n"
1646             "\tpool %#x, sub_resource_idx %u, surface %p.\n",
1647             device_parent, container_parent, width, height, format, usage, pool, sub_resource_idx, surface);
1648
1649     return wined3d_surface_create(device->wined3d_device, width, height, format, usage, pool,
1650             WINED3D_MULTISAMPLE_NONE, 0, WINED3D_SURFACE_TYPE_OPENGL, 0, container_parent,
1651             &d3d10_null_wined3d_parent_ops, surface);
1652 }
1653
1654 static HRESULT CDECL device_parent_create_swapchain_surface(struct wined3d_device_parent *device_parent,
1655         void *container_parent, UINT width, UINT height, enum wined3d_format_id format_id, DWORD usage,
1656         enum wined3d_multisample_type multisample_type, DWORD multisample_quality, struct wined3d_surface **surface)
1657 {
1658     struct d3d10_device *device = device_from_wined3d_device_parent(device_parent);
1659     struct wined3d_resource *sub_resource;
1660     struct d3d10_texture2d *texture;
1661     D3D10_TEXTURE2D_DESC desc;
1662     HRESULT hr;
1663
1664     FIXME("device_parent %p, container_parent %p, width %u, height %u, format_id %#x, usage %#x,\n"
1665             "\tmultisample_type %#x, multisample_quality %u, surface %p partial stub!\n",
1666             device_parent, container_parent, width, height, format_id, usage,
1667             multisample_type, multisample_quality, surface);
1668
1669     FIXME("Implement DXGI<->wined3d usage conversion\n");
1670
1671     desc.Width = width;
1672     desc.Height = height;
1673     desc.MipLevels = 1;
1674     desc.ArraySize = 1;
1675     desc.Format = dxgi_format_from_wined3dformat(format_id);
1676     desc.SampleDesc.Count = multisample_type ? multisample_type : 1;
1677     desc.SampleDesc.Quality = multisample_quality;
1678     desc.Usage = D3D10_USAGE_DEFAULT;
1679     desc.BindFlags = D3D10_BIND_RENDER_TARGET;
1680     desc.CPUAccessFlags = 0;
1681     desc.MiscFlags = 0;
1682
1683     hr = d3d10_device_CreateTexture2D(&device->ID3D10Device_iface, &desc, NULL,
1684             (ID3D10Texture2D **)&texture);
1685     if (FAILED(hr))
1686     {
1687         ERR("CreateTexture2D failed, returning %#x\n", hr);
1688         return hr;
1689     }
1690
1691     sub_resource = wined3d_texture_get_sub_resource(texture->wined3d_texture, 0);
1692     *surface = wined3d_surface_from_resource(sub_resource);
1693     wined3d_surface_incref(*surface);
1694     ID3D10Texture2D_Release(&texture->ID3D10Texture2D_iface);
1695
1696     return S_OK;
1697 }
1698
1699 static HRESULT CDECL device_parent_create_volume(struct wined3d_device_parent *device_parent,
1700         void *container_parent, UINT width, UINT height, UINT depth, enum wined3d_format_id format,
1701         enum wined3d_pool pool, DWORD usage, struct wined3d_volume **volume)
1702 {
1703     HRESULT hr;
1704
1705     TRACE("device_parent %p, container_parent %p, width %u, height %u, depth %u, "
1706             "format %#x, pool %#x, usage %#x, volume %p.\n",
1707             device_parent, container_parent, width, height, depth,
1708             format, pool, usage, volume);
1709
1710     hr = wined3d_volume_create(device_from_wined3d_device_parent(device_parent)->wined3d_device,
1711             width, height, depth, usage, format, pool, NULL, &d3d10_subresource_parent_ops, volume);
1712     if (FAILED(hr))
1713     {
1714         WARN("Failed to create wined3d volume, hr %#x.\n", hr);
1715         return hr;
1716     }
1717
1718     return S_OK;
1719 }
1720
1721 static HRESULT CDECL device_parent_create_swapchain(struct wined3d_device_parent *device_parent,
1722         struct wined3d_swapchain_desc *desc, struct wined3d_swapchain **swapchain)
1723 {
1724     struct d3d10_device *device = device_from_wined3d_device_parent(device_parent);
1725     IWineDXGIDevice *wine_device;
1726     HRESULT hr;
1727
1728     TRACE("device_parent %p, desc %p, swapchain %p\n", device_parent, desc, swapchain);
1729
1730     hr = d3d10_device_QueryInterface(&device->ID3D10Device_iface, &IID_IWineDXGIDevice,
1731             (void **)&wine_device);
1732     if (FAILED(hr))
1733     {
1734         ERR("Device should implement IWineDXGIDevice\n");
1735         return E_FAIL;
1736     }
1737
1738     hr = IWineDXGIDevice_create_swapchain(wine_device, desc, swapchain);
1739     IWineDXGIDevice_Release(wine_device);
1740     if (FAILED(hr))
1741     {
1742         ERR("Failed to create DXGI swapchain, returning %#x\n", hr);
1743         return hr;
1744     }
1745
1746     return S_OK;
1747 }
1748
1749 static const struct wined3d_device_parent_ops d3d10_wined3d_device_parent_ops =
1750 {
1751     device_parent_wined3d_device_created,
1752     device_parent_mode_changed,
1753     device_parent_create_swapchain_surface,
1754     device_parent_create_texture_surface,
1755     device_parent_create_volume,
1756     device_parent_create_swapchain,
1757 };
1758
1759 void d3d10_device_init(struct d3d10_device *device, void *outer_unknown)
1760 {
1761     device->ID3D10Device_iface.lpVtbl = &d3d10_device_vtbl;
1762     device->IUnknown_inner.lpVtbl = &d3d10_device_inner_unknown_vtbl;
1763     device->IWineDXGIDeviceParent_iface.lpVtbl = &d3d10_dxgi_device_parent_vtbl;
1764     device->device_parent.ops = &d3d10_wined3d_device_parent_ops;
1765     device->refcount = 1;
1766     /* COM aggregation always takes place */
1767     device->outer_unk = outer_unknown;
1768 }