[Mesa-dev] [PATCH] xdemos/corender: Remove.
Brian Paul
brianp at vmware.com
Fri May 29 06:42:11 PDT 2015
Reviewed-by: Brian Paul <brianp at vmware.com>
On 05/29/2015 05:10 AM, Jose Fonseca wrote:
> 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 */
>
More information about the mesa-dev
mailing list