DirectDraw и размер строки в видеокарте
Видео карта S3 Graphics ProSavage DDR 8D04
разрешение 1280х1024х32
Хочу, к примеру, стереть две верхних строки пишу:
lpPrimarySurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
memset(ddsd.lpSurface, 0, ddsd.lPitch * 2); //2 строки
lpPrimarySurface->Unlock(ddsd.lpSurface);
Результат стирается первая, половина 15-й и половина 2-й
ddsd.lPitch равен 1280 * 4 = 5120 (проверял)
Короче что это за режим такой:
0-я строка
пол 16-й строки
1-я строка
пол 17-й строки
....
16-я строка
пол 32-й строки
17-я строка
пол 33-й строки
Тоесть первые пол 16-й строки повторяется ниже но уже полностью.
Где об этом (в каких структурах) можно узнать?
Вообщето, насколько я помню такие манипуляции для оффскринов делаются....
Можно просто создать оффскрин из двух черных строк и просто наложить его на прайм
Да не, вообще то DirectDraw тут не причем.
Я проверил по физическим адресам видюхи (драйвер спецом написал) - то же самое, каждая новая строка выравнивается по 0x2000 байт а сама строка 0x1400 байт.
Странно что DirectDraw в структуре DDSURFACEDESC.lPitch возвращает 0x1400
SDK пишет:
lPitch
Specifies the number of bytes between the beginnings of two adjacent scan lines; that is, the number of bytes to add to the beginning address of one scan line to reach the beginning address of the next scan line below it. The driver's DdCreateSurface callback must return this value.
то есть растояние до следующей строки...
Буфер у меня один, дисплеймод я не устанавливаю, беру то что в винде настроено, CooperativeLevel без разницы какой, результат тот же.
Фигня какая то...
Вообщето, насколько я помню такие манипуляции для оффскринов делаются....
Можно просто создать оффскрин из двух черных строк и просто наложить его на прайм
Ну, задача у меня более сложная :) Это только пример я такой привел.
А вообще необходимо именно с памятью работать напрямую...
Я проверил по физическим адресам видюхи (драйвер спецом написал) - то же самое, каждая новая строка выравнивается по 0x2000 байт а сама строка 0x1400 байт.
Странно что DirectDraw в структуре DDSURFACEDESC.lPitch возвращает 0x1400
SDK пишет:
то есть растояние до следующей строки...
Буфер у меня один, дисплеймод я не устанавливаю, беру то что в винде настроено, CooperativeLevel без разницы какой, результат тот же.
Фигня какая то...
Ну, задача у меня более сложная :) Это только пример я такой привел.
А вообще необходимо именно с памятью работать напрямую...
Ну то,что 0x1400 - DDraw по-вилимому выравнивает по DWORD: 0x1400=1280*4, а чтобы выравнивание было сделано по-другому,еще не сталкивался. Во всяком случае в описании DDraw упоминание о таких ситуаций не встречал. Может скинешь исхоник, проверю у себя, интересно даже стало...:)