Home | History | Annotate | Download | only in renderer
      1 /*
      2 * Copyright (C) 2011 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 #include "RenderServer.h"
     17 #include <stdio.h>
     18 #include <string.h>
     19 #include <stdlib.h>
     20 #include "FrameBuffer.h"
     21 
     22 #include <sys/types.h>
     23 #include <unistd.h>
     24 #include <codec_defs.h>
     25 #ifdef _WIN32
     26 #include <winsock2.h>
     27 #endif
     28 
     29 #ifdef __linux__
     30 #include <X11/Xlib.h>
     31 #endif
     32 
     33 static void printUsage(const char *progName)
     34 {
     35     fprintf(stderr, "Usage: %s -windowid <windowid> [options]\n", progName);
     36     fprintf(stderr, "    -windowid <windowid>   - window id to render into\n");
     37     fprintf(stderr, "    -x <num>               - render subwindow x position\n");
     38     fprintf(stderr, "    -y <num>               - render subwindow y position\n");
     39     fprintf(stderr, "    -width <num>           - render subwindow width\n");
     40     fprintf(stderr, "    -height <num>          - render subwindow height\n");
     41     exit(-1);
     42 }
     43 
     44 int main(int argc, char *argv[])
     45 {
     46     int winX = 0;
     47     int winY = 0;
     48     int winWidth = 320;
     49     int winHeight = 480;
     50     FBNativeWindowType windowId = NULL;
     51     int iWindowId  = 0;
     52 
     53     //
     54     // Parse command line arguments
     55     //
     56     for (int i=1; i<argc; i++) {
     57         if (!strcmp(argv[i], "-windowid")) {
     58             if (++i >= argc || sscanf(argv[i],"%d", &iWindowId) != 1) {
     59                 printUsage(argv[0]);
     60             }
     61         }
     62         else if (!strncmp(argv[i], "-x", 2)) {
     63             if (++i >= argc || sscanf(argv[i],"%d", &winX) != 1) {
     64                 printUsage(argv[0]);
     65             }
     66         }
     67         else if (!strncmp(argv[i], "-y", 2)) {
     68             if (++i >= argc || sscanf(argv[i],"%d", &winY) != 1) {
     69                 printUsage(argv[0]);
     70             }
     71         }
     72         else if (!strncmp(argv[i], "-width", 6)) {
     73             if (++i >= argc || sscanf(argv[i],"%d", &winWidth) != 1) {
     74                 printUsage(argv[0]);
     75             }
     76         }
     77         else if (!strncmp(argv[i], "-height", 7)) {
     78             if (++i >= argc || sscanf(argv[i],"%d", &winHeight) != 1) {
     79                 printUsage(argv[0]);
     80             }
     81         }
     82     }
     83 
     84     windowId = (FBNativeWindowType)iWindowId;
     85     if (!windowId) {
     86         // window id must be provided
     87         printUsage(argv[0]);
     88     }
     89 
     90 #if 0 //Enable to attach gdb to renderer on startup
     91     fprintf(stderr, "renderer pid %d , press any key to continue...\n", getpid());
     92     getchar();
     93 #else
     94     fprintf(stderr, "renderer pid %d \n", getpid());
     95 #endif
     96 
     97 #ifdef _WIN32
     98     WSADATA  wsaData;
     99     int      rc = WSAStartup( MAKEWORD(2,2), &wsaData);
    100     if (rc != 0) {
    101             printf( "could not initialize Winsock\n" );
    102     }
    103 #endif
    104 
    105 #ifdef __linux__
    106     // some OpenGL implementations may call X functions
    107     // it is safer to synchronize all X calls made by all the
    108     // rendering threads. (although the calls we do are locked
    109     // in the FrameBuffer singleton object).
    110     XInitThreads();
    111 #endif
    112 
    113     //
    114     // initialize Framebuffer
    115     //
    116     bool inited = FrameBuffer::initialize(winWidth, winHeight);
    117     if (!inited) {
    118         fprintf(stderr,"Failed to initialize Framebuffer\n");
    119         return -1;
    120     }
    121 
    122     inited = FrameBuffer::setupSubWindow(windowId,
    123                                          winX, winY, winWidth, winHeight, 0.0);
    124     if (!inited) {
    125         fprintf(stderr,"Failed to create subwindow Framebuffer\n");
    126         return -1;
    127     }
    128 
    129     //
    130     // Create and run a render server listening to the given port number
    131     //
    132     char addr[256];
    133     RenderServer *server = RenderServer::create(addr, sizeof(addr));
    134     if (!server) {
    135         fprintf(stderr,"Cannot initialize render server\n");
    136         return -1;
    137     }
    138     printf("render server listening at '%s'\n", addr);
    139 
    140 #ifndef _WIN32
    141     //
    142     // run the server listener loop
    143     //
    144     server->Main();
    145 #else
    146     //
    147     // on windows we need to handle messages for the
    148     // created subwindow. So we run the server on a seperate
    149     // thread and running the windows message pump loop
    150     // in this main thread.
    151     //
    152     server->start();
    153 
    154     //
    155     // Dispatch events for the subwindow
    156     // During termination of the render server, the FrameBuffer
    157     // will be finalized, the Framebuffer subwindow will
    158     // get destroyed and the following loop will exit.
    159     //
    160     MSG msg;
    161     HWND hWnd = FrameBuffer::getFB()->getSubWindow();
    162     while( GetMessage(&msg, hWnd, 0, 0) > 0 ) {
    163         TranslateMessage(&msg);
    164         DispatchMessage(&msg);
    165     }
    166 #endif
    167 
    168     return 0;
    169 }
    170