Hi again,

 A better patch than previous

Changelog:
  - beta implementation of HW Vertex Buffer support (using 
ARB_vertex_buffer_object): locking/unlocking, creation, destruction
  - some wined3d headers/interface extension

Todo
  - Bind/Unbind on rendering (use exported APIs, see 
IWineD3DDevice_BindVertexBuffer/IWineD3DDevice_UnbindVertexBuffer)

Regards,
Raphael

Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/wined3d/device.c,v
retrieving revision 1.2
diff -u -r1.2 device.c
--- device.c	14 Oct 2004 00:32:04 -0000	1.2
+++ device.c	20 Oct 2004 23:56:45 -0000
@@ -34,30 +34,6 @@
 /**********************************************************
  * IWineD3DDevice implementation follows
  **********************************************************/
-HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage, 
-                             DWORD FVF, D3DPOOL Pool, IWineD3DVertexBuffer** ppVertexBuffer, HANDLE *sharedHandle) {
-
-    IWineD3DVertexBufferImpl *object;
-    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
-
-    /* Allocate the storage for the device */
-    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DVertexBufferImpl));
-    object->lpVtbl                = &IWineD3DVertexBuffer_Vtbl;
-    object->resource.wineD3DDevice= iface;
-    object->resource.resourceType = D3DRTYPE_VERTEXBUFFER;
-    object->resource.ref          = 1;
-    object->allocatedMemory       = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
-    object->currentDesc.Usage     = Usage;
-    object->currentDesc.Pool      = Pool;
-    object->currentDesc.FVF       = FVF;
-    object->currentDesc.Size      = Size;
-
-    TRACE("(%p) : Size=%d, Usage=%ld, FVF=%lx, Pool=%d - [EMAIL PROTECTED], [EMAIL PROTECTED]", This, Size, Usage, FVF, Pool, object->allocatedMemory, object);
-    *ppVertexBuffer = (IWineD3DVertexBuffer *)object;
-
-    return D3D_OK;
-}
-
 
 /**********************************************************
  * IUnknown parts follows
@@ -80,7 +56,7 @@
     TRACE("(%p) : Releasing from %ld\n", This, This->ref);
     ref = InterlockedDecrement(&This->ref);
     if (ref == 0) {
-        IWineD3D_Release(This->WineD3D);
+        IWineD3D_Release((IWineD3D*) This->WineD3D);
         HeapFree(GetProcessHeap(), 0, This);
     }
     return ref;
@@ -90,10 +66,16 @@
  * IWineD3DDevice VTbl follows
  **********************************************************/
 
+extern HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IWineD3DVertexBuffer** ppVertexBuffer, HANDLE *sharedHandle);
+extern HRESULT WINAPI IWineD3DDeviceImpl_BindVertexBuffer(IWineD3DDevice *iface, IWineD3DVertexBuffer* pVertexBuffer);
+extern HRESULT WINAPI IWineD3DDeviceImpl_UnbindVertexBuffer(IWineD3DDevice *iface, IWineD3DVertexBuffer* pVertexBuffer);
+
 IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
 {
     IWineD3DDeviceImpl_QueryInterface,
     IWineD3DDeviceImpl_AddRef,
     IWineD3DDeviceImpl_Release,
-    IWineD3DDeviceImpl_CreateVertexBuffer
+    IWineD3DDeviceImpl_CreateVertexBuffer,
+    IWineD3DDeviceImpl_BindVertexBuffer,
+    IWineD3DDeviceImpl_UnbindVertexBuffer
 };
Index: directx.c
===================================================================
RCS file: /home/wine/wine/dlls/wined3d/directx.c,v
retrieving revision 1.8
diff -u -r1.8 directx.c
--- directx.c	8 Oct 2004 20:52:33 -0000	1.8
+++ directx.c	20 Oct 2004 23:56:46 -0000
@@ -362,6 +362,9 @@
                 gl_info->vs_arb_version = VS_VERSION_11;
                 TRACE_(d3d_caps)(" FOUND: ARB Vertex Shader support - version=%02x\n", gl_info->vs_arb_version);
                 gl_info->supported[ARB_VERTEX_PROGRAM] = TRUE;
+            } else if (strcmp(ThisExtn, "GL_ARB_vertex_buffer_object") == 0) {
+                TRACE_(d3d_caps)(" FOUND: ARB Vertex Buffer support\n");
+		gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] = TRUE;
 
             /**
              * EXT
@@ -372,6 +375,9 @@
             } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) { /* handle paletted texture extensions */
                 TRACE_(d3d_caps)(" FOUND: EXT Paletted texture support\n");
                 gl_info->supported[EXT_PALETTED_TEXTURE] = TRUE;
+            } else if (strcmp(ThisExtn, "GL_EXT_pixel_buffer_object") == 0) {
+                TRACE_(d3d_caps)(" FOUND: EXT Pixel Buffer support\n");
+		gl_info->supported[EXT_PIXEL_BUFFER_OBJECT] = TRUE;
             } else if (strcmp(ThisExtn, "GL_EXT_point_parameters") == 0) {
                 TRACE_(d3d_caps)(" FOUND: EXT Point parameters support\n");
                 gl_info->supported[EXT_POINT_PARAMETERS] = TRUE;
@@ -1335,8 +1341,8 @@
     /* Set up initial COM information */
     object->lpVtbl  = &IWineD3DDevice_Vtbl;
     object->ref     = 1;
-    object->WineD3D = iface;
-    IWineD3D_AddRef(object->WineD3D);
+    object->WineD3D = This;
+    IWineD3D_AddRef((IWineD3D*) object->WineD3D);
     
     TRACE("(%p)->(Adptr:%d, DevType: %x, FocusHwnd: %p, BehFlags: %lx, PresParms: %p, RetDevInt: %p)\n", This, Adapter, DeviceType,
           hFocusWindow, BehaviourFlags, pPresentationParameters, ppReturnedDeviceInterface);
Index: vertexbuffer.c
===================================================================
RCS file: /home/wine/wine/dlls/wined3d/vertexbuffer.c,v
retrieving revision 1.1
diff -u -r1.1 vertexbuffer.c
--- vertexbuffer.c	14 Oct 2004 00:32:04 -0000	1.1
+++ vertexbuffer.c	20 Oct 2004 23:56:47 -0000
@@ -25,6 +25,84 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
+/*
+  switch (Usage) {
+  case D3DUSAGE_DONOTCLIP:
+  case D3DUSAGE_POINTS:
+  case D3DUSAGE_NPATCHES:
+  case D3DUSAGE_RTPATCHES:
+  case D3DUSAGE_SOFTWAREPROCESSING:
+  }
+*/
+#undef  GL_EXTCALL
+#undef  GL_SUPPORT
+#define GL_INFO(This)        ((This)->resource.wineD3DDevice->WineD3D->gl_info)
+#define GL_SUPPORT(ExtName)  (TRUE == GL_INFO(This).supported[ExtName])
+#define GL_EXTCALL(FuncName) (GL_INFO(This).FuncName)
+
+void IWineD3DVertexBufferImpl_BindArbHW(IWineD3DVertexBufferImpl* This) {
+  if (0 == This->vboID || !GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) return ;
+  GL_EXTCALL(glBindProgramARB(GL_ARRAY_BUFFER_ARB, This->vboID));
+}
+
+void IWineD3DVertexBufferImpl_UnbindArbHW(IWineD3DVertexBufferImpl* This) {
+  if (0 == This->vboID || !GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) return ;
+  GL_EXTCALL(glBindProgramARB(GL_ARRAY_BUFFER_ARB, 0));
+}
+
+HRESULT IWineD3DVertexBufferImpl_GenerateArbHW(IWineD3DVertexBufferImpl* This) {
+  GLenum gl_usage = 0; 
+  DWORD Usage = This->currentDesc.Usage;
+  
+  if (!GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) return S_OK;
+  This->vboID = 0;
+  /** return now if software rendering asked */
+  if (Usage & D3DUSAGE_SOFTWAREPROCESSING) return S_OK;
+  
+  if (Usage & D3DUSAGE_DYNAMIC) gl_usage |= GL_DYNAMIC_COPY_ARB;
+  else gl_usage |= GL_STATIC_COPY_ARB;
+
+  GL_EXTCALL(glGenBuffersARB(1, &This->vboID));
+  IWineD3DVertexBufferImpl_BindArbHW(This);
+  GL_EXTCALL(glBufferDataARB(GL_ARRAY_BUFFER_ARB, This->currentDesc.Size, NULL, gl_usage));
+  IWineD3DVertexBufferImpl_UnbindArbHW(This);
+  if (GL_OUT_OF_MEMORY == glGetError()) {
+    GL_EXTCALL(glDeleteBuffersARB(1, &This->vboID));
+    return D3DERR_OUTOFVIDEOMEMORY;
+  }
+  return S_OK;
+}
+
+HRESULT IWineD3DVertexBufferImpl_DeleteArbHW(IWineD3DVertexBufferImpl* This) {
+  if (0 == This->vboID || !GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) return S_OK;
+  GL_EXTCALL(glDeleteBuffersARB(1, &This->vboID));
+  return S_OK;
+}
+
+BYTE* IWineD3DVertexBufferImpl_LockArbHW(IWineD3DVertexBufferImpl* This, DWORD iFlags) {
+  GLenum gl_lock_access = GL_READ_WRITE_ARB;
+  DWORD Usage = This->currentDesc.Usage;
+  BYTE* ret = NULL;
+
+  if (0 == This->vboID || !GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) return NULL;
+
+  if (iFlags & D3DLOCK_READONLY)  gl_lock_access = GL_READ_ONLY_ARB;
+  else if ((Usage & D3DUSAGE_WRITEONLY) || (iFlags & D3DLOCK_DISCARD)) gl_lock_access = GL_WRITE_ONLY_ARB;  
+
+  IWineD3DVertexBufferImpl_BindArbHW(This);
+  ret = (BYTE*) GL_EXTCALL(glMapBufferARB(GL_ARRAY_BUFFER_ARB, gl_lock_access));
+  IWineD3DVertexBufferImpl_UnbindArbHW(This);
+  return ret;
+}
+
+void IWineD3DVertexBufferImpl_UnlockArbHW(IWineD3DVertexBufferImpl* This) {
+  if (0 == This->vboID || !GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) return ;
+
+  IWineD3DVertexBufferImpl_BindArbHW(This);
+  GL_EXTCALL(glUnmapBufferARB(GL_ARRAY_BUFFER_ARB));
+  IWineD3DVertexBufferImpl_UnbindArbHW(This);
+}
+
 /* *******************************************
    IWineD3DVertexBuffer IUnknown parts follow
    ******************************************* */
@@ -47,6 +125,7 @@
     TRACE("(%p) : Releasing from %ld\n", This, This->resource.ref);
     ref = InterlockedDecrement(&This->resource.ref);
     if (ref == 0) {
+        IWineD3DVertexBufferImpl_DeleteArbHW(This);
         if (NULL != This->allocatedMemory) HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
         HeapFree(GetProcessHeap(), 0, This);
     }
@@ -72,15 +151,15 @@
     return IWineD3DResource_FreePrivateData((IWineD3DResource *)iface, refguid);
 }
 
-DWORD    WINAPI        IWineD3DVertexBufferImpl_SetPriority(IWineD3DVertexBuffer *iface, DWORD PriorityNew) {
+DWORD WINAPI IWineD3DVertexBufferImpl_SetPriority(IWineD3DVertexBuffer *iface, DWORD PriorityNew) {
     return IWineD3DResource_SetPriority((IWineD3DResource *)iface, PriorityNew);
 }
 
-DWORD    WINAPI        IWineD3DVertexBufferImpl_GetPriority(IWineD3DVertexBuffer *iface) {
+DWORD WINAPI IWineD3DVertexBufferImpl_GetPriority(IWineD3DVertexBuffer *iface) {
     return IWineD3DResource_GetPriority((IWineD3DResource *)iface);
 }
 
-void     WINAPI        IWineD3DVertexBufferImpl_PreLoad(IWineD3DVertexBuffer *iface) {
+void WINAPI IWineD3DVertexBufferImpl_PreLoad(IWineD3DVertexBuffer *iface) {
     return IWineD3DResource_PreLoad((IWineD3DResource *)iface);
 }
 
@@ -94,14 +173,21 @@
    ****************************************************** */
 HRESULT  WINAPI        IWineD3DVertexBufferImpl_Lock(IWineD3DVertexBuffer *iface, UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags) {
     IWineD3DVertexBufferImpl *This = (IWineD3DVertexBufferImpl *)iface;
+    BYTE* pData = NULL;
     TRACE("(%p) : returning memory of %p (base:%p,offset:%u)\n", This, This->allocatedMemory + OffsetToLock, This->allocatedMemory, OffsetToLock);
     /* TODO: check Flags compatibility with This->currentDesc.Usage (see MSDN) */
-    *ppbData = This->allocatedMemory + OffsetToLock;
+    pData = IWineD3DVertexBufferImpl_LockArbHW(This, Flags);
+    if (NULL == pData) { /// pass in SW mode if ArbHW failed
+      pData = (This->allocatedMemory + OffsetToLock);
+    }
+    *ppbData = pData;
     return D3D_OK;
 }
 HRESULT  WINAPI        IWineD3DVertexBufferImpl_Unlock(IWineD3DVertexBuffer *iface) {
     IWineD3DVertexBufferImpl *This = (IWineD3DVertexBufferImpl *)iface;
-    TRACE("(%p) : stub\n", This);
+    
+    TRACE("(%p)\n", This);
+    IWineD3DVertexBufferImpl_UnlockArbHW(This);
     return D3D_OK;
 }
 HRESULT  WINAPI        IWineD3DVertexBufferImpl_GetDesc(IWineD3DVertexBuffer *iface, D3DVERTEXBUFFER_DESC *pDesc) {
@@ -134,3 +220,37 @@
     IWineD3DVertexBufferImpl_Unlock,
     IWineD3DVertexBufferImpl_GetDesc
 };
+
+HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IWineD3DVertexBuffer** ppVertexBuffer, HANDLE *sharedHandle) {
+    HRESULT hr = S_OK;
+  
+    IWineD3DVertexBufferImpl *object;
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+
+    /* Allocate the storage for the device */
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DVertexBufferImpl));
+    object->lpVtbl                = &IWineD3DVertexBuffer_Vtbl;
+    object->resource.wineD3DDevice= This;
+    object->resource.resourceType = D3DRTYPE_VERTEXBUFFER;
+    object->resource.ref          = 1;
+    object->allocatedMemory       = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
+    object->currentDesc.Usage     = Usage;
+    object->currentDesc.Pool      = Pool;
+    object->currentDesc.FVF       = FVF;
+    object->currentDesc.Size      = Size;
+
+    TRACE("(%p) : Size=%d, Usage=%ld, FVF=%lx, Pool=%d - [EMAIL PROTECTED], [EMAIL PROTECTED]", This, Size, Usage, FVF, Pool, object->allocatedMemory, object);
+    *ppVertexBuffer = (IWineD3DVertexBuffer *)object;
+
+    hr = IWineD3DVertexBufferImpl_GenerateArbHW(object);
+    return hr;
+}
+HRESULT WINAPI IWineD3DDeviceImpl_BindVertexBuffer(IWineD3DDevice *iface, IWineD3DVertexBuffer* pVertexBuffer) {
+  IWineD3DVertexBufferImpl_BindArbHW((IWineD3DVertexBufferImpl*) pVertexBuffer);
+  return S_OK;
+}
+
+HRESULT WINAPI IWineD3DDeviceImpl_UnbindVertexBuffer(IWineD3DDevice *iface, IWineD3DVertexBuffer* pVertexBuffer) {
+  IWineD3DVertexBufferImpl_UnbindArbHW((IWineD3DVertexBufferImpl*) pVertexBuffer);
+  return S_OK;
+}
Index: wined3d_private.h
===================================================================
RCS file: /home/wine/wine/dlls/wined3d/wined3d_private.h,v
retrieving revision 1.9
diff -u -r1.9 wined3d_private.h
--- wined3d_private.h	14 Oct 2004 00:32:04 -0000	1.9
+++ wined3d_private.h	20 Oct 2004 23:56:47 -0000
@@ -115,7 +115,7 @@
     DWORD                   ref;     /* Note: Ref counting not required */
 
     /* WineD3D Information  */
-    IWineD3D               *WineD3D;
+    IWineD3DImpl           *WineD3D;
 
     /* X and GL Information */
     HWND                    win_handle;
@@ -152,7 +152,7 @@
     DWORD                   ref;     /* Note: Ref counting not required */
 
     /* WineD3DResource Information */
-    IWineD3DDevice         *wineD3DDevice;
+    IWineD3DDeviceImpl     *wineD3DDevice;
     D3DRESOURCETYPE         resourceType;
 
 } IWineD3DResourceClass;
@@ -180,6 +180,9 @@
     BYTE                     *allocatedMemory;
     D3DVERTEXBUFFER_DESC      currentDesc;
 
+    /** fields for hw vbo use */
+    GLuint  vboID;
+
 } IWineD3DVertexBufferImpl;
 
 extern IWineD3DVertexBufferVtbl IWineD3DVertexBuffer_Vtbl;
@@ -221,6 +224,10 @@
   UINT functionLength;
   DWORD usage;
   DWORD version;
+
+  /** fields for hw vertex shader use */
+  GLuint  prgId;
+
   /* run time datas */
   VSHADERDATA* data;
   VSHADERINPUTDATA input;
@@ -237,7 +244,11 @@
 
   DWORD* function;
   UINT functionLength;
-  DWORD version;
+  DWORD version;  
+
+  /** fields for hw pixel shader use */
+  GLuint  prgId;
+
   /* run time datas */
   PSHADERDATA* data;
   PSHADERINPUTDATA input;
Index: wined3d_gl.h
===================================================================
RCS file: /home/wine/wine/include/wine/wined3d_gl.h,v
retrieving revision 1.3
diff -u -r1.3 wined3d_gl.h
--- wined3d_gl.h	6 Oct 2004 00:05:29 -0000	1.3
+++ wined3d_gl.h	20 Oct 2004 23:57:06 -0000
@@ -384,6 +384,53 @@
 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB    0x8872
 /* All ARB_fragment_program entry points are shared with ARB_vertex_program. */
 #endif
+/* GL_ARB_vertex_buffer_object */
+#ifndef GL_ARB_vertex_buffer_object
+#define GL_BUFFER_SIZE_ARB                0x8764
+#define GL_BUFFER_USAGE_ARB               0x8765
+#define GL_ARRAY_BUFFER_ARB               0x8892
+#define GL_ELEMENT_ARRAY_BUFFER_ARB       0x8893
+#define GL_ARRAY_BUFFER_BINDING_ARB       0x8894
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB  0x8896
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB  0x8897
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB   0x8898
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB   0x8899
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB   0x889A
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB       0x889B
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB  0x889D
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB          0x889E
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB   0x889F
+#define GL_READ_ONLY_ARB                  0x88B8
+#define GL_WRITE_ONLY_ARB                 0x88B9
+#define GL_READ_WRITE_ARB                 0x88BA
+#define GL_BUFFER_ACCESS_ARB              0x88BB
+#define GL_BUFFER_MAPPED_ARB              0x88BC
+#define GL_BUFFER_MAP_POINTER_ARB         0x88BD
+#define GL_STREAM_DRAW_ARB                0x88E0
+#define GL_STREAM_READ_ARB                0x88E1
+#define GL_STREAM_COPY_ARB                0x88E2
+#define GL_STATIC_DRAW_ARB                0x88E4
+#define GL_STATIC_READ_ARB                0x88E5
+#define GL_STATIC_COPY_ARB                0x88E6
+#define GL_DYNAMIC_DRAW_ARB               0x88E8
+#define GL_DYNAMIC_READ_ARB               0x88E9
+#define GL_DYNAMIC_COPY_ARB               0x88EA
+#endif
+typedef ptrdiff_t GLintptrARB;
+typedef ptrdiff_t GLsizeiptrARB;
+typedef void (APIENTRY * PGLFNBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
+typedef void (APIENTRY * PGLFNDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
+typedef void (APIENTRY * PGLFNGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
+typedef GLboolean (APIENTRY * PGLFNISBUFFERARBPROC) (GLuint buffer);
+typedef void (APIENTRY * PGLFNBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
+typedef void (APIENTRY * PGLFNBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);
+typedef void (APIENTRY * PGLFNGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);
+typedef GLvoid* (APIENTRY * PGLFNMAPBUFFERARBPROC) (GLenum target, GLenum access);
+typedef GLboolean (APIENTRY * PGLFNUNMAPBUFFERARBPROC) (GLenum target);
+typedef void (APIENTRY * PGLFNGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (APIENTRY * PGLFNGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params);
 /* GL_EXT_texture_compression_s3tc */
 #ifndef GL_EXT_texture_compression_s3tc
 #define GL_EXT_texture_compression_s3tc 1
@@ -717,9 +764,11 @@
   ARB_TEXTURE_MIRRORED_REPEAT,
   ARB_VERTEX_PROGRAM,
   ARB_VERTEX_BLEND,
+  ARB_VERTEX_BUFFER_OBJECT,
   /* EXT */
   EXT_FOG_COORD,
   EXT_PALETTED_TEXTURE,
+  EXT_PIXEL_BUFFER_OBJECT,
   EXT_POINT_PARAMETERS,
   EXT_SECONDARY_COLOR,
   EXT_STENCIL_WRAP,
@@ -761,6 +810,18 @@
     USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC,       glCompressedTexImage3DARB); \
     USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC,    glCompressedTexSubImage2DARB); \
     USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC,    glCompressedTexSubImage3DARB); \
+    /* GL_ARB_vertex_buffer_object */ \
+    USE_GL_FUNC(PGLFNBINDBUFFERARBPROC,              glBindBufferARB); \
+    USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC,           glDeleteBuffersARB); \
+    USE_GL_FUNC(PGLFNGENBUFFERSARBPROC,              glGenBuffersARB); \
+    USE_GL_FUNC(PGLFNISBUFFERARBPROC,                glIsBufferARB); \
+    USE_GL_FUNC(PGLFNBUFFERDATAARBPROC,              glBufferDataARB); \
+    USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC,           glBufferSubDataARB); \
+    USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC,        glGetBufferSubDataARB); \
+    USE_GL_FUNC(PGLFNMAPBUFFERARBPROC,               glMapBufferARB); \
+    USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC,             glUnmapBufferARB); \
+    USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC,    glGetBufferParameterivARB); \
+    USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC,       glGetBufferPointervARB); \
     /** EXT Extensions **/ \
     /* GL_EXT_fog_coord */ \
     /* GL_EXT_paletted_texture */ \
Index: wined3d_interface.h
===================================================================
RCS file: /home/wine/wine/include/wine/wined3d_interface.h,v
retrieving revision 1.11
diff -u -r1.11 wined3d_interface.h
--- wined3d_interface.h	14 Oct 2004 00:32:04 -0000	1.11
+++ wined3d_interface.h	20 Oct 2004 23:57:06 -0000
@@ -74,9 +74,12 @@
 typedef struct IWineD3DDevice         IWineD3DDevice;
 typedef struct IWineD3DResource       IWineD3DResource;
 typedef struct IWineD3DVertexBuffer   IWineD3DVertexBuffer;
+typedef struct IWineD3DVertexDeclaration IWineD3DVertexDeclaration;
+typedef struct IWineD3DVertexShader      IWineD3DVertexShader;
+typedef struct IWineD3DPixelShader       IWineD3DPixelShader;
 
 /*****************************************************************************
- * WineD3D interface 
+ * IWineD3D interface 
  */
 
 #define INTERFACE IWineD3D
@@ -130,27 +133,55 @@
 IWineD3D* WINAPI WineDirect3DCreate(UINT SDKVersion, UINT dxVersion);
 
 /*****************************************************************************
- * WineD3DDevice interface 
+ * IWineD3DDevice interface 
  */
 #define INTERFACE IWineD3DDevice
-DECLARE_INTERFACE_(IWineD3DDevice,IUnknown)
-{
+DECLARE_INTERFACE_(IWineD3DDevice,IUnknown) 
+{ 
     /*** IUnknown methods ***/
     STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
     STDMETHOD_(ULONG,Release)(THIS) PURE;
-    /*** IWineD3D methods ***/
+    /*** IWineD3DDevice methods ***/
+    /*
+    STDMETHOD(SetFVF)(THIS_ DWORD FVF) PURE; 
+    STDMETHOD(GetFVF)(THIS_ DWORD* pFVF) PURE; 
+    STDMETHOD(CreateVertexDeclaration)(THIS_ CONST DWORD* pFunction, IWineD3DVertexDeclaration** ppDeclaration) PURE; 
+    STDMETHOD(SetVertexDeclaration)(THIS_ IWineD3DVertexDeclaration* pDeclaration) PURE; 
+    STDMETHOD(GetVertexDeclaration)(THIS_ IWineD3DVertexDeclaration** ppDeclaration) PURE; 
+    STDMETHOD(CreateVertexShader)(THIS_ CONST DWORD* pFunction, IWineD3DVertexShader** ppShader) PURE; 
+    STDMETHOD(SetVertexShader)(THIS_ IWineD3DVertexShader* pShader) PURE; 
+    STDMETHOD(GetVertexShader)(THIS_ IWineD3DVertexShader** ppShader) PURE; 
+    STDMETHOD(CreatePixelShader)(THIS_ CONST DWORD* pFunction, IWineD3DPixelShader** ppShader) PURE; 
+    STDMETHOD(SetPixelShader)(THIS_ IWineD3DPixelShader* pShader) PURE; 
+    STDMETHOD(GetPixelShader)(THIS_ IWineD3DPixelShader** ppShader) PURE; 
+    */
     STDMETHOD(CreateVertexBuffer)(THIS_ UINT  Length,DWORD  Usage,DWORD  FVF,D3DPOOL  Pool,IWineD3DVertexBuffer **ppVertexBuffer, HANDLE *sharedHandle) PURE;
+    STDMETHOD(BindVertexBuffer)(THIS_ IWineD3DVertexBuffer *pVertexBuffer) PURE;
+    STDMETHOD(UnbindVertexBuffer)(THIS_ IWineD3DVertexBuffer *pVertexBuffer) PURE;
 };
 #undef INTERFACE
 
 #if !defined(__cplusplus) || defined(CINTERFACE)
 /*** IUnknown methods ***/
-#define IWineD3DDevice_QueryInterface(p,a,b)                    (p)->lpVtbl->QueryInterface(p,a,b)
-#define IWineD3DDevice_AddRef(p)                                (p)->lpVtbl->AddRef(p)
-#define IWineD3DDevice_Release(p)                               (p)->lpVtbl->Release(p)
+#define IWineD3DDevice_QueryInterface(p,a,b)             (p)->lpVtbl->QueryInterface(p,a,b)
+#define IWineD3DDevice_AddRef(p)                         (p)->lpVtbl->AddRef(p)
+#define IWineD3DDevice_Release(p)                        (p)->lpVtbl->Release(p)
 /*** IWineD3DDevice methods ***/
-#define IWineD3DDevice_CreateVertexBuffer(p,a,b,c,d,e,f)        (p)->lpVtbl->CreateVertexBuffer(p,a,b,c,d,e,f)
+#define IWineD3DDevice_SetFVF(p,a)                       (p)->lpVtbl->SetFVF(p,a)
+#define IWineD3DDevice_GetFVF(p,a)                       (p)->lpVtbl->GetFVF(p,a)
+#define IWineD3DDevice_CreateVertexDeclaration(p,a,r)    (p)->lpVtbl->CreateVertexDeclaration(p,a,r)
+#define IWineD3DDevice_SetVertexDeclaration(p,a)         (p)->lpVtbl->SetVertexDeclaration(p,a)
+#define IWineD3DDevice_GetVertexDeclaration(p,a)         (p)->lpVtbl->GetVertexDeclaration(p,a)
+#define IWineD3DDevice_CreateVertexShader(p,a,r)         (p)->lpVtbl->CreateVertexShader(p,a,r)
+#define IWineD3DDevice_SetVertexShader(p,a)              (p)->lpVtbl->SetVertexShader(p,a)
+#define IWineD3DDevice_GetVertexShader(p,a)              (p)->lpVtbl->GetVertexShader(p,a)
+#define IWineD3DDevice_CreatePixelShader(p,a,r)          (p)->lpVtbl->CreatePixelShader(p,a,r)
+#define IWineD3DDevice_SetPixelShader(p,a)               (p)->lpVtbl->SetPixelShader(p,a)
+#define IWineD3DDevice_GetPixelShader(p,a)               (p)->lpVtbl->GetPixelShader(p,a)
+#define IWineD3DDevice_CreateVertexBuffer(p,a,b,c,d,e,f) (p)->lpVtbl->CreateVertexBuffer(p,a,b,c,d,e,f)
+#define IWineD3DDevice_BindVertexBuffer(p,a)             (p)->lpVtbl->BindVertexBuffer(p,a)
+#define IWineD3DDevice_UnbindVertexBuffer(p,a)           (p)->lpVtbl->UnbindVertexBuffer(p,a)
 #endif
 
 /*****************************************************************************

Attachment: pgpTichqnzXcA.pgp
Description: PGP signature

Reply via email to