Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2340 Serge 1
 
2
#include 
3
#include "i915_drm.h"
4
#include "i915_drv.h"
5
#include "intel_drv.h"
6
#include "bitmap.h"
7
8
 
2352 Serge 9
10
 
11
12
 
2351 Serge 13
#define DRIVER_CAPS_1   0
14
15
 
16
17
 
18
19
 
2342 Serge 20
{
21
    printf("destroy bitmap %d\n", bitmap->handle);
2344 Serge 22
    free_handle(&bm_man, bitmap->handle);
23
    bitmap->handle = 0;
24
    bitmap->obj->base.read_domains = I915_GEM_DOMAIN_GTT;
2351 Serge 25
    bitmap->obj->base.write_domain = I915_GEM_DOMAIN_CPU;
26
27
 
28
    drm_gem_object_unreference(&bitmap->obj->base);
2344 Serge 29
    mutex_unlock(&main_device->struct_mutex);
2351 Serge 30
31
 
2342 Serge 32
};
33
34
 
2340 Serge 35
{
36
    int ret;
37
38
 
39
40
 
41
};
42
43
 
44
 
2344 Serge 45
{
2340 Serge 46
    struct drm_i915_gem_object *obj;
47
48
 
49
    u32         handle;
50
    u32         width, max_width;
2344 Serge 51
    u32         height, max_height;
52
    u32         size,  max_size;
53
    u32         pitch, max_pitch;
54
    void       *uaddr;
2340 Serge 55
56
 
57
58
 
59
    pbitmap->data   = (void*)-1;
2344 Serge 60
2340 Serge 61
 
2344 Serge 62
    height = pbitmap->height;
2342 Serge 63
64
 
2344 Serge 65
    if((width==0)||(height==0)||(width>4096)||(height>4096))
2340 Serge 66
        goto err1;
67
68
 
2344 Serge 69
         (pbitmap->max_width < width)) ||
70
         (pbitmap->max_width > 4096) )
71
        goto err1;
72
73
 
74
         (pbitmap->max_height < width)) ||
75
         (pbitmap->max_height > 4096) )
76
        goto err1;
77
78
 
79
        goto err1;
80
*/
81
82
 
83
    max_height = (pbitmap->max_height==0) ? height : pbitmap->max_height;
84
85
 
2340 Serge 86
//    printf("%s %d\n",__FUNCTION__, handle);
2342 Serge 87
2340 Serge 88
 
89
        goto err1;
90
91
 
92
    bitmap->handle = handle;
2342 Serge 93
    bitmap->header.destroy = destroy_bitmap;
94
    bitmap->obj    = NULL;
95
96
 
97
    if( bitmap == NULL)
2340 Serge 98
        goto err1;
99
100
 
101
102
 
103
104
 
105
2344 Serge 106
 
2342 Serge 107
2340 Serge 108
 
109
    if (obj == NULL)
110
        goto err2;
111
112
 
113
    if (ret)
114
        goto err3;
115
116
 
2344 Serge 117
    max_size =  roundup(max_pitch*max_height, PAGE_SIZE);
118
119
 
120
    if( uaddr == NULL)
2340 Serge 121
        goto err4;
122
    else
123
    {
124
        u32_t *src, *dst;
125
        u32 count, max_count;
2344 Serge 126
2340 Serge 127
 
128
129
 
130
        dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
131
        count = size/4096;
132
        max_count = max_size/4096 - count;
2344 Serge 133
2340 Serge 134
 
135
        {
136
            *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
137
        };
138
        while(max_count--)
2351 Serge 139
            *dst++ = 0;                              // cleanup unused space
140
    }
2340 Serge 141
142
 
2351 Serge 143
144
 
2340 Serge 145
    bitmap->uaddr  = uaddr;
2344 Serge 146
    bitmap->pitch  = pitch;
147
    bitmap->gaddr  = obj->gtt_offset;
148
149
 
2340 Serge 150
    bitmap->height = height;
151
    bitmap->max_width  = max_width;
2344 Serge 152
    bitmap->max_height = max_height;
153
154
 
2340 Serge 155
    bitmap->header.destroy = destroy_bitmap;
2342 Serge 156
2340 Serge 157
 
158
    pbitmap->data   = uaddr;
159
    pbitmap->pitch  = pitch;
2344 Serge 160
2342 Serge 161
 
162
 
2344 Serge 163
            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
164
165
 
2340 Serge 166
167
 
168
    i915_gem_object_unpin(obj);
2344 Serge 169
err3:
2340 Serge 170
    drm_gem_object_unreference(&obj->base);
2344 Serge 171
err2:
2340 Serge 172
    free_handle(&bm_man, handle);
173
    __DestroyObject(bitmap);
2342 Serge 174
err1:
2340 Serge 175
    return -1;
176
177
 
178
179
 
180
 
2352 Serge 181
{
182
    int ret;
183
2344 Serge 184
 
2352 Serge 185
2344 Serge 186
 
2352 Serge 187
188
 
189
        return -1;
190
191
 
192
193
 
194
        return -1;
195
196
 
197
    if(ret !=0 )
198
    {
199
        pbitmap->data  = NULL;
200
        pbitmap->pitch = 0;
201
202
 
203
        return ret;
204
    };
205
206
 
207
    pbitmap->pitch = bitmap->pitch;
208
209
 
210
};
211
212
 
2340 Serge 213
{
214
    u32* data;
215
216
 
217
    if(data)
218
    {
219
        int i;
220
221
 
222
            data[i] = ++i;
223
        data[i] = 0;
224
225
 
226
        man->next  = 0;
227
        man->avail = count;
228
        man->count = count;
229
230
 
231
    };
232
    return -ENOMEM;
233
};
234
235
 
236
{
237
    u32 handle = 0;
238
239
 
240
    {
241
        handle = man->next;
242
        man->next = man->table[handle];
243
        man->avail--;
244
        handle++;
245
    }
246
    return handle;
247
};
248
249
 
250
{
251
    int ret = -1;
252
253
 
254
255
 
256
    {
257
        man->table[handle] = man->next;
258
        man->next = handle;
259
        man->avail++;
260
        ret = 0;
261
    };
262
263
 
264
};
265
266
 
267
 
2351 Serge 268
{
269
    u8 *kaddr;
270
271
 
272
    if( kaddr != NULL)
273
    {
274
        u32_t *src = (u32_t*)obj->pages;
275
        u32_t *dst = &((u32_t*)page_tabs)[(u32_t)kaddr >> 12];
276
277
 
278
279
 
280
        {
281
            *dst++ = (0xFFFFF000 & *src++) | 0x003 ;
282
        };
283
        return kaddr;
284
    };
285
    return NULL;
286
}
287
288
 
289
{
290
    struct drm_i915_gem_object *obj = (void*)handle;
291
    drm_gem_object_unreference(&obj->base);
292
293
 
294
295
 
296
 
297
{
298
    struct drm_i915_gem_object *obj = (void*)handle;
299
    u8    *dst;
300
    int    ret;
301
302
 
303
    if (ret)
304
        return;
305
306
 
307
    if( dst != NULL )
308
    {
309
        memmove(dst+offset, src, size);
310
        FreeKernelSpace(dst);
311
    };
312
};
313
314
 
315
{
316
    struct drm_i915_gem_object *obj = (void*)handle;
317
318
 
319
};
320
321
 
322
 
323
{
324
    int ret = 0;
325
    ENTER();
326
327
 
328
329
 
330
    {
331
        case 0:
332
            caps->opt[0] = DRIVER_CAPS_0;
333
            caps->opt[1] = DRIVER_CAPS_1;
334
            break;
335
336
 
337
            caps->cap1.max_tex_width  = 4096;
338
            caps->cap1.max_tex_height = 4096;
339
            break;
340
        default:
341
            ret = 1;
342
    };
343
    caps->idx = 1;
344
    return ret;
345
}
346