Создание новой поверхности для существующего блока памяти
#include <gf/gf.h>int gf_surface_attach( gf_surface_t *psurface,gf_dev_t gdev,int w,int h,int stride,gf_format_t format,const gf_palette_t *palette,uint8_t *ptr,unsigned flags );
NULL
только в том случае, если формат поверхности не предколагает наличия палитры (отличные от GF_FORMAT_PAL8
форматы).0
.gf
Функция создает поверхность и присоединяет к ней уже существующий буфер с данными. Это позволяет дать определние вашему собственному буферу памяти в пространстве ресурсов графической подсистемы. Корректная инициализация поверхности позволяет выполнять манипуляции с поверхностью средствами GF API.
В общем случае графический процессор не сможет адресоваться напрямую к этой поверхности, что приведет к невозможности аппаратной акселерации в подобной памяти. Причина заключается в том, что у драйвера нет возможности определить источник памяти и ее природу.
На самом деле данное замечание не вполне верно. Некоторые драйвера способны определять факт отсутствия владения пользовательскими буферами данных и при удачном стечении обстоятельств адресоваться к ним средствами DMA движков. Однако, эти операции в любом случае менее производительны со стороны ускорителей, нежели манипуляции с памятью графических устройств. С другой стороны, доступ со стороны CPU в эту память будет осуществляться оптимальнее. Выбор наилучшего сценария должен производиться исходя из анализа конкретной ситуации. |
По этой же причине приложение ответственно за освобождение памяти, ассоциированной с буфером памяти. Это должно быть сделано после завершения всех операций с поверхностями, ссылающимися на буфер, а также после освобождения самих поверхностей с помощью gf_surface_free().
Память этих поверхностей не может быть разделяемой между процессами средствами менеджера io-display. По этой причине доступ к таким поверхностям через gf_surface_attach_by_sid() невозможен.
NULL
Графическая подсистема ЗОСРВ «Нейтрино», Graphics Framework
gf_palette_t, gf_surface_create(), gf_surface_create_layer(), gf_surface_free(), gf_surface_reattach()
Предыдущий раздел: GF API