Further to comments in
http://people.freedesktop.org/~marcheu/irclogs/nouveau-2007-10-20
between 11:30 and 13:51, chowmeined confirmation in
http://people.freedesktop.org/~marcheu/irclogs/nouveau-2007-10-21 at
10:16 of the same behaviour on a second 0322.

It appears that 10de0322 supports GL_EXT_framebuffer_object but does
not support ARB_draw_buffers, accordingly the current fragment program
in renouveau test.c::test_ext_framebuffer_object() causes OpenGL error
1282, 502, INVALID_OPERATION at call to ProgramStringARB on line 4595,
http://oss.sgi.com/projects/ogl-sample/registry/ARB/fragment_program.txt
section 3.11.1 suggests this is due to the illegal token in the
fragment program (fp).

The example code in
http://oss.sgi.com/projects/ogl-sample/registry/ARB/fragment_program.txt
between lines 417 and 429 suggest a method for determining which
character in the fragment program caused the error;

        GLint errorPos;
        regl.GetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);

Error appears to be firstly `OPTION ARB_draw_buffers;` and secondly
the use of `MOV result.color[%d], fragment.color;` when without
GL_ARB_draw_buffers a syntactically correct line woudl read `MOV
result.color, fragment.color;`.

Furthermore due to incorrect detection of nr_bufs line 4614 or 4615
causes a similar error when the draw buffers test attempts to use a
draw buffer which does not exist on the hardware.

Perusing http://oss.sgi.com/projects/ogl-sample/registry/ARB/draw_buffers.txt
when querying the number of supported draw buffers one should call
GetIntegerv specifying MAX_DRAW_BUFFERS_ARB (0x8824) not
GL_MAX_COLOR_ATTACHMENTS_EXT as currently performed on line 4566.

Attached patch;

1. Defines the constant MAX_DRAW_BUFFERS_ARB (in test.c, which header
should this go into? does it really matter for renouveau?)
2. Correctly uses MAX_DRAW_BUFFERS_ARB to determine the number of draw
buffers present
(http://oss.sgi.com/projects/ogl-sample/registry/ARB/draw_buffers.txt
suggests that OpenGL 1.5 MAX_DRAW_BUFFERS_ARB will always return a
minimum value of 1, will renouveau ever be run on OpenGL<1.5?)
3. Adds a line to `card_10de-xxxx_test_ext_framebuffer_object.txt`
when GL_ARB_draw_buffers is not supported
4. Modifies the fp in the case when MAX_DRAW_BUFFERS_ARB == 1 and
GL_ARB_draw_buffers is not supported
5. Draw buffer test now runs without error (due to 2)

Patch applied to a fresh checkout of renouveau on both 0322
(GL_EXT_framebuffer_object) and 0393 (GL_EXT_framebuffer_object +
GL_ARB_draw_buffers) compiled and tested without error.

Please review and consider applying the attached patch.

Regards,

Mark Carey
--- renouveau/tests.c.orig	2007-10-25 21:26:16.000000000 +1300
+++ renouveau/tests.c	2007-10-25 21:42:54.000000000 +1300
@@ -4563,8 +4563,12 @@
 
 	TEST_PROLOGUE;
 
-	regl.GetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &nr_bufs);
+/* defined as per http://oss.sgi.com/projects/ogl-sample/registry/ARB/draw_buffers.txt */
+#define MAX_DRAW_BUFFERS_ARB 0x8824 
+	regl.GetIntegerv(MAX_DRAW_BUFFERS_ARB, &nr_bufs);
 	printf("# %d draw buffers supported\n", nr_bufs);
+	if (nr_bufs == 1 && !strstr(extensions, "GL_ARB_draw_buffers"))
+		printf("# No GL_ARB_draw_buffers extension\n");
 	if (nr_bufs > RENOUVEAU_MAX_DRAW_BUFFERS)
 		nr_bufs = RENOUVEAU_MAX_DRAW_BUFFERS;
 
@@ -4578,23 +4582,34 @@
 	    regl.RenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA, 32, 32);
 	}
 	regl.GenProgramsARB(RENOUVEAU_MAX_DRAW_BUFFERS, fp_obj);
-	for (i=0; i<nr_bufs; i++) {
-		int buf;
-
+	if (nr_bufs == 1 && !strstr(extensions, "GL_ARB_draw_buffers")) {
+		/* cards with GL_EXT_framebuffer_object and no GL_ARB_draw_buffers 0322 */
 		fp[0] = '\0';
-		strcat(fp, "!!ARBfp1.0\nOPTION ARB_draw_buffers;\n");
-		for (buf=0; buf<=i; buf++) {
-			char l[100];
-			sprintf(l, "MOV result.color[%d], fragment.color;\n", buf);
-			strcat(fp, l);
-		
-		}
-		strcat(fp, "END\n");
+		strcat(fp, "!!ARBfp1.0\nMOV result.color, fragment.color;\nEND\n");
 		printf("# Fragprog is:\n%s\n", fp);
-		regl.BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fp_obj[i]);
+		regl.BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fp_obj[0]);
 		regl.ProgramStringARB(GL_FRAGMENT_PROGRAM_ARB,
 				      GL_PROGRAM_FORMAT_ASCII_ARB,
 				      strlen(fp), fp);
+	} else {
+		for (i=0; i<nr_bufs; i++) {
+			int buf;
+
+			fp[0] = '\0';
+			strcat(fp, "!!ARBfp1.0\nOPTION ARB_draw_buffers;\n");
+			for (buf=0; buf<=i; buf++) {
+				char l[100];
+				sprintf(l, "MOV result.color[%d], fragment.color;\n", buf);
+				strcat(fp, l);
+		
+			}
+			strcat(fp, "END\n");
+			printf("# Fragprog is:\n%s\n", fp);
+			regl.BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, fp_obj[i]);
+			regl.ProgramStringARB(GL_FRAGMENT_PROGRAM_ARB,
+					      GL_PROGRAM_FORMAT_ASCII_ARB,
+					      strlen(fp), fp);
+		}
 	}
 	regl.Finish();
 
_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to