Subversion Repositories Kolibri OS

Rev

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include "render.h"
  6. #include <drm/i915_drm.h>
  7. #include <kos32sys.h>
  8.  
  9. #define WIN_STATE_MINIMIZED  0x02
  10. #define WIN_STATE_ROLLED     0x04
  11.  
  12. static int drm_ioctl(int fd, unsigned long request, void *arg)
  13. {
  14.     ioctl_t  io;
  15.  
  16.     io.handle   = fd;
  17.     io.io_code  = request;
  18.     io.input    = arg;
  19.     io.inp_size = 64;
  20.     io.output   = NULL;
  21.     io.out_size = 0;
  22.  
  23.     return call_service(&io);
  24. }
  25.  
  26. void render_swap_and_blit(struct render *render)
  27. {
  28.     char proc_info[1024];
  29.     struct drm_i915_mask_update update;
  30.  
  31.     EGLContext context;
  32.     EGLSurface draw, read;
  33.     uint32_t winx, winy, winw, winh;
  34.     uint8_t  state;
  35.     float xscale, yscale;
  36.     float *vertices  = render->vertices;
  37.     float *texcoords = render->tc_src;
  38.     int r, b;
  39.  
  40.     if(render == NULL)
  41.         return;
  42.  
  43.     get_proc_info(proc_info);
  44.  
  45.     winx = *(uint32_t*)(proc_info+34);
  46.     winy = *(uint32_t*)(proc_info+38);
  47.     winw = *(uint32_t*)(proc_info+42)+1;
  48.     winh = *(uint32_t*)(proc_info+46)+1;
  49.     state  = *(uint8_t*)(proc_info+70);
  50.  
  51.     if(state & (WIN_STATE_MINIMIZED|WIN_STATE_ROLLED))
  52.         return;
  53.  
  54.     context = eglGetCurrentContext();
  55.     draw = eglGetCurrentSurface(EGL_DRAW);
  56.     read = eglGetCurrentSurface(EGL_READ);
  57.  
  58.     eglSwapBuffers(render->dpy,draw);
  59.  
  60.     render->back_buffer++;
  61.     render->back_buffer&=1;
  62.  
  63.     update.handle = render->mask_handle;
  64.     update.dx     = render->dx;
  65.     update.dy     = render->dy;
  66.     update.width  = render->width;
  67.     update.height = render->height;
  68.     update.bo_pitch = (render->width+15) & ~15;
  69.     update.bo_map = (int)render->mask_buffer;
  70.  
  71.     if(drm_ioctl(render->fd, SRV_MASK_UPDATE_EX, &update))
  72.         return;
  73.  
  74.     if (!eglMakeCurrent(render->dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, render->context))
  75.     {
  76.         printf("failed to make window current");
  77.         goto err1;
  78.     };
  79.  
  80.     glActiveTexture(GL_TEXTURE0);
  81.     glBindTexture(GL_TEXTURE_2D, render->tx_buffers[render->back_buffer]);
  82.  
  83.     glActiveTexture(GL_TEXTURE1);
  84.     glBindTexture(GL_TEXTURE_2D, render->tx_mask);
  85.  
  86.     xscale = 1.0/render->scr_width;
  87.     yscale = 1.0/render->scr_height;
  88.  
  89.     r = winx + render->dx + render->width;
  90.     b = winy + render->dy + render->height;
  91.  
  92.     float t0, t1, t2, t5;
  93.  
  94.     vertices[0]     = t0 = 2*(winx+render->dx)*xscale - 1.0;
  95.     vertices[1 * 2] = t2 = 2*r*xscale - 1.0;
  96.  
  97.     vertices[2 * 2] = t2;
  98.     vertices[3 * 2] = t0;
  99.  
  100.     vertices[1]     = t1 = 2*(winy+render->dy)*yscale - 1.0;
  101.     vertices[2*2+1] = t5 = 2*b*yscale - 1.0;
  102.     vertices[1*2+1] = t1;
  103.     vertices[3*2+1] = t5;
  104.  
  105.     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  106.     glFinish();
  107.  
  108. err1:
  109.     eglMakeCurrent(render->dpy, draw, read, context);
  110. }
  111.  
  112.