OSDev http://osdev.su/ |
|
memcpy http://osdev.su/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/ |