[dx85] vertex blend fixmes
Jason Edmeades
us at the-edmeades.demon.co.uk
Thu Oct 2 16:53:09 CDT 2003
Michael - This will silence those horrible fixmes about
worldmatrix(0..255) and vertex blend not being supported - We
incorrectly return support since the NVidia drivers dont claim support
for it, but DO return a number for the GL_MAX_VERTEX_UNITS_ARB (which is
only supported as far as I can tell, if arb_vertex_blend is supported...
weird). Does it help with the textures at all?
Changelog
Check for advertized vertex blend support before querying device
capabilities, which silences issues about vertex blending
Jason
-------------- next part --------------
diff -u3 dlls/d3d8/dx84/d3d8_private.h dlls/d3d8/d3d8_private.h
--- dlls/d3d8/dx84/d3d8_private.h 2003-10-01 18:09:03.000000000 +0100
+++ dlls/d3d8/d3d8_private.h 2003-10-02 23:16:09.000000000 +0100
@@ -273,6 +273,7 @@
/* IDirect3D8 fields */
GL_Info gl_info;
+ BOOL isGLInfoValid;
IDirect3D8Impl *direct3d8;
};
diff -u3 dlls/d3d8/dx84/directx.c dlls/d3d8/directx.c
--- dlls/d3d8/dx84/directx.c 2003-10-02 21:32:06.000000000 +0100
+++ dlls/d3d8/directx.c 2003-10-02 23:39:08.000000000 +0100
@@ -55,6 +55,7 @@
D3DFMT_X8R8G8B8
};
+static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display);
/* retrieve the X display to use on a given DC */
inline static Display *get_display( HDC hdc )
@@ -456,6 +457,10 @@
} else {
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_tex_size);
}
+
+ /* If we dont know the device settings, go query them now */
+ if (This->isGLInfoValid == FALSE) IDirect3D8Impl_FillGLCaps(iface, NULL);
+
pCaps->DeviceType = (DeviceType == D3DDEVTYPE_HAL) ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF; /* Not quite true, but use h/w supported by opengl I suppose */
pCaps->AdapterOrdinal = Adapter;
@@ -630,14 +635,14 @@
pCaps->MaxActiveLights = gl_max;
TRACE("GLCaps: GL_MAX_LIGHTS=%ld\n", pCaps->MaxActiveLights);
-#if defined(GL_ARB_vertex_blend)
- glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
- pCaps->MaxVertexBlendMatrices = gl_max;
- pCaps->MaxVertexBlendMatrixIndex = 1;
-#else
- pCaps->MaxVertexBlendMatrices = 0;
- pCaps->MaxVertexBlendMatrixIndex = 1;
-#endif
+ if (GL_SUPPORT(ARB_VERTEX_BLEND)) {
+ glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max);
+ pCaps->MaxVertexBlendMatrices = gl_max;
+ pCaps->MaxVertexBlendMatrixIndex = 1;
+ } else {
+ pCaps->MaxVertexBlendMatrices = 0;
+ pCaps->MaxVertexBlendMatrixIndex = 1;
+ }
#if defined(GL_EXT_texture_filter_anisotropic)
glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max);
@@ -847,30 +852,35 @@
GL_EXT_FUNCS_GEN;
#undef USE_GL_FUNC
- GLX_Extensions = glXQueryExtensionsString(display, DefaultScreen(display));
- FIXME("GLX_Extensions reported:\n");
+ if (display != NULL) {
+ GLX_Extensions = glXQueryExtensionsString(display, DefaultScreen(display));
+ FIXME("GLX_Extensions reported:\n");
- if (NULL == GLX_Extensions) {
- ERR(" GLX_Extensions returns NULL\n");
- } else {
- while (*GLX_Extensions != 0x00) {
- const char *Start = GLX_Extensions;
- char ThisExtn[256];
-
- memset(ThisExtn, 0x00, sizeof(ThisExtn));
- while (*GLX_Extensions != ' ' && *GLX_Extensions != 0x00) {
- GLX_Extensions++;
+ if (NULL == GLX_Extensions) {
+ ERR(" GLX_Extensions returns NULL\n");
+ } else {
+ while (*GLX_Extensions != 0x00) {
+ const char *Start = GLX_Extensions;
+ char ThisExtn[256];
+
+ memset(ThisExtn, 0x00, sizeof(ThisExtn));
+ while (*GLX_Extensions != ' ' && *GLX_Extensions != 0x00) {
+ GLX_Extensions++;
+ }
+ memcpy(ThisExtn, Start, (GLX_Extensions - Start));
+ FIXME("- %s\n", ThisExtn);
+ if (*GLX_Extensions == ' ') GLX_Extensions++;
+ }
}
- memcpy(ThisExtn, Start, (GLX_Extensions - Start));
- FIXME("- %s\n", ThisExtn);
- if (*GLX_Extensions == ' ') GLX_Extensions++;
- }
}
#define USE_GL_FUNC(type, pfn) This->gl_info.pfn = (type) glXGetProcAddressARB(#pfn);
GLX_EXT_FUNCS_GEN;
#undef USE_GL_FUNC
+ /* Only save the values obtained when a display is provided */
+ if (display != NULL) This->isGLInfoValid = TRUE;
+
}
HRESULT WINAPI IDirect3D8Impl_CreateDevice (LPDIRECT3D8 iface,
More information about the wine-patches
mailing list