I also fixed a problem with the GLX extension string when the rendering screen was not direct capable (i.e., a remote display).
The problem with HP_occlusion_test persists. :(
I don't plan to do anything else with these changes until *after* I return from vacation. I'll be back on the 23rd of June. I will be around for the #dri-devel chat on the 9th, however.
Please use that week as an opportunity to put the patch through its paces. I know there are few code paths that aren't fully tested. I'd like to commit the patch sometime shortly after I return.
Index: lib/GL/glx/compsize.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/compsize.c,v retrieving revision 1.6 diff -u -d -r1.6 compsize.c --- lib/GL/glx/compsize.c 25 Nov 2002 19:57:48 -0000 1.6 +++ lib/GL/glx/compsize.c 6 Jun 2003 21:26:06 -0000 @@ -38,6 +38,139 @@ #include "size.h" +/* +** Return the number of elements per group of a specified format +*/ +GLint __glElementsPerGroup(GLenum format, GLenum type) +{ + /* + ** To make row length computation valid for image extraction, + ** packed pixel types assume elements per group equals one. + */ + switch(type) { + case GL_UNSIGNED_BYTE_3_3_2: + case GL_UNSIGNED_BYTE_2_3_3_REV: + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_5_6_5_REV: + case GL_UNSIGNED_SHORT_4_4_4_4: + case GL_UNSIGNED_SHORT_4_4_4_4_REV: + case GL_UNSIGNED_SHORT_5_5_5_1: + case GL_UNSIGNED_SHORT_1_5_5_5_REV: + case GL_UNSIGNED_SHORT_8_8_APPLE: + case GL_UNSIGNED_SHORT_8_8_REV_APPLE: + case GL_UNSIGNED_SHORT_15_1_MESA: + case GL_UNSIGNED_SHORT_1_15_REV_MESA: + case GL_UNSIGNED_INT_8_8_8_8: + case GL_UNSIGNED_INT_8_8_8_8_REV: + case GL_UNSIGNED_INT_10_10_10_2: + case GL_UNSIGNED_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_24_8_NV: + case GL_UNSIGNED_INT_24_8_MESA: + case GL_UNSIGNED_INT_8_24_REV_MESA: + return 1; + default: + break; + } + + switch(format) { + case GL_RGB: + case GL_BGR: + return 3; + case GL_422_EXT: + case GL_422_REV_EXT: + case GL_422_AVERAGE_EXT: + case GL_422_REV_AVERAGE_EXT: + case GL_LUMINANCE_ALPHA: + return 2; + case GL_RGBA: + case GL_BGRA: + case GL_ABGR_EXT: + return 4; + case GL_COLOR_INDEX: + case GL_STENCIL_INDEX: + case GL_DEPTH_COMPONENT: + case GL_RED: + case GL_GREEN: + case GL_BLUE: + case GL_ALPHA: + case GL_LUMINANCE: + case GL_INTENSITY: + return 1; + default: + return 0; + } +} + +/* +** Return the number of bytes per element, based on the element type (other +** than GL_BITMAP). +*/ +GLint __glBytesPerElement(GLenum type) +{ + switch(type) { + case GL_UNSIGNED_SHORT: + case GL_SHORT: + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_5_6_5_REV: + case GL_UNSIGNED_SHORT_4_4_4_4: + case GL_UNSIGNED_SHORT_4_4_4_4_REV: + case GL_UNSIGNED_SHORT_5_5_5_1: + case GL_UNSIGNED_SHORT_1_5_5_5_REV: + case GL_UNSIGNED_SHORT_8_8_APPLE: + case GL_UNSIGNED_SHORT_8_8_REV_APPLE: + case GL_UNSIGNED_SHORT_15_1_MESA: + case GL_UNSIGNED_SHORT_1_15_REV_MESA: + return 2; + case GL_UNSIGNED_BYTE: + case GL_BYTE: + case GL_UNSIGNED_BYTE_3_3_2: + case GL_UNSIGNED_BYTE_2_3_3_REV: + return 1; + case GL_INT: + case GL_UNSIGNED_INT: + case GL_FLOAT: + case GL_UNSIGNED_INT_8_8_8_8: + case GL_UNSIGNED_INT_8_8_8_8_REV: + case GL_UNSIGNED_INT_10_10_10_2: + case GL_UNSIGNED_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_24_8_NV: + case GL_UNSIGNED_INT_24_8_MESA: + case GL_UNSIGNED_INT_8_24_REV_MESA: + return 4; + default: + return 0; + } +} + +/* +** Compute memory required for internal packed array of data of given type +** and format. +*/ +GLint __glImageSize(GLsizei width, GLsizei height, GLsizei depth, + GLenum format, GLenum type) +{ + int bytes_per_row; + int components; + + if (width < 0 || height < 0 || depth < 0) { + return 0; + } + /* + ** Zero is returned if either format or type are invalid. + */ + components = __glElementsPerGroup(format,type); + if (type == GL_BITMAP) { + if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) { + bytes_per_row = (width + 7) >> 3; + } else { + return 0; + } + } else { + bytes_per_row = __glBytesPerElement(type) * width; + } + return bytes_per_row * height * depth * components; +} + GLint __glFogiv_size(GLenum pname) { switch (pname) { @@ -47,6 +180,8 @@ case GL_FOG_MODE: return 1; case GL_FOG_INDEX: return 1; case GL_FOG_START: return 1; + case GL_FOG_DISTANCE_MODE_NV: return 1; + case GL_FOG_OFFSET_VALUE_SGIX: return 1; default: return 0; } @@ -81,82 +216,7 @@ GLint __glDrawPixels_size(GLenum format, GLenum type, GLsizei w, GLsizei h) { - GLint elements, esize; - - switch (format) { - case GL_COLOR_INDEX: - case GL_STENCIL_INDEX: - case GL_DEPTH_COMPONENT: - elements = 1; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - elements = 1; - break; - case GL_LUMINANCE_ALPHA: - elements = 2; - break; - case GL_RGB: - case GL_BGR: - elements = 3; - break; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elements = 4; - break; - default: - return 0; - } - switch (type) { - case GL_BITMAP: - if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) { - return (h * ((w+7)/8)); - } else { - return 0; - } - case GL_BYTE: - case GL_UNSIGNED_BYTE: - esize = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - esize = 1; - elements = 1; - break; - case GL_SHORT: - case GL_UNSIGNED_SHORT: - esize = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - esize = 2; - elements = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - esize = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - esize = 4; - elements = 1; - break; - default: - return 0; - } - return (elements * esize * w * h); + return __glImageSize( w, h, 1, format, type ); } GLint __glBitmap_size(GLsizei w, GLsizei h) @@ -190,25 +250,45 @@ GLint __glTexParameterfv_size(GLenum e) { switch (e) { + case GL_TEXTURE_BORDER_COLOR: + return 4; + case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_WRAP_R: case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: - return 1; - case GL_TEXTURE_BORDER_COLOR: - return 4; case GL_TEXTURE_PRIORITY: - return 1; + case GL_TEXTURE_RESIDENT: + + /* GL_SGIS_texture_lod / GL_EXT_texture_lod / GL 1.2 */ case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MAX_LOD: case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: + + /* GL_SGIX_texture_lod_bias */ + case GL_TEXTURE_LOD_BIAS_S_SGIX: + case GL_TEXTURE_LOD_BIAS_T_SGIX: + case GL_TEXTURE_LOD_BIAS_R_SGIX: + + /* GL_ARB_shadow / GL 1.4 */ + case GL_TEXTURE_COMPARE_MODE: + case GL_TEXTURE_COMPARE_FUNC: + + /* GL_SGIX_shadow_ambient / GL_ARB_shadow_ambient */ + case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: + + /* GL_SGIX_shadow */ + case GL_TEXTURE_COMPARE_SGIX: + case GL_TEXTURE_COMPARE_OPERATOR_SGIX: + + /* GL_SGIX_texture_coordinate_clamp */ + case GL_TEXTURE_MAX_CLAMP_S_SGIX: + case GL_TEXTURE_MAX_CLAMP_T_SGIX: + case GL_TEXTURE_MAX_CLAMP_R_SGIX: return 1; - case GL_TEXTURE_COMPARE_MODE_ARB: /* GL_ARB_shadow */ - case GL_TEXTURE_COMPARE_FUNC_ARB: /* GL_ARB_shadow */ - case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: /* GL_ARB_shadow_ambient */ - return 1; + default: return 0; } @@ -243,7 +323,7 @@ case GL_OPERAND2_ALPHA_EXT: case GL_RGB_SCALE_EXT: case GL_ALPHA_SCALE: - /* GL_EXT_texture_lod */ + /* GL_EXT_texture_lod_bias */ case GL_TEXTURE_LOD_BIAS_EXT: return 1; default: @@ -258,245 +338,18 @@ GLint __glTexImage1D_size(GLenum format, GLenum type, GLsizei w) { - GLint elements, esize; - - if (w < 0) return 0; - switch (format) { - case GL_COLOR_INDEX: - elements = 1; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - case GL_DEPTH_COMPONENT: - elements = 1; - break; - case GL_LUMINANCE_ALPHA: - elements = 2; - break; - case GL_RGB: - case GL_BGR: - elements = 3; - break; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elements = 4; - break; - default: - return 0; - } - switch (type) { - case GL_BITMAP: - if (format == GL_COLOR_INDEX) { - return (w+7)/8; - } else { - return 0; - } - case GL_BYTE: - case GL_UNSIGNED_BYTE: - esize = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - esize = 1; - elements = 1; - break; - case GL_SHORT: - case GL_UNSIGNED_SHORT: - esize = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - esize = 2; - elements = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - esize = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - esize = 4; - elements = 1; - break; - default: - return 0; - } - return (elements * esize * w); + return __glImageSize( w, 1, 1, format, type ); } GLint __glTexImage2D_size(GLenum format, GLenum type, GLsizei w, GLsizei h) { - GLint elements, esize; - - if (w < 0) return 0; - if (h < 0) return 0; - switch (format) { - case GL_COLOR_INDEX: - elements = 1; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - case GL_DEPTH_COMPONENT: - elements = 1; - break; - case GL_LUMINANCE_ALPHA: - elements = 2; - break; - case GL_RGB: - case GL_BGR: - elements = 3; - break; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elements = 4; - break; - default: - return 0; - } - switch (type) { - case GL_BITMAP: - if (format == GL_COLOR_INDEX) { - return (h * ((w+7)/8)); - } else { - return 0; - } - case GL_BYTE: - case GL_UNSIGNED_BYTE: - esize = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - esize = 1; - elements = 1; - break; - case GL_SHORT: - case GL_UNSIGNED_SHORT: - esize = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - esize = 2; - elements = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - esize = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - esize = 4; - elements = 1; - break; - default: - return 0; - } - return (elements * esize * w * h); + return __glImageSize( w, h, 1, format, type ); } GLint __glTexImage3D_size(GLenum format, GLenum type, GLsizei w, GLsizei h, GLsizei d) { - GLint elements, esize; - - if (w < 0) return 0; - if (h < 0) return 0; - if (d < 0) return 0; - switch (format) { - case GL_COLOR_INDEX: - elements = 1; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - elements = 1; - break; - case GL_LUMINANCE_ALPHA: - elements = 2; - break; - case GL_RGB: - case GL_BGR: - elements = 3; - break; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elements = 4; - break; - default: - return 0; - } - switch (type) { - case GL_BITMAP: - if (format == GL_COLOR_INDEX) { - return (d * (h * ((w+7)/8))); - } else { - return 0; - } - case GL_BYTE: - case GL_UNSIGNED_BYTE: - esize = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - esize = 1; - elements = 1; - break; - case GL_SHORT: - case GL_UNSIGNED_SHORT: - esize = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - esize = 2; - elements = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - esize = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - esize = 4; - elements = 1; - break; - default: - return 0; - } - return (elements * esize * w * h * d); + return __glImageSize( w, h, d, format, type ); } GLint __glLightfv_size(GLenum pname) Index: lib/GL/glx/glxclient.h =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/glxclient.h,v retrieving revision 1.28 diff -u -d -r1.28 glxclient.h --- lib/GL/glx/glxclient.h 21 May 2003 17:32:05 -0000 1.28 +++ lib/GL/glx/glxclient.h 6 Jun 2003 21:26:06 -0000 @@ -181,8 +181,6 @@ /* ** Method to bind a DRI drawable to a DRI graphics context. - ** XXX in the future, also pass a 'read' GLXDrawable for - ** glXMakeCurrentReadSGI() and GLX 1.3's glXMakeContextCurrent(). */ Bool (*bindContext)(Display *dpy, int scrn, GLXDrawable draw, GLXContext gc); @@ -199,6 +197,22 @@ ** screen used to create this context. Never dereferenced in libGL. */ void *private; + + /* + ** Added with internal API version "20030606". + ** + ** Method to bind a DRI drawable to a DRI graphics context. + */ + Bool (*bindContext2)(Display *dpy, int scrn, GLXDrawable draw, + GLXDrawable read, GLXContext gc); + + /* + ** Added with internal API version "20030606". + ** + ** Method to unbind a DRI drawable to a DRI graphics context. + */ + Bool (*unbindContext2)(Display *dpy, int scrn, GLXDrawable draw, + GLXDrawable read, GLXContext gc); }; /* @@ -492,7 +506,7 @@ /* ** The current drawable for this context. Will be None if this - ** context is not current to any drawable. + ** context is not current to any drawable. currentReadable is below. */ GLXDrawable currentDrawable; @@ -532,6 +546,14 @@ ** Added with internal API version "20030317". */ GLXFBConfigID fbconfigID; + + /* + ** Added with internal API version "20030606". + ** + ** The current read-drawable for this context. Will be None if this + ** context is not current to any drawable. + */ + GLXDrawable currentReadable; }; #define __glXSetError(gc,code) \ @@ -693,6 +715,14 @@ /* Return the size, in bytes, of some pixel data */ extern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum); + +/* Return the number of elements per group of a specified format*/ +extern GLint __glElementsPerGroup(GLenum format, GLenum type); + +/* Return the number of bytes per element, based on the element type (other +** than GL_BITMAP). +*/ +extern GLint __glBytesPerElement(GLenum type); /* Return the k value for a given map target */ extern GLint __glEvalComputeK(GLenum); Index: lib/GL/glx/glxcmds.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/glxcmds.c,v retrieving revision 1.41 diff -u -d -r1.41 glxcmds.c --- lib/GL/glx/glxcmds.c 21 May 2003 17:32:06 -0000 1.41 +++ lib/GL/glx/glxcmds.c 6 Jun 2003 21:26:07 -0000 @@ -52,6 +52,7 @@ const char __glXGLClientExtensions[] = "GL_ARB_depth_texture " "GL_ARB_imaging " + "GL_ARB_multisample " "GL_ARB_multitexture " "GL_ARB_point_parameters " "GL_ARB_shadow " @@ -72,6 +73,7 @@ "GL_EXT_blend_logic_op " "GL_EXT_blend_minmax " "GL_EXT_blend_subtract " + "GL_EXT_clip_volume_hint " "GL_EXT_copy_texture " "GL_EXT_draw_range_elements " "GL_EXT_fog_coord " @@ -81,28 +83,131 @@ "GL_EXT_rescale_normal " "GL_EXT_secondary_color " "GL_EXT_separate_specular_color " + "GL_EXT_shadow_funcs " "GL_EXT_stencil_two_side " "GL_EXT_stencil_wrap " "GL_EXT_subtexture " "GL_EXT_texture " "GL_EXT_texture3D " + "GL_EXT_texture_edge_clamp " "GL_EXT_texture_env_add " "GL_EXT_texture_env_combine " "GL_EXT_texture_env_dot3 " + "GL_EXT_texture_filter_anisotropic " + "GL_EXT_texture_lod " "GL_EXT_texture_lod_bias " "GL_EXT_texture_object " + "GL_EXT_texture_rectangle " "GL_EXT_vertex_array " + "GL_APPLE_packed_pixels " + "GL_APPLE_ycbcr_422 " + "GL_ATI_texture_env_combine3 " + "GL_ATI_texture_float " + "GL_ATI_texture_mirror_once " + "GL_ATIX_texture_env_combine3 " + "GL_HP_convolution_border_modes " + "GL_HP_occlusion_test " + "GL_IBM_cull_vertex " + "GL_IBM_pixel_filter_hint " + "GL_IBM_rasterpos_clip " + "GL_IBM_texture_clamp_nodraw " "GL_IBM_texture_mirrored_repeat " + "GL_MESA_pack_invert " + "GL_MESA_ycbcr_texture " "GL_NV_blend_square " + "GL_NV_copy_depth_to_color " + "GL_NV_depth_clamp " + "GL_NV_fog_distance " + "GL_NV_light_max_exponent " + "GL_NV_multisample_filter_hint " + "GL_NV_texgen_reflection " + "GL_NV_texture_rectangle " + "GL_SGIS_generate_mipmap " "GL_SGIS_multisample " "GL_SGIS_texture_border_clamp " "GL_SGIS_texture_edge_clamp " - "GL_SGIS_generate_mipmap " + "GL_SGIS_texture_lod " + "GL_SGIX_blend_alpha_minmax " + "GL_SGIX_clipmap " + "GL_SGIX_depth_texture " + "GL_SGIX_fog_offset " + "GL_SGIX_shadow " + "GL_SGIX_shadow_ambient " + "GL_SGIX_texture_coordinate_clamp " + "GL_SGIX_texture_lod_bias " + "GL_SGIX_texture_range " + "GL_SGIX_vertex_preclip " + "GL_SGIX_vertex_preclip_hint " + "GL_SGIX_ycrcb " + "GL_SUN_convolution_border_modes " + "GL_SUN_slice_accum " ; static const char __glXGLXClientVendorName[] = "SGI"; static const char __glXGLXClientVersion[] = "1.2"; +static void * DriverCreateContextWrapper( __GLXscreenConfigs *psc, + Display *dpy, XVisualInfo *vis, void *shared, __DRIcontext *ctx, + __GLXFBConfig *fbconfig ); + +static Bool dummyBindContext2( Display *dpy, int scrn, + GLXDrawable draw, GLXDrawable read, GLXContext gc ); + +static Bool dummyUnbindContext2( Display *dpy, int scrn, + GLXDrawable draw, GLXDrawable read, GLXContext gc ); + +/****************************************************************************/ + +static Bool dummyBindContext2( Display *dpy, int scrn, + GLXDrawable draw, GLXDrawable read, + GLXContext gc ) +{ + assert( draw == read ); + return (*gc->driContext.bindContext)( dpy, scrn, draw, gc ); +} + +static Bool dummyUnbindContext2( Display *dpy, int scrn, + GLXDrawable draw, GLXDrawable read, + GLXContext gc ) +{ + assert( draw == read ); + return (*gc->driContext.unbindContext)( dpy, scrn, draw, gc, GL_FALSE ); +} + + +/****************************************************************************/ +/** + * Wrap the call to the driver's \c createContext function. + * + * The \c createContext function is wrapped because not all drivers support + * the "new" \c unbindContext2 and \c bindContext2 interfaces. libGL should + * not have to check to see which functions the driver supports. Instead, + * if either function is not supported it is wrapped. The wrappers test to + * make sure that both drawables are the same and pass control to the old + * interface. + */ + +static void * DriverCreateContextWrapper( __GLXscreenConfigs *psc, + Display *dpy, XVisualInfo *vis, void *shared, + __DRIcontext *ctx, __GLXFBConfig *fbconfig ) +{ + void * ctx_priv; + + ctx_priv = (*psc->driScreen.createContext)(dpy, vis, shared, ctx, + fbconfig); + if ( ctx_priv != NULL ) { + if ( ctx->unbindContext2 == NULL ) { + ctx->unbindContext2 = dummyUnbindContext2; + } + + if ( ctx->bindContext2 == NULL ) { + ctx->bindContext2 = dummyBindContext2; + } + } + + return ctx_priv; +} + /****************************************************************************/ /** * Get the write __DRIdrawable bound to the specificed GLXContext @@ -114,7 +219,7 @@ */ static __DRIdrawable * -GetDRIDrawable( GLXContext gc ) +GetDRIDrawable( GLXContext gc, GLXDrawable drawable ) { #ifdef GLX_DIRECT_RENDERING __DRIdrawable *pdraw = NULL; @@ -130,7 +235,7 @@ ** not bound to a direct rendering context. */ pdraw = (*psc->driScreen.getDrawable)(gc->currentDpy, - gc->currentDrawable, + drawable, psc->driScreen.private); } } @@ -138,6 +243,7 @@ return pdraw; #else + (void) gc; return NULL; #endif } @@ -258,8 +364,8 @@ void *shared = (shareList ? shareList->driContext.private : NULL); gc->driContext.private = - (*psc->driScreen.createContext)(dpy, vis, shared, - &gc->driContext, NULL); + DriverCreateContextWrapper( psc, dpy, vis, shared, + &gc->driContext, NULL ); if (gc->driContext.private) { gc->isDirect = GL_TRUE; gc->screen = vis->screen; @@ -647,24 +753,11 @@ GLXContextTag tag; CARD8 opcode; #ifdef GLX_DIRECT_RENDERING - __GLXdisplayPrivate *priv; - __DRIdrawable *pdraw; + __DRIdrawable *pdraw = GetDRIDrawable( gc, drawable ); - priv = __glXInitialize(dpy); - if (priv->driDisplay.private) { - __GLXscreenConfigs *psc = &priv->screenConfigs[gc->screen]; - if (psc && psc->driScreen.private) { - /* - ** getDrawable returning NULL implies that the drawable is - ** not bound to a direct rendering context. - */ - pdraw = (*psc->driScreen.getDrawable)(dpy, drawable, - psc->driScreen.private); - if (pdraw) { - (*pdraw->swapBuffers)(dpy, pdraw->private); - return; - } - } + if ( pdraw != NULL ) { + (*pdraw->swapBuffers)(dpy, pdraw->private); + return; } #endif @@ -677,7 +770,8 @@ ** The calling thread may or may not have a current context. If it ** does, send the context tag so the server can do a flush. */ - if ((dpy == gc->currentDpy) && (drawable == gc->currentDrawable)) { + if ((dpy == gc->currentDpy) && + ((drawable == gc->currentDrawable) || (drawable == gc->currentReadable)) ) { tag = gc->currentContextTag; } else { tag = 0; @@ -769,20 +863,22 @@ case GLX_TRANSPARENT_INDEX_VALUE_EXT: *value_return = pConfig->transparentIndex; return Success; - case GLX_X_VISUAL_TYPE_EXT: + case GLX_X_VISUAL_TYPE: switch(pConfig->class) { case TrueColor: - *value_return = GLX_TRUE_COLOR_EXT; break; + *value_return = GLX_TRUE_COLOR; break; case DirectColor: - *value_return = GLX_DIRECT_COLOR_EXT; break; + *value_return = GLX_DIRECT_COLOR; break; case PseudoColor: - *value_return = GLX_PSEUDO_COLOR_EXT; break; + *value_return = GLX_PSEUDO_COLOR; break; case StaticColor: - *value_return = GLX_STATIC_COLOR_EXT; break; + *value_return = GLX_STATIC_COLOR; break; case GrayScale: - *value_return = GLX_GRAY_SCALE_EXT; break; + *value_return = GLX_GRAY_SCALE; break; case StaticGray: - *value_return = GLX_STATIC_GRAY_EXT; break; + *value_return = GLX_STATIC_GRAY; break; + default: + *value_return = GLX_NONE; break; } return Success; case GLX_VISUAL_CAVEAT_EXT: @@ -1330,7 +1426,15 @@ screen, GLX_EXTENSIONS); } - psc->effectiveGLXexts = (char *) __glXGetUsableExtensions(psc->serverGLXexts); +#ifdef GLX_DIRECT_RENDERING + psc->effectiveGLXexts = (char *) __glXGetUsableExtensions(psc->serverGLXexts, + (priv->driDisplay.private != NULL), + priv->minorVersion); +#else + psc->effectiveGLXexts = (char *) __glXGetUsableExtensions(psc->serverGLXexts, + GL_FALSE, + priv->minorVersion); +#endif } return psc->effectiveGLXexts; @@ -1638,9 +1742,8 @@ void *shared = (shareList ? shareList->driContext.private : NULL); gc->driContext.private = - (*psc->driScreen.createContext)(dpy, NULL, shared, - &gc->driContext, - fbconfig); + DriverCreateContextWrapper( psc, dpy, NULL, shared, + &gc->driContext, fbconfig ); if (gc->driContext.private) { gc->isDirect = GL_TRUE; gc->screen = fbconfig->screen; @@ -1720,10 +1823,10 @@ } -GLXDrawable glXGetCurrentReadDrawable(void) +GLXDrawable GLX_PREFIX(glXGetCurrentReadDrawable)(void) { GLXContext gc = __glXGetCurrentContext(); - return gc->currentDrawable; + return gc->currentReadable; } @@ -1796,16 +1899,6 @@ } -Bool GLX_PREFIX(glXMakeContextCurrent)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) -{ - (void) dpy; - (void) draw; - (void) read; - (void) ctx; - return 0; -} - - int GLX_PREFIX(glXQueryContext)(Display *dpy, GLXContext ctx, int attribute, int *value) { (void) dpy; @@ -1833,6 +1926,7 @@ } +#if 0 /* ** GLX_SGI_make_current_read */ @@ -1844,11 +1938,12 @@ (void) ctx; return False; } +#endif GLXDrawable glXGetCurrentReadDrawableSGI(void) { GLXContext gc = __glXGetCurrentContext(); - return gc->currentDrawable; + return gc->currentReadable; } @@ -1873,7 +1968,7 @@ #ifdef GLX_DIRECT_RENDERING if ( gc->isDirect && __glXExtensionBitIsEnabled( SGI_swap_control_bit ) ) { - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, gc->currentDrawable ); if ( pdraw != NULL ) { pdraw->swap_interval = interval; @@ -1913,7 +2008,7 @@ { #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, gc->currentDrawable ); if ( pdraw == NULL ) { return GLX_BAD_CONTEXT; @@ -1938,7 +2033,7 @@ { #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, gc->currentDrawable ); if ( pdraw && __glXExtensionBitIsEnabled( MESA_swap_control_bit ) ) { @@ -2026,7 +2121,7 @@ int status = GLX_BAD_CONTEXT; #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, drawable ); if ( (pdraw != NULL ) && (pdraw->queryFrameTracking != NULL) && __glXExtensionBitIsEnabled( MESA_swap_frame_usage_bit ) ) { @@ -2053,7 +2148,7 @@ int status = GLX_BAD_CONTEXT; #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, drawable ); if ( (pdraw != NULL ) && (pdraw->queryFrameTracking != NULL) && __glXExtensionBitIsEnabled( MESA_swap_frame_usage_bit ) ) { @@ -2112,7 +2207,7 @@ { #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, gc->currentDrawable ); if ( divisor <= 0 || remainder < 0 ) return GLX_BAD_VALUE; @@ -2237,9 +2332,8 @@ void *shared = (shareList ? shareList->driContext.private : NULL); gc->driContext.private = - (*psc->driScreen.createContext)(dpy, NULL, shared, - &gc->driContext, - fbconfig); + DriverCreateContextWrapper( psc, dpy, NULL, shared, + &gc->driContext, fbconfig ); if (gc->driContext.private) { gc->isDirect = GL_TRUE; gc->screen = fbconfig->screen; @@ -2598,7 +2692,7 @@ { #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, drawable ); /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE * error", but it also says "It [glXSwapBuffersMscOML] will return a value @@ -2632,7 +2726,7 @@ { #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, drawable ); int ret; /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE @@ -2673,7 +2767,7 @@ { #ifdef GLX_DIRECT_RENDERING GLXContext gc = __glXGetCurrentContext(); - __DRIdrawable *pdraw = GetDRIDrawable( gc ); + __DRIdrawable *pdraw = GetDRIDrawable( gc, drawable ); int ret; /* The OML_sync_control spec says this should "generate a GLX_BAD_VALUE @@ -3159,8 +3253,9 @@ * GLX_MESA_swap_frame_usage, GLX_OML_swap_method, * GLX_{ARB,SGIS}_multisample, and * GLX_SGIX_visual_select_group. + * 20030606 - Added support for GLX_SGI_make_current_read. */ - return 20030317; + return 20030606; } Index: lib/GL/glx/glxext.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/glxext.c,v retrieving revision 1.28 diff -u -d -r1.28 glxext.c --- lib/GL/glx/glxext.c 13 May 2003 13:48:21 -0000 1.28 +++ lib/GL/glx/glxext.c 6 Jun 2003 21:26:07 -0000 @@ -674,12 +674,6 @@ fb_req->reqType = priv->majorOpcode; fb_req->glxCode = X_GLXGetFBConfigs; fb_req->screen = i; - if (_XReply(dpy, (xReply*) &reply, 0, False)) { - /* Something is busted. Punt. */ - UnlockDisplay(dpy); - FreeScreenConfigs(priv); - return GL_FALSE; - } break; case 2: @@ -690,12 +684,6 @@ sgi_req->glxCode = X_GLXVendorPrivateWithReply; sgi_req->vendorCode = X_GLXvop_GetFBConfigsSGIX; sgi_req->screen = i; - if (_XReply(dpy, (xReply*) &reply, 0, False)) { - /* Something is busted. Punt. */ - UnlockDisplay(dpy); - FreeScreenConfigs(priv); - return GL_FALSE; - } break; case 3: @@ -703,15 +691,16 @@ req->reqType = priv->majorOpcode; req->glxCode = X_GLXGetVisualConfigs; req->screen = i; - if (!_XReply(dpy, (xReply*) &reply, 0, False)) { - /* Something is busted. Punt. */ - UnlockDisplay(dpy); - FreeScreenConfigs(priv); - return GL_FALSE; - } break; } + if (!_XReply(dpy, (xReply*) &reply, 0, False)) { + /* Something is busted. Punt. */ + UnlockDisplay(dpy); + FreeScreenConfigs(priv); + return GL_FALSE; + } + UnlockDisplay(dpy); if (!reply.numVisuals) { /* This screen does not support GL rendering */ @@ -745,9 +734,11 @@ } /* Allocate memory for the properties, if needed */ - prop_size = (supported_request == 3) - ? nprops * __GLX_SIZE_INT32 - : nprops * __GLX_SIZE_INT32 * 2; + if ( supported_request != 3 ) { + nprops *= 2; + } + + prop_size = nprops * __GLX_SIZE_INT32; if (prop_size <= sizeof(buf)) { props = buf; @@ -1091,17 +1082,81 @@ /************************************************************************/ +static Bool SendMakeCurrentRequest( Display *dpy, CARD8 opcode, + GLXContextID gc, GLXContextTag old_gc, GLXDrawable draw, GLXDrawable read, + xGLXMakeCurrentReply * reply ); + +static Bool SendMakeCurrentRequest( Display *dpy, CARD8 opcode, + GLXContextID gc_id, GLXContextTag gc_tag, + GLXDrawable draw, GLXDrawable read, + xGLXMakeCurrentReply * reply ) +{ + opcode = __glXSetupForCommand(dpy); + if (!opcode) { + return GL_FALSE; + } + + LockDisplay(dpy); + if ( draw == read ) { + xGLXMakeCurrentReq *req; + + GetReq(GLXMakeCurrent,req); + req->reqType = opcode; + req->glxCode = X_GLXMakeCurrent; + req->drawable = draw; + req->context = gc_id; + req->oldContextTag = gc_tag; + } + else { + __GLXdisplayPrivate *priv = __glXInitialize(dpy); + + /* If the server can support the GLX 1.3 version, we should + * perfer that. Not only that, some servers support GLX 1.3 but + * not the SGI extension. + */ + + if ( (priv->majorVersion > 1) || (priv->minorVersion >= 3) ) { + xGLXMakeContextCurrentReq *req; + + GetReq(GLXMakeContextCurrent,req); + req->reqType = opcode; + req->glxCode = X_GLXMakeContextCurrent; + req->drawable = draw; + req->readdrawable = read; + req->context = gc_id; + req->oldContextTag = gc_tag; + } + else { + xGLXVendorPrivateWithReplyReq *vpreq; + xGLXMakeCurrentReadSGIReq *req; + + GetReqExtra(GLXVendorPrivateWithReply, + sz_xGLXMakeCurrentReadSGIReq-sz_xGLXVendorPrivateWithReplyReq,vpreq); + req = (xGLXMakeCurrentReadSGIReq *)vpreq; + req->reqType = opcode; + req->glxCode = X_GLXVendorPrivateWithReply; + req->vendorCode = X_GLXvop_MakeCurrentReadSGI; + req->drawable = draw; + req->readable = read; + req->context = gc_id; + req->oldContextTag = gc_tag; + } + } + + return _XReply(dpy, (xReply*) reply, 0, False); +} + + /* ** Make a particular context current. ** NOTE: this is in this file so that it can access dummyContext. */ -Bool GLX_PREFIX(glXMakeCurrent)(Display *dpy, GLXDrawable draw, GLXContext gc) +Bool MakeContextCurrent(Display *dpy, GLXDrawable draw, GLXDrawable read, + GLXContext gc) { - xGLXMakeCurrentReq *req; xGLXMakeCurrentReply reply; GLXContext oldGC; CARD8 opcode, oldOpcode; - Display *dpyTmp; Bool sentRequestToOldDpy = False; Bool bindReturnValue = True; @@ -1109,6 +1164,7 @@ if (!opcode) { return GL_FALSE; } + /* ** Make sure that the new context has a nonzero ID. In the request, ** a zero context ID is used only to mean that we bind to no current @@ -1119,6 +1175,11 @@ } oldGC = __glXGetCurrentContext(); + oldOpcode = (gc == oldGC) ? opcode : __glXSetupForCommand(dpy); + if (!oldOpcode) { + return GL_FALSE; + } + if ((dpy != oldGC->currentDpy || (gc && gc->isDirect)) && !oldGC->isDirect && oldGC != &dummyContext) { /* @@ -1129,35 +1190,15 @@ ** unbind the previous context. */ sentRequestToOldDpy = True; - dpyTmp = dpy; - - if (dpy != oldGC->currentDpy) { - /* - ** The GetReq macro uses "dpy", so we have to save and - ** restore later. - */ - dpy = oldGC->currentDpy; - oldOpcode = __glXSetupForCommand(dpy); - if (!oldOpcode) { - return GL_FALSE; - } - } else { - oldOpcode = opcode; - } - LockDisplay(dpy); - GetReq(GLXMakeCurrent,req); - req->reqType = oldOpcode; - req->glxCode = X_GLXMakeCurrent; - req->drawable = None; - req->context = None; - req->oldContextTag = oldGC->currentContextTag; - if (!_XReply(dpy, (xReply*) &reply, 0, False)) { + if ( ! SendMakeCurrentRequest( oldGC->currentDpy, oldOpcode, None, + oldGC->currentContextTag, None, None, + &reply ) ) { /* The make current failed. Just return GL_FALSE. */ UnlockDisplay(dpy); SyncHandle(); return GL_FALSE; } - dpy = dpyTmp; + oldGC->currentContextTag = 0; } @@ -1165,13 +1206,11 @@ /* Unbind the old direct rendering context */ if (oldGC->isDirect) { if (oldGC->driContext.private) { - int will_rebind = (gc && gc->isDirect - && draw == oldGC->currentDrawable); - if (!(*oldGC->driContext.unbindContext)(oldGC->currentDpy, - oldGC->screen, - oldGC->currentDrawable, - oldGC, - will_rebind)) { + if (!(*oldGC->driContext.unbindContext2)(oldGC->currentDpy, + oldGC->screen, + oldGC->currentDrawable, + oldGC->currentReadable, + oldGC)) { /* The make current failed. Just return GL_FALSE. */ return GL_FALSE; } @@ -1183,21 +1222,18 @@ if (gc && gc->isDirect) { if (gc->driContext.private) { bindReturnValue = - (*gc->driContext.bindContext)(dpy, gc->screen, draw, gc); + (*gc->driContext.bindContext2)(dpy, gc->screen, draw, read, gc); } } else { #endif _glapi_check_multithread(); /* Send a glXMakeCurrent request to bind the new context. */ LockDisplay(dpy); - GetReq(GLXMakeCurrent,req); - req->reqType = opcode; - req->glxCode = X_GLXMakeCurrent; - req->drawable = draw; - req->context = gc ? gc->xid : None; - req->oldContextTag = oldGC->currentContextTag; - bindReturnValue = _XReply(dpy, (xReply*) &reply, 0, False); - UnlockDisplay(dpy); + + bindReturnValue = SendMakeCurrentRequest( dpy, opcode, + gc ? gc->xid : None, + oldGC->currentContextTag, + draw, read, &reply ); #ifdef GLX_DIRECT_RENDERING } #endif @@ -1213,10 +1249,11 @@ /* If the old context was direct rendering, then re-bind to it. */ if (oldGC->isDirect) { if (oldGC->driContext.private) { - if (!(*oldGC->driContext.bindContext)(oldGC->currentDpy, - oldGC->screen, - oldGC->currentDrawable, - oldGC)) { + if (!(*oldGC->driContext.bindContext2)(oldGC->currentDpy, + oldGC->screen, + oldGC->currentDrawable, + oldGC->currentReadable, + oldGC)) { /* ** The request failed; this cannot happen with the ** current API. If in the future the API is @@ -1237,20 +1274,10 @@ ** drawable. */ if (sentRequestToOldDpy) { - if (dpy != oldGC->currentDpy) { - dpy = oldGC->currentDpy; - oldOpcode = __glXSetupForCommand(dpy); - } else { - oldOpcode = opcode; - } - LockDisplay(dpy); - GetReq(GLXMakeCurrent,req); - req->reqType = oldOpcode; - req->glxCode = X_GLXMakeCurrent; - req->drawable = oldGC->currentDrawable; - req->context = oldGC->xid; - req->oldContextTag = 0; - if (!_XReply(dpy, (xReply*) &reply, 0, False)) { + if ( !SendMakeCurrentRequest( oldGC->currentDpy, oldOpcode, + oldGC->xid, 0, + oldGC->currentDrawable, + oldGC->currentReadable, &reply ) ) { UnlockDisplay(dpy); SyncHandle(); /* @@ -1280,11 +1307,13 @@ ** NULL and not the dummy. */ gc->currentDrawable = draw; + gc->currentReadable = read; } else { if (oldGC != &dummyContext) { /* Old current context is no longer current to anybody */ oldGC->currentDpy = 0; oldGC->currentDrawable = None; + oldGC->currentReadable = None; oldGC->currentContextTag = 0; if (oldGC->xid == None) { @@ -1322,6 +1351,7 @@ #endif gc->currentDpy = dpy; gc->currentDrawable = draw; + gc->currentReadable = read; #ifdef GLX_DIRECT_RENDERING if (gc->isDirect) reply.contextTag = -1; #endif @@ -1336,6 +1366,23 @@ __glXUnlock(); return GL_TRUE; } + + +Bool GLX_PREFIX(glXMakeCurrent)(Display *dpy, GLXDrawable draw, GLXContext gc) +{ + return MakeContextCurrent( dpy, draw, draw, gc ); +} + +Bool GLX_PREFIX(glXMakeCurrentReadSGI)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext gc) +{ + return MakeContextCurrent( dpy, draw, read, gc ); +} + +Bool GLX_PREFIX(glXMakeContextCurrent)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext gc) +{ + return MakeContextCurrent( dpy, draw, read, gc ); +} + #ifdef DEBUG void __glXDumpDrawBuffer(__GLXcontext *ctx) Index: lib/GL/glx/glxextensions.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/glxextensions.c,v retrieving revision 1.3 diff -u -d -r1.3 glxextensions.c --- lib/GL/glx/glxextensions.c 3 May 2003 05:19:30 -0000 1.3 +++ lib/GL/glx/glxextensions.c 6 Jun 2003 21:26:07 -0000 @@ -98,7 +98,7 @@ { GLX(OML_swap_method), VER(0,0), Y, N, N, N }, { GLX(OML_sync_control), VER(0,0), Y, N, N, Y }, { GLX(SGI_cushion), VER(0,0), N, N, N, N }, - { GLX(SGI_make_current_read), VER(1,3), N, N, N, N }, + { GLX(SGI_make_current_read), VER(1,3), Y, N, N, N }, { GLX(SGI_swap_control), VER(0,0), Y, N, N, N }, { GLX(SGI_video_sync), VER(0,0), Y, N, N, Y }, { GLX(SGIS_blended_overlay), VER(0,0), N, N, N, N }, @@ -448,10 +448,16 @@ /** * Get the list of application usable extensions. * + * \param server_string GLX extension string supplied by + * the X-server + * \param display_is_direct_capable True if the display is capable of + * direct rendering. * \returns A pointer to the string. */ char * -__glXGetUsableExtensions( const char * server_string ) +__glXGetUsableExtensions( const char * server_string, + GLboolean display_is_direct_capable, + int minor_version ) { unsigned char server_support[8]; unsigned char usable[8]; @@ -460,15 +466,35 @@ __glXExtensionsCtr(); __glXProcessServerString( server_string, server_support ); + + /* This is a hack. Some servers support GLX 1.3 but don't export + * SGI_make_current_read. This libGL supports SGI_make_current_read but + * doesn't have full GLX 1.3 support. Until GLX 1.3 is fully supported + * this hack is done to export the functionality to applications. + */ + + if ( minor_version >= 3 ) { + SET_BIT( server_support, SGI_make_current_read_bit ); + } + + /* An extension is supported if the client-side (i.e., libGL) supports * it and the "server" supports it. In this case that means that either * the true server supports it or it is only for direct-rendering and * the direct rendering driver supports it. */ - for ( i = 0 ; i < 8 ; i++ ) { - usable[i] = (client_support[i] & client_only[i]) - | (client_support[i] & (direct_support[i] & server_support[i])) - | (client_support[i] & (direct_support[i] & direct_only[i])); + if ( display_is_direct_capable ) { + for ( i = 0 ; i < 8 ; i++ ) { + usable[i] = (client_support[i] & client_only[i]) + | (client_support[i] & (direct_support[i] & server_support[i])) + | (client_support[i] & (direct_support[i] & direct_only[i])); + } + } + else { + for ( i = 0 ; i < 8 ; i++ ) { + usable[i] = (client_support[i] & client_only[i]) + | (client_support[i] & server_support[i]); + } } return __glXGetStringFromTable( usable ); Index: lib/GL/glx/glxextensions.h =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/glxextensions.h,v retrieving revision 1.2 diff -u -d -r1.2 glxextensions.h --- lib/GL/glx/glxextensions.h 30 Apr 2003 01:50:35 -0000 1.2 +++ lib/GL/glx/glxextensions.h 6 Jun 2003 21:26:07 -0000 @@ -71,7 +71,8 @@ extern GLboolean __glXExtensionBitIsEnabled( unsigned bit ); extern const char * __glXGetClientExtensions( void ); -extern char * __glXGetUsableExtensions( const char * server_string ); +extern char * __glXGetUsableExtensions( const char * server_string, + GLboolean display_is_direct_capable, int server_minor_version ); extern void __glXAddExtension( GLboolean enabled, const char * name, GLboolean client_side ); extern void __glXEnableExtension( const char * name, GLboolean force_client ); Index: lib/GL/glx/pixel.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/pixel.c,v retrieving revision 1.10 diff -u -d -r1.10 pixel.c --- lib/GL/glx/pixel.c 25 Mar 2003 12:53:44 -0000 1.10 +++ lib/GL/glx/pixel.c 6 Jun 2003 21:26:07 -0000 @@ -79,120 +79,6 @@ 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, }; -/* -** Return the number of elements per group of a specified format -*/ -static GLint ElementsPerGroup(GLenum format, GLenum type) -{ - /* - ** To make row length computation valid for image extraction, - ** packed pixel types assume elements per group equals one. - */ - switch(type) { - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - return 1; - default: - break; - } - - switch(format) { - case GL_RGB: - case GL_BGR: - return 3; - case GL_LUMINANCE_ALPHA: - return 2; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - return 4; - case GL_COLOR_INDEX: - case GL_STENCIL_INDEX: - case GL_DEPTH_COMPONENT: - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - return 1; - default: - return 0; - } -} - -/* -** Return the number of bytes per element, based on the element type (other -** than GL_BITMAP). -*/ -static GLint BytesPerElement(GLenum type) -{ - switch(type) { - case GL_UNSIGNED_SHORT: - case GL_SHORT: - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - return 2; - case GL_UNSIGNED_BYTE: - case GL_BYTE: - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - return 1; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - return 4; - default: - return 0; - } -} - -/* -** Compute memory required for internal packed array of data of given type -** and format. -*/ -GLint __glImageSize(GLsizei width, GLsizei height, GLsizei depth, - GLenum format, GLenum type) -{ - int bytes_per_row; - int components; - - if (width < 0 || height < 0 || depth < 0) { - return 0; - } - /* - ** Zero is returned if either format or type are invalid. - */ - components = ElementsPerGroup(format,type); - if (type == GL_BITMAP) { - if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) { - bytes_per_row = (width + 7) >> 3; - } else { - return 0; - } - } else { - bytes_per_row = BytesPerElement(type) * width; - } - return bytes_per_row * height * depth * components; -} /* ** Copy bitmap data from clients packed memory applying unpacking modes as the @@ -218,7 +104,7 @@ } else { groupsPerRow = width; } - components = ElementsPerGroup(format,GL_BITMAP); + components = __glElementsPerGroup(format,GL_BITMAP); rowSize = (groupsPerRow * components + 7) >> 3; padding = (rowSize % alignment); if (padding) { @@ -294,7 +180,7 @@ if (type == GL_BITMAP) { FillBitmap(gc, width, height, format, userdata, newimage); } else { - components = ElementsPerGroup(format,type); + components = __glElementsPerGroup(format,type); if (rowLength > 0) { groupsPerRow = rowLength; } else { @@ -306,7 +192,7 @@ rowsPerImage = height; } - elementSize = BytesPerElement(type); + elementSize = __glBytesPerElement(type); groupSize = elementSize * components; if (elementSize == 1) swapBytes = 0; @@ -409,7 +295,7 @@ GLint writeMask, i; GLubyte writeByte; - components = ElementsPerGroup(format,GL_BITMAP); + components = __glElementsPerGroup(format,GL_BITMAP); if (rowLength > 0) { groupsPerRow = rowLength; } else { @@ -522,7 +408,7 @@ if (type == GL_BITMAP) { EmptyBitmap(gc, width, height, format, sourceImage, userdata); } else { - components = ElementsPerGroup(format,type); + components = __glElementsPerGroup(format,type); if (rowLength > 0) { groupsPerRow = rowLength; } else { @@ -533,7 +419,7 @@ } else { rowsPerImage = height; } - elementSize = BytesPerElement(type); + elementSize = __glBytesPerElement(type); groupSize = elementSize * components; rowSize = groupsPerRow * groupSize; padding = (rowSize % alignment); Index: lib/GL/glx/render2.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/glx/render2.c,v retrieving revision 1.5 diff -u -d -r1.5 render2.c --- lib/GL/glx/render2.c 30 Apr 2003 01:50:36 -0000 1.5 +++ lib/GL/glx/render2.c 6 Jun 2003 21:26:07 -0000 @@ -426,28 +426,6 @@ __GLX_LOAD_VARIABLES(); if (!gc->currentDpy) return; - switch (cap) { -#if 0 - case GL_VERTEX_ARRAY_EXT: - gc->state.vertArray.vertex.enable = GL_TRUE; - return; - case GL_NORMAL_ARRAY_EXT: - gc->state.vertArray.normal.enable = GL_TRUE; - return; - case GL_COLOR_ARRAY_EXT: - gc->state.vertArray.color.enable = GL_TRUE; - return; - case GL_INDEX_ARRAY_EXT: - gc->state.vertArray.index.enable = GL_TRUE; - return; - case GL_TEXTURE_COORD_ARRAY_EXT: - gc->state.vertArray.texCoord[gc->state.vertArray.activeTexture].enable = GL_TRUE; - return; - case GL_EDGE_FLAG_ARRAY_EXT: - gc->state.vertArray.edgeFlag.enable = GL_TRUE; - return; -#endif - } __GLX_BEGIN(X_GLrop_Enable,8); __GLX_PUT_LONG(4,cap); __GLX_END(8); @@ -460,28 +438,6 @@ __GLX_LOAD_VARIABLES(); if (!gc->currentDpy) return; - switch (cap) { -#if 0 - case GL_VERTEX_ARRAY_EXT: - gc->state.vertArray.vertex.enable = GL_FALSE; - return; - case GL_NORMAL_ARRAY_EXT: - gc->state.vertArray.normal.enable = GL_FALSE; - return; - case GL_COLOR_ARRAY_EXT: - gc->state.vertArray.color.enable = GL_FALSE; - return; - case GL_INDEX_ARRAY_EXT: - gc->state.vertArray.index.enable = GL_FALSE; - return; - case GL_TEXTURE_COORD_ARRAY_EXT: - gc->state.vertArray.texCoord[gc->state.vertArray.activeTexture].enable = GL_FALSE; - return; - case GL_EDGE_FLAG_ARRAY_EXT: - gc->state.vertArray.edgeFlag.enable = GL_FALSE; - return; -#endif - } __GLX_BEGIN(X_GLrop_Disable,8); __GLX_PUT_LONG(4,cap); __GLX_END(8); Index: lib/GL/dri/dri_util.c =================================================================== RCS file: /cvsroot/dri/xc/xc/lib/GL/dri/dri_util.c,v retrieving revision 1.14 diff -u -d -r1.14 dri_util.c --- lib/GL/dri/dri_util.c 26 May 2003 22:10:49 -0000 1.14 +++ lib/GL/dri/dri_util.c 6 Jun 2003 21:26:10 -0000 @@ -259,9 +259,9 @@ * * \param dpy the display handle. * \param scrn the screen number. - * \param draw drawable. + * \param draw Current drawing drawable. + * \param draw Current reading drawable. * \param gc context. - * \param will_rebind not used. * * \return GL_TRUE on success, or GL_FALSE on failure. * @@ -270,25 +270,27 @@ * __DRIdrawablePrivateRec::refcount which must be non-zero for a successful * return. * - * While casting the opaque private pointers associated with the parameters into their - * respective real types it also assures they are not null. + * While casting the opaque private pointers associated with the parameters + * into their respective real types it also assures they are not null. */ -static Bool driUnbindContext(Display *dpy, int scrn, - GLXDrawable draw, GLXContext gc, - int will_rebind) +static Bool driUnbindContext2(Display *dpy, int scrn, + GLXDrawable draw, GLXDrawable read, + GLXContext gc) { __DRIscreen *pDRIScreen; __DRIdrawable *pdraw; + __DRIdrawable *pread; __DRIcontextPrivate *pcp; __DRIscreenPrivate *psp; __DRIdrawablePrivate *pdp; + __DRIdrawablePrivate *prp; /* ** Assume error checking is done properly in glXMakeCurrent before - ** calling driUnbindContext. + ** calling driUnbindContext2. */ - if (gc == NULL || draw == None) { + if (gc == NULL || draw == None || read == None) { /* ERROR!!! */ return GL_FALSE; } @@ -310,25 +312,37 @@ } pdp = (__DRIdrawablePrivate *)pdraw->private; - /* Don't leave fullscreen mode if the - drawable will be rebound in the next - step -- this avoids a protocol - request. */ - if (!will_rebind && psp->fullscreen) { - psp->DriverAPI.CloseFullScreen(pcp); - XF86DRICloseFullScreen(dpy, scrn, draw); - psp->fullscreen = NULL; + pread = __driFindDrawable(psp->drawHash, read); + if (!pread) { + /* ERROR!!! */ + return GL_FALSE; } + prp = (__DRIdrawablePrivate *)pread->private; + /* Let driver unbind drawable from context */ (*psp->DriverAPI.UnbindContext)(pcp); + if (pdp->refcount == 0) { /* ERROR!!! */ return GL_FALSE; - } else if (--pdp->refcount == 0) { + } + + pdp->refcount--; + + if (prp != pdp) { + if (prp->refcount == 0) { + /* ERROR!!! */ + return GL_FALSE; + } + + prp->refcount--; + } + #if 0 - /* + if (pdp->refcount == 0) { + /* ** NOT_DONE: When a drawable is unbound from one direct ** rendering context and then bound to another, we do not want ** to destroy the drawable data structure each time only to @@ -351,8 +365,8 @@ __driRemoveDrawable(psp->drawHash, pdraw); (*pdraw->destroyDrawable)(dpy, pdraw->private); Xfree(pdraw); -#endif } +#endif /* XXX this is disabled so that if we call SwapBuffers on an unbound * window we can determine the last context bound to the window and @@ -384,8 +398,6 @@ __DRIdrawablePrivate *prp; __DRIscreenPrivate *psp; __DRIcontextPrivate *pcp; - static Bool envchecked = False; - static Bool checkfullscreen = False; /* ** Assume error checking is done properly in glXMakeCurrent before @@ -490,75 +502,19 @@ /* Call device-specific MakeCurrent */ (*psp->DriverAPI.MakeCurrent)(pcp, pdp, prp); - /* Check for the potential to enter an automatic full-screen mode. - This may need to be moved up. */ - if (!envchecked) { - checkfullscreen = driFeatureOn("LIBGL_DRI_AUTOFULLSCREEN"); - envchecked = GL_TRUE; - } - if (checkfullscreen && pdp->numClipRects == 1) { - /* If there is valid information in the SAREA, we can use it to - avoid a protocol request. The only time when the SAREA - information won't be valid will be initially, so in the worst - case, we'll make one protocol request that we could have - avoided. */ - int try = 1; - int clw = pdp->pClipRects[0].x2 - pdp->pClipRects[0].x1; - int clh = pdp->pClipRects[0].y2 - pdp->pClipRects[0].y1; - -#if 0 - /* Useful client-side debugging message */ - fprintf(stderr, - "********************************************\n" - "********************************************\n" - "********************************************\n" - "%d @ %d,%d,%d,%d\n" - "frame %d,%d,%d,%d\n" - "win %d,%d,%d,%d\n" - "fs = %p pdp = %p sarea = %d\n" - "********************************************\n" - "********************************************\n" - "********************************************\n", - pdp->numClipRects, - pdp->pClipRects[0].x1, - pdp->pClipRects[0].y1, - pdp->pClipRects[0].x2, - pdp->pClipRects[0].y2, - psp->pSAREA->frame.x, - psp->pSAREA->frame.y, - psp->pSAREA->frame.width, - psp->pSAREA->frame.height, - pdp->x, pdp->y, pdp->w, pdp->h, - psp->fullscreen, pdp, psp->pSAREA->frame.fullscreen); -#endif - - - if (pdp->x != pdp->pClipRects[0].x1 - || pdp->y != pdp->pClipRects[0].y1 - || pdp->w != clw - || pdp->h != clh) try = 0; + return GL_TRUE; +} - if (try && psp->pSAREA->frame.width && psp->pSAREA->frame.height) { - if (pdp->x != psp->pSAREA->frame.x - || pdp->y != psp->pSAREA->frame.y - || pdp->w != psp->pSAREA->frame.width - || pdp->h != psp->pSAREA->frame.height) try = 0; - } - if (try) { - if (psp->fullscreen && !psp->pSAREA->frame.fullscreen) { - /* Server has closed fullscreen mode */ - __driUtilMessage("server closed fullscreen mode\n"); - psp->fullscreen = NULL; - } - if (XF86DRIOpenFullScreen(dpy, scrn, draw)) { - psp->fullscreen = pdp; - psp->DriverAPI.OpenFullScreen(pcp); - } - } - } - - return GL_TRUE; +/* + * Simply call bind with the same GLXDrawable for the read and draw buffers. + */ +static Bool driUnbindContext(Display *dpy, int scrn, + GLXDrawable draw, GLXContext gc, + int will_rebind) +{ + (void) will_rebind; + return driUnbindContext2( dpy, scrn, draw, draw, gc ); } Index: programs/Xserver/GL/glx/glxscreens.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/GL/glx/glxscreens.c,v retrieving revision 1.11 diff -u -d -r1.11 glxscreens.c --- programs/Xserver/GL/glx/glxscreens.c 30 Apr 2003 01:50:58 -0000 1.11 +++ programs/Xserver/GL/glx/glxscreens.c 6 Jun 2003 21:26:13 -0000 @@ -69,6 +69,7 @@ "GL_EXT_blend_logic_op " "GL_EXT_blend_minmax " "GL_EXT_blend_subtract " + "GL_EXT_clip_volume_hint " "GL_EXT_copy_texture " "GL_EXT_draw_range_elements " "GL_EXT_fog_coord " @@ -78,22 +79,38 @@ "GL_EXT_rescale_normal " "GL_EXT_secondary_color " "GL_EXT_separate_specular_color " + "GL_EXT_shadow_funcs " "GL_EXT_stencil_two_side " "GL_EXT_stencil_wrap " "GL_EXT_subtexture " "GL_EXT_texture " "GL_EXT_texture3D " + "GL_EXT_texture_edge_clamp " "GL_EXT_texture_env_add " "GL_EXT_texture_env_combine " "GL_EXT_texture_env_dot3 " + "GL_EXT_texture_lod " "GL_EXT_texture_lod_bias " "GL_EXT_texture_object " + "GL_EXT_texture_rectangle " "GL_EXT_vertex_array " + "GL_APPLE_packed_pixels " + "GL_ATI_texture_mirror_once " + "GL_ATI_texture_env_combine3 " + "GL_HP_occlusion_test " "GL_IBM_texture_mirrored_repeat " + "GL_MESA_pack_invert " + "GL_MESA_ycbcr_texture " "GL_NV_blend_square " + "GL_NV_texgen_reflection " + "GL_NV_texture_rectangle " + "GL_SGIS_generate_mipmap " "GL_SGIS_texture_border_clamp " "GL_SGIS_texture_edge_clamp " - "GL_SGIS_generate_mipmap " + "GL_SGIS_texture_lod " + "GL_SGIX_depth_texture " + "GL_SGIX_shadow " + "GL_SGIX_shadow_ambient " ; /* Index: programs/Xserver/GL/glx/rensize.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/GL/glx/rensize.c,v retrieving revision 1.7 diff -u -d -r1.7 rensize.c --- programs/Xserver/GL/glx/rensize.c 25 Nov 2002 19:58:40 -0000 1.7 +++ programs/Xserver/GL/glx/rensize.c 6 Jun 2003 21:26:13 -0000 @@ -267,109 +267,8 @@ int __glXImageSize( GLenum format, GLenum type, GLsizei w, GLsizei h, GLint rowLength, GLint skipRows, GLint alignment ) { - GLint bytesPerElement, elementsPerGroup, groupsPerRow; - GLint groupSize, rowSize, padding; - - if (w < 0 || h < 0 || - (type == GL_BITMAP && - (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX))) { - return -1; - } - if (w==0 || h==0) return 0; - - if (type == GL_BITMAP) { - if (rowLength > 0) { - groupsPerRow = rowLength; - } else { - groupsPerRow = w; - } - rowSize = (groupsPerRow + 7) >> 3; - padding = (rowSize % alignment); - if (padding) { - rowSize += alignment - padding; - } - return ((h + skipRows) * rowSize); - } else { - switch(format) { - case GL_COLOR_INDEX: - case GL_STENCIL_INDEX: - case GL_DEPTH_COMPONENT: - elementsPerGroup = 1; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - elementsPerGroup = 1; - break; - case GL_LUMINANCE_ALPHA: - elementsPerGroup = 2; - break; - case GL_RGB: - case GL_BGR: - elementsPerGroup = 3; - break; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elementsPerGroup = 4; - break; - default: - return -1; - } - switch(type) { - case GL_UNSIGNED_BYTE: - case GL_BYTE: - bytesPerElement = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - bytesPerElement = 1; - elementsPerGroup = 1; - break; - case GL_UNSIGNED_SHORT: - case GL_SHORT: - bytesPerElement = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - bytesPerElement = 2; - elementsPerGroup = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - bytesPerElement = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - bytesPerElement = 4; - elementsPerGroup = 1; - break; - default: - return -1; - } - groupSize = bytesPerElement * elementsPerGroup; - if (rowLength > 0) { - groupsPerRow = rowLength; - } else { - groupsPerRow = w; - } - rowSize = groupsPerRow * groupSize; - padding = (rowSize % alignment); - if (padding) { - rowSize += alignment - padding; - } - return ((h + skipRows) * rowSize); - } + return __glXImage3DSize( format, type, w, h, 1, 0, rowLength, + 0, skipRows, alignment ); } /* XXX @@ -406,8 +305,6 @@ case GL_COLOR_INDEX: case GL_STENCIL_INDEX: case GL_DEPTH_COMPONENT: - elementsPerGroup = 1; - break; case GL_RED: case GL_GREEN: case GL_BLUE: @@ -416,6 +313,13 @@ case GL_INTENSITY: elementsPerGroup = 1; break; + case GL_422_EXT: + case GL_422_REV_EXT: + case GL_422_AVERAGE_EXT: + case GL_422_REV_AVERAGE_EXT: + case GL_DEPTH_STENCIL_NV: + case GL_DEPTH_STENCIL_MESA: + case GL_YCBCR_MESA: case GL_LUMINANCE_ALPHA: elementsPerGroup = 2; break; @@ -451,6 +355,10 @@ case GL_UNSIGNED_SHORT_4_4_4_4_REV: case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_1_5_5_5_REV: + case GL_UNSIGNED_SHORT_8_8_APPLE: + case GL_UNSIGNED_SHORT_8_8_REV_APPLE: + case GL_UNSIGNED_SHORT_15_1_MESA: + case GL_UNSIGNED_SHORT_1_15_REV_MESA: bytesPerElement = 2; elementsPerGroup = 1; break; @@ -463,6 +371,9 @@ case GL_UNSIGNED_INT_8_8_8_8_REV: case GL_UNSIGNED_INT_10_10_10_2: case GL_UNSIGNED_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_24_8_NV: + case GL_UNSIGNED_INT_24_8_MESA: + case GL_UNSIGNED_INT_8_24_REV_MESA: bytesPerElement = 4; elementsPerGroup = 1; break; Index: programs/Xserver/GL/glx/singlesize.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/GL/glx/singlesize.c,v retrieving revision 1.6 diff -u -d -r1.6 singlesize.c --- programs/Xserver/GL/glx/singlesize.c 25 Nov 2002 19:58:41 -0000 1.6 +++ programs/Xserver/GL/glx/singlesize.c 6 Jun 2003 21:26:13 -0000 @@ -46,101 +46,7 @@ GLint __glReadPixels_size(GLenum format, GLenum type, GLint w, GLint h) { - GLint elements, esize; - GLint rowsize, padding; - - if (w < 0 || h < 0) { - return -1; - } - switch (format) { - case GL_COLOR_INDEX: - case GL_STENCIL_INDEX: - case GL_DEPTH_COMPONENT: - elements = 1; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - elements = 1; - break; - case GL_LUMINANCE_ALPHA: - elements = 2; - break; - case GL_RGB: - case GL_BGR: - elements = 3; - break; - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elements = 4; - break; - default: - return -1; - } - /* - ** According to the GLX protocol, each row must be padded to a multiple of - ** 4 bytes. 4 bytes also happens to be the default alignment in the pixel - ** store modes of the GL. - */ - switch (type) { - case GL_BITMAP: - if (format == GL_COLOR_INDEX || format == GL_STENCIL_INDEX) { - rowsize = ((w * elements)+7)/8; - padding = rowsize % 4; - if (padding) { - rowsize += 4 - padding; - } - return (rowsize * h); - } else { - return -1; - } - case GL_BYTE: - case GL_UNSIGNED_BYTE: - esize = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - esize = 1; - elements = 1; - break; - case GL_SHORT: - case GL_UNSIGNED_SHORT: - esize = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - esize = 2; - elements = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - esize = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - esize = 4; - elements = 1; - break; - default: - return -1; - } - rowsize = w * elements * esize; - padding = rowsize % 4; - if (padding) { - rowsize += 4 - padding; - } - return (rowsize * h); + return __glXImage3DSize( format, type, w, h, 1, 0, 0, 0, 0, 4 ); } GLint __glGetTexEnvfv_size(GLenum pname) @@ -207,27 +113,43 @@ GLint __glGetTexParameterfv_size(GLenum pname) { switch (pname) { + case GL_TEXTURE_BORDER_COLOR: + return 4; + case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_WRAP_R: - return 1; case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: - return 1; - case GL_TEXTURE_BORDER_COLOR: - return 4; case GL_TEXTURE_PRIORITY: - return 1; case GL_TEXTURE_RESIDENT: - return 1; + + /* GL_SGIS_texture_lod / GL_EXT_texture_lod / GL 1.2 */ case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MAX_LOD: case GL_TEXTURE_BASE_LEVEL: case GL_TEXTURE_MAX_LEVEL: - return 1; - case GL_TEXTURE_COMPARE_MODE_ARB: /* GL_ARB_shadow */ - case GL_TEXTURE_COMPARE_FUNC_ARB: /* GL_ARB_shadow */ - case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: /* GL_ARB_shadow_ambient */ + + /* GL_SGIX_texture_lod_bias */ + case GL_TEXTURE_LOD_BIAS_S_SGIX: + case GL_TEXTURE_LOD_BIAS_T_SGIX: + case GL_TEXTURE_LOD_BIAS_R_SGIX: + + /* GL_ARB_shadow / GL 1.4 */ + case GL_TEXTURE_COMPARE_MODE: + case GL_TEXTURE_COMPARE_FUNC: + + /* GL_SGIX_shadow_ambient / GL_ARB_shadow_ambient */ + case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB: + + /* GL_SGIX_shadow */ + case GL_TEXTURE_COMPARE_SGIX: + case GL_TEXTURE_COMPARE_OPERATOR_SGIX: + + /* GL_SGIX_texture_coordinate_clamp */ + case GL_TEXTURE_MAX_CLAMP_S_SGIX: + case GL_TEXTURE_MAX_CLAMP_T_SGIX: + case GL_TEXTURE_MAX_CLAMP_R_SGIX: return 1; default: @@ -915,6 +837,15 @@ case GL_TEXTURE_BINDING_CUBE_MAP_ARB: case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB: return 1; + case GL_OCCLUSION_TEST_RESULT_HP: + case GL_OCCLUSION_TEST_HP: + return 1; + case GL_PACK_INVERT_MESA: + return 1; + case GL_CULL_VERTEX_IBM: + return 1; + case GL_RASTER_POSITION_UNCLIPPED_IBM: + return 1; default: return -1; } @@ -968,83 +899,8 @@ GLint __glGetTexImage_size(GLenum target, GLint level, GLenum format, GLenum type, GLint width, GLint height, GLint depth) { - GLint elements, esize; - GLint padding, rowsize; - - switch (format) { - case GL_RGBA: - case GL_BGRA: - case GL_ABGR_EXT: - elements = 4; - break; - case GL_RGB: - case GL_BGR: - elements = 3; - break; - case GL_RED: - case GL_GREEN: - case GL_BLUE: - case GL_ALPHA: - case GL_LUMINANCE: - case GL_INTENSITY: - case GL_DEPTH_COMPONENT: - elements = 1; - break; - case GL_LUMINANCE_ALPHA: - elements = 2; - break; - default: - return -1; - } - switch (type) { - case GL_BYTE: - case GL_UNSIGNED_BYTE: - esize = 1; - break; - case GL_UNSIGNED_BYTE_3_3_2: - case GL_UNSIGNED_BYTE_2_3_3_REV: - esize = 1; - elements = 1; - break; - case GL_SHORT: - case GL_UNSIGNED_SHORT: - esize = 2; - break; - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_6_5_REV: - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_4_4_4_4_REV: - case GL_UNSIGNED_SHORT_5_5_5_1: - case GL_UNSIGNED_SHORT_1_5_5_5_REV: - esize = 2; - elements = 1; - break; - case GL_INT: - case GL_UNSIGNED_INT: - case GL_FLOAT: - esize = 4; - break; - case GL_UNSIGNED_INT_8_8_8_8: - case GL_UNSIGNED_INT_8_8_8_8_REV: - case GL_UNSIGNED_INT_10_10_10_2: - case GL_UNSIGNED_INT_2_10_10_10_REV: - esize = 4; - elements = 1; - break; - default: - return -1; - } - /* - ** According to the GLX protocol, each row must be padded to a multiple of - ** 4 bytes. 4 bytes also happens to be the default alignment in the pixel - ** store modes of the GL. - */ - rowsize = width * elements * esize; - padding = rowsize % 4; - if (padding) { - rowsize += 4 - padding; - } - return (rowsize * height * depth); + return __glXImage3DSize( format, type, width, height, depth, + 0, 0, 0, 0, 4 ); } GLint __glGetConvolutionParameteriv_size(GLenum pname) Index: programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h,v retrieving revision 1.28 diff -u -d -r1.28 radeon_reg.h --- programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h 13 May 2003 21:46:41 -0000 1.28 +++ programs/Xserver/hw/xfree86/drivers/ati/radeon_reg.h 6 Jun 2003 21:26:13 -0000 @@ -1524,6 +1524,8 @@ # define RADEON_STENCIL_FAIL_INC (3 << 16) # define RADEON_STENCIL_FAIL_DEC (4 << 16) # define RADEON_STENCIL_FAIL_INVERT (5 << 16) +# define RADEON_STENCIL_FAIL_INC_WRAP (6 << 16) +# define RADEON_STENCIL_FAIL_DEC_WRAP (7 << 16) # define RADEON_STENCIL_FAIL_MASK (0x7 << 16) # define RADEON_STENCIL_ZPASS_KEEP (0 << 20) # define RADEON_STENCIL_ZPASS_ZERO (1 << 20) @@ -1531,6 +1533,8 @@ # define RADEON_STENCIL_ZPASS_INC (3 << 20) # define RADEON_STENCIL_ZPASS_DEC (4 << 20) # define RADEON_STENCIL_ZPASS_INVERT (5 << 20) +# define RADEON_STENCIL_ZPASS_INC_WRAP (6 << 20) +# define RADEON_STENCIL_ZPASS_DEC_WRAP (7 << 20) # define RADEON_STENCIL_ZPASS_MASK (0x7 << 20) # define RADEON_STENCIL_ZFAIL_KEEP (0 << 24) # define RADEON_STENCIL_ZFAIL_ZERO (1 << 24) @@ -1538,6 +1542,8 @@ # define RADEON_STENCIL_ZFAIL_INC (3 << 24) # define RADEON_STENCIL_ZFAIL_DEC (4 << 24) # define RADEON_STENCIL_ZFAIL_INVERT (5 << 24) +# define RADEON_STENCIL_ZFAIL_INC_WRAP (6 << 24) +# define RADEON_STENCIL_ZFAIL_DEC_WRAP (7 << 24) # define RADEON_STENCIL_ZFAIL_MASK (0x7 << 24) # define RADEON_Z_COMPRESSION_ENABLE (1 << 28) # define RADEON_FORCE_Z_DIRTY (1 << 29)