wined3d: Merge indexbuffer.c with buffer.c.
Henri Verbeet
hverbeet at codeweavers.com
Mon Feb 23 02:16:06 CST 2009
---
dlls/wined3d/Makefile.in | 1 -
dlls/wined3d/buffer.c | 251 ++++++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/indexbuffer.c | 232 ----------------------------------------
3 files changed, 251 insertions(+), 233 deletions(-)
delete mode 100644 dlls/wined3d/indexbuffer.c
diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in
index 1297db5..03826c8 100644
--- a/dlls/wined3d/Makefile.in
+++ b/dlls/wined3d/Makefile.in
@@ -20,7 +20,6 @@ C_SRCS = \
drawprim.c \
gl_compat.c \
glsl_shader.c \
- indexbuffer.c \
nvidia_texture_shader.c \
palette.c \
pixelshader.c \
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index b3c2442..c0d92c5 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -2,6 +2,7 @@
* Copyright 2002-2005 Jason Edmeades
* Copyright 2002-2005 Raphael Junqueira
* Copyright 2004 Christian Costa
+ * Copyright 2005 Oliver Stieber
* Copyright 2007 Stefan Dösinger for CodeWeavers
* Copyright 2009 Henri Verbeet for CodeWeavers
*
@@ -1096,3 +1097,253 @@ const BYTE *IWineD3DVertexBufferImpl_GetMemory(IWineD3DVertexBuffer *iface, DWOR
return (const BYTE *)iOffset;
}
}
+
+/* IUnknown methods */
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_QueryInterface(IWineD3DIndexBuffer *iface,
+ REFIID riid, void **object)
+{
+ TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
+
+ if (IsEqualGUID(riid, &IID_IWineD3DIndexBuffer)
+ || IsEqualGUID(riid, &IID_IWineD3DResource)
+ || IsEqualGUID(riid, &IID_IWineD3DBase)
+ || IsEqualGUID(riid, &IID_IUnknown))
+ {
+ IUnknown_AddRef(iface);
+ *object = iface;
+ return S_OK;
+ }
+
+ WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
+
+ *object = NULL;
+
+ return E_NOINTERFACE;
+}
+
+static ULONG STDMETHODCALLTYPE IWineD3DIndexBufferImpl_AddRef(IWineD3DIndexBuffer *iface)
+{
+ IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
+ ULONG refcount = InterlockedIncrement(&This->resource.ref);
+
+ TRACE("%p increasing refcount to %u\n", This, refcount);
+
+ return refcount;
+}
+
+static ULONG STDMETHODCALLTYPE IWineD3DIndexBufferImpl_Release(IWineD3DIndexBuffer *iface)
+{
+ IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
+ ULONG refcount = InterlockedDecrement(&This->resource.ref);
+
+ TRACE("%p decreasing refcount to %u\n", This, refcount);
+
+ if (!refcount)
+ {
+ if (This->vbo)
+ {
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+
+ ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ENTER_GL();
+ /* No need to manually unset the buffer. glDeleteBuffers unsets it for the current context,
+ * but not for other contexts. However, because the d3d buffer is destroyed the app has to
+ * unset it before doing the next draw, thus dirtifying the index buffer state and forcing
+ * binding a new buffer
+ */
+ GL_EXTCALL(glDeleteBuffersARB(1, &This->vbo));
+ checkGLcall("glDeleteBuffersARB");
+ LEAVE_GL();
+ }
+
+ resource_cleanup((IWineD3DResource *)iface);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return refcount;
+}
+
+/* IWineD3DBase methods */
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_GetParent(IWineD3DIndexBuffer *iface, IUnknown **parent)
+{
+ return resource_get_parent((IWineD3DResource *)iface, parent);
+}
+
+/* IWineD3DResource methods */
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_GetDevice(IWineD3DIndexBuffer *iface, IWineD3DDevice **device)
+{
+ return resource_get_device((IWineD3DResource *)iface, device);
+}
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_SetPrivateData(IWineD3DIndexBuffer *iface,
+ REFGUID guid, const void *data, DWORD data_size, DWORD flags)
+{
+ return resource_set_private_data((IWineD3DResource *)iface, guid, data, data_size, flags);
+}
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_GetPrivateData(IWineD3DIndexBuffer *iface,
+ REFGUID guid, void *data, DWORD *data_size)
+{
+ return resource_get_private_data((IWineD3DResource *)iface, guid, data, data_size);
+}
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_FreePrivateData(IWineD3DIndexBuffer *iface, REFGUID guid)
+{
+ return resource_free_private_data((IWineD3DResource *)iface, guid);
+}
+
+static DWORD STDMETHODCALLTYPE IWineD3DIndexBufferImpl_SetPriority(IWineD3DIndexBuffer *iface, DWORD priority)
+{
+ return resource_set_priority((IWineD3DResource *)iface, priority);
+}
+
+static DWORD STDMETHODCALLTYPE IWineD3DIndexBufferImpl_GetPriority(IWineD3DIndexBuffer *iface)
+{
+ return resource_get_priority((IWineD3DResource *)iface);
+}
+
+static void STDMETHODCALLTYPE IWineD3DIndexBufferImpl_PreLoad(IWineD3DIndexBuffer *iface)
+{
+ TRACE("iface %p\n", iface);
+}
+
+static void STDMETHODCALLTYPE IWineD3DIndexBufferImpl_UnLoad(IWineD3DIndexBuffer *iface)
+{
+ IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *) iface;
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+
+ TRACE("(%p)\n", This);
+
+ /* This is easy: The whole content is shadowed in This->resource.allocatedMemory,
+ * so we only have to destroy the vbo. Only do it if we have a vbo, which implies
+ * that vbos are supported.
+ * (TODO: Make a IWineD3DBuffer base class for index and vertex buffers and share
+ * this code. Also needed for D3D10)
+ */
+ if (This->vbo)
+ {
+ ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+ ENTER_GL();
+ GL_EXTCALL(glDeleteBuffersARB(1, &This->vbo));
+ checkGLcall("glDeleteBuffersARB");
+ LEAVE_GL();
+ This->vbo = 0;
+ }
+}
+
+static WINED3DRESOURCETYPE STDMETHODCALLTYPE IWineD3DIndexBufferImpl_GetType(IWineD3DIndexBuffer *iface)
+{
+ return resource_get_type((IWineD3DResource *)iface);
+}
+
+/* IWineD3DIndexBuffer methods */
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_Lock(IWineD3DIndexBuffer *iface,
+ UINT OffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD Flags)
+{
+ IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
+
+ TRACE("(%p) : offset %d, size %d, Flags=%x\n", This, OffsetToLock, SizeToLock, Flags);
+
+ InterlockedIncrement(&This->lockcount);
+ *ppbData = This->resource.allocatedMemory + OffsetToLock;
+
+ if (Flags & (WINED3DLOCK_READONLY | WINED3DLOCK_NO_DIRTY_UPDATE) || !This->vbo)
+ {
+ return WINED3D_OK;
+ }
+
+ if (This->dirtystart != This->dirtyend)
+ {
+ if (This->dirtystart > OffsetToLock) This->dirtystart = OffsetToLock;
+ if (SizeToLock)
+ {
+ if (This->dirtyend < OffsetToLock + SizeToLock) This->dirtyend = OffsetToLock + SizeToLock;
+ }
+ else
+ {
+ This->dirtyend = This->resource.size;
+ }
+ }
+ else
+ {
+ This->dirtystart = OffsetToLock;
+ if (SizeToLock) This->dirtyend = OffsetToLock + SizeToLock;
+ else This->dirtyend = This->resource.size;
+ }
+
+ return WINED3D_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_Unlock(IWineD3DIndexBuffer *iface)
+{
+ IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
+ ULONG locks = InterlockedDecrement(&This->lockcount);
+
+ TRACE("(%p)\n", This);
+
+ /* For now load in unlock */
+ if (!locks && This->vbo && (This->dirtyend - This->dirtystart) > 0)
+ {
+ IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
+
+ ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
+
+ ENTER_GL();
+ GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, This->vbo));
+ checkGLcall("glBindBufferARB");
+ GL_EXTCALL(glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, This->dirtystart,
+ This->dirtyend - This->dirtystart, This->resource.allocatedMemory + This->dirtystart));
+ checkGLcall("glBufferSubDataARB");
+ LEAVE_GL();
+ This->dirtystart = 0;
+ This->dirtyend = 0;
+ /* TODO: Move loading into preload when the buffer is used, that avoids dirtifying the state */
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_INDEXBUFFER);
+ }
+
+ return WINED3D_OK;
+}
+
+static HRESULT STDMETHODCALLTYPE IWineD3DIndexBufferImpl_GetDesc(IWineD3DIndexBuffer *iface,
+ WINED3DINDEXBUFFER_DESC *pDesc)
+{
+ IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
+
+ TRACE("(%p)\n", This);
+
+ pDesc->Format = This->resource.format;
+ pDesc->Type = This->resource.resourceType;
+ pDesc->Usage = This->resource.usage;
+ pDesc->Pool = This->resource.pool;
+ pDesc->Size = This->resource.size;
+
+ return WINED3D_OK;
+}
+
+const IWineD3DIndexBufferVtbl IWineD3DIndexBuffer_Vtbl =
+{
+ /* IUnknown methods */
+ IWineD3DIndexBufferImpl_QueryInterface,
+ IWineD3DIndexBufferImpl_AddRef,
+ IWineD3DIndexBufferImpl_Release,
+ /* IWineD3DBase methods */
+ IWineD3DIndexBufferImpl_GetParent,
+ /* IWineD3DResource methods */
+ IWineD3DIndexBufferImpl_GetDevice,
+ IWineD3DIndexBufferImpl_SetPrivateData,
+ IWineD3DIndexBufferImpl_GetPrivateData,
+ IWineD3DIndexBufferImpl_FreePrivateData,
+ IWineD3DIndexBufferImpl_SetPriority,
+ IWineD3DIndexBufferImpl_GetPriority,
+ IWineD3DIndexBufferImpl_PreLoad,
+ IWineD3DIndexBufferImpl_UnLoad,
+ IWineD3DIndexBufferImpl_GetType,
+ /* IWineD3DIndexBuffer methods */
+ IWineD3DIndexBufferImpl_Lock,
+ IWineD3DIndexBufferImpl_Unlock,
+ IWineD3DIndexBufferImpl_GetDesc,
+};
diff --git a/dlls/wined3d/indexbuffer.c b/dlls/wined3d/indexbuffer.c
deleted file mode 100644
index 2325f70..0000000
--- a/dlls/wined3d/indexbuffer.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * IWineD3DIndexBuffer Implementation
- *
- * Copyright 2002-2004 Jason Edmeades
- * Copyright 2003-2004 Raphael Junqueira
- * Copyright 2004 Christian Costa
- * Copyright 2005 Oliver Stieber
- * Copyright 2007 Stefan Dösinger for CodeWeavers
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-#include "wined3d_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->resource.wineD3DDevice->adapter->gl_info
-
-/* *******************************************
- IWineD3DIndexBuffer IUnknown parts follow
- ******************************************* */
-static HRESULT WINAPI IWineD3DIndexBufferImpl_QueryInterface(IWineD3DIndexBuffer *iface, REFIID riid, LPVOID *ppobj)
-{
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
- TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj);
- if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IWineD3DBase)
- || IsEqualGUID(riid, &IID_IWineD3DResource)
- || IsEqualGUID(riid, &IID_IWineD3DIndexBuffer)){
- IUnknown_AddRef(iface);
- *ppobj = This;
- return S_OK;
- }
- *ppobj = NULL;
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IWineD3DIndexBufferImpl_AddRef(IWineD3DIndexBuffer *iface) {
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
- ULONG ref = InterlockedIncrement(&This->resource.ref);
- TRACE("(%p) : AddRef increasing from %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IWineD3DIndexBufferImpl_Release(IWineD3DIndexBuffer *iface) {
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
- ULONG ref = InterlockedDecrement(&This->resource.ref);
- TRACE("(%p) : Releasing from %d\n", This, ref + 1);
- if (ref == 0) {
- if(This->vbo) {
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
-
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- /* No need to manually unset the buffer. glDeleteBuffers unsets it for the current context,
- * but not for other contexts. However, because the d3d buffer is destroyed the app has to
- * unset it before doing the next draw, thus dirtifying the index buffer state and forcing
- * binding a new buffer
- */
- GL_EXTCALL(glDeleteBuffersARB(1, &This->vbo));
- checkGLcall("glDeleteBuffersARB");
- LEAVE_GL();
- }
-
- resource_cleanup((IWineD3DResource *)iface);
- HeapFree(GetProcessHeap(), 0, This);
- }
- return ref;
-}
-
-/* ****************************************************
- IWineD3DIndexBuffer IWineD3DResource parts follow
- **************************************************** */
-static HRESULT WINAPI IWineD3DIndexBufferImpl_GetDevice(IWineD3DIndexBuffer *iface, IWineD3DDevice** ppDevice) {
- return resource_get_device((IWineD3DResource *)iface, ppDevice);
-}
-
-static HRESULT WINAPI IWineD3DIndexBufferImpl_SetPrivateData(IWineD3DIndexBuffer *iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
- return resource_set_private_data((IWineD3DResource *)iface, refguid, pData, SizeOfData, Flags);
-}
-
-static HRESULT WINAPI IWineD3DIndexBufferImpl_GetPrivateData(IWineD3DIndexBuffer *iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
- return resource_get_private_data((IWineD3DResource *)iface, refguid, pData, pSizeOfData);
-}
-
-static HRESULT WINAPI IWineD3DIndexBufferImpl_FreePrivateData(IWineD3DIndexBuffer *iface, REFGUID refguid) {
- return resource_free_private_data((IWineD3DResource *)iface, refguid);
-}
-
-static DWORD WINAPI IWineD3DIndexBufferImpl_SetPriority(IWineD3DIndexBuffer *iface, DWORD PriorityNew) {
- return resource_set_priority((IWineD3DResource *)iface, PriorityNew);
-}
-
-static DWORD WINAPI IWineD3DIndexBufferImpl_GetPriority(IWineD3DIndexBuffer *iface) {
- return resource_get_priority((IWineD3DResource *)iface);
-}
-
-static void WINAPI IWineD3DIndexBufferImpl_PreLoad(IWineD3DIndexBuffer *iface) {
- TRACE("iface %p.\n", iface);
-}
-
-static void WINAPI IWineD3DIndexBufferImpl_UnLoad(IWineD3DIndexBuffer *iface) {
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *) iface;
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
- TRACE("(%p)\n", This);
-
- /* This is easy: The whole content is shadowed in This->resource.allocatedMemory,
- * so we only have to destroy the vbo. Only do it if we have a vbo, which implies
- * that vbos are supported.
- * (TODO: Make a IWineD3DBuffer base class for index and vertex buffers and share
- * this code. Also needed for D3D10)
- */
- if(This->vbo) {
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- GL_EXTCALL(glDeleteBuffersARB(1, &This->vbo));
- checkGLcall("glDeleteBuffersARB");
- LEAVE_GL();
- This->vbo = 0;
- }
-}
-
-static WINED3DRESOURCETYPE WINAPI IWineD3DIndexBufferImpl_GetType(IWineD3DIndexBuffer *iface) {
- return resource_get_type((IWineD3DResource *)iface);
-}
-
-static HRESULT WINAPI IWineD3DIndexBufferImpl_GetParent(IWineD3DIndexBuffer *iface, IUnknown **pParent) {
- return resource_get_parent((IWineD3DResource *)iface, pParent);
-}
-
-/* ******************************************************
- IWineD3DIndexBuffer IWineD3DIndexBuffer parts follow
- ****************************************************** */
-static HRESULT WINAPI IWineD3DIndexBufferImpl_Lock(IWineD3DIndexBuffer *iface, UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags) {
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
- TRACE("(%p) : offset %d, size %d, Flags=%x\n", This, OffsetToLock, SizeToLock, Flags);
-
- InterlockedIncrement(&This->lockcount);
- *ppbData = This->resource.allocatedMemory + OffsetToLock;
-
- if(Flags & (WINED3DLOCK_READONLY | WINED3DLOCK_NO_DIRTY_UPDATE) || This->vbo == 0) {
- return WINED3D_OK;
- }
-
- if(This->dirtystart != This->dirtyend) {
- if(This->dirtystart > OffsetToLock) This->dirtystart = OffsetToLock;
- if(SizeToLock) {
- if(This->dirtyend < OffsetToLock + SizeToLock) This->dirtyend = OffsetToLock + SizeToLock;
- } else {
- This->dirtyend = This->resource.size;
- }
- } else {
- This->dirtystart = OffsetToLock;
- if(SizeToLock)
- This->dirtyend = OffsetToLock + SizeToLock;
- else
- This->dirtyend = This->resource.size;
- }
-
- return WINED3D_OK;
-}
-static HRESULT WINAPI IWineD3DIndexBufferImpl_Unlock(IWineD3DIndexBuffer *iface) {
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
- unsigned long locks = InterlockedDecrement(&This->lockcount);
- TRACE("(%p)\n", This);
-
- /* For now load in unlock */
- if(locks == 0 && This->vbo && (This->dirtyend - This->dirtystart) > 0) {
- IWineD3DDeviceImpl *device = This->resource.wineD3DDevice;
-
- ActivateContext(device, device->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD);
-
- ENTER_GL();
- GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, This->vbo));
- checkGLcall("glBindBufferARB");
- GL_EXTCALL(glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
- This->dirtystart, This->dirtyend - This->dirtystart, This->resource.allocatedMemory + This->dirtystart));
- checkGLcall("glBufferSubDataARB");
- LEAVE_GL();
- This->dirtystart = 0;
- This->dirtyend = 0;
- /* TODO: Move loading into preload when the buffer is used, that avoids dirtifying the state */
- IWineD3DDeviceImpl_MarkStateDirty(device, STATE_INDEXBUFFER);
- }
- return WINED3D_OK;
-}
-static HRESULT WINAPI IWineD3DIndexBufferImpl_GetDesc(IWineD3DIndexBuffer *iface, WINED3DINDEXBUFFER_DESC *pDesc) {
- IWineD3DIndexBufferImpl *This = (IWineD3DIndexBufferImpl *)iface;
-
- TRACE("(%p)\n", This);
- pDesc->Format = This->resource.format;
- pDesc->Type = This->resource.resourceType;
- pDesc->Usage = This->resource.usage;
- pDesc->Pool = This->resource.pool;
- pDesc->Size = This->resource.size;
- return WINED3D_OK;
-}
-
-const IWineD3DIndexBufferVtbl IWineD3DIndexBuffer_Vtbl =
-{
- /* IUnknown */
- IWineD3DIndexBufferImpl_QueryInterface,
- IWineD3DIndexBufferImpl_AddRef,
- IWineD3DIndexBufferImpl_Release,
- /* IWineD3DResource */
- IWineD3DIndexBufferImpl_GetParent,
- IWineD3DIndexBufferImpl_GetDevice,
- IWineD3DIndexBufferImpl_SetPrivateData,
- IWineD3DIndexBufferImpl_GetPrivateData,
- IWineD3DIndexBufferImpl_FreePrivateData,
- IWineD3DIndexBufferImpl_SetPriority,
- IWineD3DIndexBufferImpl_GetPriority,
- IWineD3DIndexBufferImpl_PreLoad,
- IWineD3DIndexBufferImpl_UnLoad,
- IWineD3DIndexBufferImpl_GetType,
- /* IWineD3DIndexBuffer */
- IWineD3DIndexBufferImpl_Lock,
- IWineD3DIndexBufferImpl_Unlock,
- IWineD3DIndexBufferImpl_GetDesc
-};
--
1.6.0.6
--------------030505080504000901020205--
More information about the wine-patches
mailing list