According to the ARB_multisample Visual.samples is a non-negative Integer. Consequently define it, and related functions and values as such and fail in glx/choose_visual if a negative number is given.
Signed-off-by: Gert Wollny <gw.foss...@gmail.com> --- The patch was motivated by Emil: https://lists.freedesktop.org/archives/mesa-dev/2017-November/177218.html It should be noted that the sample count was already converted to unsigned in many places, e.g. in XMesaCreateVisual when passing it to pipe_screen::is_format_supported. PS: I have not commit rights. src/gallium/include/state_tracker/st_api.h | 2 +- src/gallium/state_trackers/glx/xlib/glx_api.c | 8 ++++++-- src/mesa/main/context.c | 4 ++-- src/mesa/main/context.h | 4 ++-- src/mesa/main/mtypes.h | 2 +- src/mesa/main/multisample.c | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h index f95f65f156..ec6e7844b8 100644 --- a/src/gallium/include/state_tracker/st_api.h +++ b/src/gallium/include/state_tracker/st_api.h @@ -202,7 +202,7 @@ struct st_visual enum pipe_format color_format; enum pipe_format depth_stencil_format; enum pipe_format accum_format; - int samples; + unsigned samples; /** * Desired render buffer. diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c index c473a0fe54..bb8afe0e6f 100644 --- a/src/gallium/state_trackers/glx/xlib/glx_api.c +++ b/src/gallium/state_trackers/glx/xlib/glx_api.c @@ -181,7 +181,7 @@ save_glx_visual( Display *dpy, XVisualInfo *vinfo, GLint depth_size, GLint stencil_size, GLint accumRedSize, GLint accumGreenSize, GLint accumBlueSize, GLint accumAlphaSize, - GLint level, GLint numAuxBuffers, GLint num_samples ) + GLint level, GLint numAuxBuffers, GLuint num_samples ) { GLboolean ximageFlag = GL_TRUE; XMesaVisual xmvis; @@ -996,7 +996,11 @@ choose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig ) (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 * find any real GL visuals. Instead, all we can do is try to find an RGB diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 53261fea51..a52c98112e 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -227,7 +227,7 @@ _mesa_create_visual( GLboolean dbFlag, GLint accumGreenBits, GLint accumBlueBits, GLint accumAlphaBits, - GLint numSamples ) + GLuint numSamples ) { struct gl_config *vis = CALLOC_STRUCT(gl_config); if (vis) { @@ -269,7 +269,7 @@ _mesa_initialize_visual( struct gl_config *vis, GLint accumGreenBits, GLint accumBlueBits, GLint accumAlphaBits, - GLint numSamples ) + GLuint numSamples ) { assert(vis); diff --git a/src/mesa/main/context.h b/src/mesa/main/context.h index 17fb86c323..5d9e2ede47 100644 --- a/src/mesa/main/context.h +++ b/src/mesa/main/context.h @@ -79,7 +79,7 @@ _mesa_create_visual( GLboolean dbFlag, GLint accumGreenBits, GLint accumBlueBits, GLint accumAlphaBits, - GLint numSamples ); + GLuint numSamples ); extern GLboolean _mesa_initialize_visual( struct gl_config *v, @@ -95,7 +95,7 @@ _mesa_initialize_visual( struct gl_config *v, GLint accumGreenBits, GLint accumBlueBits, GLint accumAlphaBits, - GLint numSamples ); + GLuint numSamples ); extern void _mesa_destroy_visual( struct gl_config *vis ); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 226eb94da9..d33bf08bdf 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -243,7 +243,7 @@ struct gl_config /* ARB_multisample / SGIS_multisample */ GLint sampleBuffers; - GLint samples; + GLuint samples; /* SGIX_pbuffer / GLX 1.3 */ GLint maxPbufferWidth; diff --git a/src/mesa/main/multisample.c b/src/mesa/main/multisample.c index 8ede94b745..dfe6a37142 100644 --- a/src/mesa/main/multisample.c +++ b/src/mesa/main/multisample.c @@ -87,7 +87,7 @@ _mesa_GetMultisamplefv(GLenum pname, GLuint index, GLfloat * val) switch (pname) { case GL_SAMPLE_POSITION: { - if ((int) index >= ctx->DrawBuffer->Visual.samples) { + if (index >= ctx->DrawBuffer->Visual.samples) { _mesa_error( ctx, GL_INVALID_VALUE, "glGetMultisamplefv(index)" ); return; } -- 2.13.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev