summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNicolai Haehnle <nhaehnle@gmail.com>2008-06-29 14:24:20 +0200
committerNicolai Haehnle <nhaehnle@gmail.com>2008-06-29 14:24:20 +0200
commitb8b124e7d9f1ba35c27283fe8dfecac66eff9c26 (patch)
tree52be835555975a22c4834cdb32011679c4b4437d /tests
parentc5cf79d6e81202cdecc73156adece18d948e35fb (diff)
Add fragment program / vertex program helper code to piglit-util
Diffstat (limited to 'tests')
-rw-r--r--tests/shaders/fp-fragment-position.c47
-rw-r--r--tests/shaders/fp-generic.c26
-rw-r--r--tests/shaders/fp-incomplete-tex.c46
-rw-r--r--tests/shaders/fp-kil.c43
-rw-r--r--tests/shaders/vp-bad-program.c11
-rw-r--r--tests/util/piglit-util.c151
-rw-r--r--tests/util/piglit-util.h16
7 files changed, 175 insertions, 165 deletions
diff --git a/tests/shaders/fp-fragment-position.c b/tests/shaders/fp-fragment-position.c
index 9e5ef399b..9225e7d29 100644
--- a/tests/shaders/fp-fragment-position.c
+++ b/tests/shaders/fp-fragment-position.c
@@ -76,15 +76,6 @@ static int Automatic = 0;
static int Width = 200, Height = 200;
-static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pglProgramLocalParameter4fvARB;
-static PFNGLPROGRAMLOCALPARAMETER4DARBPROC pglProgramLocalParameter4dARB;
-static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC pglGetProgramLocalParameterdvARB;
-static PFNGLGENPROGRAMSARBPROC pglGenProgramsARB;
-static PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB;
-static PFNGLBINDPROGRAMARBPROC pglBindProgramARB;
-static PFNGLISPROGRAMARBPROC pglIsProgramARB;
-static PFNGLDELETEPROGRAMSARBPROC pglDeleteProgramsARB;
-
/**
* Draw four quadrilaterals, one for each fragment program:
@@ -269,11 +260,11 @@ static int DoTest( void )
int i;
/*
- printf("ReadPixels at %d, %d\n",
+ printf("ReadPixels at %d, %d\n",
(int)(Probes[idx].x*Width/2),
(int)(Probes[idx].y*Height/2));
*/
-
+
glReadPixels((int)(Probes[idx].x*Width/2),
(int)(Probes[idx].y*Height/2),
1, 1,
@@ -354,39 +345,7 @@ static void Init(void)
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
- if (!glutExtensionSupported("GL_ARB_fragment_program")) {
- fprintf(stderr, "Sorry, this demo requires GL_ARB_fragment_program\n");
- if (Automatic)
- printf("PIGLIT: {'result': 'fail' }\n");
- exit(1);
- }
-
- /*
- * Get extension function pointers.
- */
- pglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
- assert(pglProgramLocalParameter4fvARB);
-
- pglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
- assert(pglProgramLocalParameter4dARB);
-
- pglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
- assert(pglGetProgramLocalParameterdvARB);
-
- pglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
- assert(pglGenProgramsARB);
-
- pglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
- assert(pglProgramStringARB);
-
- pglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
- assert(pglBindProgramARB);
-
- pglIsProgramARB = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
- assert(pglIsProgramARB);
-
- pglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
- assert(pglDeleteProgramsARB);
+ piglit_require_fragment_program();
/*
* Fragment programs
diff --git a/tests/shaders/fp-generic.c b/tests/shaders/fp-generic.c
index 1184babd9..9736b9e98 100644
--- a/tests/shaders/fp-generic.c
+++ b/tests/shaders/fp-generic.c
@@ -154,12 +154,6 @@ static struct testcase Testcase;
static GLuint FragProg;
-static PFNGLGENPROGRAMSARBPROC pglGenProgramsARB;
-static PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB;
-static PFNGLBINDPROGRAMARBPROC pglBindProgramARB;
-static PFNGLISPROGRAMARBPROC pglIsProgramARB;
-static PFNGLDELETEPROGRAMSARBPROC pglDeleteProgramsARB;
-
static void TestInstance(struct testinstance* instance)
{
@@ -224,25 +218,7 @@ static void Reshape(int width, int height)
static void Init(void)
{
- piglit_require_extension("GL_ARB_fragment_program");
-
- /*
- * Get extension function pointers.
- */
- pglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
- assert(pglGenProgramsARB);
-
- pglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
- assert(pglProgramStringARB);
-
- pglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
- assert(pglBindProgramARB);
-
- pglIsProgramARB = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
- assert(pglIsProgramARB);
-
- pglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
- assert(pglDeleteProgramsARB);
+ piglit_require_fragment_program();
/*
* Fragment programs
diff --git a/tests/shaders/fp-incomplete-tex.c b/tests/shaders/fp-incomplete-tex.c
index 7ed8b4eca..1a46da06b 100644
--- a/tests/shaders/fp-incomplete-tex.c
+++ b/tests/shaders/fp-incomplete-tex.c
@@ -33,6 +33,8 @@
#include <math.h>
#include <GL/glut.h>
+#include "piglit-util.h"
+
static void CheckFail(const char* cond);
#define check(cond) do { if (!(cond)) CheckFail(#cond); } while(0)
@@ -68,16 +70,6 @@ static int Automatic = 0;
static int Width = 300, Height = 200;
-static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pglProgramLocalParameter4fvARB;
-static PFNGLPROGRAMLOCALPARAMETER4DARBPROC pglProgramLocalParameter4dARB;
-static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC pglGetProgramLocalParameterdvARB;
-static PFNGLGENPROGRAMSARBPROC pglGenProgramsARB;
-static PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB;
-static PFNGLBINDPROGRAMARBPROC pglBindProgramARB;
-static PFNGLISPROGRAMARBPROC pglIsProgramARB;
-static PFNGLDELETEPROGRAMSARBPROC pglDeleteProgramsARB;
-
-
static void DoFrame(void)
{
int mask;
@@ -244,39 +236,7 @@ static void Init(void)
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
- if (!glutExtensionSupported("GL_ARB_fragment_program")) {
- fprintf(stderr, "Sorry, this demo requires GL_ARB_fragment_program\n");
- if (Automatic)
- printf("PIGLIT: {'result': 'fail' }\n");
- exit(1);
- }
-
- /*
- * Get extension function pointers.
- */
- pglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
- assert(pglProgramLocalParameter4fvARB);
-
- pglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
- assert(pglProgramLocalParameter4dARB);
-
- pglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
- assert(pglGetProgramLocalParameterdvARB);
-
- pglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
- assert(pglGenProgramsARB);
-
- pglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
- assert(pglProgramStringARB);
-
- pglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
- assert(pglBindProgramARB);
-
- pglIsProgramARB = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
- assert(pglIsProgramARB);
-
- pglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
- assert(pglDeleteProgramsARB);
+ piglit_require_fragment_program();
/*
* Fragment programs
diff --git a/tests/shaders/fp-kil.c b/tests/shaders/fp-kil.c
index 9e467347a..f272a8303 100644
--- a/tests/shaders/fp-kil.c
+++ b/tests/shaders/fp-kil.c
@@ -61,15 +61,6 @@ static int Automatic = 0;
static int Width = 200, Height = 200; // space for more tests
-static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pglProgramLocalParameter4fvARB;
-static PFNGLPROGRAMLOCALPARAMETER4DARBPROC pglProgramLocalParameter4dARB;
-static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC pglGetProgramLocalParameterdvARB;
-static PFNGLGENPROGRAMSARBPROC pglGenProgramsARB;
-static PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB;
-static PFNGLBINDPROGRAMARBPROC pglBindProgramARB;
-static PFNGLISPROGRAMARBPROC pglIsProgramARB;
-static PFNGLDELETEPROGRAMSARBPROC pglDeleteProgramsARB;
-
static void DoFrame(void)
{
@@ -320,39 +311,7 @@ static void Init(void)
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
- if (!glutExtensionSupported("GL_ARB_fragment_program")) {
- fprintf(stderr, "Sorry, this demo requires GL_ARB_fragment_program\n");
- if (Automatic)
- printf("PIGLIT: {'result': 'fail' }\n");
- exit(1);
- }
-
- /*
- * Get extension function pointers.
- */
- pglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
- assert(pglProgramLocalParameter4fvARB);
-
- pglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
- assert(pglProgramLocalParameter4dARB);
-
- pglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
- assert(pglGetProgramLocalParameterdvARB);
-
- pglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
- assert(pglGenProgramsARB);
-
- pglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
- assert(pglProgramStringARB);
-
- pglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
- assert(pglBindProgramARB);
-
- pglIsProgramARB = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
- assert(pglIsProgramARB);
-
- pglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
- assert(pglDeleteProgramsARB);
+ piglit_require_fragment_program();
/*
* Fragment programs
diff --git a/tests/shaders/vp-bad-program.c b/tests/shaders/vp-bad-program.c
index 2e00cfa58..bed440e9a 100644
--- a/tests/shaders/vp-bad-program.c
+++ b/tests/shaders/vp-bad-program.c
@@ -50,9 +50,6 @@ static int automatic = 0;
#define WIN_WIDTH 128
#define WIN_HEIGHT 128
-static PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB;
-static PFNGLBINDPROGRAMARBPROC pglBindProgramARB;
-
static void
display(void)
{
@@ -153,13 +150,7 @@ main(int argc, char**argv)
glutCreateWindow("vp-bad-program");
glutDisplayFunc(display);
- piglit_require_extension("GL_ARB_vertex_program");
-
- pglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
- assert(pglProgramStringARB);
-
- pglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
- assert(pglBindProgramARB);
+ piglit_require_vertex_program();
glutMainLoop();
return 0;
diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c
index fa51feff0..a0d9fc32d 100644
--- a/tests/util/piglit-util.c
+++ b/tests/util/piglit-util.c
@@ -21,9 +21,11 @@
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#include <assert.h>
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
-#include <math.h>
+#include <string.h>
#include "GL/glut.h"
@@ -96,3 +98,150 @@ int piglit_probe_pixel_rgba(int x, int y, const float* expected)
return 0;
}
+
+/**
+ * Read a pixel from the given location and compare its RGB value to the
+ * given expected values.
+ *
+ * Print a log message if the color value deviates from the expected value.
+ * \return true if the color values match, false otherwise
+ */
+int piglit_probe_pixel_rgb(int x, int y, const float* expected)
+{
+ GLfloat probe[3];
+ GLfloat delta[3];
+ GLfloat deltamax;
+ int i;
+
+ glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT, probe);
+
+ deltamax = 0.0;
+ for(i = 0; i < 3; ++i) {
+ delta[i] = probe[i] - expected[i];
+ if (fabs(delta[i]) > deltamax)
+ deltamax = fabs(delta[i]);
+ }
+
+ if (deltamax < 0.01)
+ return 1;
+
+ printf("Probe at (%i,%i)\n", x, y);
+ printf(" Expected: %f %f %f %f\n", expected[0], expected[1], expected[2]);
+ printf(" Observed: %f %f %f %f\n", probe[0], probe[1], probe[2]);
+
+ return 0;
+}
+
+
+PFNGLGENPROGRAMSARBPROC pglGenProgramsARB = 0;
+PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB = 0;
+PFNGLBINDPROGRAMARBPROC pglBindProgramARB = 0;
+PFNGLISPROGRAMARBPROC pglIsProgramARB = 0;
+PFNGLDELETEPROGRAMSARBPROC pglDeleteProgramsARB = 0;
+PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pglProgramLocalParameter4fvARB = 0;
+PFNGLPROGRAMLOCALPARAMETER4DARBPROC pglProgramLocalParameter4dARB = 0;
+PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC pglGetProgramLocalParameterdvARB = 0;
+
+static void get_program_functions()
+{
+ pglGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
+ assert(pglGenProgramsARB);
+
+ pglProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
+ assert(pglProgramStringARB);
+
+ pglBindProgramARB = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
+ assert(pglBindProgramARB);
+
+ pglIsProgramARB = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
+ assert(pglIsProgramARB);
+
+ pglDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
+ assert(pglDeleteProgramsARB);
+
+ pglProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
+ assert(pglProgramLocalParameter4fvARB);
+
+ pglProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
+ assert(pglProgramLocalParameter4dARB);
+
+ pglGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
+ assert(pglGetProgramLocalParameterdvARB);
+}
+
+int piglit_use_fragment_program()
+{
+ if (!glutExtensionSupported("GL_ARB_fragment_program"))
+ return 0;
+
+ get_program_functions();
+ return 1;
+}
+
+void piglit_require_fragment_program()
+{
+ if (!piglit_use_fragment_program()) {
+ printf("GL_ARB_fragment_program not supported.\n");
+ piglit_report_result(PIGLIT_SKIP);
+ exit(1);
+ }
+}
+
+int piglit_use_vertex_program()
+{
+ if (!glutExtensionSupported("GL_ARB_vertex_program"))
+ return 0;
+
+ get_program_functions();
+ return 1;
+}
+
+void piglit_require_vertex_program()
+{
+ if (!piglit_use_vertex_program()) {
+ printf("GL_ARB_vertex_program not supported.\n");
+ piglit_report_result(PIGLIT_SKIP);
+ exit(1);
+ }
+}
+
+GLuint piglit_compile_program(GLenum target, const char* text)
+{
+ GLuint program;
+ GLint errorPos;
+
+ pglGenProgramsARB(1, &program);
+ pglBindProgramARB(target, program);
+ pglProgramStringARB(
+ target,
+ GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(text),
+ (const GLubyte *)text);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
+ if (glGetError() != GL_NO_ERROR || errorPos != -1) {
+ int l = FindLine(text, errorPos);
+ int a;
+
+ fprintf(stderr, "Compiler Error (pos=%d line=%d): %s\n",
+ errorPos, l,
+ (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
+
+ for (a=-10; a<10; a++)
+ {
+ if (errorPos+a < 0)
+ continue;
+ if (errorPos+a >= strlen(text))
+ break;
+ fprintf(stderr, "%c", text[errorPos+a]);
+ }
+ fprintf(stderr, "\nin program:\n%s", text);
+ piglit_report_result(PIGLIT_FAILURE);
+ }
+ if (!pglIsProgramARB(program)) {
+ fprintf(stderr, "pglIsProgramARB failed\n");
+ piglit_report_result(PIGLIT_FAILURE);
+ }
+
+ return program;
+}
+
diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
index d6355ea25..414591a59 100644
--- a/tests/util/piglit-util.h
+++ b/tests/util/piglit-util.h
@@ -32,4 +32,20 @@ enum piglit_result {
int FindLine(const char *program, int position);
void piglit_report_result(enum piglit_result result);
void piglit_require_extension(const char *name);
+int piglit_probe_pixel_rgb(int x, int y, const float* expected);
int piglit_probe_pixel_rgba(int x, int y, const float* expected);
+
+extern PFNGLGENPROGRAMSARBPROC pglGenProgramsARB;
+extern PFNGLPROGRAMSTRINGARBPROC pglProgramStringARB;
+extern PFNGLBINDPROGRAMARBPROC pglBindProgramARB;
+extern PFNGLISPROGRAMARBPROC pglIsProgramARB;
+extern PFNGLDELETEPROGRAMSARBPROC pglDeleteProgramsARB;
+extern PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pglProgramLocalParameter4fvARB;
+extern PFNGLPROGRAMLOCALPARAMETER4DARBPROC pglProgramLocalParameter4dARB;
+extern PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC pglGetProgramLocalParameterdvARB;
+
+int piglit_use_fragment_program();
+int piglit_use_vertex_program();
+void piglit_require_fragment_program();
+void piglit_require_vertex_program();
+GLuint piglit_compile_program(GLenum target, const char* text);