diff options
author | Jose Fonseca <jfonseca@vmware.com> | 2015-05-29 12:07:09 +0100 |
---|---|---|
committer | Jose Fonseca <jfonseca@vmware.com> | 2015-05-29 16:25:50 +0100 |
commit | bf5ae602db3ff5d38b73c969c4b0aee2bf25bd73 (patch) | |
tree | 52364261e3f7736a75b8c5a651d15195dbc330f7 | |
parent | fca824431608101298ff0735db4c09954dcf64ab (diff) | |
download | mesa-demos-bf5ae602db3ff5d38b73c969c4b0aee2bf25bd73.tar.gz |
xdemos/corender: Remove.
Rendering from multiple processes into the same X window is not
something that works in practice anymore.
Nowadays interprocess rendering is better done with GLX/EGL extensions
for that effect.
https://bugs.freedesktop.org/show_bug.cgi?id=30279
Reviewed-by: Brian Paul <brianp@vmware.com>
-rw-r--r-- | src/xdemos/.gitignore | 1 | ||||
-rw-r--r-- | src/xdemos/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/xdemos/Makefile.am | 6 | ||||
-rw-r--r-- | src/xdemos/corender.c | 400 | ||||
-rw-r--r-- | src/xdemos/ipc.c | 264 | ||||
-rw-r--r-- | src/xdemos/ipc.h | 16 |
6 files changed, 1 insertions, 689 deletions
diff --git a/src/xdemos/.gitignore b/src/xdemos/.gitignore index 41f25195..7ad94493 100644 --- a/src/xdemos/.gitignore +++ b/src/xdemos/.gitignore @@ -1,4 +1,3 @@ -corender glsync glthreads glxcontexts diff --git a/src/xdemos/CMakeLists.txt b/src/xdemos/CMakeLists.txt index 97329fef..d49a6e61 100644 --- a/src/xdemos/CMakeLists.txt +++ b/src/xdemos/CMakeLists.txt @@ -70,8 +70,7 @@ target_link_libraries (${subdir}_pbdemo pbutil) target_link_libraries (${subdir}_pbinfo pbutil) target_link_libraries (${subdir}_sharedtex_mt pthread) -add_executable (corender corender.c ipc.c) add_executable (xrotfontdemo xrotfontdemo.c xuserotfont.c) add_executable (glxinfo glxinfo.c glinfo_common.c) -install (TARGETS glxinfo corender xrotfontdemo DESTINATION demos) +install (TARGETS glxinfo xrotfontdemo DESTINATION demos) diff --git a/src/xdemos/Makefile.am b/src/xdemos/Makefile.am index cfd23b13..625b2782 100644 --- a/src/xdemos/Makefile.am +++ b/src/xdemos/Makefile.am @@ -34,7 +34,6 @@ if HAVE_X11 noinst_LTLIBRARIES = libpbutil.la bin_PROGRAMS = \ - corender \ glsync \ glthreads \ glxdemo \ @@ -67,11 +66,6 @@ libpbutil_la_SOURCES = \ pbutil.c \ pbutil.h -corender_SOURCES = \ - corender.c \ - ipc.c \ - ipc.h - xrotfontdemo_SOURCES = \ xrotfontdemo.c \ xuserotfont.c \ diff --git a/src/xdemos/corender.c b/src/xdemos/corender.c deleted file mode 100644 index e706f4b3..00000000 --- a/src/xdemos/corender.c +++ /dev/null @@ -1,400 +0,0 @@ -/** - * Example of cooperative rendering into one window by two processes. - * The first instance of the program creates the GLX window. - * The second instance of the program gets the window ID from the first - * and draws into it. - * Socket IPC is used for synchronization. - * - * Usage: - * 1. run 'corender &' - * 2. run 'corender 2' (any arg will do) - * - * Brian Paul - * 11 Oct 2007 - */ - - -#include <GL/gl.h> -#include <GL/glx.h> -#include <assert.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <X11/keysym.h> -#include <unistd.h> -#include "ipc.h" - - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -static int MyID = 0; /* 0 or 1 */ -static int WindowID = 0; -static GLXContext Context = 0; -static int Width = 700, Height = 350; -static int Rot = 0; -static int Sock = 0; - -static GLfloat Red[4] = {1.0, 0.2, 0.2, 1.0}; -static GLfloat Blue[4] = {0.2, 0.2, 1.0, 1.0}; - -static int Sync = 1; /** synchronized rendering? */ - - -static void -setup_ipc(void) -{ - int k, port = 10001; - - if (MyID == 0) { - /* I'm the first one, wait for connection from second */ - k = CreatePort(&port); - assert(k != -1); - - printf("Waiting for connection from another 'corender'\n"); - Sock = AcceptConnection(k); - assert(Sock != -1); - - printf("Got connection, sending windowID\n"); - - /* send windowID */ - SendData(Sock, &WindowID, sizeof(WindowID)); - } - else { - /* I'm the second one, connect to first */ - char hostname[1000]; - - MyHostName(hostname, 1000); - Sock = Connect(hostname, port); - assert(Sock != -1); - - /* get windowID */ - ReceiveData(Sock, &WindowID, sizeof(WindowID)); - printf("Contacted first 'corender', getting WindowID\n"); - } -} - - - -/** from GLUT */ -static void -doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings) -{ - int i, j; - GLfloat theta, phi, theta1; - GLfloat cosTheta, sinTheta; - GLfloat cosTheta1, sinTheta1; - GLfloat ringDelta, sideDelta; - - ringDelta = 2.0 * M_PI / rings; - sideDelta = 2.0 * M_PI / nsides; - - theta = 0.0; - cosTheta = 1.0; - sinTheta = 0.0; - for (i = rings - 1; i >= 0; i--) { - theta1 = theta + ringDelta; - cosTheta1 = cos(theta1); - sinTheta1 = sin(theta1); - glBegin(GL_QUAD_STRIP); - phi = 0.0; - for (j = nsides; j >= 0; j--) { - GLfloat cosPhi, sinPhi, dist; - - phi += sideDelta; - cosPhi = cos(phi); - sinPhi = sin(phi); - dist = R + r * cosPhi; - - glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); - glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi); - glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); - glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi); - } - glEnd(); - theta = theta1; - cosTheta = cosTheta1; - sinTheta = sinTheta1; - } -} - - -static void -redraw(Display *dpy) -{ - int dbg = 0; - - glXMakeCurrent(dpy, WindowID, Context); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); - glClearColor(0.5, 0.5, 0.5, 0.0); - - if (MyID == 0) { - /* First process */ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - glTranslatef(-1, 0, 0); - glRotatef(Rot, 1, 0, 0); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Red); - doughnut(0.5, 2.0, 20, 30); - glPopMatrix(); - - glFinish(); - if (!Sync) { - usleep(1000*10); - } - - /* signal second process to render */ - if (Sync) { - int code = 1; - if (dbg) printf("0: send signal\n"); - SendData(Sock, &code, sizeof(code)); - SendData(Sock, &Rot, sizeof(Rot)); - } - - /* wait for second process to finish rendering */ - if (Sync) { - int code = 0; - if (dbg) printf("0: wait signal\n"); - ReceiveData(Sock, &code, sizeof(code)); - if (dbg) printf("0: got signal\n"); - assert(code == 2); - } - - } - else { - /* Second process */ - - /* wait for first process's signal for me to render */ - if (Sync) { - int code = 0; - if (dbg) printf("1: wait signal\n"); - ReceiveData(Sock, &code, sizeof(code)); - ReceiveData(Sock, &Rot, sizeof(Rot)); - - if (dbg) printf("1: got signal\n"); - assert(code == 1); - } - - /* XXX this clear should not be here, but for some reason, it - * makes things _mostly_ work correctly w/ NVIDIA's driver. - * There's only occasional glitches. - * Without this glClear(), depth buffer for the second process - * is pretty much broken. - */ - /* glClear(GL_DEPTH_BUFFER_BIT); */ - - glPushMatrix(); - glTranslatef(1, 0, 0); - glRotatef(Rot + 90 , 1, 0, 0); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Blue); - doughnut(0.5, 2.0, 20, 30); - glPopMatrix(); - glFinish(); - - glXSwapBuffers(dpy, WindowID); - usleep(1000*10); - - /* signal first process that I'm done rendering */ - if (Sync) { - int code = 2; - if (dbg) printf("1: send signal\n"); - SendData(Sock, &code, sizeof(code)); - } - } -} - - -static void -resize(Display *dpy, int width, int height) -{ - float ar = (float) width / height; - - glXMakeCurrent(dpy, WindowID, Context); - - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-ar, ar, 1.0, -1.0, 5.0, 200.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, -15); - - Width = width; - Height = height; -} - - - -static void -set_window_title(Display *dpy, Window win, const char *title) -{ - XSizeHints sizehints; - sizehints.flags = 0; - XSetStandardProperties(dpy, win, title, title, - None, (char **)NULL, 0, &sizehints); -} - - -static Window -make_gl_window(Display *dpy, XVisualInfo *visinfo, int width, int height) -{ - int scrnum; - XSetWindowAttributes attr; - unsigned long mask; - Window root; - Window win; - int x = 0, y = 0; - char *name = NULL; - - scrnum = DefaultScreen( dpy ); - root = RootWindow( dpy, scrnum ); - - /* window attributes */ - 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, x, y, width, height, - 0, visinfo->depth, InputOutput, - visinfo->visual, mask, &attr ); - - /* set hints and properties */ - { - XSizeHints sizehints; - sizehints.x = x; - sizehints.y = y; - sizehints.width = width; - sizehints.height = height; - sizehints.flags = USSize | USPosition; - XSetNormalHints(dpy, win, &sizehints); - XSetStandardProperties(dpy, win, name, name, - None, (char **)NULL, 0, &sizehints); - } - - return win; -} - - -static void -set_event_mask(Display *dpy, Window win) -{ - XSetWindowAttributes attr; - attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; - XChangeWindowAttributes(dpy, win, CWEventMask, &attr); -} - - -static void -event_loop(Display *dpy) -{ - while (1) { - while (XPending(dpy) > 0) { - XEvent event; - XNextEvent(dpy, &event); - - switch (event.type) { - case Expose: - redraw(dpy); - break; - case ConfigureNotify: - resize(dpy, event.xconfigure.width, event.xconfigure.height); - break; - case KeyPress: - { - char buffer[10]; - int r, code; - code = XLookupKeysym(&event.xkey, 0); - if (code == XK_Left) { - } - else { - r = XLookupString(&event.xkey, buffer, sizeof(buffer), - NULL, NULL); - if (buffer[0] == 27) { - exit(0); - } - } - } - default: - /* nothing */ - ; - } - } - - if (MyID == 0 || !Sync) - Rot += 1; - redraw(dpy); - } -} - - -static XVisualInfo * -choose_visual(Display *dpy) -{ - int attribs[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, - None }; - int scrnum = DefaultScreen( dpy ); - return glXChooseVisual(dpy, scrnum, attribs); -} - - -static void -parse_opts(int argc, char *argv[]) -{ - if (argc > 1) { - MyID = 1; - } -} - - -int -main( int argc, char *argv[] ) -{ - Display *dpy; - XVisualInfo *visinfo; - - parse_opts(argc, argv); - - dpy = XOpenDisplay(NULL); - - visinfo = choose_visual(dpy); - - Context = glXCreateContext( dpy, visinfo, NULL, True ); - if (!Context) { - printf("Error: glXCreateContext failed\n"); - exit(1); - } - - if (MyID == 0) { - WindowID = make_gl_window(dpy, visinfo, Width, Height); - set_window_title(dpy, WindowID, "corender"); - XMapWindow(dpy, WindowID); - /*printf("WindowID 0x%x\n", (int) WindowID);*/ - } - - /* do ipc hand-shake here */ - setup_ipc(); - assert(Sock); - assert(WindowID); - - if (MyID == 1) { - set_event_mask(dpy, WindowID); - } - - resize(dpy, Width, Height); - - event_loop(dpy); - - return 0; -} diff --git a/src/xdemos/ipc.c b/src/xdemos/ipc.c deleted file mode 100644 index 54c9236f..00000000 --- a/src/xdemos/ipc.c +++ /dev/null @@ -1,264 +0,0 @@ -/* Copyright (c) 2003 VMware, Inc. - * - * 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 - * VMWARE 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. - */ - -/* - * Simple IPC API - * Brian Paul - */ - - -#include <assert.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <unistd.h> -#include <sys/socket.h> -#include "ipc.h" - -#if defined(IRIX) || defined(irix) -typedef int socklen_t; -#endif - -#define NO_DELAY 1 - -#define DEFAULT_MASTER_PORT 7011 - - -/* - * Return my hostname in <nameOut>. - * Return 1 for success, 0 for error. - */ -int -MyHostName(char *nameOut, int maxNameLength) -{ - int k = gethostname(nameOut, maxNameLength); - return k==0; -} - - -/* - * Create a socket attached to a port. Later, we can call AcceptConnection - * on the socket returned from this function. - * Return the new socket number or -1 if error. - */ -int -CreatePort(int *port) -{ - char hostname[1000]; - struct sockaddr_in servaddr; - struct hostent *hp; - int so_reuseaddr = 1; - int tcp_nodelay = 1; - int sock, k; - - /* create socket */ - sock = socket(AF_INET, SOCK_STREAM, 0); - assert(sock > 2); - - /* get my host name */ - k = gethostname(hostname, 1000); - assert(k == 0); - - /* get hostent info */ - hp = gethostbyname(hostname); - assert(hp); - - /* initialize the servaddr struct */ - memset(&servaddr, 0, sizeof(servaddr) ); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons((unsigned short) (*port)); - memcpy((char *) &servaddr.sin_addr, hp->h_addr, - sizeof(servaddr.sin_addr)); - - /* deallocate when we exit */ - k = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, - (char *) &so_reuseaddr, sizeof(so_reuseaddr)); - assert(k==0); - - /* send packets immediately */ -#if NO_DELAY - k = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, - (char *) &tcp_nodelay, sizeof(tcp_nodelay)); - assert(k==0); -#endif - - if (*port == 0) - *port = DEFAULT_MASTER_PORT; - - k = 1; - while (k && (*port < 65534)) { - /* bind our address to the socket */ - servaddr.sin_port = htons((unsigned short) (*port)); - k = bind(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); - if (k) - *port = *port + 1; - } - -#if 0 - printf("###### Real Port: %d\n", *port); -#endif - - /* listen for connections */ - k = listen(sock, 100); - assert(k == 0); - - return sock; -} - - -/* - * Accept a connection on the named socket. - * Return a new socket for the new connection, or -1 if error. - */ -int -AcceptConnection(int socket) -{ - struct sockaddr addr; - socklen_t addrLen; - int newSock; - - addrLen = sizeof(addr); - newSock = accept(socket, &addr, &addrLen); - if (newSock == 1) - return -1; - else - return newSock; -} - - -/* - * Contact the server running on the given host on the named port. - * Return socket number or -1 if error. - */ -int -Connect(const char *hostname, int port) -{ - struct sockaddr_in servaddr; - struct hostent *hp; - int sock, k; - int tcp_nodelay = 1; - - assert(port); - - sock = socket(AF_INET, SOCK_STREAM, 0); - assert(sock >= 0); - - hp = gethostbyname(hostname); - assert(hp); - - memset(&servaddr, 0, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons((unsigned short) port); - memcpy((char *) &servaddr.sin_addr, hp->h_addr, sizeof(servaddr.sin_addr)); - - k = connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)); - if (k != 0) { - perror("Connect:"); - return -1; - } - -#if NO_DELAY - /* send packets immediately */ - k = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, - (char *) &tcp_nodelay, sizeof(tcp_nodelay)); - assert(k==0); -#endif - - return sock; -} - - -void -CloseSocket(int socket) -{ - close(socket); -} - - -int -SendData(int socket, const void *data, int bytes) -{ - int sent = 0; - int b; - - while (sent < bytes) { - b = write(socket, (char *) data + sent, bytes - sent); - if (b <= 0) - return -1; /* something broke */ - sent += b; - } - return sent; -} - - -int -ReceiveData(int socket, void *data, int bytes) -{ - int received = 0, b; - - while (received < bytes) { - b = read(socket, (char *) data + received, bytes - received); - if (b <= 0) - return -1; - received += b; - } - return received; -} - - -int -SendString(int socket, const char *str) -{ - const int len = strlen(str); - int sent, b; - - /* first, send a 4-byte length indicator */ - b = write(socket, &len, sizeof(len)); - if (b <= 0) - return -1; - - sent = SendData(socket, str, len); - assert(sent == len); - return sent; -} - - -int -ReceiveString(int socket, char *str, int maxLen) -{ - int len, received, b; - - /* first, read 4 bytes to see how long of string to receive */ - b = read(socket, &len, sizeof(len)); - if (b <= 0) - return -1; - - assert(len <= maxLen); /* XXX fix someday */ - assert(len >= 0); - received = ReceiveData(socket, str, len); - assert(received != -1); - assert(received == len); - str[len] = 0; - return received; -} diff --git a/src/xdemos/ipc.h b/src/xdemos/ipc.h deleted file mode 100644 index 3f434457..00000000 --- a/src/xdemos/ipc.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef IPC_H -#define IPC_H - - -extern int MyHostName(char *nameOut, int maxNameLength); -extern int CreatePort(int *port); -extern int AcceptConnection(int socket); -extern int Connect(const char *hostname, int port); -extern void CloseSocket(int socket); -extern int SendData(int socket, const void *data, int bytes); -extern int ReceiveData(int socket, void *data, int bytes); -extern int SendString(int socket, const char *str); -extern int ReceiveString(int socket, char *str, int maxLen); - - -#endif /* IPC_H */ |