#include <GL/glxproto.h>
#include "xm_api.h"
+#include "main/imports.h"
+#include "main/errors.h"
+#include "util/u_math.h"
/* An "Atrribs/Attribs" typo was fixed in glxproto.h in Nov 2014.
* This is in case we don't have the updated header.
GLint depth_size, GLint stencil_size,
GLint accumRedSize, GLint accumGreenSize,
GLint accumBlueSize, GLint accumAlphaSize,
- GLint level, GLint numAuxBuffers )
+ GLint level, GLint numAuxBuffers, GLuint num_samples )
{
GLboolean ximageFlag = GL_TRUE;
XMesaVisual xmvis;
if (v->display == dpy
&& v->mesa_visual.level == level
&& v->mesa_visual.numAuxBuffers == numAuxBuffers
+ && v->mesa_visual.samples == num_samples
&& v->ximage_flag == ximageFlag
&& v->mesa_visual.rgbMode == rgbFlag
&& v->mesa_visual.doubleBufferMode == dbFlag
stereoFlag, ximageFlag,
depth_size, stencil_size,
accumRedSize, accumBlueSize,
- accumBlueSize, accumAlphaSize, 0, level,
+ accumBlueSize, accumAlphaSize, num_samples, level,
GLX_NONE_EXT );
if (xmvis) {
/* Save a copy of the pointer now so we can find this visual again
accBits, /* b */
accBits, /* a */
0, /* level */
- 0 /* numAux */
+ 0, /* numAux */
+ 0 /* numSamples */
);
}
else {
* 10 bits per color channel. Mesa's limited to a max of 8 bits/channel.
*/
if (vis && depth > 24 && (xclass==TrueColor || xclass==DirectColor)) {
- if (_mesa_bitcount((GLuint) vis->red_mask ) <= 8 &&
- _mesa_bitcount((GLuint) vis->green_mask) <= 8 &&
- _mesa_bitcount((GLuint) vis->blue_mask ) <= 8) {
+ if (util_bitcount((GLuint) vis->red_mask ) <= 8 &&
+ util_bitcount((GLuint) vis->green_mask) <= 8 &&
+ util_bitcount((GLuint) vis->blue_mask ) <= 8) {
return vis;
}
else {
{
xmesa_destroy_buffers_on_display(dpy);
destroy_visuals_on_display(dpy);
+ xmesa_close_display(dpy);
return 0;
}
XMesaVisual xmvis = NULL;
int desiredVisualID = -1;
int numAux = 0;
+ GLint num_samples = 0;
- xmesa_init( dpy );
+ if (xmesa_init( dpy ) != 0) {
+ _mesa_warning(NULL, "Failed to initialize display");
+ return NULL;
+ }
parselist = list;
* GLX_ARB_multisample
*/
case GLX_SAMPLE_BUFFERS_ARB:
+ /* ignore */
+ parselist++;
+ parselist++;
+ break;
case GLX_SAMPLES_ARB:
parselist++;
- if (*parselist++ != 0) {
- /* ms not supported */
- return NULL;
- }
+ num_samples = *parselist++;
break;
/*
parselist += 2; /* ignore the parameter */
break;
-#ifdef GLX_EXT_texture_from_pixmap
case GLX_BIND_TO_TEXTURE_RGB_EXT:
parselist++; /*skip*/
break;
case GLX_Y_INVERTED_EXT:
parselist++; /*skip*/
break;
-#endif
case None:
/* end of list */
(void) caveat;
+ if (num_samples < 0) {
+ _mesa_warning(NULL, "GLX_SAMPLES_ARB: number of samples must not be negative");
+ return NULL;
+ }
/*
* Since we're only simulating the GLX extension this function will never
xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
stereo_flag, depth_size, stencil_size,
accumRedSize, accumGreenSize,
- accumBlueSize, accumAlphaSize, level, numAux );
+ accumBlueSize, accumAlphaSize, level, numAux,
+ num_samples );
}
return xmvis;
* GLX_ARB_multisample
*/
case GLX_SAMPLE_BUFFERS_ARB:
- *value = 0;
+ *value = xmvis->mesa_visual.sampleBuffers;
return 0;
case GLX_SAMPLES_ARB:
- *value = 0;
+ *value = xmvis->mesa_visual.samples;
return 0;
/*
*value = xmvis->visinfo->visualid;
break;
-#ifdef GLX_EXT_texture_from_pixmap
case GLX_BIND_TO_TEXTURE_RGB_EXT:
*value = True; /*XXX*/
break;
case GLX_Y_INVERTED_EXT:
*value = True; /*XXX*/
break;
-#endif
default:
return GLX_BAD_ATTRIBUTE;
case GLX_FBCONFIG_ID:
*value = xmbuf->xm_visual->visinfo->visualid;
return;
-#ifdef GLX_EXT_texture_from_pixmap
case GLX_TEXTURE_FORMAT_EXT:
*value = xmbuf->TextureFormat;
break;
case GLX_MIPMAP_TEXTURE_EXT:
*value = xmbuf->TextureMipmap;
break;
-#endif
default:
generate_error(dpy, BadValue, 0, X_GLXCreateContextAttribsARB, true);
}
-PUBLIC int
+PUBLIC void
glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute,
unsigned int *value)
{
if (!xmbuf) {
/* Generate GLXBadPbufferSGIX for bad pbuffer */
- return 0;
+ return;
}
switch (attribute) {
default:
*value = 0;
}
- return 0;
}
#endif
-/*** GLX_SGIX_swap_group ***/
-
-PUBLIC void
-glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
-{
- (void) dpy;
- (void) drawable;
- (void) member;
-}
-
-
-
-/*** GLX_SGIX_swap_barrier ***/
-
-PUBLIC void
-glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
-{
- (void) dpy;
- (void) drawable;
- (void) barrier;
-}
-
-PUBLIC Bool
-glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
-{
- (void) dpy;
- (void) screen;
- (void) max;
- return False;
-}
-
-
-
/*** GLX_SUN_get_transparent_index ***/
PUBLIC Status
glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay,
- long *pTransparent)
+ unsigned long *pTransparent)
{
(void) dpy;
(void) overlay;