summaryrefslogtreecommitdiff
path: root/progs
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2010-02-18 16:54:14 -0700
committerBrian Paul <brianp@vmware.com>2010-02-18 16:58:38 -0700
commit86bf224cac4600ad4706ee101ced9e3f1a9886b4 (patch)
tree3208382c64e3aa219c256ea5eede91124dd51ec0 /progs
parent00d1d8aad3b97899e3fab1cc4e4296c3f6ee8513 (diff)
progs/demos: update arbocclude.c to do multiple queries at once
Issue a whole bunch of queries then get the results and render. Draw the test object in red instead of orange if the result was not ready when we first queried it.
Diffstat (limited to 'progs')
-rw-r--r--progs/demos/arbocclude.c213
1 files changed, 108 insertions, 105 deletions
diff --git a/progs/demos/arbocclude.c b/progs/demos/arbocclude.c
index f669a1f26b..cc787eeb8a 100644
--- a/progs/demos/arbocclude.c
+++ b/progs/demos/arbocclude.c
@@ -32,11 +32,12 @@
#include <GL/glew.h>
#include <GL/glut.h>
-#define TEST_DISPLAY_LISTS 0
+#define NUM_OCC 10
static GLboolean Anim = GL_TRUE;
-static GLfloat Xpos = 0;
-static GLuint OccQuery;
+static GLfloat Xpos[NUM_OCC], Ypos[NUM_OCC];
+static GLfloat Sign[NUM_OCC];
+static GLuint OccQuery[NUM_OCC];
static GLint Win = 0;
@@ -54,38 +55,43 @@ PrintString(const char *s)
static void Idle(void)
{
static int lastTime = 0;
- static int sign = +1;
int time = glutGet(GLUT_ELAPSED_TIME);
float step;
+ int i;
if (lastTime == 0)
lastTime = time;
else if (time - lastTime < 20) /* 50Hz update */
return;
- step = (time - lastTime) / 1000.0 * sign;
- lastTime = time;
+ for (i = 0; i < NUM_OCC; i++) {
- Xpos += step;
+ step = (time - lastTime) / 1000.0 * Sign[i];
+
+ Xpos[i] += step;
+
+ if (Xpos[i] > 2.5) {
+ Xpos[i] = 2.5;
+ Sign[i] = -1;
+ }
+ else if (Xpos[i] < -2.5) {
+ Xpos[i] = -2.5;
+ Sign[i] = +1;
+ }
- if (Xpos > 2.5) {
- Xpos = 2.5;
- sign = -1;
- }
- else if (Xpos < -2.5) {
- Xpos = -2.5;
- sign = +1;
}
+
+ lastTime = time;
+
glutPostRedisplay();
}
static void Display( void )
{
- GLuint passed;
- GLint ready;
- char s[100];
+ int i;
+ glClearColor(0.25, 0.25, 0.25, 0.0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
@@ -96,97 +102,84 @@ static void Display( void )
glTranslatef( 0.0, 0.0, -15.0 );
/* draw the occluding polygons */
- glColor3f(0, 0.6, 0.8);
+ glColor3f(0, 0.4, 0.6);
glBegin(GL_QUADS);
- glVertex2f(-1.6, -1.5);
- glVertex2f(-0.4, -1.5);
- glVertex2f(-0.4, 1.5);
- glVertex2f(-1.6, 1.5);
-
- glVertex2f( 0.4, -1.5);
- glVertex2f( 1.6, -1.5);
- glVertex2f( 1.6, 1.5);
- glVertex2f( 0.4, 1.5);
+ glVertex2f(-1.6, -2.5);
+ glVertex2f(-0.4, -2.5);
+ glVertex2f(-0.4, 2.5);
+ glVertex2f(-1.6, 2.5);
+ glVertex2f( 0.4, -2.5);
+ glVertex2f( 1.6, -2.5);
+ glVertex2f( 1.6, 2.5);
+ glVertex2f( 0.4, 2.5);
glEnd();
- /* draw the test polygon with occlusion testing */
- glPushMatrix();
- glTranslatef(Xpos, 0, -0.5);
- glScalef(0.3, 0.3, 1.0);
- glRotatef(-90.0 * Xpos, 0, 0, 1);
-
-#if defined(GL_ARB_occlusion_query)
-#if TEST_DISPLAY_LISTS
- glNewList(10, GL_COMPILE);
- glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery);
- glEndList();
- glCallList(10);
-#else
- glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery);
-#endif
glColorMask(0, 0, 0, 0);
glDepthMask(GL_FALSE);
- glBegin(GL_POLYGON);
- glVertex3f(-1, -1, 0);
- glVertex3f( 1, -1, 0);
- glVertex3f( 1, 1, 0);
- glVertex3f(-1, 1, 0);
- glEnd();
+ /* draw the test polygons with occlusion testing */
+ for (i = 0; i < NUM_OCC; i++) {
+ glPushMatrix();
+ glTranslatef(Xpos[i], Ypos[i], -0.5);
+ glScalef(0.2, 0.2, 1.0);
+ glRotatef(-90.0 * Xpos[i], 0, 0, 1);
+
+ glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery[i]);
+ glBegin(GL_POLYGON);
+ glVertex3f(-1, -1, 0);
+ glVertex3f( 1, -1, 0);
+ glVertex3f( 1, 1, 0);
+ glVertex3f(-1, 1, 0);
+ glEnd();
+ glEndQueryARB(GL_SAMPLES_PASSED_ARB);
+
+ glPopMatrix();
+ }
-#if TEST_DISPLAY_LISTS
- glNewList(11, GL_COMPILE);
- glEndQueryARB(GL_SAMPLES_PASSED_ARB);
- glEndList();
- glCallList(11);
-#else
- glEndQueryARB(GL_SAMPLES_PASSED_ARB);
-#endif
-
- do {
- /* do useful work here, if any */
- glGetQueryObjectivARB(OccQuery, GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
- } while (!ready);
- glGetQueryObjectuivARB(OccQuery, GL_QUERY_RESULT_ARB, &passed);
-
- /* turn off occlusion testing */
glColorMask(1, 1, 1, 1);
glDepthMask(GL_TRUE);
-#endif /* GL_ARB_occlusion_query */
-
- /* draw the orange rect, so we can see what's going on */
- glColor3f(0.8, 0.5, 0);
- glBegin(GL_POLYGON);
- glVertex3f(-1, -1, 0);
- glVertex3f( 1, -1, 0);
- glVertex3f( 1, 1, 0);
- glVertex3f(-1, 1, 0);
- glEnd();
- glPopMatrix();
-
-
- /* Print result message */
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
-
- glColor3f(1, 1, 1);
-#if defined(GL_ARB_occlusion_query)
- sprintf(s, " %4d Fragments Visible", passed);
- glRasterPos3f(-0.50, -0.7, 0);
- PrintString(s);
- if (!passed) {
- glRasterPos3f(-0.25, -0.8, 0);
- PrintString("Fully Occluded");
+ /* Draw the rectangles now.
+ * Draw orange if result was ready
+ * Draw red if result was not ready.
+ */
+ for (i = 0; i < NUM_OCC; i++) {
+ GLuint passed;
+ GLint ready;
+
+ glGetQueryObjectivARB(OccQuery[i], GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
+
+ glGetQueryObjectuivARB(OccQuery[i], GL_QUERY_RESULT_ARB, &passed);
+
+ if (!ready)
+ glColor3f(1, 0, 0);
+ else
+ glColor3f(0.8, 0.5, 0);
+
+ if (!ready || passed) {
+ glPushMatrix();
+ glTranslatef(Xpos[i], Ypos[i], -0.5);
+ glScalef(0.2, 0.2, 1.0);
+ glRotatef(-90.0 * Xpos[i], 0, 0, 1);
+
+ glBegin(GL_POLYGON);
+ glVertex3f(-1, -1, 0);
+ glVertex3f( 1, -1, 0);
+ glVertex3f( 1, 1, 0);
+ glVertex3f(-1, 1, 0);
+ glEnd();
+
+ glPopMatrix();
+ }
+
+ {
+ char s[10];
+ glRasterPos3f(0.45, Ypos[i], 1.0);
+ sprintf(s, "%4d", passed);
+ PrintString(s);
+ }
}
-#else
- glRasterPos3f(-0.25, -0.8, 0);
- PrintString("GL_ARB_occlusion_query not available at compile time");
-#endif /* GL_ARB_occlusion_query */
glutSwapBuffers();
}
@@ -222,14 +215,17 @@ static void Key( unsigned char key, int x, int y )
static void SpecialKey( int key, int x, int y )
{
const GLfloat step = 0.1;
+ int i;
(void) x;
(void) y;
switch (key) {
case GLUT_KEY_LEFT:
- Xpos -= step;
+ for (i = 0; i < NUM_OCC; i++)
+ Xpos[i] -= step;
break;
case GLUT_KEY_RIGHT:
- Xpos += step;
+ for (i = 0; i < NUM_OCC; i++)
+ Xpos[i] += step;
break;
}
glutPostRedisplay();
@@ -240,29 +236,33 @@ static void Init( void )
{
const char *ext = (const char *) glGetString(GL_EXTENSIONS);
GLint bits;
+ int i;
if (!strstr(ext, "GL_ARB_occlusion_query")) {
printf("Sorry, this demo requires the GL_ARB_occlusion_query extension\n");
exit(-1);
}
-#if defined(GL_ARB_occlusion_query)
glGetQueryivARB(GL_SAMPLES_PASSED_ARB, GL_QUERY_COUNTER_BITS_ARB, &bits);
if (!bits) {
printf("Hmmm, GL_QUERY_COUNTER_BITS_ARB is zero!\n");
exit(-1);
}
-#endif /* GL_ARB_occlusion_query */
glGetIntegerv(GL_DEPTH_BITS, &bits);
printf("Depthbits: %d\n", bits);
-#if defined(GL_ARB_occlusion_query)
- glGenQueriesARB(1, &OccQuery);
- assert(OccQuery > 0);
-#endif /* GL_ARB_occlusion_query */
+ glGenQueriesARB(NUM_OCC, OccQuery);
glEnable(GL_DEPTH_TEST);
+
+ for (i = 0; i < NUM_OCC; i++) {
+ float t = (float) i / (NUM_OCC - 1);
+ Xpos[i] = 2.5 * t;
+ Ypos[i] = 4.0 * (t - 0.5);
+ Sign[i] = 1.0;
+ }
+
}
@@ -276,7 +276,10 @@ int main( int argc, char *argv[] )
glutReshapeFunc( Reshape );
glutKeyboardFunc( Key );
glutSpecialFunc( SpecialKey );
- glutIdleFunc( Idle );
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
glutDisplayFunc( Display );
Init();
glutMainLoop();