OSDev
http://osdev.ru/

memcpy
http://osdev.ru/viewtopic.php?f=6&t=2384
Страница 2 из 2

Автор:  Himik [ 13 май 2018, 21:32 ]
Заголовок сообщения:  Re: memcpy

grenders22 писал(а):
Куда копать, чтобы сделать это? Я так понял PAT это страничная?

Должен быть страничный режим, но таблица PAT настраивает только атрибуты кэширования. Таблица PAT находится в системных регистрах процессора, типа MSR.
Здесь это периодически обсуждается.
viewtopic.php?f=5&t=1014&hilit=MTRR+PAT&start=10
viewtopic.php?f=7&t=834&hilit=MTRR+PAT&start=10
viewtopic.php?f=6&t=1134&hilit=MTRR+PAT&start=10

Автор:  SII [ 14 май 2018, 14:26 ]
Заголовок сообщения:  Re: memcpy

grenders22 писал(а):
SII писал(а):
Никаких. Попиксельно будет ещё медленнее.


Если нет альтернатив, то как строить этот "мост" между озу и видеопамятью?


Если стоит задача готовить кадр силами центрального процессора (т.е. без использования ГП на видюхе -- а именно так и приходится делать в Вашем случае, поскольку, даже если документация на ГП открыта, сделать свой драйвер будет архисложно), то надо сначала полностью подготовить новый кадр в обычном ОЗУ, а затем скопировать его в видеопамять либо одной-единственной операцией копирования (сразу весь буфер), либо построчно (это выгодней, если под каждую строку в данном видеорежиме выделено больше памяти, чем фактически необходимо для хранения пикселей: в этом случае достигается экономия за счёт того, что копируются только нужные данные). Благодаря этому на каждый кадр будет выполняться лишь одно копирование, без которого в любом случае не обойтись.

Если есть возможность переключать страницы видеопамяти, то, возможно, будет полезно использовать две видеостраницы. Тогда изображение всё равно готовится в обычном ОЗУ, потом копируется в ту страницу, которая сейчас неактивна, после чего видеоконтроллеру выдаётся ЦУ переключить страницы (использованием соответствующей функции BIOS, скорей всего). В данном случае скорость может оказаться выше, чем при использовании одной страницы, за счёт того, что видеоконтроллер, осуществляя вывод кадра на экран, обращается к одной области видеопамяти, а ЦП в процессе копирования -- к другой, и если физически эти страницы доступны независимо, эти обращения можно будет выполнять параллельно.

Автор:  grenders22 [ 14 май 2018, 16:50 ]
Заголовок сообщения:  Re: memcpy

SII писал(а):
Благодаря этому на каждый кадр будет выполняться лишь одно копирование, без которого в любом случае не обойтись.

Если есть возможность переключать страницы видеопамяти, то, возможно, будет полезно использовать две видеостраницы.


Вот сейчас я так и выполня. построчно, но все же этого не достаточно для оптимизации. Обновляю нужный прямоугольник, тоесть не весь экран с помощью memcpy

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

Автор:  Himik [ 14 май 2018, 19:18 ]
Заголовок сообщения:  Re: memcpy

Для начала проясни, в каком режиме у тебя работает процессор и включен ли страничный режим. Какой язык программирования и компилятор используется. Потом я может подберу нужные фрагменты кода, благо они короткие.

Автор:  SII [ 14 май 2018, 19:20 ]
Заголовок сообщения:  Re: memcpy

Переключать-то возможно, вопрос в том, как это делать :) Поскольку я под ПК не пишу сто лет, а с VESA вообще дела никогда не имел, ничего конкретного сказать и не могу. Но вот сильные тормоза при программной реализации графики выглядят откровенно странно. Как ни крути, а современные процы, память и шины существенно быстрей того, что было 20-30 лет назад. Однако делали ж игры целиком на ЦП -- и проблем с обновлением картинки не возникало. Такое впечатление, что что-то где-то недонастроено по железу...

Автор:  Himik [ 14 май 2018, 19:30 ]
Заголовок сообщения:  Re: memcpy

В ДОСе рисовали 8-битными пикселями с палитрой. А у нас тут 16-32 бит на пиксель. Кстати, сколько использует grenders22?

Автор:  grenders22 [ 14 май 2018, 19:46 ]
Заголовок сообщения:  Re: memcpy

Himik писал(а):
Для начала проясни, в каком режиме у тебя работает процессор и включен ли страничный режим. Какой язык программирования и компилятор используется. Потом я может подберу нужные фрагменты кода, благо они короткие.

Страничный режим включен, язык си в основном, 32 битный режим (800х600 и 1366х768, оба режима пробую смотрю разницу), компилятор - i686-elf-gcc.

К слову, получаю очень странный отклик при попытке memcpy из озу в видео память, он не срабатывает пока нет отклика от клавы или мыши. Для тестирования пробовал попиксельно весь экран выводить, тут без нареканий, но долго.

Автор:  Himik [ 14 май 2018, 19:50 ]
Заголовок сообщения:  Re: memcpy

Код:
#define UCHAR unsigned char
#define MSR_IA32_CR_PAT 0x277
#define asm_rdmsr(ecx, eax, edx)  asm volatile("rdmsr" : "=a" (eax), "=d" (edx) : "c" (ecx))
#define asm_wrmsr(ecx, eax, edx)  asm volatile("wrmsr" : : "c" (ecx), "a" (eax), "d" (edx))

   //Установить тип кэширования "write-combining" для ускорения видеопамяти.
   //Для этого устанавливаем регистр MSR PAT, элемент 1 (биты 8,9,10) значение 1
   //При использовании видеопамяти, виртуальная страница должна иметь атрибуты PAT=0, PCD=0, PWT=1.
   unsigned int eax, ecx, edx;
   if(CPUFeatures & 0x10000) //Проверка поддержки PAT в процессоре
   {
      ecx = MSR_IA32_CR_PAT;
      asm_rdmsr(ecx, eax, edx);
      ((UCHAR*)&eax)[1] = 1; //"write-combining"
      asm_wrmsr(ecx, eax, edx);
   }


Код:
((UCHAR*)&eax)[1]

буквально означает регистр AH.

Автор:  grenders22 [ 14 май 2018, 21:41 ]
Заголовок сообщения:  Re: memcpy

Я прошу прощения за открытие этой темы. Я ну очень сильно тупанул, при доступе к видео памяти я забыл об указателе. Т.е. залез в давно забытый код и О ЧУДО. Спасибо SII, вы натолкнули на проверку старого кода. В общем и смешно и грустно, очень грустно. Теперь отображение "картинки" на железе не отстает от виртуалки, что радует.

Несмотря на все выше перечисленное, отображение хоть и быстрое, но не плавное, имеются претензии. Тут помогут ваши советы с оптимизацией. За это большое спасибо!

Автор:  Himik [ 14 май 2018, 22:05 ]
Заголовок сообщения:  Re: memcpy

Когда включишь "write-combining", то единственный эффект который (возможно) будет волновать, это вертикальная синхронизация при перезаписи кадра.
Да, после вставки того фрагмента кода, надо всем виртуальным страницам, через которые отобразил видеопамять, задать биты атрибутов - там указано в комментариях.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/