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

Drivers for various video cards
  • У меня вопрос.

    Code: Select all

         srv_hw2d = get_service("HDRAW");
    
           if(srv_hw2d == 0)
    
             srv_hw2d = load_service("/rd/1/drivers/ati2d.drv");
    
    
    
         return TRUE;
    Это получается, что даже если драйвер не загрузиться, то результат инициализации всё равно положительный. Библиотека pixlib работает и без загруженного драйвера.Значит что-то эмулирует работу сервиса драйвера на уровне ядра. Я правильно понял или нет ?
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • 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;
    };
    В следующей версии аппаратным будет только блиттер. Всё остальное будет рисоваться в память и потом сбрасываться блиттером на экран.
  • 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: Я такого не ожидал...
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • В следующей версии аппаратным будет только блиттер. Всё остальное будет рисоваться в память и потом сбрасываться блиттером на экран.
    Это получается, что для нормального использования библиотеки придётся переделать оконный менеджер. Для каждого окна должен создаваться буфер размером с рабочую область окна. И после рисования в этом буфере он должен выводиться с учётом пересечения с другими окнами. И восстановление фона под окнами тоже он должен производить с учётом этих буферов. Иначе рисование напрямую на экране приведёт к коллизиям выводимых буферов.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • andrew_programmer
    Если я не ошибаюсь, то рисование на экран напрямую рекомендовано исключительно для самого верхнего приложения в оконном стеке.
    В случае полноэкранного приложения, например игры или видеоплеера разверного на весь экран, такое вполне нормально.
  • В полно экранном случае вопросов нет. Но я не думаю, что у библиотеки будет столь узкая специализация для аппаратного ускорения. А для нормального применения придётся переделать оконный менеджер и возможно приложения.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Это давно можно было сделать через селектор gs. А для упрощения я сделал доступными 8 Мб видеопамяти в user mode. Разумеется прямой доступ к видеопамяти некошерно для современных ОС поэтому "it should not be used by anyone". С другой стороны в Win программа может получить контекст для всего экрана и тоже рисовать в любом месте.
  • Полный док по некоторым неслабым и нестарым чипсетам AMD (включая регистровую модель Radeon HD3200 и руководство разработчика BIOS)!
    <https://wwwd.amd.com/amd/devsite.nsf/so ... _rs780.htm>
    (регистрация через <http://wwwd.amd.com/amd/devsite.nsf/hom ... ment&login>)
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • andrew_programmer

    Для начала через аппаратный блиттер будет рисовать только верхнее окно. Остальные через вызов ядра. Если получится написать пиксельные шейдеры можно будет выводить все окна с отсечением по карте окон. Фактически это 8-ми битный трафарет/стенсил.
  • Если получится написать пиксельные шейдеры можно будет выводить все окна с отсечением по карте окон. Фактически это 8-ми битный трафарет/стенсил.
    Жаль только, что моя видеокарта не поддерживает пиксельных и вершинных шейдеров. А видеокарту в ноутбуке не смениш. :(
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Всего полтора года и вот новый драйвер для всех :D :D :D видеокарт от Radeon 256 до Radeon HD 4xxx а также многочисленных IGP. В комплект входит адаптированное ядро.
  • Serge
    Поздравляюсь с отлично проделанной работой. Искренне рад тому, что разработка не стояла на месте. Восхищаюсь твоим упорством.
    Одна лишь горькая пилюля немного оттеняет радость победы - Nvidia, по крайней мере для меня.
    Но, все равно я рад. Большое тебе спасибо за труд!
  • Здорово, правда жалко, что у меня не завелось.
    Последняя ночная сборка, поудалял демки и игрушки, заменил ядро, закинул atikms и atikms.dll в папку drivers, при загрузке выбрал режим 1024х1067х32, потом в проге run набрал: /sys/drivers/atikms -m 1280x1024 -l. Экран моргнул 1 раз но режим не поменялся. В vmode.kex - пусто, никаких режимов нет. Видео - встроенное HD 3200. Лог прилагаю.
    Attachments
    ATIKMS.LOG (4.11 KiB)
    Downloaded 201 times
  • Serge
    Спасибо за проделанную работу! У меня на ноуте IBM R51 видео ATI 7500 32 MB, не завелось. Прописывал как в автозагруку так и запускал через RUN. В обоих случаях, ноут подвисает, помогает только reset or shutdown. Лог не могу привести, т.к. нет раздела fat32. Пробовал под эмулятором, в обохи случаях система работала нормально, лог создавался c сообщением (device not found).
  • Who is online

    Users browsing this forum: No registered users and 1 guest