Subversion Repositories Kolibri OS

Rev

Rev 2340 | Rev 2344 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2340 Rev 2342
Line 4... Line 4...
4
#include "i915_drv.h"
4
#include "i915_drv.h"
5
#include "intel_drv.h"
5
#include "intel_drv.h"
6
#include "bitmap.h"
6
#include "bitmap.h"
7
 
7
 
Line -... Line 8...
-
 
8
void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap)
-
 
9
{
-
 
10
/*
-
 
11
 *
-
 
12
 *
-
 
13
 *
-
 
14
*/
-
 
15
    __DestroyObject(bitmap);
-
 
16
};
-
 
17
 
8
extern struct drm_device *main_device;
18
extern struct drm_device *main_device;
Line 9... Line 19...
9
 
19
 
Line 10... Line 20...
10
struct hman bm_man;
20
struct hman bm_man;
Line 18... Line 28...
18
    return ret;
28
    return ret;
19
};
29
};
Line 20... Line 30...
20
 
30
 
21
 
31
 
22
int create_bitmap(struct ubitmap *pbitmap, int width, int height)
32
int create_bitmap(struct ubitmap *pbitmap)
Line 23... Line 33...
23
{
33
{
24
    struct drm_i915_gem_object *obj;
34
    struct drm_i915_gem_object *obj;
-
 
35
 
-
 
36
    bitmap_t   *bitmap;
25
 
37
    u32         handle;
26
    bitmap_t   *bitmap;
38
    u32         width;
27
    u32         handle;
39
    u32         height;
Line 28... Line 40...
28
    u32         size;
40
    u32         size;
Line 29... Line 41...
29
    u32         pitch;
41
    u32         pitch;
30
    void       *uaddr;
42
    void       *uaddr;
Line -... Line 43...
-
 
43
 
-
 
44
    int   ret;
-
 
45
 
31
 
46
    pbitmap->handle = 0;
32
    int   ret;
47
    pbitmap->data   = NULL;
Line 33... Line 48...
33
 
48
 
-
 
49
    width = pbitmap->width;
Line 34... Line 50...
34
    pbitmap->handle = 0;
50
    height = pbitmap->height;
35
    pbitmap->data   = NULL;
51
 
Line 36... Line 52...
36
 
52
    if((width==0)||(height==0)||(width>4096)||(height>4096))
-
 
53
        goto err1;
-
 
54
 
-
 
55
    handle = alloc_handle(&bm_man);
-
 
56
//    printf("%s %d\n",__FUNCTION__, handle);
-
 
57
 
37
    if((width==0)||(height==0)||(width>4096)||(height>4096))
58
    if(handle == 0)
38
        goto err1;
59
        goto err1;
Line 39... Line 60...
39
 
60
 
Line 40... Line 61...
40
    handle = alloc_handle(&bm_man);
61
    bitmap = CreateObject(GetPid(), sizeof(*bitmap));
Line 41... Line 62...
41
 
62
    bitmap->handle = handle;
-
 
63
    bitmap->header.destroy = destroy_bitmap;
Line 42... Line 64...
42
    if(handle == 0)
64
    bitmap->obj    = NULL;
43
        goto err1;
65
 
44
 
66
//    printf("bitmap %x\n", bitmap);
Line 86... Line 108...
86
    bitmap->pitch  = pitch;
108
    bitmap->pitch  = pitch;
87
    bitmap->gaddr  = obj->gtt_offset;
109
    bitmap->gaddr  = obj->gtt_offset;
88
    bitmap->uaddr  = uaddr;
110
    bitmap->uaddr  = uaddr;
89
    bitmap->obj    = obj;
111
    bitmap->obj    = obj;
90
 
112
    bitmap->header.destroy = destroy_bitmap;
-
 
113
 
Line -... Line 114...
-
 
114
    pbitmap->pitch  = pitch;
91
    pbitmap->handle = handle;
115
    pbitmap->handle = handle;
92
    pbitmap->data   = uaddr;
116
    pbitmap->data   = uaddr;
93
    return 0;
-
 
94
 
-
 
95
err4:
-
 
96
//    drm_gem_object_unpin;
-
 
97
err3:
-
 
98
//    drm_gem_object_unreference(&obj->base);
-
 
99
err2:
-
 
100
    free_handle(&bm_man, handle);
-
 
101
    DestroyObject(bitmap);
-
 
102
err1:
-
 
103
    return -1;
-
 
Line 104... Line -...
104
 
-
 
105
};
-
 
106
 
-
 
107
 
-
 
108
int create_video(int width, int height, u32_t *outp)
-
 
109
{
-
 
110
    struct drm_i915_gem_object *obj;
-
 
111
 
-
 
112
    size_t      size;
-
 
113
    size_t      pitch;
-
 
114
    void       *uaddr;
-
 
115
 
-
 
116
    int   ret;
-
 
117
 
-
 
118
    if((width==0)||(height==0)||(width>4096)||(height>4096))
-
 
119
        goto err1;
-
 
120
 
-
 
121
    pitch = ALIGN(width*4,64);
-
 
122
 
117
 
123
    size =  roundup(pitch*height, PAGE_SIZE);
-
 
124
 
-
 
125
    obj = i915_gem_alloc_object(main_device, size);
-
 
126
    if (obj == NULL)
-
 
127
        goto err2;
-
 
128
 
-
 
129
    ret = i915_gem_object_pin(obj, 4096, true);
-
 
130
    if (ret)
-
 
131
        goto err3;
-
 
132
 
-
 
133
    uaddr = UserAlloc(size);
-
 
134
    if( uaddr == NULL)
-
 
135
        goto err4;
-
 
136
    else
-
 
137
    {
-
 
138
        u32_t *src, *dst;
-
 
139
        int count;
-
 
140
 
-
 
141
#define page_tabs  0xFDC00000      /* really dirty hack */
-
 
142
 
-
 
143
        src =  (u32_t*)obj->pages;
-
 
144
        dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
-
 
145
        count = size/4096;
-
 
146
 
-
 
147
        while(count--)
-
 
148
        {
118
//    printf("%s handle %d pitch %d gpu %x user %x\n",
149
            *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
-
 
150
        };
-
 
151
    }
-
 
152
 
-
 
153
    outp[0] = obj->gtt_offset;
-
 
154
    outp[2] = (u32)uaddr;
-
 
Line 155... Line 119...
155
    outp[3] = pitch;
119
//            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
Line 156... Line 120...
156
 
120
 
157
    return 0;
121
    return 0;
158
 
122
 
159
err4:
123
err4:
160
//    drm_gem_object_unpin;
124
//    drm_gem_object_unpin;
-
 
125
err3:
-
 
126
//    drm_gem_object_unreference(&obj->base);
161
err3:
127
err2:
162
//    drm_gem_object_unreference(&obj->base);
128
    free_handle(&bm_man, handle);
-
 
129
    __DestroyObject(bitmap);
163
err2:
130
err1:
Line 164... Line 131...
164
err1:
131
    return -1;
165
    return -1;
132