graw: fix logic error in pixel format selection

The loop to choose a pixel format for the window was incrementing
'i' after we succeeded in creating the window so if we chose format[0]
for graw_create_window_and_screen() we were putting format[1] in
the pipe_resource template for creating the render target.

This only worked because of the order of the elements in the formats[]
array.

The graw_xlib.c code now properly compares the requested gallium pixel
format against the visual's color layout.

Update all the graw demos to fix the off-by-one-i error.
This commit is contained in:
Brian Paul 2011-01-20 13:32:35 -07:00
parent 22eeb1b331
commit 4ef955a12a
10 changed files with 96 additions and 54 deletions

View file

@ -66,9 +66,6 @@ graw_create_window_and_screen( int x,
root = RootWindow( graw.display, scrnum );
if (format != PIPE_FORMAT_R8G8B8A8_UNORM)
goto fail;
if (graw.display == NULL)
goto fail;
@ -88,6 +85,23 @@ graw_create_window_and_screen( int x,
exit(1);
}
/* See if the requirested pixel format matches the visual */
if (visinfo->red_mask == 0xff0000 &&
visinfo->green_mask == 0xff00 &&
visinfo->blue_mask == 0xff) {
if (format != PIPE_FORMAT_B8G8R8A8_UNORM)
goto fail;
}
else if (visinfo->red_mask == 0xff &&
visinfo->green_mask == 0xff00 &&
visinfo->blue_mask == 0xff0000) {
if (format != PIPE_FORMAT_R8G8B8A8_UNORM)
goto fail;
}
else {
goto fail;
}
/* window attributes */
attr.background_pixel = 0;
attr.border_pixel = 0;

View file

@ -2,6 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include <stdio.h>
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
@ -48,16 +49,17 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,300,300,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
if (window == NULL)
exit(2);
ctx = screen->context_create(screen, NULL);
if (ctx == NULL)

View file

@ -433,15 +433,18 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,WIDTH,HEIGHT,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);
if (ctx == NULL)
exit(3);

View file

@ -497,15 +497,18 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,WIDTH,HEIGHT,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);
if (ctx == NULL)
exit(3);

View file

@ -2,6 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include <stdio.h>
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
@ -303,15 +304,18 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,300,300,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);
if (ctx == NULL)
exit(3);

View file

@ -176,15 +176,18 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,300,300,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);
if (ctx == NULL)
exit(3);

View file

@ -2,6 +2,7 @@
* any utility code, just the graw interface and gallium.
*/
#include <stdio.h>
#include "state_tracker/graw.h"
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
@ -182,13 +183,16 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,300,300,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);

View file

@ -234,13 +234,16 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,300,300,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);

View file

@ -162,13 +162,16 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,300,300,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);

View file

@ -384,13 +384,16 @@ static void init( void )
* Also, no easy way of querying supported formats if the screen
* cannot be created first.
*/
for (i = 0;
window == NULL && formats[i] != PIPE_FORMAT_NONE;
i++) {
screen = graw_create_window_and_screen(0,0,WIDTH,HEIGHT,
for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
screen = graw_create_window_and_screen(0, 0, 300, 300,
formats[i],
&window);
if (window && screen)
break;
}
if (!screen || !window) {
fprintf(stderr, "Unable to create window\n");
exit(1);
}
ctx = screen->context_create(screen, NULL);