[Mesa-dev] [PATCH] xdemos/corender: Remove.

Jose Fonseca jfonseca at vmware.com
Fri May 29 04:10:45 PDT 2015


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
---
 src/xdemos/.gitignore     |   1 -
 src/xdemos/CMakeLists.txt |   3 +-
 src/xdemos/Makefile.am    |   6 -
 src/xdemos/corender.c     | 400 ----------------------------------------------
 src/xdemos/ipc.c          | 264 ------------------------------
 src/xdemos/ipc.h          |  16 --
 6 files changed, 1 insertion(+), 689 deletions(-)
 delete mode 100644 src/xdemos/corender.c
 delete mode 100644 src/xdemos/ipc.c
 delete mode 100644 src/xdemos/ipc.h

diff --git a/src/xdemos/.gitignore b/src/xdemos/.gitignore
index 41f2519..7ad9449 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 97329fe..d49a6e6 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 cfd23b1..625b278 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 e706f4b..0000000
--- 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 54c9236..0000000
--- 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 3f43445..0000000
--- 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 */
-- 
2.1.0



More information about the mesa-dev mailing list