Работа с графикой в PM

Тема в разделе "WASM.OS.DEVEL", создана пользователем MegaI2, 17 сен 2007.

  1. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Где можно раздобыть информации по этой теме ?
    Сам искал не нашел ничего толкового, пытался методом тыка - результат нулевой все попытки окончились ресетом :dntknw:
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    MegaI2
    Не, ты первый спрашиваешь объэтом. Работа с графикой в PM, делается прямым выводом в видео память. Вывод осуществляется в LFB. Установка видео режима делается в реальном или виртуальном режиме через vesa. У Зубкова был пример.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    прямой вывод в видеопамять.. только вот придется писать минидрова для видеокарточек, ибо насколько я понял, для каждой карточки адрес начала видеобуффера вычисляется по-своему. если интересно, посмотри как реализованы драйвера минипорта для видеокарт в Windows, там в одном из мест в HwDeviceExtension записывается адрес начала фреймбуффера, который вычисляется динамически на основе характеристик карты.
    вообще я как раз этой темой щас занимаюсь глубоко.. правда не в голом PM, а под Windows в режиме ядра.
    Основной алгоритм - получаем у драйвера минипорта физадрес фреймбуффера, ну точнее уже промаппленый на виртуальное АП, но через секцию PhysicalMemory, это мне не катит, поэтому я перемапирую через MmGetPhysicalAddress/MmMapIoSpace, и дальше напрямую записываем в эту память.
    Уже написал семейство базовых функции для работы с графикой типа BitBlt, FillRect и прочих вплоть до вывода графических файлов и текста с помощью шрифтов.

    ADD:
    Pavia
    опередил :P
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    через VBE (VESA bios extension) вроде стандартным образом все вычисляется
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    для этого как я помню нужен rm / v86
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Great
    Можно, через VESA узнать адресс.
    Я постил код который находит адресс видео памяти через PCI в 99% должен работать.
    http://forum.codenet.ru/showpost.php?p=202118&postcount=27
     
  7. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    такс вникаю... :))))

    начиться для начала надо найти адрес видеобуфера
    а поподробнее можно ? :)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Pavia
    о спасибо за код. надо попробовать ради интереса.. в принципе меня существующий мой код получения адреса через IOCTL_VIDEO_MAP_VIDEO_MEMORY / MmGetPhysicalAddress устраивает, но и другой вариант тоже не помешает)
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    MegaI2
    Вот держи стандарт на VESA
    http://www.vesa.org/public/VBE/vbe3.pdf
    Функция 01. Возращает инвормацию о режиме и адресс видео памяти PhysBasePtr.
     
  10. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Pavia
    спасибо
    а запись простым mov'ом и эквивалентными коммандами ? :)

    ещё бы хотелось узнать про текстовый видеобуфер
    что-то не пойму какие коды он принимает
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    начиная с версии 3.0 VBE поддерживает интерфейс защищенного режима
     
  12. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    так какие коды символов принимает текстовый видеобуфер ?
    а то даж дебаг инфу не вывести :dntknw:
     
  13. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    MegaI2
    0-ой байт - ASCII код символа
    1-ый байт - атрибут символа (фон, цвет и т. д)
     
  14. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    поподробнее если можно
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MegaI2
    пиши семерку (7), не ошибешься.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Кстати я тут слегка покопал насчет PCI и её конфигур пространства, получился такой кодес (аналог кода Pavia, только на си): http://www.everfall.com/paste/id.php?nn8vuab14hrr
     
  17. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    почитал инфу про VBE 3.0
    что то меня копирование и использование биоса не порадовало

    есть ещё варианты
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ой я тут еще накопал из спецификации PCI Local Bus 2.2 насчет получения размера фреймбуффера - нужно дополнить тот код:
    Код (Text):
    1.                 PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0x10 + i) );
    2.                 PCI_SET_DATA( 0xFFFFFFFF );
    3.                 ULONG size = PCI_GET_DATA();
    4.                 PCI_SET_DATA( tmp );
    5.                 size = (~(size & 0xFFFFFFF0)) + 1;
    то есть результирующий код выглядит так:
    Код (Text):
    1. ULONG GetVideoAdapterLFBPhysAddress(USHORT VidAdapter, ULONG *size)
    2. {
    3.     // Get configuration space data at address 0x00 [DevId VenId]
    4.     PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0) );
    5.     ULONG tmp = PCI_GET_DATA();
    6.  
    7.     USHORT VenId = (USHORT)(tmp&0xFFFF);
    8.     if( VenId == 0xFFFF )
    9.     {
    10.         PCI_SET_ADDRESS( PCICONF_ADDRESS(0,0,0,0) );
    11.         return 0;
    12.     }
    13.  
    14.     // Read BARs
    15.     for( int i=0; i<6; i++ )
    16.     {
    17.         PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0x10 + i) );
    18.         PCI_BAR bar;
    19.         tmp = PCI_GET_DATA();
    20.         *(ULONG*)&bar = tmp;
    21.  
    22.         if( bar.m.IoOrMemorySpace == 0 )
    23.         {
    24.             // Memory-Space BAR
    25.  
    26.             if( bar.m.Type == PCI_BAR_MEM_TYPE_32BIT )
    27.             {
    28.                 // 32-bit Memory-Space BAR; LFB phys. address
    29.  
    30.                 // get LFB size. write -1 and read value. bits that are don't-care will be set to 0.
    31.                 PCI_SET_ADDRESS( PCICONF_ADDRESS(0,VidAdapter,0,0x10 + i) );
    32.                 PCI_SET_DATA( 0xFFFFFFFF );
    33.                 *size = PCI_GET_DATA();
    34.                 PCI_SET_DATA( tmp );
    35.                 *size = (~(*size & 0xFFFFFFF0)) + 1; // LFB size
    36.  
    37.                 PCI_SET_ADDRESS( PCICONF_ADDRESS(0,0,0,0) );
    38.                 return (tmp & 0xFFFFFFF0);
    39.             }
    40.         }
    41.     }
    42.  
    43.     PCI_SET_ADDRESS( PCICONF_ADDRESS(0,0,0,0) );
    44.     return 0;
    45. }
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    MegaI2
    Непонял, что куда копировать?
    Не хочешь биос использовать исполльзуй драйвер ОС. Если пишешь свою, то придеться для каждой видюшки свой драйвер писать.

    Great
    Про определения размера я знаю. А вот тебе не мешает выяснить про бит 3 BAR регистра -Prefetchable. Он позволяет отделить собственно памяти видео карты, от регистров отоброженных ввидео память.