From ee8be1faf58d8c73421a8e6e699bc32a68e2ed96 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 3 Aug 2011 01:43:11 +1000 Subject: [PATCH] tri-2101010: add a simple demo for GL_ARB_vertex_type_2_10_10_10_rev --- src/trivial/CMakeLists.txt | 1 + src/trivial/Makefile.am | 1 + src/trivial/tri-2101010.c | 162 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 src/trivial/tri-2101010.c diff --git a/src/trivial/CMakeLists.txt b/src/trivial/CMakeLists.txt index 1bff1c55..26598a06 100644 --- a/src/trivial/CMakeLists.txt +++ b/src/trivial/CMakeLists.txt @@ -104,6 +104,7 @@ set (targets readpixels sub-tex tex-quads + tri-2101010 tri-alpha tri-alpha-tex tri-array-interleaved diff --git a/src/trivial/Makefile.am b/src/trivial/Makefile.am index bc3da72a..844eb585 100644 --- a/src/trivial/Makefile.am +++ b/src/trivial/Makefile.am @@ -112,6 +112,7 @@ bin_PROGRAMS = \ quad-unfilled-clip \ quad-unfilled-stipple \ readpixels \ + tri-2101010 \ tri-alpha \ tri-alpha-tex \ tri-array-interleaved \ diff --git a/src/trivial/tri-2101010.c b/src/trivial/tri-2101010.c new file mode 100644 index 00000000..bbdab193 --- /dev/null +++ b/src/trivial/tri-2101010.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2011 David Airlie + * + * Based on tri.c which is: + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + + +#define CI_OFFSET_1 16 +#define CI_OFFSET_2 32 + + +GLenum doubleBuffer = 1; +int win; + +static void Init(void) +{ + fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); + fflush(stderr); + + if (!glutExtensionSupported("GL_ARB_vertex_type_2_10_10_10_rev")){ + fprintf(stderr,"requires ARB_vertex_type_2_10_10_10_rev\n"); + exit(1); + } + + glClearColor(0.3, 0.1, 0.3, 0.0); +} + +static void Reshape(int width, int height) +{ + + glViewport(0, 0, (GLint)width, (GLint)height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-100.0, 100.0, -100.0, 100.0, -50.0, 1000.0); + glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + switch (key) { + case 27: + glutDestroyWindow(win); + exit(0); + default: + glutPostRedisplay(); + return; + } +} + +#define i32to10(x) ((x) > 0 ? (x & 0x1ff) : 1024-(abs((x))& 0x1ff)) +#define i32to2(x) ((x) > 0 ? (x & 0x1) : 3-abs((x))) + +static uint32_t iconv(int x, int y, int z, int w) +{ + uint32_t val; + + val = i32to10(x); + val |= i32to10(y) << 10; + val |= i32to10(z) << 20; + val |= i32to2(w) << 30; + return val; +} +#define conv(x,y,z,w) (((x) & 0x3ff) | ((y) & 0x3ff) << 10 | ((z) & 0x3ff)<< 20 | ((w) & 0x3) << 30) + +static void Draw(void) +{ + glClear(GL_COLOR_BUFFER_BIT); + + glBegin(GL_TRIANGLES); + glColorP3ui(GL_UNSIGNED_INT_2_10_10_10_REV, conv(820, 0, 0, 0)); + glVertexP3ui(GL_INT_2_10_10_10_REV, iconv(-90, -90, -30, 0)); + glColorP3ui(GL_UNSIGNED_INT_2_10_10_10_REV, conv(0, 921, 0, 0)); + glVertexP3ui(GL_INT_2_10_10_10_REV, iconv(90, -90, -30, 0)); + glColorP3ui(GL_UNSIGNED_INT_2_10_10_10_REV, conv(0, 0, 716, 0)); + glVertexP3ui(GL_INT_2_10_10_10_REV, iconv(0, 90, -30, 0)); + glEnd(); + + glFlush(); + + if (doubleBuffer) { + glutSwapBuffers(); + } +} + +static GLenum Args(int argc, char **argv) +{ + GLint i; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-sb") == 0) { + doubleBuffer = GL_FALSE; + } else if (strcmp(argv[i], "-db") == 0) { + doubleBuffer = GL_TRUE; + } else { + fprintf(stderr, "%s (Bad option).\n", argv[i]); + return GL_FALSE; + } + } + return GL_TRUE; +} + +int main(int argc, char **argv) +{ + GLenum type; + + + glutInit(&argc, argv); + + if (Args(argc, argv) == GL_FALSE) { + exit(1); + } + + glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + + type = GLUT_RGB | GLUT_ALPHA; + type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; + glutInitDisplayMode(type); + + win = glutCreateWindow(*argv); + if (!win) { + exit(1); + } + + glewInit(); + Init(); + + glutReshapeFunc(Reshape); + glutKeyboardFunc(Key); + glutDisplayFunc(Draw); + glutMainLoop(); + return 0; +} -- 2.11.4.GIT