Subversion Repositories Kolibri OS

Rev

Rev 4503 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (C) 2010 LunarG Inc.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice shall be included
  12.  * in all copies or substantial portions of the Software.
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20.  * DEALINGS IN THE SOFTWARE.
  21.  *
  22.  * Authors:
  23.  *    Chia-I Wu <olv@lunarg.com>
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <sys/time.h>
  30.  
  31. #define EGL_EGLEXT_PROTOTYPES
  32. #include "EGL/egl.h"
  33. #include "EGL/eglext.h"
  34. #include "gbm.h"
  35. #include <kos32sys.h>
  36.  
  37. #include "eglutint.h"
  38.  
  39. #define MAX_MODES 100
  40.  
  41. //static EGLScreenMESA kms_screen;
  42. //static EGLModeMESA kms_mode;
  43. //static EGLint kms_width, kms_height;
  44.  
  45. void
  46. _eglutNativeInitDisplay(void)
  47. {
  48.    struct gbm_device *gbm;
  49.    int fd;
  50.  
  51.    fd = get_service("DISPLAY");
  52.    gbm = gbm_create_device(fd);
  53.    if( gbm == NULL){
  54.       _eglutFatal("failed to initialize GBM device");
  55.       exit(1);
  56.    };
  57.  
  58. //   init_pixlib(HW_BIT_BLIT);
  59.  
  60.    _eglut->native_dpy = gbm;
  61.    _eglut->surface_type = EGL_WINDOW_BIT;
  62. }
  63.  
  64. void
  65. _eglutNativeFiniDisplay(void)
  66. {
  67. //    done_pixlib();
  68. }
  69.  
  70. #if 0
  71. static void
  72. init_kms(void)
  73. {
  74.    EGLModeMESA modes[MAX_MODES];
  75.    EGLint num_screens, num_modes;
  76.    EGLint width, height, best_mode;
  77.    EGLint i;
  78.  
  79.    if (!eglGetScreensMESA(_eglut->dpy, &kms_screen, 1, &num_screens) ||
  80.          !num_screens)
  81.       _eglutFatal("eglGetScreensMESA failed\n");
  82.  
  83.    if (!eglGetModesMESA(_eglut->dpy, kms_screen,
  84.             modes, MAX_MODES, &num_modes) || !num_modes)
  85.       _eglutFatal("eglGetModesMESA failed!\n");
  86.  
  87.    printf("Found %d modes:\n", num_modes);
  88.  
  89.    best_mode = 0;
  90.    width = 0;
  91.    height = 0;
  92.    for (i = 0; i < num_modes; i++) {
  93.       EGLint w, h;
  94.       eglGetModeAttribMESA(_eglut->dpy, modes[i], EGL_WIDTH, &w);
  95.       eglGetModeAttribMESA(_eglut->dpy, modes[i], EGL_HEIGHT, &h);
  96.       printf("%3d: %d x %d\n", i, w, h);
  97.       if (w > width && h > height) {
  98.          width = w;
  99.          height = h;
  100.          best_mode = i;
  101.       }
  102.    }
  103.  
  104.    printf("Will use screen size: %d x %d\n", width, height);
  105.  
  106.    kms_mode = modes[best_mode];
  107.    kms_width = width;
  108.    kms_height = height;
  109. }
  110. #endif
  111.  
  112. void
  113. _eglutNativeInitWindow(struct eglut_window *win, const char *title,
  114.                        int x, int y, int w, int h)
  115. {
  116.     struct gbm_device   *gbm = _eglut->native_dpy;
  117.     struct gbm_surface  *gs;
  118.  
  119.     gs = gbm_surface_create(gbm, w, h, GBM_BO_FORMAT_ARGB8888, GBM_BO_USE_RENDERING);
  120.  
  121.     win->native.u.surface = gs;
  122.  
  123.     win->native.width = w;
  124.     win->native.height = h;
  125.  
  126.     BeginDraw();
  127.     DrawWindow(x, y, w+TYPE_3_BORDER_WIDTH*2,
  128.                h+TYPE_3_BORDER_WIDTH+get_skin_height(), title, 0x000000, 0x74);
  129.  
  130.     EndDraw();
  131.  
  132. //    sna_create_mask();
  133. }
  134.  
  135. void
  136. _eglutNativeFiniWindow(struct eglut_window *win)
  137. {
  138. //   eglShowScreenSurfaceMESA(_eglut->dpy,
  139. //         kms_screen, EGL_NO_SURFACE, 0);
  140. //   eglDestroySurface(_eglut->dpy, win->native.u.surface);
  141. }
  142.  
  143. void
  144. _eglutNativeEventLoop(void)
  145. {
  146.     struct eglut_window *win = _eglut->current;
  147.     int start = _eglutNow();
  148.     int frames = 0;
  149.     int run = 1;
  150.     _eglut->redisplay = 1;
  151.  
  152.     while (run)
  153.     {
  154.         int now = _eglutNow();
  155.         oskey_t   key;
  156.         int ev;
  157.  
  158.         ev = check_os_event();
  159.         switch(ev)
  160.         {
  161.             case 1:
  162.                 BeginDraw();
  163.                 DrawWindow(0,0,0,0,NULL,0,0x74);
  164.                 EndDraw();
  165.                 break;
  166.  
  167.             case 2:
  168.                 key = get_key();
  169.                 if (key.code == 27)
  170.                 {
  171.                     run = 0;
  172.                     continue;
  173.                 }
  174.                 if(win->keyboard_cb)
  175.                     win->keyboard_cb(key.code);
  176.                 break;
  177.  
  178.             case 3:
  179.                 if(get_os_button()==1)
  180.                 {
  181.                     run = 0;
  182.                     continue;
  183.                 }
  184.                 break;
  185.         };
  186.  
  187.         if (now - start >= 5000)
  188.         {
  189.             double elapsed = (double) (now - start) / 1000.0;
  190.  
  191.             printf("%d frames in %3.1f seconds = %6.3f FPS\n",
  192.                     frames, elapsed, frames / elapsed);
  193.             fflush(stdout);
  194.  
  195.             start = now;
  196.             frames = 0;
  197.         }
  198.  
  199.         if (_eglut->idle_cb)
  200.             _eglut->idle_cb();
  201.  
  202.         if (_eglut->redisplay)
  203.         {
  204.             _eglut->redisplay = 0;
  205.  
  206.             if (win->display_cb)
  207.                 win->display_cb();
  208.  
  209.             render_swap_and_blit(_eglut->render);
  210.             frames++;
  211.         }
  212.    }
  213.  //  glFinish();
  214.    eglutDestroyWindow(_eglut->current->index);
  215.    eglutFini();
  216. }
  217.