diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 2f10b642c0c64f39521da5af3cc127db467b2ca8..5d1ce4a11edac4b81e687e505bd061d9149f02f1 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -363,6 +363,12 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info, Display* display) 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_blend") == 0) { + TRACE_(d3d_caps)(" FOUND: ARB Vertex Blend support\n"); + gl_info->supported[ARB_VERTEX_BLEND] = 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 diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index a31790a1b5090a9c9461117e2b8249baf4554147..441ea5e009f449973e3597ee34a2afb7cd758b73 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -685,12 +685,23 @@ void drawStridedFast(IWineD3DDevice *iface, Direct3DVertexStridedData *sd, /* Blend Data ----------------------------------------------*/ if ((sd->u.s.blendWeights.lpData != NULL) || (sd->u.s.blendMatrixIndices.lpData != NULL)) { - /* FIXME: Won't get here as will drop to slow method */ - FIXME("Blending not supported in fast draw routine\n"); - -#if 0 /* Vertex blend support needs to be added */ - if (GL_SUPPORT(ARB_VERTEX_BLEND)) { - /*FIXME("TODO\n");*/ +#if 1 /* Vertex blend support needs to be added */ + if (GL_SUPPORT(ARB_VERTEX_BLEND)) { + DWORD fvf = (sd->u.s.blendWeights.dwType - D3DDECLTYPE_FLOAT1) + 1; + int numBlends = ((fvf & D3DFVF_POSITION_MASK) >> 1) - 2 + ((FALSE == (fvf & D3DFVF_LASTBETA_UBYTE4)) ? 0 : -1); + + /*FIXME("TODO\n");*/ + /* Note dwType == float3 or float4 == 2 or 3 */ + VTRACE(("glWeightPointerARB(%ld, GL_FLOAT, %ld, %p)\n", + numBlends, + sd->u.s.blendWeights.dwStride, + sd->u.s.blendWeights.lpData)); + GL_EXTCALL(glWeightPointerARB)(numBlends, GL_FLOAT, + sd->u.s.blendWeights.dwStride, + sd->u.s.blendWeights.lpData); + checkGLcall("glWeightPointerARB(...)"); + glEnableClientState(GL_WEIGHT_ARRAY_ARB); + checkGLcall("glEnableClientState(GL_VERTEX_ARRAY)"); } else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) { /*FIXME("TODO\n");*/ /* @@ -712,6 +723,9 @@ void drawStridedFast(IWineD3DDevice *iface, Direct3DVertexStridedData *sd, checkGLcall("glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)"); */ } +#else + /* FIXME: Won't get here as will drop to slow method */ + FIXME("Blending not supported in fast draw routine\n"); #endif } @@ -1551,9 +1565,9 @@ void drawPrimitive(IWineD3DDevice *iface, #endif } - } else if ((dataLocations.u.s.pSize.lpData != NULL) || - (dataLocations.u.s.diffuse.lpData != NULL) || - (dataLocations.u.s.blendWeights.lpData != NULL)) { + } else if ((dataLocations.u.s.pSize.lpData != NULL) + || (dataLocations.u.s.diffuse.lpData != NULL) + /*|| (dataLocations.u.s.blendWeights.lpData != NULL)*/) { /* Fixme, Ideally, only use the per-vertex code for software HAL but until opengl supports all the functions returned to setup diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h index a13362d1655ae45299300c9c07e6cc6c1bcba895..2a607b48064fe004049cac25bca9dac182b9f077 100644 --- a/include/wine/wined3d_gl.h +++ b/include/wine/wined3d_gl.h @@ -96,6 +96,7 @@ #define GL_MODELVIEW30_ARB 0x873E #define GL_MODELVIEW31_ARB 0x873F #endif +typedef void (APIENTRY * PGLFNGLWEIGHTPOINTERARB) (GLint size, GLenum type, GLsizei stride, GLvoid* pointer); /* GL_EXT_secondary_color */ #ifndef GL_EXT_secondary_color #define GL_EXT_secondary_color 1 @@ -384,6 +385,51 @@ typedef GLboolean (APIENTRY * PGLFNISPROGRAMARBPROC) (GLuint program); #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 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, ptrdiff_t size, const GLvoid *data, GLenum usage); +typedef void (APIENTRY * PGLFNBUFFERSUBDATAARBPROC) (GLenum target, ptrdiff_t offset, ptrdiff_t size, const GLvoid *data); +typedef void (APIENTRY * PGLFNGETBUFFERSUBDATAARBPROC) (GLenum target, ptrdiff_t offset, ptrdiff_t 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 +763,11 @@ typedef enum _GL_SupportedExt { 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 +809,20 @@ typedef enum _GL_SupportedExt { USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3DARB); \ USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2DARB); \ USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3DARB); \ + /* GL_ARB_vertex_blend */ \ + USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, glWeightPointerARB); \ + /* 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 */ \