Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenbuffer.c
Go to the documentation of this file.
00001 /* 00002 * Copyright 2005 Oliver Stieber 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #include "config.h" 00020 #include <assert.h> 00021 #include "d3d8_private.h" 00022 00023 WINE_DEFAULT_DEBUG_CHANNEL(d3d8); 00024 00025 static inline IDirect3DVertexBuffer8Impl *impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface) 00026 { 00027 return CONTAINING_RECORD(iface, IDirect3DVertexBuffer8Impl, IDirect3DVertexBuffer8_iface); 00028 } 00029 00030 static HRESULT WINAPI d3d8_vertexbuffer_QueryInterface(IDirect3DVertexBuffer8 *iface, REFIID riid, void **object) 00031 { 00032 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); 00033 00034 if (IsEqualGUID(riid, &IID_IDirect3DVertexBuffer8) 00035 || IsEqualGUID(riid, &IID_IDirect3DResource8) 00036 || IsEqualGUID(riid, &IID_IUnknown)) 00037 { 00038 IUnknown_AddRef(iface); 00039 *object = iface; 00040 return S_OK; 00041 } 00042 00043 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); 00044 00045 *object = NULL; 00046 return E_NOINTERFACE; 00047 } 00048 00049 static ULONG WINAPI d3d8_vertexbuffer_AddRef(IDirect3DVertexBuffer8 *iface) 00050 { 00051 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00052 ULONG refcount = InterlockedIncrement(&buffer->ref); 00053 00054 TRACE("%p increasing refcount to %u.\n", iface, refcount); 00055 00056 if (refcount == 1) 00057 { 00058 IDirect3DDevice8_AddRef(buffer->parentDevice); 00059 wined3d_mutex_lock(); 00060 wined3d_buffer_incref(buffer->wineD3DVertexBuffer); 00061 wined3d_mutex_unlock(); 00062 } 00063 00064 return refcount; 00065 } 00066 00067 static ULONG WINAPI d3d8_vertexbuffer_Release(IDirect3DVertexBuffer8 *iface) 00068 { 00069 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00070 ULONG refcount = InterlockedDecrement(&buffer->ref); 00071 00072 TRACE("%p decreasing refcount to %u.\n", iface, refcount); 00073 00074 if (!refcount) 00075 { 00076 IDirect3DDevice8 *device = buffer->parentDevice; 00077 00078 wined3d_mutex_lock(); 00079 wined3d_buffer_decref(buffer->wineD3DVertexBuffer); 00080 wined3d_mutex_unlock(); 00081 00082 /* Release the device last, as it may cause the device to be destroyed. */ 00083 IDirect3DDevice8_Release(device); 00084 } 00085 00086 return refcount; 00087 } 00088 00089 static HRESULT WINAPI d3d8_vertexbuffer_GetDevice(IDirect3DVertexBuffer8 *iface, 00090 IDirect3DDevice8 **device) 00091 { 00092 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00093 00094 TRACE("iface %p, device %p.\n", iface, device); 00095 00096 *device = buffer->parentDevice; 00097 IDirect3DDevice8_AddRef(*device); 00098 00099 TRACE("Returning device %p.\n", *device); 00100 00101 return D3D_OK; 00102 } 00103 00104 static HRESULT WINAPI d3d8_vertexbuffer_SetPrivateData(IDirect3DVertexBuffer8 *iface, 00105 REFGUID guid, const void *data, DWORD data_size, DWORD flags) 00106 { 00107 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00108 struct wined3d_resource *resource; 00109 HRESULT hr; 00110 00111 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", 00112 iface, debugstr_guid(guid), data, data_size, flags); 00113 00114 wined3d_mutex_lock(); 00115 resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer); 00116 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags); 00117 wined3d_mutex_unlock(); 00118 00119 return hr; 00120 } 00121 00122 static HRESULT WINAPI d3d8_vertexbuffer_GetPrivateData(IDirect3DVertexBuffer8 *iface, 00123 REFGUID guid, void *data, DWORD *data_size) 00124 { 00125 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00126 struct wined3d_resource *resource; 00127 HRESULT hr; 00128 00129 TRACE("iface %p, guid %s, data %p, data_size %p.\n", 00130 iface, debugstr_guid(guid), data, data_size); 00131 00132 wined3d_mutex_lock(); 00133 resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer); 00134 hr = wined3d_resource_get_private_data(resource, guid, data, data_size); 00135 wined3d_mutex_unlock(); 00136 00137 return hr; 00138 } 00139 00140 static HRESULT WINAPI d3d8_vertexbuffer_FreePrivateData(IDirect3DVertexBuffer8 *iface, REFGUID guid) 00141 { 00142 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00143 struct wined3d_resource *resource; 00144 HRESULT hr; 00145 00146 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); 00147 00148 wined3d_mutex_lock(); 00149 resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer); 00150 hr = wined3d_resource_free_private_data(resource, guid); 00151 wined3d_mutex_unlock(); 00152 00153 return hr; 00154 } 00155 00156 static DWORD WINAPI d3d8_vertexbuffer_SetPriority(IDirect3DVertexBuffer8 *iface, DWORD priority) 00157 { 00158 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00159 DWORD previous; 00160 00161 TRACE("iface %p, priority %u.\n", iface, priority); 00162 00163 wined3d_mutex_lock(); 00164 previous = wined3d_buffer_set_priority(buffer->wineD3DVertexBuffer, priority); 00165 wined3d_mutex_unlock(); 00166 00167 return previous; 00168 } 00169 00170 static DWORD WINAPI d3d8_vertexbuffer_GetPriority(IDirect3DVertexBuffer8 *iface) 00171 { 00172 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00173 DWORD priority; 00174 00175 TRACE("iface %p.\n", iface); 00176 00177 wined3d_mutex_lock(); 00178 priority = wined3d_buffer_get_priority(buffer->wineD3DVertexBuffer); 00179 wined3d_mutex_unlock(); 00180 00181 return priority; 00182 } 00183 00184 static void WINAPI d3d8_vertexbuffer_PreLoad(IDirect3DVertexBuffer8 *iface) 00185 { 00186 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00187 00188 TRACE("iface %p.\n", iface); 00189 00190 wined3d_mutex_lock(); 00191 wined3d_buffer_preload(buffer->wineD3DVertexBuffer); 00192 wined3d_mutex_unlock(); 00193 } 00194 00195 static D3DRESOURCETYPE WINAPI d3d8_vertexbuffer_GetType(IDirect3DVertexBuffer8 *iface) 00196 { 00197 TRACE("iface %p.\n", iface); 00198 00199 return D3DRTYPE_VERTEXBUFFER; 00200 } 00201 00202 static HRESULT WINAPI d3d8_vertexbuffer_Lock(IDirect3DVertexBuffer8 *iface, UINT offset, UINT size, 00203 BYTE **data, DWORD flags) 00204 { 00205 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00206 HRESULT hr; 00207 00208 TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", 00209 iface, offset, size, data, flags); 00210 00211 wined3d_mutex_lock(); 00212 hr = wined3d_buffer_map(buffer->wineD3DVertexBuffer, offset, size, data, flags); 00213 wined3d_mutex_unlock(); 00214 00215 return hr; 00216 } 00217 00218 static HRESULT WINAPI d3d8_vertexbuffer_Unlock(IDirect3DVertexBuffer8 *iface) 00219 { 00220 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00221 00222 TRACE("iface %p.\n", iface); 00223 00224 wined3d_mutex_lock(); 00225 wined3d_buffer_unmap(buffer->wineD3DVertexBuffer); 00226 wined3d_mutex_unlock(); 00227 00228 return D3D_OK; 00229 } 00230 00231 static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface, 00232 D3DVERTEXBUFFER_DESC *desc) 00233 { 00234 IDirect3DVertexBuffer8Impl *buffer = impl_from_IDirect3DVertexBuffer8(iface); 00235 struct wined3d_resource_desc wined3d_desc; 00236 struct wined3d_resource *wined3d_resource; 00237 00238 TRACE("iface %p, desc %p.\n", iface, desc); 00239 00240 wined3d_mutex_lock(); 00241 wined3d_resource = wined3d_buffer_get_resource(buffer->wineD3DVertexBuffer); 00242 wined3d_resource_get_desc(wined3d_resource, &wined3d_desc); 00243 wined3d_mutex_unlock(); 00244 00245 desc->Type = D3DRTYPE_VERTEXBUFFER; 00246 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; 00247 desc->Pool = wined3d_desc.pool; 00248 desc->Size = wined3d_desc.size; 00249 desc->FVF = buffer->fvf; 00250 desc->Format = D3DFMT_VERTEXDATA; 00251 00252 return D3D_OK; 00253 } 00254 00255 static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = 00256 { 00257 /* IUnknown */ 00258 d3d8_vertexbuffer_QueryInterface, 00259 d3d8_vertexbuffer_AddRef, 00260 d3d8_vertexbuffer_Release, 00261 /* IDirect3DResource8 */ 00262 d3d8_vertexbuffer_GetDevice, 00263 d3d8_vertexbuffer_SetPrivateData, 00264 d3d8_vertexbuffer_GetPrivateData, 00265 d3d8_vertexbuffer_FreePrivateData, 00266 d3d8_vertexbuffer_SetPriority, 00267 d3d8_vertexbuffer_GetPriority, 00268 d3d8_vertexbuffer_PreLoad, 00269 d3d8_vertexbuffer_GetType, 00270 /* IDirect3DVertexBuffer8 */ 00271 d3d8_vertexbuffer_Lock, 00272 d3d8_vertexbuffer_Unlock, 00273 d3d8_vertexbuffer_GetDesc, 00274 }; 00275 00276 static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent) 00277 { 00278 HeapFree(GetProcessHeap(), 0, parent); 00279 } 00280 00281 static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops = 00282 { 00283 d3d8_vertexbuffer_wined3d_object_destroyed, 00284 }; 00285 00286 HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, 00287 UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) 00288 { 00289 HRESULT hr; 00290 00291 buffer->IDirect3DVertexBuffer8_iface.lpVtbl = &Direct3DVertexBuffer8_Vtbl; 00292 buffer->ref = 1; 00293 buffer->fvf = fvf; 00294 00295 wined3d_mutex_lock(); 00296 hr = wined3d_buffer_create_vb(device->wined3d_device, size, usage & WINED3DUSAGE_MASK, 00297 (enum wined3d_pool)pool, buffer, &d3d8_vertexbuffer_wined3d_parent_ops, &buffer->wineD3DVertexBuffer); 00298 wined3d_mutex_unlock(); 00299 if (FAILED(hr)) 00300 { 00301 WARN("Failed to create wined3d buffer, hr %#x.\n", hr); 00302 return hr; 00303 } 00304 00305 buffer->parentDevice = &device->IDirect3DDevice8_iface; 00306 IUnknown_AddRef(buffer->parentDevice); 00307 00308 return D3D_OK; 00309 } 00310 00311 IDirect3DVertexBuffer8Impl *unsafe_impl_from_IDirect3DVertexBuffer8(IDirect3DVertexBuffer8 *iface) 00312 { 00313 if (!iface) 00314 return NULL; 00315 assert(iface->lpVtbl == &Direct3DVertexBuffer8_Vtbl); 00316 00317 return impl_from_IDirect3DVertexBuffer8(iface); 00318 } 00319 00320 static inline IDirect3DIndexBuffer8Impl *impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface) 00321 { 00322 return CONTAINING_RECORD(iface, IDirect3DIndexBuffer8Impl, IDirect3DIndexBuffer8_iface); 00323 } 00324 00325 static HRESULT WINAPI d3d8_indexbuffer_QueryInterface(IDirect3DIndexBuffer8 *iface, REFIID riid, void **object) 00326 { 00327 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); 00328 00329 if (IsEqualGUID(riid, &IID_IDirect3DIndexBuffer8) 00330 || IsEqualGUID(riid, &IID_IDirect3DResource8) 00331 || IsEqualGUID(riid, &IID_IUnknown)) 00332 { 00333 IUnknown_AddRef(iface); 00334 *object = iface; 00335 return S_OK; 00336 } 00337 00338 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); 00339 00340 *object = NULL; 00341 return E_NOINTERFACE; 00342 } 00343 00344 static ULONG WINAPI d3d8_indexbuffer_AddRef(IDirect3DIndexBuffer8 *iface) 00345 { 00346 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00347 ULONG refcount = InterlockedIncrement(&buffer->ref); 00348 00349 TRACE("%p increasing refcount to %u.\n", iface, refcount); 00350 00351 if (refcount == 1) 00352 { 00353 IDirect3DDevice8_AddRef(buffer->parentDevice); 00354 wined3d_mutex_lock(); 00355 wined3d_buffer_incref(buffer->wineD3DIndexBuffer); 00356 wined3d_mutex_unlock(); 00357 } 00358 00359 return refcount; 00360 } 00361 00362 static ULONG WINAPI d3d8_indexbuffer_Release(IDirect3DIndexBuffer8 *iface) 00363 { 00364 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00365 ULONG refcount = InterlockedDecrement(&buffer->ref); 00366 00367 TRACE("%p decreasing refcount to %u.\n", iface, refcount); 00368 00369 if (!refcount) 00370 { 00371 IDirect3DDevice8 *device = buffer->parentDevice; 00372 00373 wined3d_mutex_lock(); 00374 wined3d_buffer_decref(buffer->wineD3DIndexBuffer); 00375 wined3d_mutex_unlock(); 00376 00377 /* Release the device last, as it may cause the device to be destroyed. */ 00378 IDirect3DDevice8_Release(device); 00379 } 00380 00381 return refcount; 00382 } 00383 00384 static HRESULT WINAPI d3d8_indexbuffer_GetDevice(IDirect3DIndexBuffer8 *iface, 00385 IDirect3DDevice8 **device) 00386 { 00387 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00388 00389 TRACE("iface %p, device %p.\n", iface, device); 00390 00391 *device = buffer->parentDevice; 00392 IDirect3DDevice8_AddRef(*device); 00393 00394 TRACE("Returning device %p.\n", *device); 00395 00396 return D3D_OK; 00397 } 00398 00399 static HRESULT WINAPI d3d8_indexbuffer_SetPrivateData(IDirect3DIndexBuffer8 *iface, 00400 REFGUID guid, const void *data, DWORD data_size, DWORD flags) 00401 { 00402 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00403 struct wined3d_resource *resource; 00404 HRESULT hr; 00405 00406 TRACE("iface %p, guid %s, data %p, data_size %u, flags %#x.\n", 00407 iface, debugstr_guid(guid), data, data_size, flags); 00408 00409 wined3d_mutex_lock(); 00410 resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer); 00411 hr = wined3d_resource_set_private_data(resource, guid, data, data_size, flags); 00412 wined3d_mutex_unlock(); 00413 00414 return hr; 00415 } 00416 00417 static HRESULT WINAPI d3d8_indexbuffer_GetPrivateData(IDirect3DIndexBuffer8 *iface, 00418 REFGUID guid, void *data, DWORD *data_size) 00419 { 00420 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00421 struct wined3d_resource *resource; 00422 HRESULT hr; 00423 00424 TRACE("iface %p, guid %s, data %p, data_size %p.\n", 00425 iface, debugstr_guid(guid), data, data_size); 00426 00427 wined3d_mutex_lock(); 00428 resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer); 00429 hr = wined3d_resource_get_private_data(resource, guid, data, data_size); 00430 wined3d_mutex_unlock(); 00431 00432 return hr; 00433 } 00434 00435 static HRESULT WINAPI d3d8_indexbuffer_FreePrivateData(IDirect3DIndexBuffer8 *iface, REFGUID guid) 00436 { 00437 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00438 struct wined3d_resource *resource; 00439 HRESULT hr; 00440 00441 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid)); 00442 00443 wined3d_mutex_lock(); 00444 resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer); 00445 hr = wined3d_resource_free_private_data(resource, guid); 00446 wined3d_mutex_unlock(); 00447 00448 return hr; 00449 } 00450 00451 static DWORD WINAPI d3d8_indexbuffer_SetPriority(IDirect3DIndexBuffer8 *iface, DWORD priority) 00452 { 00453 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00454 DWORD previous; 00455 00456 TRACE("iface %p, priority %u.\n", iface, priority); 00457 00458 wined3d_mutex_lock(); 00459 previous = wined3d_buffer_set_priority(buffer->wineD3DIndexBuffer, priority); 00460 wined3d_mutex_unlock(); 00461 00462 return previous; 00463 } 00464 00465 static DWORD WINAPI d3d8_indexbuffer_GetPriority(IDirect3DIndexBuffer8 *iface) 00466 { 00467 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00468 DWORD priority; 00469 00470 TRACE("iface %p.\n", iface); 00471 00472 wined3d_mutex_lock(); 00473 priority = wined3d_buffer_get_priority(buffer->wineD3DIndexBuffer); 00474 wined3d_mutex_unlock(); 00475 00476 return priority; 00477 } 00478 00479 static void WINAPI d3d8_indexbuffer_PreLoad(IDirect3DIndexBuffer8 *iface) 00480 { 00481 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00482 00483 TRACE("iface %p.\n", iface); 00484 00485 wined3d_mutex_lock(); 00486 wined3d_buffer_preload(buffer->wineD3DIndexBuffer); 00487 wined3d_mutex_unlock(); 00488 } 00489 00490 static D3DRESOURCETYPE WINAPI d3d8_indexbuffer_GetType(IDirect3DIndexBuffer8 *iface) 00491 { 00492 TRACE("iface %p.\n", iface); 00493 00494 return D3DRTYPE_INDEXBUFFER; 00495 } 00496 00497 static HRESULT WINAPI d3d8_indexbuffer_Lock(IDirect3DIndexBuffer8 *iface, UINT offset, UINT size, 00498 BYTE **data, DWORD flags) 00499 { 00500 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00501 HRESULT hr; 00502 00503 TRACE("iface %p, offset %u, size %u, data %p, flags %#x.\n", 00504 iface, offset, size, data, flags); 00505 00506 wined3d_mutex_lock(); 00507 hr = wined3d_buffer_map(buffer->wineD3DIndexBuffer, offset, size, data, flags); 00508 wined3d_mutex_unlock(); 00509 00510 return hr; 00511 } 00512 00513 static HRESULT WINAPI d3d8_indexbuffer_Unlock(IDirect3DIndexBuffer8 *iface) 00514 { 00515 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00516 00517 TRACE("iface %p.\n", iface); 00518 00519 wined3d_mutex_lock(); 00520 wined3d_buffer_unmap(buffer->wineD3DIndexBuffer); 00521 wined3d_mutex_unlock(); 00522 00523 return D3D_OK; 00524 } 00525 00526 static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface, 00527 D3DINDEXBUFFER_DESC *desc) 00528 { 00529 IDirect3DIndexBuffer8Impl *buffer = impl_from_IDirect3DIndexBuffer8(iface); 00530 struct wined3d_resource_desc wined3d_desc; 00531 struct wined3d_resource *wined3d_resource; 00532 00533 TRACE("iface %p, desc %p.\n", iface, desc); 00534 00535 wined3d_mutex_lock(); 00536 wined3d_resource = wined3d_buffer_get_resource(buffer->wineD3DIndexBuffer); 00537 wined3d_resource_get_desc(wined3d_resource, &wined3d_desc); 00538 wined3d_mutex_unlock(); 00539 00540 desc->Format = d3dformat_from_wined3dformat(buffer->format); 00541 desc->Type = D3DRTYPE_INDEXBUFFER; 00542 desc->Usage = wined3d_desc.usage & WINED3DUSAGE_MASK; 00543 desc->Pool = wined3d_desc.pool; 00544 desc->Size = wined3d_desc.size; 00545 00546 return D3D_OK; 00547 } 00548 00549 static const IDirect3DIndexBuffer8Vtbl d3d8_indexbuffer_vtbl = 00550 { 00551 /* IUnknown */ 00552 d3d8_indexbuffer_QueryInterface, 00553 d3d8_indexbuffer_AddRef, 00554 d3d8_indexbuffer_Release, 00555 /* IDirect3DResource8 */ 00556 d3d8_indexbuffer_GetDevice, 00557 d3d8_indexbuffer_SetPrivateData, 00558 d3d8_indexbuffer_GetPrivateData, 00559 d3d8_indexbuffer_FreePrivateData, 00560 d3d8_indexbuffer_SetPriority, 00561 d3d8_indexbuffer_GetPriority, 00562 d3d8_indexbuffer_PreLoad, 00563 d3d8_indexbuffer_GetType, 00564 /* IDirect3DIndexBuffer8 */ 00565 d3d8_indexbuffer_Lock, 00566 d3d8_indexbuffer_Unlock, 00567 d3d8_indexbuffer_GetDesc, 00568 }; 00569 00570 static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent) 00571 { 00572 HeapFree(GetProcessHeap(), 0, parent); 00573 } 00574 00575 static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops = 00576 { 00577 d3d8_indexbuffer_wined3d_object_destroyed, 00578 }; 00579 00580 HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, 00581 UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) 00582 { 00583 HRESULT hr; 00584 00585 buffer->IDirect3DIndexBuffer8_iface.lpVtbl = &d3d8_indexbuffer_vtbl; 00586 buffer->ref = 1; 00587 buffer->format = wined3dformat_from_d3dformat(format); 00588 00589 wined3d_mutex_lock(); 00590 hr = wined3d_buffer_create_ib(device->wined3d_device, size, usage & WINED3DUSAGE_MASK, 00591 (enum wined3d_pool)pool, buffer, &d3d8_indexbuffer_wined3d_parent_ops, &buffer->wineD3DIndexBuffer); 00592 wined3d_mutex_unlock(); 00593 if (FAILED(hr)) 00594 { 00595 WARN("Failed to create wined3d buffer, hr %#x.\n", hr); 00596 return hr; 00597 } 00598 00599 buffer->parentDevice = &device->IDirect3DDevice8_iface; 00600 IUnknown_AddRef(buffer->parentDevice); 00601 00602 return D3D_OK; 00603 } 00604 00605 IDirect3DIndexBuffer8Impl *unsafe_impl_from_IDirect3DIndexBuffer8(IDirect3DIndexBuffer8 *iface) 00606 { 00607 if (!iface) 00608 return NULL; 00609 assert(iface->lpVtbl == &d3d8_indexbuffer_vtbl); 00610 00611 return impl_from_IDirect3DIndexBuffer8(iface); 00612 } Generated on Sat May 26 2012 04:20:06 for ReactOS by
1.7.6.1
|