Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include <stdint.h>
  2. #include <libavcodec/avcodec.h>
  3. #include <libavformat/avformat.h>
  4. #include <libswscale/swscale.h>
  5. #include <stdio.h>
  6. #include <fcntl.h>
  7. #include "fplay.h"
  8.  
  9. #define DISPLAY_VERSION     0x0200     /*      2.00     */
  10.  
  11. #define SRV_GETVERSION       0
  12. #define SRV_GET_CAPS         3
  13.  
  14. #define SRV_CREATE_SURFACE  10
  15. #define SRV_BLIT_VIDEO      20
  16.  
  17. #define __ALIGN_MASK(x,mask)  (((x)+(mask))&~(mask))
  18. #define ALIGN(x,a)            __ALIGN_MASK(x,(typeof(x))(a)-1)
  19.  
  20. //void InitPixlib(uint32_t flags);
  21.  
  22. static uint32_t service;
  23. static uint32_t blit_caps;
  24.  
  25. typedef struct
  26. {
  27.     uint32_t  idx;
  28.     union
  29.     {
  30.         uint32_t opt[2];
  31.         struct {
  32.             uint32_t max_tex_width;
  33.             uint32_t max_tex_height;
  34.         }cap1;
  35.     };
  36. }hwcaps_t;
  37.  
  38. static uint32_t get_service(char *name)
  39. {
  40.   uint32_t retval = 0;
  41.   asm volatile ("int $0x40"
  42.       :"=a"(retval)
  43.       :"a"(68),"b"(16),"c"(name)
  44.       :"memory");
  45.  
  46.   return retval;
  47. };
  48.  
  49. static int call_service(ioctl_t *io)
  50. {
  51.   int retval;
  52.  
  53.   asm volatile("int $0x40"
  54.       :"=a"(retval)
  55.       :"a"(68),"b"(17),"c"(io)
  56.       :"memory","cc");
  57.  
  58.   return retval;
  59. };
  60.  
  61. #define BUFFER_SIZE(n) ((n)*sizeof(uint32_t))
  62.  
  63.  
  64.  
  65. uint32_t InitPixlib(uint32_t caps)
  66. {
  67.     uint32_t  api_version;
  68.     hwcaps_t  hwcaps;
  69.     ioctl_t   io;
  70.  
  71.  //   __asm__ __volatile__("int3");
  72.  
  73.     service = get_service("DISPLAY");
  74.     if(service == 0)
  75.         goto fail;
  76.  
  77.     io.handle   = service;
  78.     io.io_code  = SRV_GETVERSION;
  79.     io.input    = NULL;
  80.     io.inp_size = 0;
  81.     io.output   = &api_version;
  82.     io.out_size = BUFFER_SIZE(1);
  83.  
  84.     if (call_service(&io)!=0)
  85.         goto fail;
  86.  
  87.     if( (DISPLAY_VERSION > (api_version & 0xFFFF)) ||
  88.         (DISPLAY_VERSION < (api_version >> 16)))
  89.         goto fail;
  90.  
  91. /*
  92.  * Let's see what this service can do
  93. */
  94.     hwcaps.idx  = 0;
  95.  
  96.     io.handle   = service;
  97.     io.io_code  = SRV_GET_CAPS;
  98.     io.input    = &hwcaps;
  99.     io.inp_size = sizeof(hwcaps);
  100.     io.output   = NULL;
  101.     io.out_size = 0;
  102.  
  103.     if (call_service(&io)!=0)
  104.         goto fail;
  105.  
  106.     blit_caps = hwcaps.opt[0];
  107.  
  108.     printf("\nDISPLAY service handle %x\n", service);
  109.  
  110.     if( blit_caps )
  111.         printf("service caps %s%s%s\n",
  112.                (blit_caps & HW_BIT_BLIT) != 0 ?"HW_BIT_BLIT ":"",
  113.                (blit_caps & HW_TEX_BLIT) != 0 ?"HW_TEX_BLIT ":"",
  114.                (blit_caps & HW_VID_BLIT) != 0 ?"HW_VID_BLIT ":"");
  115.  
  116.     blit_caps&= caps;
  117.     return blit_caps;
  118.  
  119. fail:
  120.     service = 0;
  121.     return 0;
  122. };
  123.  
  124.  
  125. int create_bitmap(bitmap_t *bitmap)
  126. {
  127.  //    __asm__ __volatile__("int3");
  128.  
  129.     if( blit_caps & HW_BIT_BLIT )
  130.     {
  131.         struct __attribute__((packed))  /*     SRV_CREATE_SURFACE    */
  132.         {
  133.             uint32_t  handle;           // ignored
  134.             void      *data;            // ignored
  135.  
  136.             uint32_t  width;
  137.             uint32_t  height;
  138.             uint32_t  pitch;            // ignored
  139.  
  140.             uint32_t  max_width;
  141.             uint32_t  max_height;
  142.             uint32_t  format;           // reserved mbz
  143.         }io_10;
  144.  
  145.         ioctl_t io;
  146.         int     err;
  147.  
  148. //        printf("create bitmap %d x %d\n",
  149. //                bitmap->width, bitmap->height);
  150.  
  151.         io_10.width      = bitmap->width;
  152.         io_10.height     = bitmap->height;
  153.         io_10.max_width  = 0;
  154.         io_10.max_height = 0;
  155.         io_10.format     = 0;
  156.  
  157.         io.handle   = service;
  158.         io.io_code  = SRV_CREATE_SURFACE;
  159.         io.input    = &io_10;
  160.         io.inp_size = BUFFER_SIZE(8);
  161.         io.output   = NULL;
  162.         io.out_size = 0;
  163.  
  164.         err = call_service(&io);
  165.         if(err==0)
  166.         {
  167.             bitmap->handle = io_10.handle;
  168.             bitmap->pitch  = io_10.pitch;
  169.             bitmap->data   = io_10.data;
  170. //            printf("Create hardware surface %x pitch %d, buffer %x\n",
  171. //                     bitmap->handle, bitmap->pitch, bitmap->data);
  172.             return 0;
  173.         };
  174.         return err;
  175.     };
  176.  
  177.     uint32_t   size;
  178.     uint32_t   pitch;
  179.     uint8_t   *buffer;
  180.  
  181.     pitch = ALIGN(bitmap->width*4, 16);
  182.     size  = pitch * bitmap->height;
  183.  
  184.     buffer = (uint8_t*)user_alloc(size);
  185.     if( buffer )
  186.     {
  187.         bitmap->handle = 0;
  188.         bitmap->pitch  = pitch;
  189.         bitmap->data   = buffer;
  190.         return 0;
  191.     };
  192.  
  193.     printf("Cannot alloc frame buffer\n\r");
  194.  
  195.     return -1;
  196. };
  197.  
  198. struct blit_call
  199. {
  200.     int dstx;
  201.     int dsty;
  202.     int w;
  203.     int h;
  204.  
  205.     int srcx;
  206.     int srcy;
  207.     int srcw;
  208.     int srch;
  209.  
  210.     unsigned char *bitmap;
  211.     int   stride;
  212. };
  213.  
  214. int blit_bitmap(bitmap_t *bitmap, int dst_x, int dst_y,
  215.                 int w, int h)
  216. {
  217.  
  218.     if( blit_caps & HW_BIT_BLIT )
  219.     {
  220.  
  221. /*
  222.  *   Now you will experience the full power of the dark side...
  223. */
  224.  
  225.         struct __attribute__((packed))
  226.         {
  227.             uint32_t handle;
  228.             int      dst_x;
  229.             int      dst_y;
  230.             int      src_x;
  231.             int      src_y;
  232.             uint32_t w;
  233.             uint32_t h;
  234.         }io_20;
  235.  
  236.         ioctl_t io;
  237.         int     err;
  238.  
  239.         io_20.handle = bitmap->handle;
  240.         io_20.dst_x  = dst_x;
  241.         io_20.dst_y  = dst_y;
  242.         io_20.src_x  = 0;
  243.         io_20.src_y  = 0;
  244.         io_20.w      = w;
  245.         io_20.h      = h;
  246.  
  247.         io.handle    = service;
  248.         io.io_code   = SRV_BLIT_VIDEO;
  249.         io.input     = &io_20;
  250.         io.inp_size  = BUFFER_SIZE(7);
  251.         io.output    = NULL;
  252.         io.out_size  = 0;
  253.  
  254. //        printf("do blit %x pitch %d\n",bitmap->handle,
  255. //                bitmap->pitch);
  256.         err = call_service(&io);
  257.         if (call_service(&io)==0)
  258.         {
  259.             //bitmap->data = NULL;    Not now, Serge
  260. //            printf("blit done\n");
  261.             delay(1);
  262.             return 0;
  263.         };
  264.         return err;
  265.     };
  266.  
  267.     volatile struct blit_call bc;
  268.  
  269.     bc.dstx = dst_x;
  270.     bc.dsty = dst_y;
  271.     bc.w    = w;
  272.     bc.h    = h;
  273.     bc.srcx = 0;
  274.     bc.srcy = 0;
  275.     bc.srcw = w;
  276.     bc.srch = h;
  277.     bc.stride = bitmap->pitch;
  278.     bc.bitmap = bitmap->data;
  279.  
  280.     __asm__ __volatile__(
  281.     "int $0x40"
  282.     ::"a"(73),"b"(0),"c"(&bc));
  283. };
  284.  
  285.  
  286. static inline void* user_realloc(void *mem, size_t size)
  287. {
  288.     void *val;
  289.     __asm__ __volatile__(
  290.     "int $0x40"
  291.     :"=eax"(val)
  292.     :"a"(68),"b"(12),"c"(size),"d"(mem)
  293.     :"memory");
  294.  
  295.     return val;
  296. }
  297.  
  298. int resize_bitmap(bitmap_t *bitmap)
  299. {
  300.  //    __asm__ __volatile__("int3");
  301.  
  302.     if( blit_caps & HW_BIT_BLIT )
  303.     {
  304.        /*   work in progress   */
  305.     };
  306.  
  307.     uint32_t   size;
  308.     uint32_t   pitch;
  309.     uint8_t   *buffer;
  310.  
  311.     pitch = ALIGN(bitmap->width*4, 16);
  312.     size  = pitch * bitmap->height;
  313.  
  314.     buffer = (uint8_t*)user_realloc(bitmap->data, size);
  315.     if( buffer )
  316.     {
  317.         bitmap->handle = 0;
  318.         bitmap->pitch  = pitch;
  319.         bitmap->data   = buffer;
  320.         return 0;
  321.     };
  322.  
  323.     printf("Cannot realloc frame buffer\n\r");
  324.  
  325.     return -1;
  326. };
  327.  
  328.