2 * Copyright 2011 Henri Verbeet for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/port.h"
23 #include "d3d10_private.h"
25 WINE_DEFAULT_DEBUG_CHANNEL(d3d10
);
27 struct d3d10_stateblock
29 ID3D10StateBlock ID3D10StateBlock_iface
;
33 static inline struct d3d10_stateblock
*impl_from_ID3D10StateBlock(ID3D10StateBlock
*iface
)
35 return CONTAINING_RECORD(iface
, struct d3d10_stateblock
, ID3D10StateBlock_iface
);
38 static HRESULT STDMETHODCALLTYPE
d3d10_stateblock_QueryInterface(ID3D10StateBlock
*iface
, REFIID iid
, void **object
)
40 struct d3d10_stateblock
*stateblock
;
42 TRACE("iface %p, iid %s, object %p.\n", iface
, debugstr_guid(iid
), object
);
44 stateblock
= impl_from_ID3D10StateBlock(iface
);
46 if (IsEqualGUID(iid
, &IID_ID3D10StateBlock
)
47 || IsEqualGUID(iid
, &IID_IUnknown
))
49 IUnknown_AddRef(&stateblock
->ID3D10StateBlock_iface
);
50 *object
= &stateblock
->ID3D10StateBlock_iface
;
54 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid
));
60 static ULONG STDMETHODCALLTYPE
d3d10_stateblock_AddRef(ID3D10StateBlock
*iface
)
62 struct d3d10_stateblock
*stateblock
= impl_from_ID3D10StateBlock(iface
);
63 ULONG refcount
= InterlockedIncrement(&stateblock
->refcount
);
65 TRACE("%p increasing refcount to %u.\n", stateblock
, refcount
);
70 static ULONG STDMETHODCALLTYPE
d3d10_stateblock_Release(ID3D10StateBlock
*iface
)
72 struct d3d10_stateblock
*stateblock
= impl_from_ID3D10StateBlock(iface
);
73 ULONG refcount
= InterlockedDecrement(&stateblock
->refcount
);
75 TRACE("%p decreasing refcount to %u.\n", stateblock
, refcount
);
78 HeapFree(GetProcessHeap(), 0, stateblock
);
83 static HRESULT STDMETHODCALLTYPE
d3d10_stateblock_Capture(ID3D10StateBlock
*iface
)
85 FIXME("iface %p stub!\n", iface
);
90 static HRESULT STDMETHODCALLTYPE
d3d10_stateblock_Apply(ID3D10StateBlock
*iface
)
92 FIXME("iface %p stub!\n", iface
);
97 static HRESULT STDMETHODCALLTYPE
d3d10_stateblock_ReleaseAllDeviceObjects(ID3D10StateBlock
*iface
)
99 FIXME("iface %p stub!\n", iface
);
104 static HRESULT STDMETHODCALLTYPE
d3d10_stateblock_GetDevice(ID3D10StateBlock
*iface
, ID3D10Device
**device
)
106 FIXME("iface %p, device %p stub!\n", iface
, device
);
111 static const struct ID3D10StateBlockVtbl d3d10_stateblock_vtbl
=
113 /* IUnknown methods */
114 d3d10_stateblock_QueryInterface
,
115 d3d10_stateblock_AddRef
,
116 d3d10_stateblock_Release
,
117 /* ID3D10StateBlock methods */
118 d3d10_stateblock_Capture
,
119 d3d10_stateblock_Apply
,
120 d3d10_stateblock_ReleaseAllDeviceObjects
,
121 d3d10_stateblock_GetDevice
,
124 HRESULT WINAPI
D3D10CreateStateBlock(ID3D10Device
*device
,
125 D3D10_STATE_BLOCK_MASK
*mask
, ID3D10StateBlock
**stateblock
)
127 struct d3d10_stateblock
*object
;
129 FIXME("device %p, mask %p, stateblock %p stub!\n", device
, mask
, stateblock
);
131 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
));
134 ERR("Failed to allocate D3D10 stateblock object memory.\n");
135 return E_OUTOFMEMORY
;
138 object
->ID3D10StateBlock_iface
.lpVtbl
= &d3d10_stateblock_vtbl
;
139 object
->refcount
= 1;
141 TRACE("Created stateblock %p.\n", object
);
142 *stateblock
= &object
->ID3D10StateBlock_iface
;
147 static HRESULT
stateblock_mask_set_bits(BYTE
*field
, UINT field_size
, UINT start_bit
, UINT count
)
149 UINT end_bit
= start_bit
+ count
;
150 BYTE start_mask
= 0xff << (start_bit
& 7);
151 BYTE end_mask
= 0x7f >> (~end_bit
& 7);
152 UINT start_idx
= start_bit
>> 3;
153 UINT end_idx
= end_bit
>> 3;
155 if (start_bit
>= field_size
|| field_size
- start_bit
< count
)
158 if (start_idx
== end_idx
)
160 field
[start_idx
] |= start_mask
& end_mask
;
166 field
[start_idx
] |= start_mask
;
170 memset(&field
[start_idx
], 0xff, end_idx
- start_idx
);
173 field
[end_idx
] |= end_mask
;
178 static HRESULT
stateblock_mask_clear_bits(BYTE
*field
, UINT field_size
, UINT start_bit
, UINT count
)
180 UINT end_bit
= start_bit
+ count
;
181 BYTE start_mask
= 0x7f >> (~start_bit
& 7);
182 BYTE end_mask
= 0xff << (end_bit
& 7);
183 UINT start_idx
= start_bit
>> 3;
184 UINT end_idx
= end_bit
>> 3;
186 if (start_bit
>= field_size
|| field_size
- start_bit
< count
)
189 if (start_idx
== end_idx
)
191 field
[start_idx
] &= start_mask
| end_mask
;
197 field
[start_idx
] &= start_mask
;
201 memset(&field
[start_idx
], 0, end_idx
- start_idx
);
204 field
[end_idx
] &= end_mask
;
209 HRESULT WINAPI
D3D10StateBlockMaskDifference(D3D10_STATE_BLOCK_MASK
*mask_x
,
210 D3D10_STATE_BLOCK_MASK
*mask_y
, D3D10_STATE_BLOCK_MASK
*result
)
212 UINT count
= sizeof(*result
) / sizeof(DWORD
);
215 TRACE("mask_x %p, mask_y %p, result %p.\n", mask_x
, mask_y
, result
);
217 if (!mask_x
|| !mask_y
|| !result
)
220 for (i
= 0; i
< count
; ++i
)
222 ((DWORD
*)result
)[i
] = ((DWORD
*)mask_x
)[i
] ^ ((DWORD
*)mask_y
)[i
];
224 for (i
= count
* sizeof(DWORD
); i
< sizeof(*result
); ++i
)
226 ((BYTE
*)result
)[i
] = ((BYTE
*)mask_x
)[i
] ^ ((BYTE
*)mask_y
)[i
];
232 HRESULT WINAPI
D3D10StateBlockMaskDisableAll(D3D10_STATE_BLOCK_MASK
*mask
)
234 TRACE("mask %p.\n", mask
);
239 memset(mask
, 0, sizeof(*mask
));
244 HRESULT WINAPI
D3D10StateBlockMaskDisableCapture(D3D10_STATE_BLOCK_MASK
*mask
,
245 D3D10_DEVICE_STATE_TYPES state_type
, UINT start_idx
, UINT count
)
247 TRACE("mask %p state_type %s, start_idx %u, count %u.\n",
248 mask
, debug_d3d10_device_state_types(state_type
), start_idx
, count
);
255 case D3D10_DST_SO_BUFFERS
:
256 return stateblock_mask_clear_bits(&mask
->SOBuffers
, 1, start_idx
, count
);
257 case D3D10_DST_OM_RENDER_TARGETS
:
258 return stateblock_mask_clear_bits(&mask
->OMRenderTargets
, 1, start_idx
, count
);
259 case D3D10_DST_DEPTH_STENCIL_STATE
:
260 return stateblock_mask_clear_bits(&mask
->OMDepthStencilState
, 1, start_idx
, count
);
261 case D3D10_DST_BLEND_STATE
:
262 return stateblock_mask_clear_bits(&mask
->OMBlendState
, 1, start_idx
, count
);
264 return stateblock_mask_clear_bits(&mask
->VS
, 1, start_idx
, count
);
265 case D3D10_DST_VS_SAMPLERS
:
266 return stateblock_mask_clear_bits(mask
->VSSamplers
,
267 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
268 case D3D10_DST_VS_SHADER_RESOURCES
:
269 return stateblock_mask_clear_bits(mask
->VSShaderResources
,
270 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
271 case D3D10_DST_VS_CONSTANT_BUFFERS
:
272 return stateblock_mask_clear_bits(mask
->VSConstantBuffers
,
273 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
275 return stateblock_mask_clear_bits(&mask
->GS
, 1, start_idx
, count
);
276 case D3D10_DST_GS_SAMPLERS
:
277 return stateblock_mask_clear_bits(mask
->GSSamplers
,
278 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
279 case D3D10_DST_GS_SHADER_RESOURCES
:
280 return stateblock_mask_clear_bits(mask
->GSShaderResources
,
281 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
282 case D3D10_DST_GS_CONSTANT_BUFFERS
:
283 return stateblock_mask_clear_bits(mask
->GSConstantBuffers
,
284 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
286 return stateblock_mask_clear_bits(&mask
->PS
, 1, start_idx
, count
);
287 case D3D10_DST_PS_SAMPLERS
:
288 return stateblock_mask_clear_bits(mask
->PSSamplers
,
289 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
290 case D3D10_DST_PS_SHADER_RESOURCES
:
291 return stateblock_mask_clear_bits(mask
->PSShaderResources
,
292 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
293 case D3D10_DST_PS_CONSTANT_BUFFERS
:
294 return stateblock_mask_clear_bits(mask
->PSConstantBuffers
,
295 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
296 case D3D10_DST_IA_VERTEX_BUFFERS
:
297 return stateblock_mask_clear_bits(mask
->IAVertexBuffers
,
298 D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
299 case D3D10_DST_IA_INDEX_BUFFER
:
300 return stateblock_mask_clear_bits(&mask
->IAIndexBuffer
, 1, start_idx
, count
);
301 case D3D10_DST_IA_INPUT_LAYOUT
:
302 return stateblock_mask_clear_bits(&mask
->IAInputLayout
, 1, start_idx
, count
);
303 case D3D10_DST_IA_PRIMITIVE_TOPOLOGY
:
304 return stateblock_mask_clear_bits(&mask
->IAPrimitiveTopology
, 1, start_idx
, count
);
305 case D3D10_DST_RS_VIEWPORTS
:
306 return stateblock_mask_clear_bits(&mask
->RSViewports
, 1, start_idx
, count
);
307 case D3D10_DST_RS_SCISSOR_RECTS
:
308 return stateblock_mask_clear_bits(&mask
->RSScissorRects
, 1, start_idx
, count
);
309 case D3D10_DST_RS_RASTERIZER_STATE
:
310 return stateblock_mask_clear_bits(&mask
->RSRasterizerState
, 1, start_idx
, count
);
311 case D3D10_DST_PREDICATION
:
312 return stateblock_mask_clear_bits(&mask
->Predication
, 1, start_idx
, count
);
314 FIXME("Unhandled state_type %#x.\n", state_type
);
319 HRESULT WINAPI
D3D10StateBlockMaskEnableAll(D3D10_STATE_BLOCK_MASK
*mask
)
321 TRACE("mask %p.\n", mask
);
326 memset(mask
, 0xff, sizeof(*mask
));
331 HRESULT WINAPI
D3D10StateBlockMaskEnableCapture(D3D10_STATE_BLOCK_MASK
*mask
,
332 D3D10_DEVICE_STATE_TYPES state_type
, UINT start_idx
, UINT count
)
334 TRACE("mask %p state_type %s, start_idx %u, count %u.\n",
335 mask
, debug_d3d10_device_state_types(state_type
), start_idx
, count
);
342 case D3D10_DST_SO_BUFFERS
:
343 return stateblock_mask_set_bits(&mask
->SOBuffers
, 1, start_idx
, count
);
344 case D3D10_DST_OM_RENDER_TARGETS
:
345 return stateblock_mask_set_bits(&mask
->OMRenderTargets
, 1, start_idx
, count
);
346 case D3D10_DST_DEPTH_STENCIL_STATE
:
347 return stateblock_mask_set_bits(&mask
->OMDepthStencilState
, 1, start_idx
, count
);
348 case D3D10_DST_BLEND_STATE
:
349 return stateblock_mask_set_bits(&mask
->OMBlendState
, 1, start_idx
, count
);
351 return stateblock_mask_set_bits(&mask
->VS
, 1, start_idx
, count
);
352 case D3D10_DST_VS_SAMPLERS
:
353 return stateblock_mask_set_bits(mask
->VSSamplers
,
354 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
355 case D3D10_DST_VS_SHADER_RESOURCES
:
356 return stateblock_mask_set_bits(mask
->VSShaderResources
,
357 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
358 case D3D10_DST_VS_CONSTANT_BUFFERS
:
359 return stateblock_mask_set_bits(mask
->VSConstantBuffers
,
360 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
362 return stateblock_mask_set_bits(&mask
->GS
, 1, start_idx
, count
);
363 case D3D10_DST_GS_SAMPLERS
:
364 return stateblock_mask_set_bits(mask
->GSSamplers
,
365 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
366 case D3D10_DST_GS_SHADER_RESOURCES
:
367 return stateblock_mask_set_bits(mask
->GSShaderResources
,
368 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
369 case D3D10_DST_GS_CONSTANT_BUFFERS
:
370 return stateblock_mask_set_bits(mask
->GSConstantBuffers
,
371 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
373 return stateblock_mask_set_bits(&mask
->PS
, 1, start_idx
, count
);
374 case D3D10_DST_PS_SAMPLERS
:
375 return stateblock_mask_set_bits(mask
->PSSamplers
,
376 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
377 case D3D10_DST_PS_SHADER_RESOURCES
:
378 return stateblock_mask_set_bits(mask
->PSShaderResources
,
379 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
380 case D3D10_DST_PS_CONSTANT_BUFFERS
:
381 return stateblock_mask_set_bits(mask
->PSConstantBuffers
,
382 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
383 case D3D10_DST_IA_VERTEX_BUFFERS
:
384 return stateblock_mask_set_bits(mask
->IAVertexBuffers
,
385 D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
386 case D3D10_DST_IA_INDEX_BUFFER
:
387 return stateblock_mask_set_bits(&mask
->IAIndexBuffer
, 1, start_idx
, count
);
388 case D3D10_DST_IA_INPUT_LAYOUT
:
389 return stateblock_mask_set_bits(&mask
->IAInputLayout
, 1, start_idx
, count
);
390 case D3D10_DST_IA_PRIMITIVE_TOPOLOGY
:
391 return stateblock_mask_set_bits(&mask
->IAPrimitiveTopology
, 1, start_idx
, count
);
392 case D3D10_DST_RS_VIEWPORTS
:
393 return stateblock_mask_set_bits(&mask
->RSViewports
, 1, start_idx
, count
);
394 case D3D10_DST_RS_SCISSOR_RECTS
:
395 return stateblock_mask_set_bits(&mask
->RSScissorRects
, 1, start_idx
, count
);
396 case D3D10_DST_RS_RASTERIZER_STATE
:
397 return stateblock_mask_set_bits(&mask
->RSRasterizerState
, 1, start_idx
, count
);
398 case D3D10_DST_PREDICATION
:
399 return stateblock_mask_set_bits(&mask
->Predication
, 1, start_idx
, count
);
401 FIXME("Unhandled state_type %#x.\n", state_type
);