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