123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- /*
- * Test sharing of texture objects by two rendering contexts.
- * In particular, test that changing a texture object in one context
- * effects the texture in the second context.
- *
- * Brian Paul
- * 30 Apr 2008
- *
- * Copyright (C) 2008 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
- #include <GL/gl.h>
- #include <GL/glx.h>
- #include <assert.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <X11/keysym.h>
-
-
- #define MAX_CONTEXTS 2
-
- #define TEX_SIZE 32
-
- static const char *DisplayName = NULL;
- static Display *Dpy;
- static XVisualInfo *VisInfo;
- static Window Win;
- static GLXContext Contexts[MAX_CONTEXTS];
- static int WinWidth = 300, WinHeight = 300;
-
- static int DrawContext = 0, TexContext = 1;
-
- static GLuint TexObj = 0;
- static GLboolean NewTexture = GL_FALSE;
-
-
- static void
- Error(const char *msg)
- {
- fprintf(stderr, "sharedtex error: %s\n", msg);
- exit(1);
- }
-
-
- static void
- CreateWindow(const char *name)
- {
- int attrib[] = { GLX_RGBA,
- GLX_RED_SIZE, 1,
- GLX_GREEN_SIZE, 1,
- GLX_BLUE_SIZE, 1,
- GLX_DOUBLEBUFFER,
- None };
- int scrnum;
- XSetWindowAttributes attr;
- unsigned long mask;
- Window root;
- int xpos = 0, ypos = 0;
- static int n = 0;
-
- scrnum = DefaultScreen(Dpy);
- root = RootWindow(Dpy, scrnum);
-
- VisInfo = glXChooseVisual(Dpy, scrnum, attrib);
- if (!VisInfo) {
- Error("Unable to find RGB, double-buffered visual");
- }
-
- /* window attributes */
- xpos = (n % 10) * 100;
- ypos = (n / 10) * 100;
- n++;
-
- attr.background_pixel = 0;
- attr.border_pixel = 0;
- attr.colormap = XCreateColormap(Dpy, root, VisInfo->visual, AllocNone);
- attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
- mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
-
- Win = XCreateWindow(Dpy, root, xpos, ypos, WinWidth, WinHeight,
- 0, VisInfo->depth, InputOutput,
- VisInfo->visual, mask, &attr);
- if (!Win) {
- Error("Couldn't create window");
- }
-
- {
- XSizeHints sizehints;
- sizehints.x = xpos;
- sizehints.y = ypos;
- sizehints.width = WinWidth;
- sizehints.height = WinHeight;
- sizehints.flags = USSize | USPosition;
- XSetNormalHints(Dpy, Win, &sizehints);
- XSetStandardProperties(Dpy, Win, name, name,
- None, (char **)NULL, 0, &sizehints);
- }
-
- XMapWindow(Dpy, Win);
- }
-
-
- /**
- * Change texture image, using TexContext
- */
- static void
- ModifyTexture(void)
- {
- GLuint tex[TEX_SIZE][TEX_SIZE];
- GLuint c0, c1;
- int i, j;
-
- if (Win && !glXMakeCurrent(Dpy, Win, Contexts[TexContext])) {
- Error("glXMakeCurrent failed");
- }
-
- /* choose two random colors */
- c0 = rand() & 0xffffffff;
- c1 = rand() & 0xffffffff;
-
- for (i = 0; i < TEX_SIZE; i++) {
- for (j = 0; j < TEX_SIZE; j++) {
- if (((i / 4) ^ (j / 4)) & 1) {
- tex[i][j] = c0;
- }
- else {
- tex[i][j] = c1;
- }
- }
- }
-
- glBindTexture(GL_TEXTURE_2D, TexObj);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, tex);
-
- NewTexture = GL_TRUE;
- }
-
-
- static void
- InitContext(void)
- {
- glGenTextures(1, &TexObj);
- assert(TexObj);
- glBindTexture(GL_TEXTURE_2D, TexObj);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glEnable(GL_TEXTURE_2D);
-
- printf("GL_RENDERER = %s\n", (char*) glGetString(GL_RENDERER));
- }
-
-
- static void
- Setup(void)
- {
- int i;
-
- Dpy = XOpenDisplay(DisplayName);
- if (!Dpy) {
- Error("Unable to open display");
- }
-
- CreateWindow("sharedtex");
-
- for (i = 0; i < MAX_CONTEXTS; i++) {
- GLXContext share = i > 0 ? Contexts[0] : 0;
-
- Contexts[i] = glXCreateContext(Dpy, VisInfo, share, True);
- if (!Contexts[i]) {
- Error("Unable to create GLX context");
- }
-
- if (!glXMakeCurrent(Dpy, Win, Contexts[i])) {
- Error("glXMakeCurrent failed");
- }
-
- InitContext();
- }
-
- ModifyTexture();
- }
-
-
- /**
- * Redraw window, using DrawContext
- */
- static void
- Redraw(void)
- {
- static float rot = 0.0;
- float ar;
-
- rot += 1.0;
-
- if (Win && !glXMakeCurrent(Dpy, Win, Contexts[DrawContext])) {
- Error("glXMakeCurrent failed");
- }
-
- glViewport(0, 0, WinWidth, WinHeight);
- ar = (float) WinWidth / (float) WinHeight;
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
-
- glShadeModel(GL_FLAT);
- glClearColor(0.5, 0.5, 0.5, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- glPushMatrix();
- glRotatef(rot, 0, 0, 1);
- glScalef(0.7, 0.7, 0.7);
-
- if (NewTexture) {
- /* rebind to get new contents */
- glBindTexture(GL_TEXTURE_2D, TexObj);
- NewTexture = GL_FALSE;
- }
-
- /* draw textured quad */
- glBegin(GL_POLYGON);
- glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
- glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
- glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
- glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
- glEnd();
-
- glPopMatrix();
-
- if (Win)
- glXSwapBuffers(Dpy, Win);
- }
-
-
- static void
- EventLoop(void)
- {
- while (1) {
- while (XPending(Dpy) > 0) {
- XEvent event;
- XNextEvent(Dpy, &event);
-
- switch (event.type) {
- case Expose:
- Redraw();
- break;
- case ConfigureNotify:
- WinWidth = event.xconfigure.width;
- WinHeight = event.xconfigure.height;
- break;
- case KeyPress:
- {
- char buf[100];
- KeySym keySym;
- XComposeStatus stat;
- XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat);
- switch (keySym) {
- case XK_Escape:
- exit(0);
- break;
- case XK_t:
- case XK_T:
- ModifyTexture();
- break;
- default:
- ;
- }
- }
- Redraw();
- break;
- default:
- /*no-op*/ ;
- }
- }
-
- Redraw();
- usleep(10000);
- }
- }
-
-
-
-
- int
- main(int argc, char *argv[])
- {
- int i;
-
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-display") == 0 && i < argc) {
- DisplayName = argv[i+1];
- i++;
- }
- }
-
- Setup();
-
- printf("Press 't' to change texture image/colors\n");
-
- EventLoop();
-
- return 0;
- }
|