Subversion Repositories Kolibri OS

Rev

Rev 4525 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4502 Serge 1
#include 
2
#include 
3
#include 
4
 
5
#include "render.h"
4523 Serge 6
#include 
4502 Serge 7
#include 
8
 
4526 Serge 9
#define WIN_STATE_MINIMIZED  0x02
10
#define WIN_STATE_ROLLED     0x04
11
 
4523 Serge 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
 
4502 Serge 26
void render_swap_and_blit(struct render *render)
27
{
28
    char proc_info[1024];
4523 Serge 29
    struct drm_i915_mask_update update;
4502 Serge 30
 
31
    EGLContext context;
32
    EGLSurface draw, read;
4526 Serge 33
    uint32_t winx, winy, winw, winh;
34
    uint8_t  state;
4523 Serge 35
    float xscale, yscale;
4502 Serge 36
    float *vertices  = render->vertices;
4523 Serge 37
    float *texcoords = render->tc_src;
4502 Serge 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);
4523 Serge 47
    winw = *(uint32_t*)(proc_info+42)+1;
48
    winh = *(uint32_t*)(proc_info+46)+1;
4526 Serge 49
    state  = *(uint8_t*)(proc_info+70);
4502 Serge 50
 
4526 Serge 51
    if(state & (WIN_STATE_MINIMIZED|WIN_STATE_ROLLED))
52
        return;
53
 
4502 Serge 54
    context = eglGetCurrentContext();
55
    draw = eglGetCurrentSurface(EGL_DRAW);
56
    read = eglGetCurrentSurface(EGL_READ);
57
 
58
    eglSwapBuffers(render->dpy,draw);
59
 
4525 Serge 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, 45, &update))
72
        return;
73
 
4502 Serge 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
 
4523 Serge 83
    xscale = 1.0/render->scr_width;
84
    yscale = 1.0/render->scr_height;
85
 
4502 Serge 86
    r = winx + render->dx + render->width;
87
    b = winy + render->dy + render->height;
88
 
89
    float t0, t1, t2, t5;
90
 
4523 Serge 91
    vertices[0]     = t0 = 2*(winx+render->dx)*xscale - 1.0;
92
    vertices[1 * 2] = t2 = 2*r*xscale - 1.0;
4502 Serge 93
 
94
    vertices[2 * 2] = t2;
95
    vertices[3 * 2] = t0;
96
 
4523 Serge 97
    vertices[1]     = t1 = 2*(winy+render->dy)*yscale - 1.0;
98
    vertices[2*2+1] = t5 = 2*b*yscale - 1.0;
4502 Serge 99
    vertices[1*2+1] = t1;
100
    vertices[3*2+1] = t5;
101
 
102
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
4526 Serge 103
//    glFlush();
4502 Serge 104
 
105
err1:
106
    eglMakeCurrent(render->dpy, draw, read, context);
107
}
108