Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Физический адрес памяти видеокарты

2.7K
05 июля 2007 года
barracuda
76 / / 29.03.2004
Как получить без ДиректХ? (в XP)

Кинте линком а?
353
06 июля 2007 года
Nixus
840 / / 04.01.2007
Никак. Создавай окно на весь экран и рисуй все в него. Или, как вариант, получай девайс контекст (HDC) десктопа и рисуй в него. Но лучше все же с окном.
2.7K
09 июля 2007 года
barracuda
76 / / 29.03.2004
Зачем окно? тем более зачем HDC?
Мне нужен именно линейный адрес видео
353
09 июля 2007 года
Nixus
840 / / 04.01.2007
В том-то и дело, что никак. DirectX предназначен для расширения возможностей управления драйверами видео, звука и т.д. Поэтому может себе позволить проецировать память видеоадаптера на участок ОЗУ компютера.
Иначе только через GDI. Можно сделать DIB-секцию, и копировать байты пикселей в нее, а после того как кадр нарисован, делать блиттинг. Примерно так делает OpenGL. В любом случае без окна не обойтись.
2.7K
09 июля 2007 года
barracuda
76 / / 29.03.2004
Цитата: Nixus
В том-то и дело, что никак. DirectX предназначен для расширения возможностей управления драйверами видео, звука и т.д. Поэтому может себе позволить проецировать память видеоадаптера на участок ОЗУ компютера.
Иначе только через GDI. Можно сделать DIB-секцию, и копировать байты пикселей в нее, а после того как кадр нарисован, делать блиттинг. Примерно так делает OpenGL. В любом случае без окна не обойтись.


DirectDrawCreate(
SetCooperativeLevel(
CreateSurface(
Surface->Lock(

виртуальный адрес видеопамяти, и никаких окон, и никаких HDC

в общем я нашел один способ, на уровне ядра, но пока не проверял

Цитата:

invoke IoGetDeviceInterfaces, offset GUID_DEVINTERFACE_DISPLAY_ADAPTER, 0, DEVICE_INTERFACE_INCLUDE_NONACTIVE, offset pw
invoke RtlInitUnicodeString, offset uDevName, pw
invoke IoGetDeviceObjectPointer, offset uDevName, FILE_READ_DATA, offset FileObject, offset DeviceObject
invoke ExFreePool, pw
invoke KeInitializeEvent, offset event, NotificationEvent, FALSE
invoke IoGetAttachedDeviceReference, DeviceObject
mov targetObject, eax
invoke IoBuildDeviceIoControlRequest, IOCTL_VIDEO_MAP_VIDEO_MEMORY, targetObject, offset videoMemory, sizeof VIDEO_MEMORY, pVI, sizeof VIDEO_MEMORY_INFORMATION, FALSE, offset event, offset ioStatusBlock
mov _irp, eax
invoke IoCallDriver, targetObject, _irp
.if eax==STATUS_PENDING
invoke KeWaitForSingleObject, offset event, Executive, KernelMode, FALSE, NULL
.endif
invoke ObDereferenceObject, targetObject

353
09 июля 2007 года
Nixus
840 / / 04.01.2007
Цитата: barracuda

DirectDrawCreate(
SetCooperativeLevel(
CreateSurface(
Surface->Lock(
виртуальный адрес видеопамяти, и никаких окон, и никаких HDC


В SetCooperativeLevel передается хэндл окна.
Окно нужно всегда.
Во-первых для того чтобы полноэкранное приложения можно было свернуть и развернуть.
Во-вторых, т.к. тогда могут случиться нечайные запуски ярлыков на рабочем столе и т.д.. Курсор мыши продолжает функционировать, даже если он скрыт, не говоря о фокусе ввода с клавиатуры.

Цитата: barracuda

в общем я нашел один способ, на уровне ядра, но пока не проверял


А еще можно напрямую комманды драйверу отправлять, но так до BSOD недалеко. Я не стал бы так извращаться.

2.7K
09 июля 2007 года
barracuda
76 / / 29.03.2004
Да, должен передаваться, но передаю нулл
кроме того как известно десктоп не является окном в полном смысле этого слова
чтобы не срабатывали ярлыки корректно обрабатывать сообщения мыши/клавы надо
Но это все лирика, мне нужен был именно линейный адрес, более того в режиме ядра, потому директХ тут как бы второстепенен
353
09 июля 2007 года
Nixus
840 / / 04.01.2007
Цитата: barracuda
кроме того как известно десктоп не является окном в полном смысле этого слова


Я не говорил что это окно. Я говорил, что можно брать его HDC.
А device context можно использовать для блиттинга (разницы в скорости между этим методом и использованием direct x - не заметно невооруженным глазом).

Цитата: barracuda
Но это все лирика, мне нужен был именно линейный адрес, более того в режиме ядра, потому директХ тут как бы второстепенен


Ну что ж, может быть. Хотя если честно не могу представить для какой задачи может быть нужен линейный адрес в редиме ядра. Это ненадежно.
-----------------------------------
Но я вас ни к чему не склоняю. :)

2.7K
10 июля 2007 года
barracuda
76 / / 29.03.2004
Но я и не беру HDC :)
У меня задача снять картинку с монитора так чтобы не мешать оператору.
Разница заметна если использовать память напрямую, и даже невооруженным глазом.
К примеру когда лочишь поверхность исчезает курсор. (на некоторых видюхах). Тоже самое при работе с контекстом. И это сильней заметно когда используются графические программы например WinCC. Если же работать напрямую с памятью курсор не исчезнет. Только есть вероятность попасть в период обновления экрана, картинка может быть смазанной.
И как раз о надежности и идет речь, так как я обнаружил, что не на всех видюхах можно использовать директХ, к примеру, на серверах у которых видюха встроенная, а видов и типов компьютеров у меня много. Поэтому нужен универсальный метод.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог