Subversion Repositories Kolibri OS

Rev

Rev 2342 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #include <drmP.h>
  3. #include <drm.h>
  4. #include "i915_drm.h"
  5. #include "i915_drv.h"
  6. #include "intel_drv.h"
  7. #include "bitmap.h"
  8.  
  9. extern struct drm_device *main_device;
  10.  
  11. struct hman bm_man;
  12.  
  13. int init_bitmaps()
  14. {
  15.     int ret;
  16.  
  17.     ret = init_hman(&bm_man, 1024);
  18.  
  19.     return ret;
  20. };
  21.  
  22.  
  23. int create_bitmap(struct ubitmap *pbitmap, int width, int height)
  24. {
  25.     struct drm_i915_gem_object *obj;
  26.  
  27.     bitmap_t   *bitmap;
  28.     u32         handle;
  29.     u32         size;
  30.     u32         pitch;
  31.     void       *uaddr;
  32.  
  33.     int   ret;
  34.  
  35.     pbitmap->handle = 0;
  36.     pbitmap->data   = NULL;
  37.  
  38.     if((width==0)||(height==0)||(width>4096)||(height>4096))
  39.         goto err1;
  40.  
  41.     handle = alloc_handle(&bm_man);
  42.  
  43.     if(handle == 0)
  44.         goto err1;
  45.  
  46.     bitmap = CreateObject(GetPid(), sizeof(*bitmap));
  47.     if( bitmap == NULL)
  48.         goto err1;
  49.  
  50.     hman_set_data(&bm_man, handle, bitmap);
  51.  
  52.     pitch = ALIGN(width*4,64);
  53.  
  54.     size =  roundup(pitch*height, PAGE_SIZE);
  55.  
  56.     obj = i915_gem_alloc_object(main_device, size);
  57.     if (obj == NULL)
  58.         goto err2;
  59.  
  60.     ret = i915_gem_object_pin(obj, 4096, true);
  61.     if (ret)
  62.         goto err3;
  63.  
  64.     uaddr = UserAlloc(size);
  65.     if( uaddr == NULL)
  66.         goto err4;
  67.     else
  68.     {
  69.         u32_t *src, *dst;
  70.         int count;
  71.  
  72. #define page_tabs  0xFDC00000      /* really dirty hack */
  73.  
  74.         src =  (u32_t*)obj->pages;
  75.         dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
  76.         count = size/4096;
  77.  
  78.         while(count--)
  79.         {
  80.             *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
  81.         };
  82.     }
  83.  
  84.     bitmap->handle = handle;
  85.     bitmap->width  = width;
  86.     bitmap->height = height;
  87.     bitmap->pitch  = pitch;
  88.     bitmap->gaddr  = obj->gtt_offset;
  89.     bitmap->uaddr  = uaddr;
  90.     bitmap->obj    = obj;
  91.  
  92.     pbitmap->handle = handle;
  93.     pbitmap->data   = uaddr;
  94.     return 0;
  95.  
  96. err4:
  97. //    drm_gem_object_unpin;
  98. err3:
  99. //    drm_gem_object_unreference(&obj->base);
  100. err2:
  101.     free_handle(&bm_man, handle);
  102.     DestroyObject(bitmap);
  103. err1:
  104.     return -1;
  105.  
  106. };
  107.  
  108.  
  109. int create_video(int width, int height, u32_t *outp)
  110. {
  111.     struct drm_i915_gem_object *obj;
  112.  
  113.     size_t      size;
  114.     size_t      pitch;
  115.     void       *uaddr;
  116.  
  117.     int   ret;
  118.  
  119.     if((width==0)||(height==0)||(width>4096)||(height>4096))
  120.         goto err1;
  121.  
  122.     pitch = ALIGN(width*4,64);
  123.  
  124.     size =  roundup(pitch*height, PAGE_SIZE);
  125.  
  126.     obj = i915_gem_alloc_object(main_device, size);
  127.     if (obj == NULL)
  128.         goto err2;
  129.  
  130.     ret = i915_gem_object_pin(obj, 4096, true);
  131.     if (ret)
  132.         goto err3;
  133.  
  134.     uaddr = UserAlloc(size);
  135.     if( uaddr == NULL)
  136.         goto err4;
  137.     else
  138.     {
  139.         u32_t *src, *dst;
  140.         int count;
  141.  
  142. #define page_tabs  0xFDC00000      /* really dirty hack */
  143.  
  144.         src =  (u32_t*)obj->pages;
  145.         dst =  &((u32_t*)page_tabs)[(u32_t)uaddr >> 12];
  146.         count = size/4096;
  147.  
  148.         while(count--)
  149.         {
  150.             *dst++ = (0xFFFFF000 & *src++) | 0x207 ; // map as shared page
  151.         };
  152.     }
  153.  
  154.     outp[0] = obj->gtt_offset;
  155.     outp[2] = (u32)uaddr;
  156.     outp[3] = pitch;
  157.  
  158.     return 0;
  159.  
  160. err4:
  161. //    drm_gem_object_unpin;
  162. err3:
  163. //    drm_gem_object_unreference(&obj->base);
  164. err2:
  165. err1:
  166.     return -1;
  167. };
  168.  
  169.  
  170. int init_hman(struct hman *man, u32 count)
  171. {
  172.     u32* data;
  173.  
  174.     data = malloc(count*sizeof(u32*));
  175.     if(data)
  176.     {
  177.         int i;
  178.  
  179.         for(i=0;i < count-1;)
  180.             data[i] = ++i;
  181.         data[i] = 0;
  182.  
  183.         man->table = data;
  184.         man->next  = 0;
  185.         man->avail = count;
  186.         man->count = count;
  187.  
  188.         return 0;
  189.     };
  190.     return -ENOMEM;
  191. };
  192.  
  193. u32  alloc_handle(struct hman *man)
  194. {
  195.     u32 handle = 0;
  196.  
  197.     if(man->avail)
  198.     {
  199.         handle = man->next;
  200.         man->next = man->table[handle];
  201.         man->avail--;
  202.         handle++;
  203.     }
  204.     return handle;
  205. };
  206.  
  207. int free_handle(struct hman *man, u32 handle)
  208. {
  209.     int ret = -1;
  210.  
  211.     handle--;
  212.  
  213.     if(handle < man->count)
  214.     {
  215.         man->table[handle] = man->next;
  216.         man->next = handle;
  217.         man->avail++;
  218.         ret = 0;
  219.     };
  220.  
  221.     return ret;
  222. };
  223.  
  224.  
  225.