Package: mesa
Severity: normal
The following combination leads to a black border on the right hand side
of the viewport which is wrong:
- glPixelZoom(1.0f, -1.0f)
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
- glDrawPixels with format GL_LUMINANCE
Any other combination or slightly different pixel zoom values work as
expected. A sample program demonstrating the behaviour is attached.
Compile as follows: gcc -lglut mesa_bug.c -o mesa_bug
Note that the bug happens in both, accelerated (DRI) and non-accelerated
modes and with different graphics drivers (Radeon 7500 & Matrox G550).
-- System Information:
Debian Release: 4.0
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
// demonstrates bug in Mesa where a black border appears on the right hand
// side of the window.
// Compile with:
//
// gcc -lglut mesa_bug.c -o mesa_bug
//
#include <stdlib.h> // for malloc
#include <GL/glut.h>
#define WIDTH 150
#define HEIGHT 150
unsigned char *pixels;
void reshapeFunc(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, w, h, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
}
static void dispOpts(int align, int format, float zoomY)
{
glClear(GL_COLOR_BUFFER_BIT);
glPixelZoom(1.0f, zoomY);
glPixelStorei(GL_UNPACK_ALIGNMENT, align);
glRasterPos2i(0, 0);
glDrawPixels(WIDTH, HEIGHT, format, GL_UNSIGNED_BYTE, pixels);
glutSwapBuffers();
}
// This combination exposes the bug
// (Unpack alignment 1, format Luminance, vertical pixel zoom -1.0f)
void dispFunc1(void)
{
dispOpts(1, GL_LUMINANCE, -1.0f);
}
// Other format: works
void dispFunc2(void)
{
dispOpts(1, GL_RED, -1.0f);
}
// Other pixel zoom value: works
void dispFunc3(void)
{
dispOpts(1, GL_LUMINANCE, -1.0001f);
}
// Other alignment value: works
void dispFunc4(void)
{
dispOpts(2, GL_LUMINANCE, -1.0f);
}
int main(int argc, char** argv)
{
int i, j;
unsigned char *ptr;
glutInit(&argc, argv);
pixels = (unsigned char *)malloc(WIDTH*HEIGHT);
ptr = pixels;
// create a simple gradient
for (i=0; i < HEIGHT; i++)
for (j=0; j < WIDTH; j++)
*(ptr++) = j;
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(WIDTH, HEIGHT);
// Window 1
glutInitWindowPosition(100, 100);
glutCreateWindow("BUG");
glutDisplayFunc(dispFunc1);
glutReshapeFunc(reshapeFunc);
// Window 2
glutInitWindowPosition(200+WIDTH, 100);
glutCreateWindow("WORKS");
glutDisplayFunc(dispFunc2);
glutReshapeFunc(reshapeFunc);
// Window 3
glutInitWindowPosition(100, 200+HEIGHT);
glutCreateWindow("WORKS");
glutDisplayFunc(dispFunc3);
glutReshapeFunc(reshapeFunc);
// Window 4
glutInitWindowPosition(200+WIDTH, 200+HEIGHT);
glutCreateWindow("WORKS");
glutDisplayFunc(dispFunc4);
glutReshapeFunc(reshapeFunc);
glutMainLoop();
return 0;
}