Subversion Repositories Kolibri OS

Rev

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

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdbool.h>
  4. #include <kos32sys.h>
  5.  
  6. #include "pixlib3.h"
  7. #include "pixdriver.h"
  8.  
  9. #define DISPLAY_VERSION         0x0200  /*      2.00     */
  10.  
  11. #define SRV_GETVERSION              0
  12. #define SRV_GET_CAPS                3
  13.  
  14.  
  15. #define BUFFER_SIZE(n) ((n)*sizeof(uint32_t))
  16. #define __ALIGN_MASK(x,mask)  (((x)+(mask))&~(mask))
  17. #define ALIGN(x,a)            __ALIGN_MASK(x,(typeof(x))(a)-1)
  18.  
  19. struct bitmap
  20. {
  21.     uint32_t    width;
  22.     uint32_t    height;
  23.     uint32_t    pitch;
  24.     void       *buffer;
  25.     uint32_t    size;
  26. };
  27.  
  28. static uint32_t fd;
  29. static struct pix_driver *driver;
  30.  
  31.  
  32. static bitmap_t *sw_create_bitmap(uint32_t width, uint32_t height)
  33. {
  34.     bitmap_t *bitmap;
  35.  
  36.     bitmap = malloc(sizeof(bitmap_t));
  37.     if(bitmap == NULL)
  38.         goto err_0;
  39.  
  40.     bitmap->width  = width;
  41.     bitmap->height = height;
  42.  
  43.     bitmap->pitch = ALIGN(width * 4, 16);
  44.     bitmap->size = ALIGN(bitmap->pitch * height, 4096);
  45.  
  46.     bitmap->buffer = user_alloc(bitmap->size);
  47.     if (bitmap->buffer == NULL)
  48.         goto err_1;
  49.  
  50.     return bitmap;
  51.  
  52. err_1:
  53.     free(bitmap);
  54. err_0:
  55.     return NULL;
  56. };
  57.  
  58. static int sw_destroy_bitmap(bitmap_t * bitmap)
  59. {
  60.     user_free(bitmap->buffer);
  61.     free(bitmap);
  62.     return 0;
  63. };
  64.  
  65. static void *sw_lock_bitmap(bitmap_t *bitmap, uint32_t *pitch)
  66. {
  67.     *pitch = bitmap->pitch;
  68.  
  69.     return bitmap->buffer;
  70. };
  71.  
  72. static int sw_resize_bitmap(bitmap_t * bitmap, uint32_t width, uint32_t height)
  73. {
  74.     uint32_t size;
  75.     uint32_t pitch;
  76.  
  77.     pitch = ALIGN(width * 4, 16);
  78.     size = ALIGN(pitch * height, 4096);
  79.  
  80.     if (size > bitmap->size)
  81.     {
  82.         bitmap->buffer = user_realloc(bitmap->buffer, size);    /* grow buffer */
  83.         if (bitmap->buffer == NULL)
  84.             return -1;
  85.  
  86.         bitmap->size = size;
  87.     }
  88.     else if (size < bitmap->size)
  89.         user_unmap(bitmap->buffer, size, bitmap->size - size); /* unmap unused pages */
  90.  
  91.     bitmap->width  = width;
  92.     bitmap->height = height;
  93.     bitmap->pitch  = pitch;
  94.  
  95.     return 0;
  96. };
  97.  
  98. static int sw_blit(bitmap_t * bitmap, int dst_x, int dst_y,
  99.                    uint32_t w, uint32_t h, int src_x, int src_y)
  100. {
  101.     struct blit_call bc;
  102.     int ret;
  103.  
  104.     bc.dstx     = dst_x;
  105.     bc.dsty     = dst_y;
  106.     bc.w        = w;
  107.     bc.h        = h;
  108.     bc.srcx     = src_x;
  109.     bc.srcy     = src_y;
  110.     bc.srcw     = bitmap->width;
  111.     bc.srch     = bitmap->height;
  112.     bc.stride   = bitmap->pitch;
  113.     bc.bitmap   = bitmap->buffer;
  114.  
  115.     __asm__ __volatile__(
  116.     "int $0x40":"=a"(ret):"a"(73), "b"(0x00),
  117.     "c"(&bc):"memory");
  118.  
  119.     return ret;
  120. };
  121.  
  122. static int sw_create_client(int x, int y, uint32_t width, uint32_t height)
  123. {
  124.     return 0;
  125. };
  126.  
  127. static int sw_resize_client(int x, int y, uint32_t width, uint32_t height)
  128. {
  129.     return 0;
  130. };
  131.  
  132. bitmap_t *pxCreateBitmap(uint32_t width, uint32_t height)
  133. {
  134.     return driver->create_bitmap(width, height);
  135. };
  136.  
  137. int pxDestroyBitmap(bitmap_t *bitmap)
  138. {
  139.     return driver->destroy_bitmap(bitmap);
  140. };
  141.  
  142. void *pxLockBitmap(bitmap_t *bitmap, uint32_t *pitch)
  143. {
  144.     return driver->lock_bitmap(bitmap, pitch);
  145. };
  146.  
  147. int pxResizeBitmap(bitmap_t *bitmap, uint32_t width, uint32_t height)
  148. {
  149.     return driver->resize_bitmap(bitmap, width, height);
  150. };
  151.  
  152. int pxBlitBitmap(bitmap_t *bitmap, int dst_x, int dst_y,
  153.                 uint32_t w, uint32_t h, int src_x, int src_y)
  154. {
  155.     return driver->blit_bitmap(bitmap, dst_x, dst_y,
  156.                                w, h, src_x, src_y);
  157. };
  158.  
  159. int pxCreateClient(int x, int y, uint32_t width, uint32_t height)
  160. {
  161.     return driver->create_client(x, y, width, height);
  162. }
  163.  
  164. int pxResizeClient(int x, int y, uint32_t width, uint32_t height)
  165. {
  166.     return driver->resize_client(x, y, width, height);
  167. }
  168.  
  169. static struct pix_driver sw_driver =
  170. {
  171.     0,
  172.     sw_create_bitmap,
  173.     sw_destroy_bitmap,
  174.     sw_lock_bitmap,
  175.     sw_resize_bitmap,
  176.     sw_blit,
  177.     sw_create_client,
  178.     sw_resize_client,
  179.     NULL,
  180.     NULL,
  181.     NULL
  182. };
  183.  
  184.  
  185. uint32_t pxInit(int hw)
  186. {
  187.     void *lib;
  188.     struct pix_driver *(*drventry)(uint32_t service);
  189.  
  190.     uint32_t api_version;
  191.     ioctl_t io;
  192.  
  193.     if(driver != NULL)
  194.         return driver->driver_caps;
  195.  
  196.     driver = &sw_driver;
  197.  
  198.     if(hw == 0)
  199.         return 0;
  200.  
  201.     if (fd != 0)
  202.         return driver->driver_caps;
  203.  
  204.     fd = get_service("DISPLAY");
  205.     if (fd == 0)
  206.         goto fail;
  207.  
  208.     io.handle = fd;
  209.     io.io_code = SRV_GETVERSION;
  210.     io.input = NULL;
  211.     io.inp_size = 0;
  212.     io.output = &api_version;
  213.     io.out_size = BUFFER_SIZE(1);
  214.  
  215.     if (call_service(&io) != 0)
  216.         goto fail;
  217.  
  218.     if ((DISPLAY_VERSION > (api_version & 0xFFFF)) ||
  219.         (DISPLAY_VERSION < (api_version >> 16)))
  220.         goto fail;
  221.  
  222.     lib = load_library("pixlib-gl.dll");
  223.     if(lib == 0)
  224.         goto fail;
  225.  
  226.     drventry = get_proc_address(lib, "DrvInit");
  227.  
  228.     if( drventry == NULL)
  229.         goto fail;
  230.  
  231.     driver = drventry(fd);
  232.     if(driver == NULL)
  233.     {
  234.         driver = &sw_driver;
  235.         goto fail;
  236.     };
  237.  
  238.     if (driver->driver_caps)
  239.         printf("2D caps %s%s%s\n",
  240.                (driver->driver_caps & HW_BIT_BLIT) != 0 ? "HW_BIT_BLIT " : "",
  241.                (driver->driver_caps & HW_TEX_BLIT) != 0 ? "HW_TEX_BLIT " : "",
  242.                (driver->driver_caps & HW_VID_BLIT) != 0 ? "HW_VID_BLIT " : "");
  243.  
  244.     return driver->driver_caps;
  245.  
  246. fail:
  247.     printf("Warning! Hardware initialization failed.\n"
  248.            "fallback to software rendering.\n");
  249.     fd = 0;
  250.     return 0;
  251. };
  252.  
  253. void pxFini()
  254. {
  255.     if (driver->fini)
  256.         driver->fini();
  257. };
  258.  
  259.  
  260. planar_t* pxCreatePlanar(int name, int format,
  261.                          uint32_t width, uint32_t height,
  262.                          uint32_t offset0, uint32_t pitch0,
  263.                          uint32_t offset1, uint32_t pitch1,
  264.                          uint32_t offset2, uint32_t pitch2)
  265. {
  266.     if(driver->create_planar)
  267.         return driver->create_planar(name, format, width, height,
  268.                                      offset0, pitch0, offset1, pitch1,
  269.                                      offset2, pitch2);
  270.     else
  271.         return NULL;
  272. }
  273.  
  274.  
  275. int pxBlitPlanar(planar_t *planar, int dst_x, int dst_y,
  276.                  uint32_t w, uint32_t h, int src_x, int src_y)
  277. {
  278.     if(driver->blit_planar)
  279.         return driver->blit_planar(planar, dst_x, dst_y,
  280.                                    w, h, src_x, src_y);
  281.     else
  282.         return 0;
  283. };
  284.  
  285.  
  286.  
  287.  
  288.