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

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