Subversion Repositories Kolibri OS

Rev

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

Rev 2342 Rev 2344
Line 6... Line 6...
6
#include "bitmap.h"
6
#include "bitmap.h"
7
 
7
 
Line 8... Line 8...
8
void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap)
8
void __attribute__((regparm(1))) destroy_bitmap(bitmap_t *bitmap)
9
{
9
{
10
/*
-
 
11
 *
-
 
12
 *
-
 
-
 
10
    printf("destroy bitmap %d\n", bitmap->handle);
-
 
11
    free_handle(&bm_man, bitmap->handle);
13
 *
12
    bitmap->handle = 0;
14
*/
-
 
-
 
13
    i915_gem_object_unpin(bitmap->obj);
-
 
14
    drm_gem_object_unreference(&bitmap->obj->base);
15
    __DestroyObject(bitmap);
15
    __DestroyObject(bitmap);
16
};
16
};
Line 17... Line 17...
17
 
17
 
Line 28... Line 28...
28
    return ret;
28
    return ret;
29
};
29
};
Line 30... Line 30...
30
 
30
 
31
 
31
 
32
int create_bitmap(struct ubitmap *pbitmap)
32
int create_surface(struct io_call_10 *pbitmap)
Line 33... Line 33...
33
{
33
{
34
    struct drm_i915_gem_object *obj;
34
    struct drm_i915_gem_object *obj;
35
 
35
 
36
    bitmap_t   *bitmap;
36
    bitmap_t   *bitmap;
37
    u32         handle;
37
    u32         handle;
38
    u32         width;
38
    u32         width, max_width;
39
    u32         height;
39
    u32         height, max_height;
Line 40... Line 40...
40
    u32         size;
40
    u32         size,  max_size;
Line 41... Line 41...
41
    u32         pitch;
41
    u32         pitch, max_pitch;
42
    void       *uaddr;
42
    void       *uaddr;
Line 43... Line 43...
43
 
43
 
44
    int   ret;
44
    int   ret;
Line -... Line 45...
-
 
45
 
45
 
46
    pbitmap->handle = 0;
46
    pbitmap->handle = 0;
47
    pbitmap->data   = (void*)-1;
Line -... Line 48...
-
 
48
 
-
 
49
    width  = pbitmap->width;
-
 
50
    height = pbitmap->height;
-
 
51
 
-
 
52
/*
-
 
53
    if((width==0)||(height==0)||(width>4096)||(height>4096))
-
 
54
        goto err1;
-
 
55
 
-
 
56
    if( ((pbitmap->max_width !=0 ) &&
-
 
57
         (pbitmap->max_width < width)) ||
-
 
58
         (pbitmap->max_width > 4096) )
-
 
59
        goto err1;
-
 
60
 
-
 
61
    if( ((pbitmap->max_height !=0 ) &&
-
 
62
         (pbitmap->max_height < width)) ||
-
 
63
         (pbitmap->max_height > 4096) )
-
 
64
        goto err1;
47
    pbitmap->data   = NULL;
65
 
48
 
66
    if( pbitmap->format != 0)
Line 49... Line 67...
49
    width = pbitmap->width;
67
        goto err1;
50
    height = pbitmap->height;
68
*/
Line 71... Line 89...
71
 
89
 
Line 72... Line 90...
72
    pitch = ALIGN(width*4,64);
90
    pitch = ALIGN(width*4,64);
Line 73... Line 91...
73
 
91
 
-
 
92
    size =  roundup(pitch*height, PAGE_SIZE);
74
    size =  roundup(pitch*height, PAGE_SIZE);
93
 
Line 75... Line 94...
75
//    printf("pitch %d size %d\n", pitch, size);
94
//    printf("pitch %d size %d\n", pitch, size);
76
 
95
 
77
    obj = i915_gem_alloc_object(main_device, size);
96
    obj = i915_gem_alloc_object(main_device, size);
Line 78... Line 97...
78
    if (obj == NULL)
97
    if (obj == NULL)
79
        goto err2;
98
        goto err2;
80
 
99
 
Line -... Line 100...
-
 
100
    ret = i915_gem_object_pin(obj, 4096, true);
-
 
101
    if (ret)
-
 
102
        goto err3;
81
    ret = i915_gem_object_pin(obj, 4096, true);
103
 
82
    if (ret)
104
    max_pitch = ALIGN(max_width*4,64);
83
        goto err3;
105
    max_size =  roundup(max_pitch*max_height, PAGE_SIZE);
84
 
106
 
85
    uaddr = UserAlloc(size);
107
    uaddr = UserAlloc(max_size);
86
    if( uaddr == NULL)
108
    if( uaddr == NULL)
87
        goto err4;
109
        goto err4;
Line 88... Line 110...
88
    else
110
    else
Line 89... Line 111...
89
    {
111
    {
90
        u32_t *src, *dst;
112
        u32_t *src, *dst;
91
        int count;
113
        u32 count, max_count;
-
 
114
 
Line 92... Line 115...
92
 
115
#define page_tabs  0xFDC00000      /* really dirty hack */
93
#define page_tabs  0xFDC00000      /* really dirty hack */
116
 
94
 
117
        src =  (u32_t*)obj->pages;
95
        src =  (u32_t*)obj->pages;
118
        dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
-
 
119
        count = size/4096;
-
 
120
        max_count = max_size/4096 - count;
96
        dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
121
 
Line 97... Line 122...
97
        count = size/4096;
122
        while(count--)
98
 
123
        {
99
        while(count--)
-
 
100
        {
124
            *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
101
            *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
125
        };
-
 
126
//        while(max_count--)
102
        };
127
//            *dst++ = 0;                              // cleanup unused space
-
 
128
    }
-
 
129
 
-
 
130
    bitmap->handle = handle;
-
 
131
    bitmap->uaddr  = uaddr;
103
    }
132
    bitmap->pitch  = pitch;
104
 
133
    bitmap->gaddr  = obj->gtt_offset;
Line 105... Line -...
105
    bitmap->handle = handle;
-
 
106
    bitmap->width  = width;
134
 
107
    bitmap->height = height;
135
    bitmap->width  = width;
-
 
136
    bitmap->height = height;
Line -... Line 137...
-
 
137
    bitmap->max_width  = max_width;
108
    bitmap->pitch  = pitch;
138
    bitmap->max_height = max_height;
109
    bitmap->gaddr  = obj->gtt_offset;
139
 
Line 110... Line 140...
110
    bitmap->uaddr  = uaddr;
140
    bitmap->obj    = obj;
Line 111... Line 141...
111
    bitmap->obj    = obj;
141
    bitmap->header.destroy = destroy_bitmap;
112
    bitmap->header.destroy = destroy_bitmap;
142
 
113
 
143
    pbitmap->handle = handle;
114
    pbitmap->pitch  = pitch;
144
    pbitmap->data   = uaddr;
115
    pbitmap->handle = handle;
145
    pbitmap->pitch  = pitch;
116
    pbitmap->data   = uaddr;
146
 
117
 
147
 
118
//    printf("%s handle %d pitch %d gpu %x user %x\n",
148
    printf("%s handle: %d pitch: %d gpu_addr: %x user_addr: %x\n",
119
//            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
149
            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
Line 120... Line 150...
120
 
150
 
Line -... Line 151...
-
 
151
    return 0;
-
 
152
 
121
    return 0;
153
err4:
122
 
154
    i915_gem_object_unpin(obj);
123
err4:
155
err3:
Line 124... Line 156...
124
//    drm_gem_object_unpin;
156
    drm_gem_object_unreference(&obj->base);