Subversion Repositories Kolibri OS

Rev

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

Rev 3037 Rev 3039
Line 34... Line 34...
34
    {
34
    {
35
        for (i = 0; i < bitmap->page_count; i++)
35
        for (i = 0; i < bitmap->page_count; i++)
36
            FreePage(pages[i]);
36
            FreePage(pages[i]);
37
 
37
 
Line 38... Line 38...
38
        DRM_DEBUG("%s freec %d pages\n", __FUNCTION__, bitmap->page_count);
38
        DRM_DEBUG("%s release %d pages\n", __FUNCTION__, bitmap->page_count);
Line 39... Line 39...
39
 
39
 
40
        free(pages);
40
        free(pages);
41
    };
41
    };
42
    UserFree(bitmap->uaddr);
42
    UserFree(bitmap->uaddr);
Line 50... Line 50...
50
 
50
 
Line 51... Line 51...
51
    /* Get the list of pages out of our struct file.  They'll be pinned
51
    /* Get the list of pages out of our struct file.  They'll be pinned
52
     * at this point until we release them.
52
     * at this point until we release them.
53
     */
53
     */
-
 
54
 
54
    page_count = obj->base.size / PAGE_SIZE;
55
    page_count = obj->base.size / PAGE_SIZE;
55
    BUG_ON(obj->allocated_pages == NULL);
56
    BUG_ON(obj->allocated_pages == NULL);
56
    BUG_ON(obj->pages.page != NULL);
57
    BUG_ON(obj->pages.page != NULL);
Line 57... Line 58...
57
 
58
 
Line 303... Line 304...
303
    return 0;
304
    return 0;
304
};
305
};
Line -... Line 306...
-
 
306
 
-
 
307
 
-
 
308
int resize_surface(struct io_call_14 *pbitmap)
-
 
309
{
-
 
310
    bitmap_t  *bitmap;
-
 
311
    dma_addr_t page, *pages;
-
 
312
    u32        size, page_count;
-
 
313
    u32        width, height;
-
 
314
    u32        pitch;
-
 
315
    int        i;
-
 
316
    int        ret = 0;
-
 
317
 
-
 
318
 
-
 
319
    if(unlikely(pbitmap->handle == 0))
-
 
320
        return -1;
-
 
321
 
-
 
322
    bitmap = (bitmap_t*)hmm_get_data(&bm_mm, pbitmap->handle);
-
 
323
 
-
 
324
    if(unlikely(bitmap==NULL))
-
 
325
        return -1;
-
 
326
 
-
 
327
    if( pbitmap->new_width > bitmap->max_width ||
-
 
328
        pbitmap->new_height > bitmap->max_height)
-
 
329
        return -1;
-
 
330
 
-
 
331
    width  = pbitmap->new_width;
-
 
332
    height = pbitmap->new_height;
-
 
333
 
-
 
334
    pitch = ALIGN(width*4,64);
-
 
335
    size =  roundup(pitch * height, PAGE_SIZE);
-
 
336
    page_count = size/PAGE_SIZE;
-
 
337
 
-
 
338
    DRM_DEBUG("new width %d height %d pitch %d size %d\n",
-
 
339
            width, height, pitch, size);
-
 
340
 
-
 
341
    if( page_count == bitmap->page_count )
-
 
342
    {
-
 
343
        bitmap->width  = width;
-
 
344
        bitmap->height = height;
-
 
345
        bitmap->pitch  = pitch;
-
 
346
    }
-
 
347
    else if(page_count > bitmap->page_count)
-
 
348
    {
-
 
349
        char *vaddr = bitmap->uaddr + PAGE_SIZE * bitmap->page_count;
-
 
350
 
-
 
351
        pages = bitmap->obj->allocated_pages;
-
 
352
 
-
 
353
        DRM_DEBUG("old pages %d new_pages %d vaddr %x\n",
-
 
354
                bitmap->page_count, page_count, vaddr);
-
 
355
 
-
 
356
        for(i = bitmap->page_count; i < page_count; i++, vaddr+= PAGE_SIZE)
-
 
357
        {
-
 
358
            page = AllocPage();
-
 
359
            if ( page == 0 )
-
 
360
                goto err4;
-
 
361
            pages[i] = page;
-
 
362
            MapPage(vaddr, page, 0x207);        //map as shared page
-
 
363
        };
-
 
364
 
-
 
365
        DRM_DEBUG("%s alloc %d pages\n", __FUNCTION__,
-
 
366
                  page_count - bitmap->page_count);
-
 
367
 
-
 
368
//        mutex_lock(&main_device->struct_mutex);
-
 
369
 
-
 
370
        i915_gem_object_unpin(bitmap->obj);
-
 
371
        i915_gem_object_unbind(bitmap->obj);
-
 
372
        bitmap->obj->base.size = size;
-
 
373
        bitmap->obj->pages.nents = page_count;
-
 
374
 
-
 
375
        ret = i915_gem_object_pin(bitmap->obj, PAGE_SIZE, true,true);
-
 
376
        if (ret)
-
 
377
            goto err4;
-
 
378
//        mutex_unlock(&main_device->struct_mutex);
-
 
379
 
-
 
380
        bitmap->page_count = page_count;
-
 
381
        bitmap->width  = width;
-
 
382
        bitmap->height = height;
-
 
383
        bitmap->pitch  = pitch;
-
 
384
        bitmap->gaddr  = bitmap->obj->gtt_offset;
-
 
385
    };
-
 
386
 
-
 
387
    if(ret != 0 )
-
 
388
    {
-
 
389
        pbitmap->data  = NULL;
-
 
390
        pbitmap->pitch = 0;
-
 
391
 
-
 
392
        dbgprintf("%s fail\n", __FUNCTION__);
-
 
393
        return ret;
-
 
394
    };
-
 
395
 
-
 
396
    pbitmap->data  = bitmap->uaddr;
-
 
397
    pbitmap->pitch = bitmap->pitch;
-
 
398
 
-
 
399
    return 0;
-
 
400
 
-
 
401
err4:
-
 
402
    while (i-- > bitmap->page_count)
-
 
403
        FreePage(pages[i]);
-
 
404
 
Line 305... Line 405...
305
 
405
    return -1;
306
 
406
};
307
 
407