Запустил командный процессор на всех gpu, так что можно заняться акселерацией.
Вот примерный API для следующей версии pixlib
Все функции возвращают код ошибки как знаковое целое.
typedef struct
{
uint32_t width;
uint32_t height;
uint32_t format;
uint32_t pitch; //ширина строки в байтах
color_t *pixels;
//что-то ещё
...
}; pixmap_t;
pixmap_t ScreenPixmap; Первичная поверхность. Создаётся библиотекой.
int CreatePixmap(pixmap_t *pixmap);
Создаёт текстуру в
локальной видеопамяти.
Перед вызовом надо заполнить поля width, height и format структуры.
int ResizePixmap(pixmap_t *pixmap, uint32_t new_width, uint32_t new_height);
Устанавливает новый размер текстуры не меняя формат. Старое содержимое теряется.
int BindPixmap(pixmap_t *pixmap, uint32_t flags);
Связывает текстуру с копией в системной памяти.
int UnbindPixmap(pixmap_t *pixmap);
Освобождает системную память.
int UpdatePixmap(pixmap_t *pixmap, uint32_t xorg, uint32_t yorg,
uint32_t width, uint32_t height, uint32_t location);
Обновляет текстуру. location определяет положение - в системной или видеопамяти. Координаты задают обновляемую область.
Функции блиттера
int Blit(pixmap_t *dst, pixmap_t *src, int xdst, int ydst, int xsrc, int ysrc, uin32_t width, uint32_t height);
int BlitTransparent(pixmap_t *dst, pixmap_t *src, int xdst, int ydst, int xsrc, int ysrc, uin32_t width, uint32_t height, color_t key);
int Blend(pixmap_t *dst, pixmap_t *src, int xdst, int ydst, int xsrc, int ysrc, uin32_t width, uint32_t height);
BlitTransparent использует key как прозрачный цвет источника.
Прмер использования.
Code: Select all
pixmap_t win_pixmap;
//Пиксмап для отрисовки всего окна
On_Create:
int error;
//Получили размер окна
win_pixmap.width = window_width;
win_pixmap.height = window_height;
win_pixmap.format = ARGB32;
error = CreatePixmap(&pixmap);
if( error )
{
epic_fail();
};
error = BindPixmap(&pixmap);
if( error )
{
epic_fail();
};
/****************/
On_Paint()
//рисуем в текстуру успользуя win_pixmap.pixels и не забывая про win_pixmap.pitch
error = UpdatePixmap(&win_pixmap, координаты перерисованной области, PX_MEM_LOCAL);
if( error )
{
epic_fail();
};
error = Blit(&ScreenPixmap, &win_pixmap, window_x, window_y, координаты перерисованной области);
if( error )
{
epic_fail();
};
/****************/
On_Size:
//Получили размер окна
error = ResizePixmap(&win_pixmap, window_width, window_height);
if( error )
{
epic_fail();
};
Code: Select all
//Просто текстура в видеопамяти
pixmap_t my_pixmap;
//Задаём размер текстуры;
...
//Создаём текстуру
error = CreatePixmap(&my_pixmap);
//Загружаем текстуру в видеопамять
error = BindPixmap(&my_pixmap);
load_bitmap(my_pixmap.pixels, my_pixmap.pitch, источник, что-то ещё);
error = UpdatePixmap(&my_pixmap, 0, 0, my_pixmap.width, my_pixmap.height, PX_MEM_LOCAL);
error = UnbindPixmap(&my_pixmap);
/*******************/
PROFIT
В дополнение к этим функциям будет возможность запускать на исполнение командные пакеты. Так что владеющие
Тайным Знанием любопытные Буратины смогут программировать чип напрямую (со всеми вытекающими), в том числе вести модные расчёты на GPU.