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_clear_bits(BYTE
*field
, UINT field_size
, UINT start_bit
, UINT count
)
149 UINT end_bit
= start_bit
+ count
;
150 BYTE start_mask
= 0x7f >> (~start_bit
& 7);
151 BYTE end_mask
= 0xff << (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
], 0, end_idx
- start_idx
);
173 field
[end_idx
] &= end_mask
;
178 HRESULT WINAPI
D3D10StateBlockMaskDifference(D3D10_STATE_BLOCK_MASK
*mask_x
,
179 D3D10_STATE_BLOCK_MASK
*mask_y
, D3D10_STATE_BLOCK_MASK
*result
)
181 UINT count
= sizeof(*result
) / sizeof(DWORD
);
184 TRACE("mask_x %p, mask_y %p, result %p.\n", mask_x
, mask_y
, result
);
186 if (!mask_x
|| !mask_y
|| !result
)
189 for (i
= 0; i
< count
; ++i
)
191 ((DWORD
*)result
)[i
] = ((DWORD
*)mask_x
)[i
] ^ ((DWORD
*)mask_y
)[i
];
193 for (i
= count
* sizeof(DWORD
); i
< sizeof(*result
); ++i
)
195 ((BYTE
*)result
)[i
] = ((BYTE
*)mask_x
)[i
] ^ ((BYTE
*)mask_y
)[i
];
201 HRESULT WINAPI
D3D10StateBlockMaskDisableAll(D3D10_STATE_BLOCK_MASK
*mask
)
203 TRACE("mask %p.\n", mask
);
208 memset(mask
, 0, sizeof(*mask
));
213 HRESULT WINAPI
D3D10StateBlockMaskDisableCapture(D3D10_STATE_BLOCK_MASK
*mask
,
214 D3D10_DEVICE_STATE_TYPES state_type
, UINT start_idx
, UINT count
)
216 TRACE("mask %p state_type %s, start_idx %u, count %u.\n",
217 mask
, debug_d3d10_device_state_types(state_type
), start_idx
, count
);
224 case D3D10_DST_SO_BUFFERS
:
225 return stateblock_mask_clear_bits(&mask
->SOBuffers
, 1, start_idx
, count
);
226 case D3D10_DST_OM_RENDER_TARGETS
:
227 return stateblock_mask_clear_bits(&mask
->OMRenderTargets
, 1, start_idx
, count
);
228 case D3D10_DST_DEPTH_STENCIL_STATE
:
229 return stateblock_mask_clear_bits(&mask
->OMDepthStencilState
, 1, start_idx
, count
);
230 case D3D10_DST_BLEND_STATE
:
231 return stateblock_mask_clear_bits(&mask
->OMBlendState
, 1, start_idx
, count
);
233 return stateblock_mask_clear_bits(&mask
->VS
, 1, start_idx
, count
);
234 case D3D10_DST_VS_SAMPLERS
:
235 return stateblock_mask_clear_bits(mask
->VSSamplers
,
236 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
237 case D3D10_DST_VS_SHADER_RESOURCES
:
238 return stateblock_mask_clear_bits(mask
->VSShaderResources
,
239 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
240 case D3D10_DST_VS_CONSTANT_BUFFERS
:
241 return stateblock_mask_clear_bits(mask
->VSConstantBuffers
,
242 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
244 return stateblock_mask_clear_bits(&mask
->GS
, 1, start_idx
, count
);
245 case D3D10_DST_GS_SAMPLERS
:
246 return stateblock_mask_clear_bits(mask
->GSSamplers
,
247 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
248 case D3D10_DST_GS_SHADER_RESOURCES
:
249 return stateblock_mask_clear_bits(mask
->GSShaderResources
,
250 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
251 case D3D10_DST_GS_CONSTANT_BUFFERS
:
252 return stateblock_mask_clear_bits(mask
->GSConstantBuffers
,
253 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
255 return stateblock_mask_clear_bits(&mask
->PS
, 1, start_idx
, count
);
256 case D3D10_DST_PS_SAMPLERS
:
257 return stateblock_mask_clear_bits(mask
->PSSamplers
,
258 D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT
, start_idx
, count
);
259 case D3D10_DST_PS_SHADER_RESOURCES
:
260 return stateblock_mask_clear_bits(mask
->PSShaderResources
,
261 D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
262 case D3D10_DST_PS_CONSTANT_BUFFERS
:
263 return stateblock_mask_clear_bits(mask
->PSConstantBuffers
,
264 D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT
, start_idx
, count
);
265 case D3D10_DST_IA_VERTEX_BUFFERS
:
266 return stateblock_mask_clear_bits(mask
->IAVertexBuffers
,
267 D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
, start_idx
, count
);
268 case D3D10_DST_IA_INDEX_BUFFER
:
269 return stateblock_mask_clear_bits(&mask
->IAIndexBuffer
, 1, start_idx
, count
);
270 case D3D10_DST_IA_INPUT_LAYOUT
:
271 return stateblock_mask_clear_bits(&mask
->IAInputLayout
, 1, start_idx
, count
);
272 case D3D10_DST_IA_PRIMITIVE_TOPOLOGY
:
273 return stateblock_mask_clear_bits(&mask
->IAPrimitiveTopology
, 1, start_idx
, count
);
274 case D3D10_DST_RS_VIEWPORTS
:
275 return stateblock_mask_clear_bits(&mask
->RSViewports
, 1, start_idx
, count
);
276 case D3D10_DST_RS_SCISSOR_RECTS
:
277 return stateblock_mask_clear_bits(&mask
->RSScissorRects
, 1, start_idx
, count
);
278 case D3D10_DST_RS_RASTERIZER_STATE
:
279 return stateblock_mask_clear_bits(&mask
->RSRasterizerState
, 1, start_idx
, count
);
280 case D3D10_DST_PREDICATION
:
281 return stateblock_mask_clear_bits(&mask
->Predication
, 1, start_idx
, count
);
283 FIXME("Unhandled state_type %#x.\n", state_type
);
288 HRESULT WINAPI
D3D10StateBlockMaskEnableAll(D3D10_STATE_BLOCK_MASK
*mask
)
290 TRACE("mask %p.\n", mask
);
295 memset(mask
, 0xff, sizeof(*mask
));