Протестите код

Тема в разделе "WASM.NT.KERNEL", создана пользователем PROFi, 12 окт 2007.

  1. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    _BC_

    Протестить сейчас не могу - комп не тот, но как доберусь попробую. Извини за отсутствие - переезжал с одной квартиры на другую.

    Про твой подход к выводу на экран - работа проделана значительная, но к сожалению (вот сейчас ATI RAGE 128 expert - очень старая, но мой драйверок вывел картинку и на ней хм.. а твой конечно же ничего не выведет)


    Кстати 25 буду в Москве ...
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    2ой аттач заработал. 3ий не смотрел.
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    последний кстати только для gf 8xxx.

    Пока судя по предварительным результатам, работает везде кроме 8xxx. Подожду как владельцы 8800GTS потестят последний аттач, пока же попробую добавить поддержку ATi.
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    _BC_

    пока же попробую добавить поддержку ATi.

    Ну тогда покроешь 85% современных карт что есть хорошо.

    Подожду как владельцы 8800GTS потестят последний аттач
    После 28, раньше не доберусь.
     
  5. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    похоже, что на gf8 драйвера вообще отрубают доступ к регистрам, с которыми работает VBE. Даже старые, совместимые с VGA, регистры CRT-контроллера содержат в себе фейк -- как будто бы выставлен классический режим 640x480x16.

    Найти бы кого-нть с GeForce 8400*, 8500*, 8600* для теста. Если на них то же самое, что и на 8800 -- то проще будет купить самую дешевую gf8-карту и поэкспериментировать с ней вживую. 8400GS стоит порядка 50$. Только надо убедиться, что она по нужным регистрам совместима с 8800, т.е. если на ней тест не сработает -- значит совместима. ;)

    На ати нужны видеобиосы к новым картам, пока почти разобрался как работать с "первым поколением", вплоть до X700. С новыми гораздо легче т.к. на них теперь есть даташиты, правда довольно аскетичные, поэтому видеобиос всё же не помешает.
     
  6. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Мож прямой доступ к VRAM через DirectDraw, поможет чем нибудь.
    Код (Text):
    1. #include "ddraw.h"
    2. HWND ghWnd,mhWnd;
    3. short * scr;
    4. bool appAct = false;
    5.  
    6.     IDirectDraw * DirDraw;
    7.     LPDIRECTDRAWSURFACE  DSurface;
    8.     DDSURFACEDESC        DDSD;
    9.    
    10. int _fastcall Random (int val)
    11. {
    12.     static int RndSeed;
    13. __asm {
    14.     Mov Eax, ecx
    15.     IMUL    EDX,RndSeed,0x8088405
    16.     INC     EDX
    17.     MOV     RndSeed,EDX
    18.     MUL     EDX
    19.     MOV     EAX,EDX  }
    20. }
    21.  
    22. void OpenDD ()
    23. {
    24.  
    25.     DirectDrawCreate (0, &DirDraw,0);
    26.     DirDraw->SetCooperativeLevel (mhWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
    27.  
    28.     DDSD.dwSize            = sizeof(DDSD);
    29.     DDSD.dwFlags           = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    30.     DDSD.ddsCaps.dwCaps    = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |  DDSCAPS_COMPLEX;
    31.  
    32.     DDSD.dwBackBufferCount = 1;
    33.     DirDraw->CreateSurface(&DDSD, &DSurface, 0);
    34.  
    35.     DSurface->Lock (0, &DDSD, 0, 0);
    36.     DSurface->Unlock(DDSD.lpSurface);
    37.     scr = (short*)DDSD.lpSurface;
    38.     appAct = true;
    39. }
    40.  
    41. CloseDD ()
    42. {
    43.     appAct = false;
    44.     Sleep (100);
    45.     DSurface->Release();
    46.     DirDraw->Release();
    47. }
    48.  
    49. /* main window procedure */
    50. long _stdcall MainWndProc
    51. ( HWND    hWnd, UINT    uMsg,  WPARAM  wParam,  LPARAM  lParam)
    52.  
    53. {
    54.  
    55.     switch (uMsg) {
    56.  
    57.     case WM_CREATE:
    58.         mhWnd = hWnd;
    59.         OpenDD ();
    60.         break;
    61.  
    62.     case WM_CLOSE:
    63.     close:
    64.         DestroyWindow (hWnd);
    65.         break;
    66.  
    67.     case WM_DESTROY:
    68.  
    69.         CloseDD ();
    70.         PostQuitMessage (0);
    71.         break;
    72.  
    73.     case WM_KEYDOWN:
    74.         switch (wParam)
    75.         { case VK_ESCAPE: goto close;
    76.         }
    77.     }
    78.  
    79.     return DefWindowProc (hWnd, uMsg, wParam, lParam);
    80. }
    81.  
    82. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    83.                                          LPSTR lpCmdLine, int nCmdShow)
    84. {
    85.  
    86.     char szAppName[]="WIN32APP";
    87.     MSG        msg;
    88.     WNDCLASS   wndclass;
    89.     /* Register the frame class */
    90.     wndclass.style         = 0;
    91.     wndclass.lpfnWndProc   = &MainWndProc;//(WNDPROC)
    92.     wndclass.cbClsExtra    = 0;
    93.     wndclass.cbWndExtra    = 0;
    94.     wndclass.hInstance     = hInstance;
    95.     wndclass.hIcon         = 0;
    96.     wndclass.hCursor       = LoadCursor (NULL,IDC_ARROW);
    97.     wndclass.hbrBackground = 0;
    98.     wndclass.lpszMenuName  = szAppName;
    99.  
    100.     wndclass.lpszClassName = szAppName;
    101.  
    102.     if (!RegisterClass (&wndclass) )
    103.         return false;
    104.  
    105.     /* Create the frame */
    106.     ghWnd = CreateWindow (szAppName,
    107.              szAppName,//"DDraw APP",
    108.              WS_POPUP,
    109.              0,//CW_USEDEFAULT,
    110.              0,//CW_USEDEFAULT,
    111.          GetSystemMetrics(SM_CXSCREEN),
    112.          GetSystemMetrics(SM_CYSCREEN),
    113.              0,//NULL,
    114.              0,//NULL,
    115.              0,//hInstance,
    116.              0);
    117.  
    118.     ShowWindow   (ghWnd, SW_SHOW);
    119.     UpdateWindow (ghWnd);
    120.  
    121. while (true)
    122. {
    123.        if (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))
    124.         {
    125.             if (GetMessage(&msg, 0, 0, 0) )
    126.             {
    127.                 TranslateMessage(&msg);
    128.                 DispatchMessage(&msg);
    129.             }  else
    130.          return  true;
    131.         }
    132.  
    133.       if (appAct) scr[ Random (800*600)] = Random (65535);
    134. }
    135.     return 0;
    136. }
     
  7. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    MX 200 всё штатно режимы 32/16 1024
     
  8. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Here it comes ATI!
    Поддержку сделал для всех карт (точнее, кроме начала 90-х гг.), но для новых опять-таки не отлаживал и не тестил, может сглюкнуть по моей вине. Под новыми в данном случае понимаются те, что старше X1300.

    ATI в отличие от нвидии на свои девайсы не выкладывает списки ID'шников, поэтому брал их с pciids, там довольно мутноватый формат имен и нет некоторых новых карт (еще не добавили походу). Впрочем, вывод имен карт -- фича чисто бонусная, имена карт изначально можно было и не выводить. ;)

    С 8ххх скорее всего буду решать вопрос покупкой 8400GS, если она окажется совместимой с 8800 по юзаемым регистрам.

    [see newer version below]
     
  9. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    8500 GT/8800 GTS 640M An error occured while drawing

    З.Ы. Разрешение экрана [from hardware] определяет неправильно?

    Мля.. это ж для ati :)
     
  10. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    тему невнимательно читал. ;) На данный момент поддержка для всех ати, которую почему-то никто не тестит (я тестил на X700 Pro и на IGP Radeon Xpress 200M) и всех нвидий кроме gf 8xxx, поддержка которых на очереди.

    На gf8 это больше, чем вопрос принципа -- на них не работают ring0-отладчики, странно, что это еще мало кто заметил.
     
  11. Guest

    Guest Guest

    Публикаций:
    0
    Ноут с Xpress 200M, работает нормально - 1280х800/32
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    раздобыл 8400GS и уже немного успел ее "пощупать за вымя". Изменения по сравнению с предыдущими картами -- весьма существенные. Большинство нововведений проистекает от драйверов, но есть и кое-что принципиально новое. Это новое было известно заранее, от разбора видеобиоса, поэтому на системе без установленных драйверов к 8400GS тест успешно заработал. Я чуть было не успел расстроиться, подумав, что выкинул на ветер 1400р. ;) Но после установки прилагающихся драйверов всё встало на свои места.

    Итак, что мы имеем:

    - r0-отладчики действительно не работают, как и было обещано. Для этого не надо ничего особенного, типа висты, аеро, каких-либо специфичных настроек и тп -- ничего такого. Обыкновенная XP SP2, DirectX 9c, обыкновенные драйвера c диска, дефолтные настройки -- и понеслось, по кочкам. ;)

    - фреймбуфер более не находится в видеопамяти. ;) BAR в +14h в pci conf по-прежнему указывает на видеопамять, но для того, чтобы добраться до фреймбуфера, надо брать базу из +1Ch, которая указывает на некий диапазон размером 32Мб, в котором и находится фреймбуфер. Возможно, что он отображается на какую-то часть основного диапазона, не проверял. Но та же VBE c gf8xxx берет базу фреймбуфера исключительно из +1Ch.

    - фреймбуфер начинается не с начала этой базы -- та самая "вторая составляющая". Что VBE, что драйвера винды используют смещение +1000000h, т.е. +16Мб. Таким образом, адрес экранной поверхности теперь получается как сумма 3х слагаемых: вышеупомянутый BAR из pciconf[1Ch] + 1000000h + cмещение primary surface.

    - самое интересное теперь -- структура фреймбуфера. Нвидиавские драйвера включают весьма мутный режим, в котором фреймбуфер нелинеен. Теперь экран разбивается на квадратные tile'ы, внутри которых довольно замысловатое распределение пикселов. На эту тему наверное тисну небольшую статейку, с картинками и алгоритмом преобразования экранных координат в смещение во фреймбуфере. Алго пока довольно громоздкий, но можно сделать 100%-табличным. Сами тайлы идут во фреймбуфере линейно, как раньше пикселы, т.е. слева направо, сверху вниз, а вот внутри тайла уже начинается искривление пространства. ;) Ни за что б не подумал, что после того, как ушли в забвение битовые плоскости, защелки, и прочая планарная хренатень, может понадобится столько возни, чтобы нарисовать банальную горизонтальную линию пикселов.

    - драйвера блокируют многие интересные регистры, среди которых и те, которые используются VBE-функциями. Это на данный момент самая главная проблема. С этих залоченных регистров как раз и получались адрес и характеристики primary surface для прямого рисования во фреймбуфере. Собственно рисовать в нем я уже научился, надо только узнать, как снимать эту залочку с регистров. Как отключать tile-режим уже тоже (скорее всего) известно, но чтобы это сделать, надо опять-таки добраться до регистров.
     
  13. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    Теперь будешь бомбить RivaTuner? :)
     
  14. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    скорее всего сами драйвера. В риватюнере этого возможно и нет, хотя проверить безусловно стоит. ;)
     
  15. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    _BC_

    На gf8 это больше, чем вопрос принципа -- на них не работают ring0-отладчики, странно, что это еще мало кто заметил.

    Заметили и не один раз - посмотри в форуме. Кстати я начал интерисоваться вопросом вывода на экран именно по этой причине.
    http://www.wasm.ru/forum/viewtopic.php?id=21398
    и
    http://www.wasm.ru/forum/viewtopic.php?id=22678

    Инет накрылся пишу строчки из И-клуба.

    GF 8800 - не работает

    похоже, что на gf8 драйвера вообще отрубают доступ к регистрам, с которыми работает VBE.

    С этим явлением встречался еще в VBIOS от старых карточек S3 64V+
    Кстати SAVE_STATE и RESTORE_STATE в BIOS 8800 почему-то тоже не сохраняют текущий экран правильно - т.е. если насильно перейти в реальный режим, потом сохранить текущий видеорежим, включить текстовый, потом опять восстановить сохранение, то режим не восстанавливается.

    Лучше протестить на HD 2900 поскольку скорее всего такое поведение VGA CRT - есть подозрение на защиту контента от копирования.


    PS: похоже лучше соединить 2 технологии в одном драйвере для устойчивого вывода на экран, но твоя определенно может иметь приимущества (как и недостатки).
    Исходники драйвера не прилагаются ? :)
     
  16. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    ну их поддержка ща вроде есть, только пока никто не нашелся, кто бы эту поддержку проверил, на HD2900.

    Насчет защиты от копирования -- там нет ничего такого. AFAIK их больше волновало как защитить передаваемый по кабелю до монитора/телека сигнал, а не как защитить FB от скриншотов и рисования. ;)

    На данном этапе я могу рисовать и делать скриншоты с FB и в tile-режиме. Т.е. если как раньше, предварительно брать инфу об экране от ОС, а затем рисовать -- то больше ничего для счастья и не надо. Софтайс также можно пропатчить, чтобы он научился выводить на экран в тайлах. Судя по проявляющимся видеоглюкам, у него еще тоже проблемы с базой экрана в FB, т.к. на экран у него попадают явно не все пикселы.

    Там просто хитрая структура FB, которую надо либо учитывать, либо отключать на время вывода в FB, переводя в линейный режим. На это проще всего пропатчить софтайс -- чтобы он перед рисованием вырубал tile-mode и затем уже рисовал себя. Аналогично включать на выходе, после восстановления куска FB. Если это прокатит, то выглядеть будет довольно забавно -- нажимается ctrl+d. появляется айс, его окошко выглядит как обычно, а вот экран на фоне капитально запарафинился. ;) Но при выходе из SI нормально восстанавливается в исходное состояние.

    А у тебя похоже были проблемы с получением адреса фреймбуфера, потому что несмотря на всю хитром#$%сть, flood fill всего экрана -- срабатывает. Я с этого и начал -- последовательное заполнение всего фреймбуфера, с небольшой задержкой, чтобы можно было наглядно видеть, каким образом пикселы попадают на экран.

    Исходники непременно будут, как только разберусь с заветной дверцей на gf8 и приведу их в божеский вид. ;)
     
  17. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    PROFi
    Кстати,возможно по этой причине иногда при частом переключении на 8800 бывает черный экран.Только перезагрузка спасает.
     
  18. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    _BC_

    как защитить передаваемый по кабелю до монитора/телека сигнал
    Не совсем так, имея доступ к регистрам карты можно читать ключ (тот который для шифрования посылается и монитором и видеокарточкой). Но вряд ли это поможет НО ВЕДЬ МОЖНО ПОДСУНУТЬ ВИРТУАЛЬНЫЙ МОНИТОР.

    на время вывода в FB, переводя в линейный режим.
    Абсолютно точно в GeForce 8800 перевод осущетвляется DirectDraw Surface Lock метод, т.е. если наклепать простенькое приложение пользовательского режима которое захватывает весь экран для прямого вывода и полсле Lock допустим завесить его back: jmp back
    то мой предыдущий отладчик исправно рисовал в FB и последний был линейным. Это кстати наиболее перспективный метод, поскольку полагаться на DrvCopyBits при работе с 3D графикой весьма проблематично FB не всегда вообще совпадает с тем что нашел (даже по смещению 1Сh) - это пройденный этап.

    Так что с исходниками. :)

    Кстати монитор новый купил 1600х1200 (LCD) а у тебя выдает прога вот что см аттач
     
  19. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    _BC_
    сделай в своей проге кнопку копирования инфы, чтобы данные ручками не перебивать

    итак, ATI Radeon Mobility X1400

    "An error occured while drawing"

    Разрешение "from hardware" показывает неправильно: 2160x1250 вместо 1920x1200
     
  20. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    PROFi
    поздравляю, повторю свой пост:
    На данный момент поддержка <...> и всех нвидий кроме gf 8xxx, поддержка которых на очереди.

    Jupiter
    ага, наконец-то новый ati. ;)
    проще скриншот окошка проги сделать вообще-то. ;) Ладно, добавлю copy to clipboard.
    а остальная инфа какая? В принципе, по разрешению уже догадываюсь, где надо фиксить.