Subversion Repositories Kolibri OS

Rev

Rev 2360 | Rev 3033 | 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
//    printf("bitmap %x\n", bitmap);
2361 Serge 93
    if( bitmap == NULL)
94
        goto err1;
95
96
 
2342 Serge 97
    bitmap->header.destroy = destroy_bitmap;
98
    bitmap->obj    = NULL;
99
100
 
2340 Serge 101
 
102
103
 
104
105
 
106
2344 Serge 107
 
2342 Serge 108
2340 Serge 109
 
110
    if (obj == NULL)
111
        goto err2;
112
113
 
114
    if (ret)
115
        goto err3;
116
117
 
2344 Serge 118
    max_size =  roundup(max_pitch*max_height, PAGE_SIZE);
119
120
 
121
    if( uaddr == NULL)
2340 Serge 122
        goto err4;
123
    else
124
    {
125
        u32_t *src, *dst;
126
        u32 count, max_count;
2344 Serge 127
2340 Serge 128
 
129
130
 
131
        dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
132
        count = size/4096;
133
        max_count = max_size/4096 - count;
2344 Serge 134
2340 Serge 135
 
136
        {
137
            *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
138
        };
139
        while(max_count--)
2351 Serge 140
            *dst++ = 0;                              // cleanup unused space
141
    }
2340 Serge 142
143
 
2351 Serge 144
145
 
2340 Serge 146
    bitmap->uaddr  = uaddr;
2344 Serge 147
    bitmap->pitch  = pitch;
148
    bitmap->gaddr  = obj->gtt_offset;
149
150
 
2340 Serge 151
    bitmap->height = height;
152
    bitmap->max_width  = max_width;
2344 Serge 153
    bitmap->max_height = max_height;
154
155
 
2340 Serge 156
    bitmap->header.destroy = destroy_bitmap;
2342 Serge 157
2340 Serge 158
 
159
    pbitmap->data   = uaddr;
160
    pbitmap->pitch  = pitch;
2344 Serge 161
2342 Serge 162
 
163
 
2344 Serge 164
            __FUNCTION__, handle, pitch, obj->gtt_offset, uaddr);
165
166
 
2340 Serge 167
168
 
169
    i915_gem_object_unpin(obj);
2344 Serge 170
err3:
2340 Serge 171
    drm_gem_object_unreference(&obj->base);
2344 Serge 172
err2:
2340 Serge 173
    free_handle(&bm_man, handle);
174
    __DestroyObject(bitmap);
2342 Serge 175
err1:
2340 Serge 176
    return -1;
177
178
 
179
180
 
181
 
2352 Serge 182
{
183
    int ret;
184
2344 Serge 185
 
2352 Serge 186
2344 Serge 187
 
2352 Serge 188
189
 
190
        return -1;
191
192
 
193
194
 
195
        return -1;
196
197
 
198
    if(ret !=0 )
199
    {
200
        pbitmap->data  = NULL;
201
        pbitmap->pitch = 0;
202
203
 
204
        return ret;
205
    };
206
207
 
208
    pbitmap->pitch = bitmap->pitch;
209
210
 
211
};
212
213
 
2361 Serge 214
 
2340 Serge 215
{
216
    u32* data;
217
218
 
219
    if(data)
220
    {
221
        int i;
222
223
 
224
            data[i] = ++i;
225
        data[i] = 0;
226
227
 
228
        man->next  = 0;
229
        man->avail = count;
230
        man->count = count;
231
232
 
233
    };
234
    return -ENOMEM;
235
};
236
237
 
238
{
239
    u32 handle = 0;
240
241
 
242
    {
243
        handle = man->next;
244
        man->next = man->table[handle];
245
        man->avail--;
246
        handle++;
247
    }
248
    return handle;
249
};
250
251
 
252
{
253
    int ret = -1;
254
255
 
256
257
 
258
    {
259
        man->table[handle] = man->next;
260
        man->next = handle;
261
        man->avail++;
262
        ret = 0;
263
    };
264
265
 
266
};
267
268
 
269
 
2351 Serge 270
{
271
    u8 *kaddr;
272
273
 
274
    if( kaddr != NULL)
275
    {
276
        u32_t *src = (u32_t*)obj->pages;
277
        u32_t *dst = &((u32_t*)page_tabs)[(u32_t)kaddr >> 12];
278
279
 
280
281
 
282
        {
283
            *dst++ = (0xFFFFF000 & *src++) | 0x003 ;
284
        };
285
        return kaddr;
286
    };
287
    return NULL;
288
}
289
290
 
291
{
292
    struct drm_i915_gem_object *obj = (void*)handle;
293
    drm_gem_object_unreference(&obj->base);
294
295
 
296
297
 
298
 
299
{
300
    struct drm_i915_gem_object *obj = (void*)handle;
301
    u8    *dst;
302
    int    ret;
303
304
 
305
    if (ret)
306
        return;
307
308
 
309
    if( dst != NULL )
310
    {
311
        memmove(dst+offset, src, size);
312
        FreeKernelSpace(dst);
313
    };
314
};
315
316
 
317
{
318
    struct drm_i915_gem_object *obj = (void*)handle;
319
320
 
321
};
322
323
 
324
 
325
{
326
    int ret = 0;
327
    ENTER();
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