OSDev

для всех
Текущее время: 29 мар 2024, 02:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 13 май 2018, 21:32 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 14:26 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
grenders22 писал(а):
SII писал(а):
Никаких. Попиксельно будет ещё медленнее.


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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 16:50 

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

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


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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 19:18 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Для начала проясни, в каком режиме у тебя работает процессор и включен ли страничный режим. Какой язык программирования и компилятор используется. Потом я может подберу нужные фрагменты кода, благо они короткие.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 19:20 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 19:30 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
В ДОСе рисовали 8-битными пикселями с палитрой. А у нас тут 16-32 бит на пиксель. Кстати, сколько использует grenders22?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 19:46 

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

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

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


Последний раз редактировалось grenders22 14 май 2018, 19:52, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 19:50 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Код:
#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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 21:41 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: memcpy
СообщениеДобавлено: 14 май 2018, 22:05 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Когда включишь "write-combining", то единственный эффект который (возможно) будет волновать, это вертикальная синхронизация при перезаписи кадра.
Да, после вставки того фрагмента кода, надо всем виртуальным страницам, через которые отобразил видеопамять, задать биты атрибутов - там указано в комментариях.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB