Subversion Repositories Kolibri OS

Rev

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