[D3D8 - 0] the number begin: new x11drv/GLX stuff [resend]

Raphaël Junqueira fenix at club-internet.fr
Fri Jan 10 18:06:32 CST 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Saturday 11 January 2003 00:42, Raphaël Junqueira wrote:
> Hi,
>
>  This stuff is needed by the future D3D8 patches so it's numbered 0 ;)
> This have been developed with ddraw people and maybe they'll need it ;)
>
> Changelog:
>   - add a call to x11drv::ExtEscape to get openGL infos (extensions and
> caps) (only filled once at first call) - define in x11drv:
>         - X11DRV_OPENGL_INFO struct
>         - typedefs, if not defined by glext.h, for the extensions functions
>         - X11DRV_OPENGL_SUPPORTED_EXT enum for d3d* needs extensions
>
>

argh. a brown paper bag please

now second try with the diff

>  Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQE+H2AIp7NA3AmQTU4RAm/FAJ9Duf9r1WM4KbjUpQNdNXo86tj3KACeKXSB
YG4agV/lPoWOl8dcSh/HvAI=
=4EHM
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: include/x11drv.h
===================================================================
RCS file: /home/wine/wine/include/x11drv.h,v
retrieving revision 1.118
diff -u -r1.118 x11drv.h
--- include/x11drv.h	15 Nov 2002 04:16:38 -0000	1.118
+++ include/x11drv.h	10 Jan 2003 23:32:30 -0000
@@ -99,6 +99,142 @@
     XRENDERINFO   xrender;
 } X11DRV_PDEVICE;
 
+/**
+ * OpenGL/GLX Extensions
+ */
+#ifdef HAVE_OPENGL
+#ifndef GL_ARB_vertex_blend
+#define GL_ARB_vertex_blend 1
+void glWeightfvARB(int size, float* weights);
+void glWeightPointerARB(int size, unsigned int type, int stride, void* pointer);
+void glVertexBlendARB(int count);
+#endif
+/* TODO GL_ARB_fog_coord => GL 1.4 */
+/* TODO GL_ARB_vertex_program => GL 1.4 */
+/* TODO GL_EXT_fog_coord */
+/* GL_EXT_secondary_color */
+#ifndef GL_EXT_secondary_color
+#define GL_EXT_secondary_color 1
+typedef void (*PFNGLSECONDARYCOLOR3UBEXTPROC)(unsigned char red, unsigned char green, unsigned char blue);
+typedef void (*PFNGLSECONDARYCOLOR3FEXTPROC)(float red, float green, float blue);
+typedef void (*PFNGLSECONDARYCOLOR3FVEXTPROC)(float* v);
+typedef void (*PFNGLSECONDARYCOLORPOINTEREXTPROC)(int, unsigned int, int, void*);
+#endif
+/* GL_EXT_paletted_texture */
+#ifndef GL_EXT_paletted_texture
+#define GL_EXT_paletted_texture 1
+typedef void (*PFNGLCOLORTABLEEXTPROC)(unsigned int target, unsigned int internalFormat, int width, unsigned int format, unsigned int type, const void *table);
+#endif
+/* GL_EXT_vertex_shader */
+#ifndef GL_EXT_vertex_shader
+#define GL_EXT_vertex_shader 1
+typedef void (*PFNGLBINDVERTEXSHADEREXTPROC)(unsigned int id);
+typedef void (*PFNGLDELETEVERTEXSHADEREXTPROC)(unsigned int id);
+typedef unsigned int (*PFNGLGENVERTEXSHADERSEXTPROC)(unsigned int range);
+typedef void (*PFNGLBEGINVERTEXSHADEREXTPROC)(void);
+typedef void (*PFNGLENDVERTEXSHADEREXTPROC)(void);
+#endif
+/* GL_EXT_vertex_weighting */
+#ifndef GL_EXT_vertex_weighting
+#define GL_EXT_vertex_weighting 1
+typedef void (*PFNGLVERTEXWEIGHTFEXTPROC)(float weight);
+typedef void (*PFNGLVERTEXWEIGHTFVEXTPROC)(const float* weight);
+typedef void (*PFNGLVERTEXWEIGHTPOINTEREXTPROC) (int size, unsigned int type, int stride, const void* pointer);
+#endif
+/* GL_NV_vertex_program */
+#ifndef GL_NV_vertex_program
+#define GL_NV_vertex_program 1
+typedef void (*PFNGLBINDPROGRAMNVPROC)(unsigned int target, unsigned int id);
+typedef void (*PFNGLDELETEPROGRAMSNVPROC)(int n, const unsigned int *programs);
+typedef void (*PFNGLGENPROGRAMSNVPROC)(int n, unsigned int *programs);
+typedef void (*PFNGLLOADPROGRAMNVPROC)(unsigned int target, unsigned int id, int len, const unsigned char *program);
+typedef void (*PFNGLPROGRAMPARAMETER4DNVPROC)(unsigned int target, unsigned int index, double x, double y, double z, double w);
+typedef void (*PFNGLPROGRAMPARAMETER4DVNVPROC)(unsigned int target, unsigned int index, const double *v);
+typedef void (*PFNGLPROGRAMPARAMETER4FNVPROC)(unsigned int target, unsigned int index, float x, float y, float z, float w);
+typedef void (*PFNGLPROGRAMPARAMETER4FVNVPROC)(unsigned int target, unsigned int index, const float *v);
+typedef void (*PFNGLPROGRAMPARAMETERS4DVNVPROC)(unsigned int target, unsigned int index, unsigned int count, const double *v);
+typedef void (*PFNGLPROGRAMPARAMETERS4FVNVPROC)(unsigned int target, unsigned int index, unsigned int count, const float *v);
+typedef void (*PFNGLVERTEXATTRIBPOINTERNVPROC)(unsigned int index, int fsize, unsigned int type, int stride, const void *pointer);
+#endif
+
+
+#define GL_EXT_FUNCS_GEN \
+    /** EXT Extensions **/ \
+    /* GL_EXT_fog_coord */ \
+    /* GL_EXT_paletted_texture */ \
+    USE_GL_FUNC(PFNGLCOLORTABLEEXTPROC,            glColorTableEXT); \
+    /* GL_EXT_secondary_color */ \
+    USE_GL_FUNC(PFNGLSECONDARYCOLOR3UBEXTPROC,     glSecondaryColor3ubEXT); \
+    USE_GL_FUNC(PFNGLSECONDARYCOLOR3FEXTPROC,      glSecondaryColor3fEXT); \
+    USE_GL_FUNC(PFNGLSECONDARYCOLOR3FVEXTPROC,     glSecondaryColor3fvEXT); \
+    USE_GL_FUNC(PFNGLSECONDARYCOLORPOINTEREXTPROC, glSecondaryColorPointerEXT); \
+    /* GL_EXT_vertex_weighting */ \
+    USE_GL_FUNC(PFNGLVERTEXWEIGHTFEXTPROC,         glVertexWeightfEXT); \
+    USE_GL_FUNC(PFNGLVERTEXWEIGHTFVEXTPROC,        glVertexWeightfvEXT); \
+    USE_GL_FUNC(PFNGLVERTEXWEIGHTPOINTEREXTPROC,   glVertexWeightPointerEXT); \
+    /** NVIDIA Extensions **/ \
+    /* GL_NV_vertex_program */ \
+    USE_GL_FUNC(PFNGLBINDPROGRAMNVPROC,            glBindProgramNV); \
+    /** ATI Extensions **/ \
+    /* GL_EXT_vertex_shader */ \
+    USE_GL_FUNC(PFNGLBINDVERTEXSHADEREXTPROC,      glBindVertexShaderEXT); \
+    USE_GL_FUNC(PFNGLDELETEVERTEXSHADEREXTPROC,    glDeleteVertexShaderEXT); \
+    USE_GL_FUNC(PFNGLGENVERTEXSHADERSEXTPROC,      glGenVertexShadersEXT); \
+    USE_GL_FUNC(PFNGLBEGINVERTEXSHADEREXTPROC,     glBeginVertexShaderEXT); \
+    USE_GL_FUNC(PFNGLENDVERTEXSHADEREXTPROC,       glEndVertexShaderEXT); \
+
+
+typedef enum _X11DRV_OPENGL_VS_VERSION {
+    VS_VERSION_NOT_SUPPORTED = 0x0,
+    VS_VERSION_10 = 0x10,
+    VS_VERSION_11 = 0x11,
+    VS_VERSION_20 = 0x20,
+    VS_VERSION_30 = 0x30,
+    /*Force 32-bits*/
+    VS_VERSION_FORCE_DWORD = 0x7FFFFFFF
+} X11DRV_OPENGL_VS_VERSION;
+
+typedef enum _X11DRV_OPENGL_SUPPORTED_EXT {
+  /* ARB */
+  ARB_MULTITEXTURE,
+  ARB_POINT_PARAMETERS,
+  ARB_TEXTURE_COMPRESSION,
+  ARB_TEXTURE_CUBE_MAP,
+  ARB_TEXTURE_ENV_DOT3,
+  ARB_VERTEX_PROGRAM,
+  ARB_VERTEX_BLEND,
+  /* EXT */
+  EXT_FOG_COORD,
+  EXT_PALETTED_TEXTURE,
+  EXT_SECONDARY_COLOR,
+  EXT_VERTEX_WEIGHTING,
+  /* NVIDIA */
+  NV_VERTEX_PROGRAM,
+  /* ATI */
+  EXT_VERTEX_SHADER,
+
+  OPENGL_SUPPORTED_EXT_END
+} X11DRV_OPENGL_SUPPORTED_EXT;
+
+#define USE_GL_FUNC(type, pfn) type pfn;
+typedef struct _X11DRV_OPENGL_INFO {
+    /** 
+     * CAPS Constants 
+     */
+    int   max_lights;
+    int   max_textures;
+    X11DRV_OPENGL_VS_VERSION vs_arb_version;
+    X11DRV_OPENGL_VS_VERSION vs_nv_version;
+    X11DRV_OPENGL_VS_VERSION vs_ati_version;
+
+    /**
+     *  OpenGL EXT Functions 
+     */
+    GL_EXT_FUNCS_GEN;
+    BOOL supported[25];
+} X11DRV_OPENGL_INFO;
+#undef USE_GL_FUNC
+#endif /* defined(HAVE_OPENGL) */
 
   /* GCs used for B&W and color bitmap operations */
 extern GC BITMAP_monoGC, BITMAP_colorGC;
@@ -227,6 +363,7 @@
 extern void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev);
 
 extern void X11DRV_OpenGL_Init(Display *display);
+extern BOOL X11DRV_OpenGL_GetInfo(X11DRV_PDEVICE *physDev, X11DRV_OPENGL_INFO *info);
 extern XVisualInfo *X11DRV_setup_opengl_visual(Display *display);
 
 /* exported dib functions for now */
@@ -320,9 +457,10 @@
 #define X11DRV_ESCAPE 6789
 enum x11drv_escape_codes
 {
-    X11DRV_GET_DISPLAY,   /* get X11 display for a DC */
-    X11DRV_GET_DRAWABLE,  /* get current drawable for a DC */
-    X11DRV_GET_FONT,      /* get current X font for a DC */
+    X11DRV_GET_DISPLAY,     /* get X11 display for a DC */
+    X11DRV_GET_DRAWABLE,    /* get current drawable for a DC */
+    X11DRV_GET_FONT,        /* get current X font for a DC */
+    X11DRV_GET_OPENGL_INFO  /* get OpenGL info */
 };
 
 /**************************************************************************
Index: graphics/x11drv/init.c
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/init.c,v
retrieving revision 1.55
diff -u -r1.55 init.c
--- graphics/x11drv/init.c	10 Dec 2002 22:56:45 -0000	1.55
+++ graphics/x11drv/init.c	10 Jan 2003 23:33:04 -0000
@@ -294,6 +294,12 @@
                     *(Font *)out_data = pfo->fs->fid;
                     return TRUE;
                 }
+	    case X11DRV_GET_OPENGL_INFO:
+	        if (out_count >= sizeof(X11DRV_OPENGL_INFO))
+                {
+                    X11DRV_OpenGL_GetInfo(physDev, (X11DRV_OPENGL_INFO*)out_data);
+                    return TRUE;
+                }
             }
         }
         break;
Index: graphics/x11drv/opengl.c
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/opengl.c,v
retrieving revision 1.15
diff -u -r1.15 opengl.c
--- graphics/x11drv/opengl.c	27 Nov 2002 20:21:24 -0000	1.15
+++ graphics/x11drv/opengl.c	10 Jan 2003 23:33:10 -0000
@@ -113,15 +113,167 @@
 #define SONAME_LIBGL "libGL.so"
 #endif
 
-static void *opengl_handle;
+static void* opengl_handle;
+static BOOL opengl_info_valid = FALSE;
+static X11DRV_OPENGL_INFO opengl_info;
+
 
 #define MAKE_FUNCPTR(f) static typeof(f) * p##f;
 MAKE_FUNCPTR(glXChooseVisual)
 MAKE_FUNCPTR(glXGetConfig)
 MAKE_FUNCPTR(glXSwapBuffers)
 MAKE_FUNCPTR(glXQueryExtension)
+MAKE_FUNCPTR(glXQueryExtensionsString)
+MAKE_FUNCPTR(glXCreateContext)
+MAKE_FUNCPTR(glXDestroyContext)
+MAKE_FUNCPTR(glXMakeCurrent)
+MAKE_FUNCPTR(glXGetProcAddressARB)
+MAKE_FUNCPTR(glGetIntegerv)
+MAKE_FUNCPTR(glGetString)
 #undef MAKE_FUNCPTR
 
+static VOID X11DRV_OpenGL_GetInfoInit(VOID) {
+    const char* GL_Extensions = NULL;
+    XVisualInfo* vis = NULL;
+    GLXContext gl_context;
+
+    opengl_info_valid = FALSE;
+
+    TRACE("Init OpenGL Info struct\n");
+
+    vis = X11DRV_setup_opengl_visual(gdi_display);
+    wine_tsx11_lock();
+    gl_context = pglXCreateContext(gdi_display, vis, NULL, GL_TRUE);
+    if (!gl_context) {
+        ERR("Error in creating contex\n");
+       goto _exit;
+    }
+    if (pglXMakeCurrent(gdi_display, root_window, gl_context) == False) {
+       ERR("Error in setting current context (context %p drawable %ld)!\n", gl_context, root_window);
+       goto _exit;
+    }
+
+    /**
+     * Get some basic OpenGL caps
+     */
+    pglGetIntegerv(GL_MAX_LIGHTS, &opengl_info.max_lights);
+    
+    /** 
+     * Handle OpenGL extensions
+     */    
+    /** Default values */
+    memset(&opengl_info.supported, 0, sizeof(opengl_info.supported));
+    opengl_info.max_textures = 1;
+    opengl_info.vs_arb_version  = VS_VERSION_NOT_SUPPORTED;
+    opengl_info.vs_nv_version   = VS_VERSION_NOT_SUPPORTED;
+
+#define USE_GL_FUNC(type, pfn) opengl_info.pfn = NULL;
+    GL_EXT_FUNCS_GEN;
+#undef USE_GL_FUNC
+
+    GL_Extensions = pglGetString(GL_EXTENSIONS);
+    if (NULL == GL_Extensions) {
+      ERR("GL_EXTENSIONS returns NULL\n");
+    } else {
+      TRACE("GL_EXTENSIONS reported:\n"); 
+      while (*GL_Extensions != 0x00) {
+        const char* Start = GL_Extensions;
+        char ThisExtn[256];
+
+        memset(ThisExtn, 0x00, sizeof(ThisExtn));
+        while (*GL_Extensions != ' ' && *GL_Extensions != 0x00) {
+	  ++GL_Extensions;
+        }
+        memcpy(ThisExtn, Start, (GL_Extensions - Start));
+        TRACE ("- %s\n", ThisExtn);
+
+#define USE_GL_FUNC(type, pfn) opengl_info.pfn = (type) pglXGetProcAddressARB(#pfn);
+
+	/**
+	 * ARB 
+	 */
+        if (strcmp(ThisExtn, "GL_ARB_multitexture") == 0) {
+	  /* handle multi texturing extensions */
+	  pglGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &opengl_info.max_textures);
+	  TRACE(" FOUND: ARB Multitexture support - GL_MAX_TEXTURE_UNITS_ARB=%u\n", opengl_info.max_textures);
+	  opengl_info.supported[ARB_MULTITEXTURE] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_ARB_texture_compression") == 0) {
+	  FIXME(" FOUND: ARB Texture Compression support\n");
+	  opengl_info.supported[ARB_TEXTURE_COMPRESSION] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_ARB_texture_cube_map") == 0) {
+	  FIXME(" FOUND: ARB Texture Cube Map support\n");
+	  opengl_info.supported[ARB_TEXTURE_CUBE_MAP] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_ARB_vertex_program") == 0) {
+	  opengl_info.vs_arb_version = VS_VERSION_11;
+	  FIXME(" FOUND: ARB Vertex Shader support - version=%02x\n", opengl_info.vs_arb_version);
+	  opengl_info.supported[ARB_VERTEX_PROGRAM] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_ARB_vertex_blend") == 0) {
+	  FIXME(" FOUND: ARB Vertex Blend Support\n");
+	  opengl_info.supported[ARB_VERTEX_BLEND] = TRUE;
+
+	/**
+	 * EXT
+	 */
+        } else if (strcmp(ThisExtn, "GL_EXT_fog_coord") == 0) {
+	  FIXME(" FOUND: EXT Fog coord\n");
+	  opengl_info.supported[EXT_FOG_COORD] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) {
+	  /* handle paletted texture extensions */
+	  USE_GL_FUNC(PFNGLCOLORTABLEEXTPROC,            glColorTableEXT);
+	  TRACE(" FOUND: EXT Paletted texture support\n");
+	  opengl_info.supported[EXT_PALETTED_TEXTURE] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_secondary_color") == 0) {
+	  USE_GL_FUNC(PFNGLSECONDARYCOLOR3UBEXTPROC,     glSecondaryColor3ubEXT); 
+	  USE_GL_FUNC(PFNGLSECONDARYCOLOR3FEXTPROC,      glSecondaryColor3fEXT); 
+	  USE_GL_FUNC(PFNGLSECONDARYCOLOR3FVEXTPROC,     glSecondaryColor3fvEXT); 
+	  USE_GL_FUNC(PFNGLSECONDARYCOLORPOINTEREXTPROC, glSecondaryColorPointerEXT); 
+	  FIXME(" FOUND: EXT Secondary coord\n");
+	  opengl_info.supported[EXT_SECONDARY_COLOR] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_vertex_weighting") == 0) {
+	  USE_GL_FUNC(PFNGLVERTEXWEIGHTFEXTPROC,         glVertexWeightfEXT);
+	  USE_GL_FUNC(PFNGLVERTEXWEIGHTFVEXTPROC,        glVertexWeightfvEXT);
+	  USE_GL_FUNC(PFNGLVERTEXWEIGHTPOINTEREXTPROC,   glVertexWeightPointerEXT); 
+	  FIXME(" FOUND: EXT Vertex weighting\n");
+	  opengl_info.supported[EXT_VERTEX_WEIGHTING] = TRUE;
+
+	/**
+	 * NVIDIA 
+	 */
+	} else if (strstr(ThisExtn, "GL_NV_vertex_program")) {
+	  opengl_info.vs_nv_version = max(opengl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program1_1")) ? VS_VERSION_11 : VS_VERSION_10);
+	  opengl_info.vs_nv_version = max(opengl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program2"))   ? VS_VERSION_20 : VS_VERSION_10);
+	  if (NULL == opengl_info.glBindProgramNV) { USE_GL_FUNC(PFNGLBINDPROGRAMNVPROC, glBindProgramNV); }
+	  TRACE(" FOUND: NVIDIA Vertex Shader support - version=%02x\n", opengl_info.vs_nv_version);
+	  opengl_info.supported[NV_VERTEX_PROGRAM] = TRUE;
+
+	/**
+	 * ATI
+	 */
+	/** TODO */
+	} else if (strcmp(ThisExtn, "GL_EXT_vertex_shader") == 0) {
+	  opengl_info.vs_ati_version = VS_VERSION_11;
+	  USE_GL_FUNC(PFNGLBINDVERTEXSHADEREXTPROC,      glBindVertexShaderEXT); 
+	  USE_GL_FUNC(PFNGLDELETEVERTEXSHADEREXTPROC,    glDeleteVertexShaderEXT); 
+	  USE_GL_FUNC(PFNGLGENVERTEXSHADERSEXTPROC,      glGenVertexShadersEXT); 
+	  USE_GL_FUNC(PFNGLBEGINVERTEXSHADEREXTPROC,     glBeginVertexShaderEXT); 
+	  USE_GL_FUNC(PFNGLENDVERTEXSHADEREXTPROC,       glEndVertexShaderEXT); 
+	  TRACE(" FOUND: AIT (EXT) Vertex Shader support - version=%02x\n", opengl_info.vs_ati_version);
+	  opengl_info.supported[EXT_VERTEX_SHADER] = TRUE;
+	}
+
+#undef USE_GL_FUNC
+
+        if (*GL_Extensions == ' ') ++GL_Extensions;
+      }
+    }
+
+    opengl_info_valid = TRUE;
+    pglXDestroyContext(gdi_display, gl_context);
+
+_exit:
+    wine_tsx11_unlock();
+}
+
 void X11DRV_OpenGL_Init(Display *display) {
     int error_base, event_base;
 
@@ -133,6 +285,13 @@
 LOAD_FUNCPTR(glXGetConfig)
 LOAD_FUNCPTR(glXSwapBuffers)
 LOAD_FUNCPTR(glXQueryExtension)
+LOAD_FUNCPTR(glXQueryExtensionsString)
+LOAD_FUNCPTR(glXCreateContext)
+LOAD_FUNCPTR(glXDestroyContext)
+LOAD_FUNCPTR(glXMakeCurrent)
+LOAD_FUNCPTR(glXGetProcAddressARB)
+LOAD_FUNCPTR(glGetIntegerv)
+LOAD_FUNCPTR(glGetString)
 #undef LOAD_FUNCPTR
 
     wine_tsx11_lock();
@@ -150,6 +309,20 @@
     opengl_handle = NULL;
 }
 
+BOOL X11DRV_OpenGL_GetInfo(X11DRV_PDEVICE* physDev, X11DRV_OPENGL_INFO* info) {
+  static int _isInit = 0;
+  if (0 == _isInit) {
+    /** Init opengl caps struct */
+    X11DRV_OpenGL_GetInfoInit();
+    _isInit = 1;
+  } 
+  if (TRUE == opengl_info_valid) {
+    memcpy(info, &opengl_info, sizeof(X11DRV_OPENGL_INFO));
+  }
+  return  opengl_info_valid;
+}
+
+
 /* X11DRV_ChoosePixelFormat
 
      Equivalent of glXChooseVisual
@@ -433,6 +606,11 @@
 
 void X11DRV_OpenGL_Init(Display *display)
 {
+}
+
+BOOL X11DRV_OpenGL_GetInfo(X11DRV_PDEVICE *physDev, X11DRV_OPENGL_INFO* info) {
+  ERR("No OpenGL support compiled in.\n");
+  return FALSE;
 }
 
 /***********************************************************************


More information about the wine-patches mailing list