Кто подскажет как сделать следующее: - гарантировано создать тескстуру в видео памяти - получить адрес (виртуальный достаточно) буфера созданной текстуры Сейчас я это делаю вызовами: - CreateTexture() с D3DPOOL_DEFAULT и D3DUSAGE_DYNAMIC - LockRect() на разных адаптерах, к сожалению, приводит к разным результатам.
Гарантированно? Как дрова сделают и как директ это их внутреннее дело. D3DPOOL_DEFAULT — это любая память в том числе и видео и ОЗУ и AGP. D3DPOOL_MANAGED - наверняка в видеопамяти. Получить буфер созданной текстуры через LockRect(), как ты и делаешь. А в чем заключаются "разные результаты"?
в том что на nVidia FX3500 я получаю непрерывную видеопамять а на FX3700 - обычный RAM, причем сегментированный мне надо получить непрерывный буфер для non-scatter-gather DMA
ik01 У тебя есть DirectX Sdk? 9b Теперь про непрерывность: То есть придерживаешься питча, (то есть расстояния между строками) и всё Ok. Остальные версии DirectX сейчас обсуждать не готов, в данный момент нет доступа.
Питч к непрерыности памяти не имеет никакого отношения. Под непрерыностью я имею в виду непрерывность физической адресации. В случае если текстура размещена в RAM - каждая страница (4К) размещена по-своему и физический адрес первых 4К может быть и больше адреса вторых 4К. А уж вероятность того, что PhysAddres( buffer ) +4K == PhysAddres( buffer + 4K ) вообще нулевая. Для меня же это обязательно. Насчет DirectX SDK. В той же документации сказано: D3DPOOL_DEFAULT Resources are placed in the memory pool most appropriate for the set of usages requested for the given resource. This is usually video memory, including both local video memory and AGP memory. К сожалению поведение неопределено - AGP memory это RAM. Мой вопрос был в том - можно ли заставить DirectX создавать текстуру гарантировано в video memory
Обнаружилась еще более интересная вещь. Тестировалась nvidia quadro FX 3500. Если высота создаваемой текстуры кратна 2-м - буфер создается в RAM'e. Если нет - в видео-памяти...