ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

buffer.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.