Page 13 of 41

Re: Новые драйвера для ATI Radeon.

Posted: Mon Aug 31, 2009 10:37 am
by Serge
Page Attribute Table (PAT) расшироение таблиц страниц для постраничного управления кешированием. Появилось начиная с РIII. Три бита pcd, pwt и pat из тaблицы страниц используются как индекс в таблице аттрибутов. Таблица программируется через IA32_CR_PAT MSR.
Подробнее всё расписано в Intel SDM Vol.3 10.12.

Re: Новые драйвера для ATI Radeon.

Posted: Fri Sep 18, 2009 4:39 pm
by andrew_programmer
У меня вопрос.

Code: Select all

     srv_hw2d = get_service("HDRAW");

       if(srv_hw2d == 0)

         srv_hw2d = load_service("/rd/1/drivers/ati2d.drv");



     return TRUE;
Это получается, что даже если драйвер не загрузиться, то результат инициализации всё равно положительный. Библиотека pixlib работает и без загруженного драйвера.Значит что-то эмулирует работу сервиса драйвера на уровне ядра. Я правильно понял или нет ?

Re: Новые драйвера для ATI Radeon.

Posted: Sat Sep 19, 2009 10:53 am
by Serge
andrew_programmer

Не совсем. Если нет акселерации pixlib рисует всё на экране сама в user-mode.

Code: Select all

int Blit(pixmap_t *dst_pixmap, int dst_x, int dst_y,
         pixmap_t *src_pixmap, int src_x, int src_y,
         int width, int height)
{
    clip_t src_clip, dst_clip;

    if( ( width <= 0 ) || ( height<=0 ) )
        return ERR_PARAM;

/*  if "hardware acceleration present" and
    "destinastion is primary screen or local videomemory"
*/
    if( (srv_hw2d != 0) &&
        ( (dst_pixmap == (void*)-1) ||
           ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) /* &&
         ( (src_pixmap == (void*)-1) ||
           ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) */ )
    {
        ioctl_t io;
        pxblit_t *blit = (pxblit_t*)&dst_pixmap;

        if((int)dst_pixmap != -1)
            blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle;

        if( (int)src_pixmap != -1 &&
            (src_pixmap->flags & PX_MEM_MASK) != PX_MEM_SYSTEM)
            blit->src_pixmap = (pixmap_t*)src_pixmap->handle;

        io.handle   = srv_hw2d;
        io.io_code  = PX_BLIT;
        io.input    = blit;
        io.inp_size = 8;
        io.output   = NULL;
        io.out_size = 0;

        return call_service(&io);
    }

    dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ;
    src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ;

    src_clip.xmin = 0;
    src_clip.ymin = 0;
    src_clip.xmax = src_pixmap->width-1;
    src_clip.ymax = src_pixmap->height-1;

    dst_clip.xmin = 0;
    dst_clip.ymin = 0;
    dst_clip.xmax = dst_pixmap->width-1;
    dst_clip.ymax = dst_pixmap->height-1;

    if( !blit_clip(&dst_clip, &dst_x, &dst_y,
                   &src_clip, &src_x, &src_y,
                   &width, &height) )
    {
        color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x];
        color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x];

        while( height-- )
        {
            int w = width;
            color_t *tmp_src = src_addr;              
            color_t *tmp_dst = dst_addr;

            src_addr += src_pixmap->pitch/4;
            dst_addr += dst_pixmap->pitch/4;

            while( w >= 8)
            {
                __asm__ __volatile__ (
                "movq     (%0),   %%mm0\n"
                "movq    8(%0),   %%mm1\n"
                "movq   16(%0),   %%mm2\n"
                "movq   24(%0),   %%mm3\n"
                "movq   %%mm0,    (%1)\n"
                "movq   %%mm1,   8(%1)\n"
                "movq   %%mm2,  16(%1)\n"
                "movq   %%mm3,  24(%1)\n"
                :: "r" (tmp_src), "r" (tmp_dst)
                : "memory", "%mm0", "%mm1", "%mm2", "%mm3");
                w -= 8;
                tmp_src += 8;            
                tmp_dst += 8;
            };
            if( w >= 4 )
            {
                __asm__ __volatile__ (
                "movq     (%0),   %%mm0\n"
                "movq    8(%0),   %%mm1\n"
                "movq   %%mm0,    (%1)\n"
                "movq   %%mm1,   8(%1)\n"
                :: "r" (tmp_src), "r" (tmp_dst)
                : "memory", "%mm0", "%mm1");
                w -= 4;
                tmp_src += 4;
                tmp_dst += 4;
            };
            if( w >= 2 )
            {
                __asm__ __volatile__ (
                "movq     (%0),   %%mm0\n"
                "movq   %%mm0,    (%1)\n"
                :: "r" (tmp_src), "r" (tmp_dst)
                : "memory", "%mm0");
                w -= 2;
                tmp_src += 2;
                tmp_dst += 2;
            };
            if( w )
                *tmp_dst = *tmp_src;
        };
    };
    return ERR_OK;
};
В следующей версии аппаратным будет только блиттер. Всё остальное будет рисоваться в память и потом сбрасываться блиттером на экран.

Re: Новые драйвера для ATI Radeon.

Posted: Sat Sep 19, 2009 12:55 pm
by andrew_programmer
Serge

Меня удивил тот факт, что среди оберток системных вызовов в pixlib нет обёрток для функций копирования содержимомго экрана в память и функций для вывода содержимого памяти на экран. И я не понял, как осуществляется доступ к экрану. А сейчас, после утверждения, что библиотека всё-таки сама осуществляет доступ к экрану, более дотошно покопался в коде.

Code: Select all

.................
  #define  LFB_BASE   0xFE000000
.....................
     scrn_pixmap.width   = scrnsize >> 16;
     scrn_pixmap.height  = scrnsize & 0xFFFF;
     scrn_pixmap.format  = PICT_a8r8g8b8;
     scrn_pixmap.flags   = PX_MEM_LOCAL;
     scrn_pixmap.pitch   = scrnpitch;
     scrn_pixmap.mapped  = (void*)LFB_BASE; <----------------------------------------
Это получается, что из user-mode можно получить доступ к экрану и система не будет возражать? :shock: Я такого не ожидал...

Re: Новые драйвера для ATI Radeon.

Posted: Sat Sep 19, 2009 1:23 pm
by andrew_programmer
В следующей версии аппаратным будет только блиттер. Всё остальное будет рисоваться в память и потом сбрасываться блиттером на экран.
Это получается, что для нормального использования библиотеки придётся переделать оконный менеджер. Для каждого окна должен создаваться буфер размером с рабочую область окна. И после рисования в этом буфере он должен выводиться с учётом пересечения с другими окнами. И восстановление фона под окнами тоже он должен производить с учётом этих буферов. Иначе рисование напрямую на экране приведёт к коллизиям выводимых буферов.

Re: Новые драйвера для ATI Radeon.

Posted: Sat Sep 19, 2009 1:25 pm
by Mario
andrew_programmer
Если я не ошибаюсь, то рисование на экран напрямую рекомендовано исключительно для самого верхнего приложения в оконном стеке.
В случае полноэкранного приложения, например игры или видеоплеера разверного на весь экран, такое вполне нормально.

Re: Новые драйвера для ATI Radeon.

Posted: Sat Sep 19, 2009 1:33 pm
by andrew_programmer
В полно экранном случае вопросов нет. Но я не думаю, что у библиотеки будет столь узкая специализация для аппаратного ускорения. А для нормального применения придётся переделать оконный менеджер и возможно приложения.

Re: Новые драйвера для ATI Radeon.

Posted: Sat Sep 19, 2009 1:37 pm
by Serge
Это давно можно было сделать через селектор gs. А для упрощения я сделал доступными 8 Мб видеопамяти в user mode. Разумеется прямой доступ к видеопамяти некошерно для современных ОС поэтому "it should not be used by anyone". С другой стороны в Win программа может получить контекст для всего экрана и тоже рисовать в любом месте.

Re: Новые драйвера для ATI Radeon.

Posted: Wed Sep 23, 2009 12:09 am
by art_zh
Полный док по некоторым неслабым и нестарым чипсетам AMD (включая регистровую модель Radeon HD3200 и руководство разработчика BIOS)!
<https://wwwd.amd.com/amd/devsite.nsf/so ... _rs780.htm>
(регистрация через <http://wwwd.amd.com/amd/devsite.nsf/hom ... ment&login>)

Re: Новые драйвера для ATI Radeon.

Posted: Wed Sep 23, 2009 3:25 pm
by Serge
andrew_programmer

Для начала через аппаратный блиттер будет рисовать только верхнее окно. Остальные через вызов ядра. Если получится написать пиксельные шейдеры можно будет выводить все окна с отсечением по карте окон. Фактически это 8-ми битный трафарет/стенсил.

Re: Новые драйвера для ATI Radeon.

Posted: Wed Sep 23, 2009 8:04 pm
by andrew_programmer
Если получится написать пиксельные шейдеры можно будет выводить все окна с отсечением по карте окон. Фактически это 8-ми битный трафарет/стенсил.
Жаль только, что моя видеокарта не поддерживает пиксельных и вершинных шейдеров. А видеокарту в ноутбуке не смениш. :(

Re: Новые драйвера для ATI Radeon.

Posted: Tue Oct 27, 2009 1:27 am
by Serge
Всего полтора года и вот новый драйвер для всех :D :D :D видеокарт от Radeon 256 до Radeon HD 4xxx а также многочисленных IGP. В комплект входит адаптированное ядро.

Re: Новые драйвера для ATI Radeon.

Posted: Tue Oct 27, 2009 1:55 am
by Mario
Serge
Поздравляюсь с отлично проделанной работой. Искренне рад тому, что разработка не стояла на месте. Восхищаюсь твоим упорством.
Одна лишь горькая пилюля немного оттеняет радость победы - Nvidia, по крайней мере для меня.
Но, все равно я рад. Большое тебе спасибо за труд!

Re: Новые драйвера для ATI Radeon.

Posted: Tue Oct 27, 2009 5:48 am
by Heavyiron
Здорово, правда жалко, что у меня не завелось.
Последняя ночная сборка, поудалял демки и игрушки, заменил ядро, закинул atikms и atikms.dll в папку drivers, при загрузке выбрал режим 1024х1067х32, потом в проге run набрал: /sys/drivers/atikms -m 1280x1024 -l. Экран моргнул 1 раз но режим не поменялся. В vmode.kex - пусто, никаких режимов нет. Видео - встроенное HD 3200. Лог прилагаю.

Re: Новые драйвера для ATI Radeon.

Posted: Tue Oct 27, 2009 7:44 am
by <Lrz>
Serge
Спасибо за проделанную работу! У меня на ноуте IBM R51 видео ATI 7500 32 MB, не завелось. Прописывал как в автозагруку так и запускал через RUN. В обоих случаях, ноут подвисает, помогает только reset or shutdown. Лог не могу привести, т.к. нет раздела fat32. Пробовал под эмулятором, в обохи случаях система работала нормально, лог создавался c сообщением (device not found).