diff options
Diffstat (limited to 'progs')
-rw-r--r-- | progs/SConscript | 71 | ||||
-rw-r--r-- | progs/demos/Makefile | 7 | ||||
-rw-r--r-- | progs/demos/shadowtex.c | 1 | ||||
-rw-r--r-- | progs/fp/position-frc-integer.txt | 7 | ||||
-rw-r--r-- | progs/fp/position-frc.txt | 6 | ||||
-rw-r--r-- | progs/fp/position-upper-left.txt | 7 | ||||
-rw-r--r-- | progs/fp/position.txt | 2 | ||||
-rw-r--r-- | progs/tests/bufferobj.c | 8 | ||||
-rw-r--r-- | progs/trivial/Makefile | 1 | ||||
-rw-r--r-- | progs/trivial/tri-fbo-tex-mip.c | 1 | ||||
-rw-r--r-- | progs/trivial/vp-array-hf.c | 215 | ||||
-rw-r--r-- | progs/xdemos/glxgears.c | 14 | ||||
-rw-r--r-- | progs/xdemos/offset.c | 10 |
13 files changed, 302 insertions, 48 deletions
diff --git a/progs/SConscript b/progs/SConscript index 3b180d00bc..66a1745271 100644 --- a/progs/SConscript +++ b/progs/SConscript @@ -15,38 +15,39 @@ if progs_env['platform'] == 'windows': 'gdi32', ]) -# OpenGL -if progs_env['platform'] == 'windows': - progs_env.Prepend(LIBS = ['glu32', 'opengl32']) -else: - progs_env.Prepend(LIBS = ['GLU', 'GL']) - -# Glut -progs_env.Prepend(LIBS = [glut]) - -# GLEW -progs_env.Prepend(LIBS = [glew]) - -progs_env.Prepend(CPPPATH = [ - '#progs/util', -]) - -progs_env.Prepend(LIBS = [ - util, -]) - -Export('progs_env') - -SConscript([ - 'demos/SConscript', - 'glsl/SConscript', - 'redbook/SConscript', - 'samples/SConscript', - 'tests/SConscript', - 'trivial/SConscript', - 'vp/SConscript', - 'vpglsl/SConscript', - 'fp/SConscript', - 'wgl/SConscript', - 'perf/SConscript', -]) +if platform != 'embedded': + # OpenGL + if progs_env['platform'] == 'windows': + progs_env.Prepend(LIBS = ['glu32', 'opengl32']) + else: + progs_env.Prepend(LIBS = ['GLU', 'GL']) + + # Glut + progs_env.Prepend(LIBS = [glut]) + + # GLEW + progs_env.Prepend(LIBS = [glew]) + + progs_env.Prepend(CPPPATH = [ + '#progs/util', + ]) + + progs_env.Prepend(LIBS = [ + util, + ]) + + Export('progs_env') + + SConscript([ + 'demos/SConscript', + 'glsl/SConscript', + 'redbook/SConscript', + 'samples/SConscript', + 'tests/SConscript', + 'trivial/SConscript', + 'vp/SConscript', + 'vpglsl/SConscript', + 'fp/SConscript', + 'wgl/SConscript', + 'perf/SConscript', + ]) diff --git a/progs/demos/Makefile b/progs/demos/Makefile index 65fdbaaad8..f21d916330 100644 --- a/progs/demos/Makefile +++ b/progs/demos/Makefile @@ -124,13 +124,6 @@ reflect.o: reflect.c showbuffer.h $(APP_CC) -c -I$(INCDIR) $(CFLAGS) reflect.c -shadowtex: shadowtex.o showbuffer.o - $(APP_CC) $(CFLAGS) $(LDFLAGS) shadowtex.o showbuffer.o $(LIBS) -o $@ - -shadowtex.o: shadowtex.c showbuffer.h - $(APP_CC) -c -I$(INCDIR) $(CFLAGS) shadowtex.c - - gloss: gloss.o trackball.o readtex.o $(APP_CC) $(CFLAGS) $(LDFLAGS) gloss.o trackball.o readtex.o $(LIBS) -o $@ diff --git a/progs/demos/shadowtex.c b/progs/demos/shadowtex.c index 036f73d40b..677a42104f 100644 --- a/progs/demos/shadowtex.c +++ b/progs/demos/shadowtex.c @@ -38,7 +38,6 @@ #include <math.h> #include <GL/glew.h> #include <GL/glut.h> -#include "showbuffer.h" #define DEG_TO_RAD (3.14159 / 180.0) diff --git a/progs/fp/position-frc-integer.txt b/progs/fp/position-frc-integer.txt new file mode 100644 index 0000000000..3a634c9b3b --- /dev/null +++ b/progs/fp/position-frc-integer.txt @@ -0,0 +1,7 @@ +!!ARBfp1.0 +# expected: black triangle +# brown means the wrong pixel center convention is being used +OPTION ARB_fragment_coord_pixel_center_integer; +MOV result.color, {0}.x; +FRC result.color.xy, fragment.position; +END diff --git a/progs/fp/position-frc.txt b/progs/fp/position-frc.txt new file mode 100644 index 0000000000..35ae3efa10 --- /dev/null +++ b/progs/fp/position-frc.txt @@ -0,0 +1,6 @@ +!!ARBfp1.0 +# expected: brown triangle +# black means the wrong pixel center convention is being used +MOV result.color, {0}.x; +FRC result.color.xy, fragment.position; +END diff --git a/progs/fp/position-upper-left.txt b/progs/fp/position-upper-left.txt new file mode 100644 index 0000000000..ac632dbfb7 --- /dev/null +++ b/progs/fp/position-upper-left.txt @@ -0,0 +1,7 @@ +!!ARBfp1.0 +# expected: the yellow vertex is the bottom one +# if it is the top one, the wrong origin convention is being used +OPTION ARB_fragment_coord_origin_upper_left; +MOV result.color, {0}.x; +MUL result.color.xy, fragment.position, {.005}.x; +END diff --git a/progs/fp/position.txt b/progs/fp/position.txt index 1875897d78..f59d0259c7 100644 --- a/progs/fp/position.txt +++ b/progs/fp/position.txt @@ -1,4 +1,6 @@ !!ARBfp1.0 +# expected: the yellow vertex is the top one +# if it is the bottom one, the wrong origin convention is being used MOV result.color, {0}.x; MUL result.color.xy, fragment.position, {.005}.x; END diff --git a/progs/tests/bufferobj.c b/progs/tests/bufferobj.c index d4ca270016..dc479af045 100644 --- a/progs/tests/bufferobj.c +++ b/progs/tests/bufferobj.c @@ -29,6 +29,7 @@ struct object GLuint VertexStride; GLuint ColorStride; GLuint NumElements; + GLuint MaxElement; }; static struct object Objects[NUM_OBJECTS]; @@ -58,7 +59,8 @@ static void DrawObject( const struct object *obj ) if (obj->NumElements > 0) { /* indexed arrays */ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, obj->ElementsBufferID); - glDrawElements(GL_LINE_LOOP, obj->NumElements, GL_UNSIGNED_INT, NULL); + glDrawRangeElements(GL_LINE_LOOP, 0, obj->MaxElement, + obj->NumElements, GL_UNSIGNED_INT, NULL); } else { /* non-indexed arrays */ @@ -300,6 +302,7 @@ static void MakeObject1(struct object *obj) obj->VertexStride = 0; obj->ColorStride = 0; obj->NumElements = 0; + obj->MaxElement = 0; glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); @@ -345,6 +348,7 @@ static void MakeObject2(struct object *obj) obj->ColorStride = 6 * sizeof(GLfloat); obj->NumElements = 0; + obj->MaxElement = 0; glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); @@ -401,6 +405,7 @@ static void MakeObject3(struct object *obj) i[3] = 3; glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); obj->NumElements = 4; + obj->MaxElement = 3; if (Have_ARB_vertex_array_object) { CreateVertexArrayObject(obj); @@ -445,6 +450,7 @@ static void MakeObject4(struct object *obj) /* Setup a buffer of indices to test the ELEMENTS path */ obj->ElementsBufferID = 0; obj->NumElements = 0; + obj->MaxElement = 0; if (Have_ARB_vertex_array_object) { CreateVertexArrayObject(obj); diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index 5e08d60389..207215dee9 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -160,6 +160,7 @@ SOURCES = \ vbo-drawelements.c \ vbo-drawrange.c \ vp-array.c \ + vp-array-hf.c \ vp-array-int.c \ vp-clip.c \ vp-line-clip.c \ diff --git a/progs/trivial/tri-fbo-tex-mip.c b/progs/trivial/tri-fbo-tex-mip.c index df4725c7b4..2e8fb74a00 100644 --- a/progs/trivial/tri-fbo-tex-mip.c +++ b/progs/trivial/tri-fbo-tex-mip.c @@ -6,7 +6,6 @@ #include <assert.h> #include <stdio.h> #include <stdlib.h> -#include <math.h> /* For debug */ diff --git a/progs/trivial/vp-array-hf.c b/progs/trivial/vp-array-hf.c new file mode 100644 index 0000000000..f812436437 --- /dev/null +++ b/progs/trivial/vp-array-hf.c @@ -0,0 +1,215 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glew.h> +#include <GL/glut.h> + +typedef union { GLfloat f; GLint i; } fi_type; +/** + * Convert a 4-byte float to a 2-byte half float. + * Based on code from: + * http://www.opengl.org/discussion_boards/ubb/Forum3/HTML/008786.html + */ +static GLhalf +_mesa_float_to_half(GLfloat val) +{ + + const fi_type fi = {val}; + const int flt_m = fi.i & 0x7fffff; + const int flt_e = (fi.i >> 23) & 0xff; + const int flt_s = (fi.i >> 31) & 0x1; + int s, e, m = 0; + GLhalf result; + + /* sign bit */ + s = flt_s; + + /* handle special cases */ + if ((flt_e == 0) && (flt_m == 0)) { + /* zero */ + /* m = 0; - already set */ + e = 0; + } + else if ((flt_e == 0) && (flt_m != 0)) { + /* denorm -- denorm float maps to 0 half */ + /* m = 0; - already set */ + e = 0; + } + else if ((flt_e == 0xff) && (flt_m == 0)) { + /* infinity */ + /* m = 0; - already set */ + e = 31; + } + else if ((flt_e == 0xff) && (flt_m != 0)) { + /* NaN */ + m = 1; + e = 31; + } + else { + /* regular number */ + const int new_exp = flt_e - 127; + if (new_exp < -24) { + /* this maps to 0 */ + /* m = 0; - already set */ + e = 0; + } + else if (new_exp < -14) { + /* this maps to a denorm */ + unsigned int exp_val = (unsigned int) (-14 - new_exp); /* 2^-exp_val*/ + e = 0; + switch (exp_val) { + case 0: + /* m = 0; - already set */ + break; + case 1: m = 512 + (flt_m >> 14); break; + case 2: m = 256 + (flt_m >> 15); break; + case 3: m = 128 + (flt_m >> 16); break; + case 4: m = 64 + (flt_m >> 17); break; + case 5: m = 32 + (flt_m >> 18); break; + case 6: m = 16 + (flt_m >> 19); break; + case 7: m = 8 + (flt_m >> 20); break; + case 8: m = 4 + (flt_m >> 21); break; + case 9: m = 2 + (flt_m >> 22); break; + case 10: m = 1; break; + } + } + else if (new_exp > 15) { + /* map this value to infinity */ + /* m = 0; - already set */ + e = 31; + } + else { + /* regular */ + e = new_exp + 15; + m = flt_m >> 13; + } + } + + result = (s << 15) | (e << 10) | m; + return result; +} + + +GLfloat verts[][4] = { + { 0.9, -0.9, 0.0, 1.0 }, + { 0.9, 0.9, 0.0, 1.0 }, + { -0.9, 0.9, 0.0, 1.0 }, + { -0.9, -0.9, 0.0, 1.0 }, +}; + +GLhalf hverts[16]; + +GLubyte color[][4] = { + { 0x00, 0x00, 0xff, 0x00 }, + { 0x00, 0xff, 0x00, 0x00 }, + { 0xff, 0x00, 0x00, 0x00 }, + { 0xff, 0xff, 0xff, 0x00 }, +}; + +GLuint indices[] = { 0, 1, 2, 3 }; + +static void Init( void ) +{ + GLint errno; + GLuint prognum; + GLuint i, j; + + static const char *prog1 = + "!!ARBvp1.0\n" + "MOV result.color, vertex.color;\n" + "MOV result.position, vertex.position;\n" + "END\n"; + + if (!glutExtensionSupported("GL_ARB_half_float_vertex")) { + printf("GL_ARB_half_float_vertex not found!\n"); + exit(0); + } + + glGenProgramsARB(1, &prognum); + glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); + glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, + strlen(prog1), (const GLubyte *) prog1); + + assert(glIsProgramARB(prognum)); + errno = glGetError(); + printf("glGetError = %d\n", errno); + if (errno != GL_NO_ERROR) + { + GLint errorpos; + + glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); + printf("errorpos: %d\n", errorpos); + printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); + } + + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + hverts[i * 4 + j] = _mesa_float_to_half(verts[i][j]); + + glEnableClientState( GL_VERTEX_ARRAY ); + glEnableClientState( GL_COLOR_ARRAY ); + glVertexPointer( 4, GL_HALF_FLOAT, 8, hverts ); + glColorPointer( 4, GL_UNSIGNED_BYTE, 0, color ); + +} + + + +static void Display( void ) +{ + glClearColor(0.3, 0.3, 0.3, 1); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glEnable(GL_VERTEX_PROGRAM_NV); + glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices ); + + glFlush(); +} + + +static void Reshape( int width, int height ) +{ + glViewport( 0, 0, width, height ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + /*glTranslatef( 0.0, 0.0, -15.0 );*/ +} + + +static void Key( unsigned char key, int x, int y ) +{ + (void) x; + (void) y; + switch (key) { + case 27: + exit(0); + break; + } + glutPostRedisplay(); +} + + + + +int main( int argc, char *argv[] ) +{ + glutInit( &argc, argv ); + glutInitWindowPosition( 0, 0 ); + glutInitWindowSize( 250, 250 ); + glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH ); + glutCreateWindow(argv[0]); + glewInit(); + glutReshapeFunc( Reshape ); + glutKeyboardFunc( Key ); + glutDisplayFunc( Display ); + Init(); + glutMainLoop(); + return 0; +} diff --git a/progs/xdemos/glxgears.c b/progs/xdemos/glxgears.c index 088f25a357..92c75caa5e 100644 --- a/progs/xdemos/glxgears.c +++ b/progs/xdemos/glxgears.c @@ -35,6 +35,7 @@ #include <X11/keysym.h> #include <GL/gl.h> #include <GL/glx.h> +#include <GL/glxext.h> #ifndef GLX_MESA_swap_control #define GLX_MESA_swap_control 1 @@ -586,11 +587,17 @@ is_glx_extension_supported(Display *dpy, const char *query) * Attempt to determine whether or not the display is synched to vblank. */ static void -query_vsync(Display *dpy) +query_vsync(Display *dpy, GLXDrawable drawable) { int interval = 0; - +#if defined(GLX_EXT_swap_control) + if (is_glx_extension_supported(dpy, "GLX_EXT_swap_control")) { + unsigned int tmp = -1; + glXQueryDrawable(dpy, drawable, GLX_SWAP_INTERVAL_EXT, &tmp); + interval = tmp; + } else +#endif if (is_glx_extension_supported(dpy, "GLX_MESA_swap_control")) { PFNGLXGETSWAPINTERVALMESAPROC pglXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) @@ -749,7 +756,7 @@ main(int argc, char *argv[]) make_window(dpy, "glxgears", x, y, winWidth, winHeight, &win, &ctx); XMapWindow(dpy, win); glXMakeCurrent(dpy, win, ctx); - query_vsync(dpy); + query_vsync(dpy, win); if (printInfo) { printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); @@ -771,6 +778,7 @@ main(int argc, char *argv[]) glDeleteLists(gear1, 1); glDeleteLists(gear2, 1); glDeleteLists(gear3, 1); + glXMakeCurrent(dpy, None, NULL); glXDestroyContext(dpy, ctx); XDestroyWindow(dpy, win); XCloseDisplay(dpy); diff --git a/progs/xdemos/offset.c b/progs/xdemos/offset.c index 314a4fcdd1..3858a5b802 100644 --- a/progs/xdemos/offset.c +++ b/progs/xdemos/offset.c @@ -94,6 +94,9 @@ static int attributeList[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, static int dimension = 3; +static float Scale = 1.0; + + int main(int argc, char** argv) { Display *dpy; XVisualInfo *vi; @@ -182,6 +185,7 @@ draw_scene(int mx, int my) { #else glEnable(GL_POLYGON_OFFSET_FILL); #endif + glScalef(Scale, Scale, Scale); cubes(mx, my, HIDDEN_LINE); #ifdef GL_EXT_polygon_offset glDisable(GL_POLYGON_OFFSET_EXT); @@ -289,6 +293,12 @@ process_input(Display *dpy, Window win) { case KeyPress: (void) XLookupString(&event.xkey, buf, sizeof(buf), &keysym, NULL); switch (keysym) { + case 'Z': + Scale *= 1.1; + break; + case 'z': + Scale *= 0.9; + break; case XK_Escape: exit(EXIT_SUCCESS); default: |