Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 11.12.06 10:15
Оценка:
Всем привет.
Не знаю подходящий ли форум, но тем не менее.
Столкнулся с такой проблемой, что не знаю, как мне узнать поподробнее об ошибке которая у меня происходит при создании девайса Direct3D, т.е. при вызове функции CreateDevice(). HRESULT о многом не говорит, поэтому хотелось бы узнать, есть ли возможность получить подробное строковое описание ошибки? Когда я немного работал с COM, видел интерфейс IErrorInfo, но как его подцепить к D3D я не знаю.
Re: Получение строки ошибки в DirectX
От: МЪ www.morock.narod.ru
Дата: 11.12.06 13:08
Оценка:
Здравствуйте, Wallrunner, Вы писали:

W>Столкнулся с такой проблемой, что не знаю, как мне узнать поподробнее об ошибке которая у меня происходит при создании девайса Direct3D, т.е. при вызове функции CreateDevice(). HRESULT о многом не говорит, поэтому хотелось бы узнать, есть ли возможность получить подробное строковое описание ошибки? Когда я немного работал с COM, видел интерфейс IErrorInfo, но как его подцепить к D3D я не знаю.


Попробуйте так:

HRESULT hr;
hr = g_pD3D->CreateDevice(...);
const WCHAR  * chErrorDesc;
chErrorDesc = DXGetErrorDescription9(hr);
printf("Reason: %S.\nApplication work finished with error. Press any key for exit...", chErrorDesc);


Есть еще DxgetErrorString9();
Now some men like the fishing
And some men like fowling
And some men like to hear
The cannonballs are roaring
Me — I like sleeping...
Re[2]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 13.12.06 12:12
Оценка:
Спасибо, строку ошибки получить удалось, правда сказала она по-прежнему немного, а именно "Invalid call". Я так почитал в инете немного, вроде как это в основном связано с версией DX или с драйверами. Я подозреваю что виновата видюха. Дело в том что дома у меня Radeon 9600 и все пашет норм, а когда запускаю на работе, вот такая лажа происходит, а здесь видюха интегрированная, SiS 650.

Может кто знает другие причины, из-за которых происходит подобная ошибка?
Или может возможно получить более подробную информацию о причине ошибки.

МЪ>Попробуйте так:


МЪ>
МЪ>HRESULT hr;
МЪ>hr = g_pD3D->CreateDevice(...);
МЪ>const WCHAR  * chErrorDesc;
МЪ>chErrorDesc = DXGetErrorDescription9(hr);
МЪ>printf("Reason: %S.\nApplication work finished with error. Press any key for exit...", chErrorDesc);
МЪ>


МЪ>Есть еще DxgetErrorString9();
Re[3]: Получение строки ошибки в DirectX
От: Аноним  
Дата: 14.12.06 07:53
Оценка:
Здравствуйте, Wallrunner, Вы писали:

W> Дело в том что дома у меня Radeon 9600 и все пашет норм, а когда запускаю на работе, вот такая лажа происходит, а здесь видюха интегрированная, SiS 650.


RTFM

Подскажу где:

IDirect3D9::RegisterSoftwareDevice


И еще намек:
"If the user's computer provides no special hardware acceleration for 3D operations, your application might emulate 3D hardware in software. Software rasterization devices emulate the functions of color 3D hardware in software. A software device runs more slowly than a hal."
© 2005 Microsoft Corporation. All rights reserved. DirectX9 SDK.

Re[4]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 14.12.06 09:46
Оценка:
Ммм.. Ну ваще-то софтовым рендерингом че-то не очень хочется пользоваться честно говоря. Ведь видюха интегрированная не такая уж слабая, как можно подумать. По крайней мере Unreal Tournament (первый) она тянет без проблем, более че-то крутого пока не пробовал, но ведь и то что я там программлю особо не требует ресурсов.

Все-таки есть возможность получить от DX какой-нибудь более внятный ответ вместо этого "Invalid call"? Типа там "Cannot run on your hardware" . Или нет?

А>RTFM


А>Подскажу где:


А>
IDirect3D9::RegisterSoftwareDevice


А>И еще намек:

А>"If the user's computer provides no special hardware acceleration for 3D operations, your application might emulate 3D hardware in software. Software rasterization devices emulate the functions of color 3D hardware in software. A software device runs more slowly than a hal."
А>© 2005 Microsoft Corporation. All rights reserved. DirectX9 SDK.

А>
Re[4]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 14.12.06 10:47
Оценка: 1 (1)
Кстати вот RTFM'ить каждый может, а вот ты пробовал сам использовать этот RegisterSoftwareDevice()? Этой функции нужно передать указатель на какую-то функцию инициализации устройства, при этом совершенно нигде не сказано что в этой функции должно происходить. Передаю NULL или указатель на функцию которая ничего не делает и возвращается ошибка "Not found".

P.S. Я тут нашел кое-какую инфу по интегрированным видюхам, вроде как они не могут сами делать процессинг вертексов, поэтому нужно врубать software vertex processing, но его можно врубить походу только создав софтварный девайс.

А>RTFM


А>Подскажу где:


А>
IDirect3D9::RegisterSoftwareDevice


А>И еще намек:

А>"If the user's computer provides no special hardware acceleration for 3D operations, your application might emulate 3D hardware in software. Software rasterization devices emulate the functions of color 3D hardware in software. A software device runs more slowly than a hal."
А>© 2005 Microsoft Corporation. All rights reserved. DirectX9 SDK.

А>
Re[5]: Получение строки ошибки в DirectX
От: МЪ www.morock.narod.ru
Дата: 14.12.06 14:16
Оценка:
Здравствуйте, Wallrunner, Вы писали:

W>Кстати вот RTFM'ить каждый может, а вот ты пробовал сам использовать этот RegisterSoftwareDevice()? Этой функции нужно передать указатель на какую-то функцию инициализации устройства, при этом совершенно нигде не сказано что в этой функции должно происходить. Передаю NULL или указатель на функцию которая ничего не делает и возвращается ошибка "Not found".


RTFM: The Direct3D Driver Development Kit (DDK) provides the documentation and headers for developing pluggable software devices.

W>P.S. Я тут нашел кое-какую инфу по интегрированным видюхам, вроде как они не могут сами делать процессинг вертексов, поэтому нужно врубать software vertex processing, но его можно врубить походу только создав софтварный девайс.


D3DDEVTYPE_REF Пробовал?
Now some men like the fishing
And some men like fowling
And some men like to hear
The cannonballs are roaring
Me — I like sleeping...
Re[6]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 14.12.06 14:20
Оценка:
МЪ>RTFM: The Direct3D Driver Development Kit (DDK) provides the documentation and headers for developing pluggable software devices.

Ок, попробую почитать. Но все-таки блин, почему же некоторые 3д игрушки пашут и почему проверки dxdiag проходят нормально, не ругаются никакими Invalid call'ами.

МЪ>D3DDEVTYPE_REF Пробовал?


Да, как раз попробовал после того как написал предыдущее сообщение.
Тормоза были просто жуткие.
Re[3]: Получение строки ошибки в DirectX
От: Аноним  
Дата: 05.01.07 06:47
Оценка:
Здравствуйте, Wallrunner, Вы писали:

W>Спасибо, строку ошибки получить удалось, правда сказала она по-прежнему немного, а именно "Invalid call". Я так почитал в инете немного, вроде как это в основном связано с версией DX или с драйверами. Я подозреваю что виновата видюха. Дело в том что дома у меня Radeon 9600 и все пашет норм, а когда запускаю на работе, вот такая лажа происходит, а здесь видюха интегрированная, SiS 650.


W>Может кто знает другие причины, из-за которых происходит подобная ошибка?

W>Или может возможно получить более подробную информацию о причине ошибки.

Код инициализации можно увидеть ???
Сам тестирую на SIS 640 — все работает...
Re[4]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 11.01.07 13:15
Оценка:
А>Код инициализации можно увидеть ???
А>Сам тестирую на SIS 640 — все работает...

Уж и не ожидал, что кто-то еще ответит .
Код вот такой:


        HRESULT hr;
        const TCHAR * errorDesc;

        if (NULL == (mD3D = Direct3DCreate9(D3D_SDK_VERSION)))
        {
            throw Direct3DException(_T("Error occured while initializing Direct3D"));
        }

        D3DDISPLAYMODE display;
        if (FAILED(hr = mD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display)))
        {
            errorDesc = DXGetErrorDescription9(hr);
            throw Direct3DException(_T("Error occured while getting display mode: ") + String(errorDesc));
        }

        D3DPRESENT_PARAMETERS direct3DParameters; 
        ZeroMemory( &direct3DParameters, sizeof(direct3DParameters) );
        direct3DParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
        direct3DParameters.BackBufferFormat = display.Format;
        direct3DParameters.EnableAutoDepthStencil = TRUE;
        direct3DParameters.AutoDepthStencilFormat = D3DFMT_D16;

        Settings * settings = Engine::getInstance().getSettings();
        if (settings->getFullscreen())
        {
            direct3DParameters.Windowed = FALSE;
            direct3DParameters.BackBufferWidth = settings->getScreenWidth();
            direct3DParameters.BackBufferHeight = settings->getScreenHeight();
            direct3DParameters.BackBufferCount = 3;
            direct3DParameters.FullScreen_RefreshRateInHz = display.RefreshRate;
        }
        else
        {
            direct3DParameters.Windowed = TRUE;
        }

        D3DDeviceKeeper::D3DDevicePointer device;
        if ( FAILED(hr = mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mhWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,    &direct3DParameters, &device)) )
        {
            errorDesc = DXGetErrorDescription9(hr);
            throw Direct3DException(_T("Error occured while creating Direct3D device: ") + String(errorDesc));
        }



D3DDeviceKeeper и всякая другая ботва это мои заморочки, на них можно внимания не обращать, в данном случае там просто хранится указатель на девайс.
Re[5]: Получение строки ошибки в DirectX
От: Antipov  
Дата: 12.01.07 06:30
Оценка:
Здравствуйте, Wallrunner, Вы писали:

W>Уж и не ожидал, что кто-то еще ответит .

W>Код вот такой:


W>

W>        D3DDeviceKeeper::D3DDevicePointer device;
W>        if ( FAILED(hr = mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mhWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &direct3DParameters, &device)) )
W>        {
W>            errorDesc = DXGetErrorDescription9(hr);
W>            throw Direct3DException(_T("Error occured while creating Direct3D device: ") + String(errorDesc));
W>        }
W>


Возможно видюха не поддерживает Hardware rasterization или hardware vertex processing попробуй D3DDEVTYPE_REF и D3DCREATE_SOFTWARE_VERTEXPROCESSING, а вообще правильнее проверять что умеет адаптер (D3DCAPS9) прежде чем создавать устройство.
Re[6]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 12.01.07 09:50
Оценка: 1 (1)
A>Возможно видюха не поддерживает Hardware rasterization или hardware vertex processing попробуй D3DDEVTYPE_REF и D3DCREATE_SOFTWARE_VERTEXPROCESSING, а вообще правильнее проверять что умеет адаптер (D3DCAPS9) прежде чем создавать устройство.

D3DDEVTYPE_REF пробовал еще раньше, работает, но тормоза жуткие, делать че-то нереально. Если делаешь D3DCREATE_SOFTWARE_VERTEXPROCESSING то типа говорит, что софтового девайса нету.
Re: Получение строки ошибки в DirectX
От: МЪ www.morock.narod.ru
Дата: 12.01.07 10:42
Оценка:
Здравствуйте, Wallrunner, Вы писали:

Я вот подумал, а может у тебя дрова глючные? Обновить\переустановить пробовал?
Now some men like the fishing
And some men like fowling
And some men like to hear
The cannonballs are roaring
Me — I like sleeping...
Re[2]: Получение строки ошибки в DirectX
От: Wallrunner  
Дата: 12.01.07 11:04
Оценка:
Здравствуйте, МЪ, Вы писали:

МЪ>Здравствуйте, Wallrunner, Вы писали:


МЪ>Я вот подумал, а может у тебя дрова глючные? Обновить\переустановить пробовал?


Все пробовал И дрова последние скачивал и DX переставлял.
Ну в общем проще забить. Возможно скоро я смогу поставить на этот комп другую видюху.
Re[7]: Получение строки ошибки в DirectX
От: Аноним  
Дата: 17.01.07 08:51
Оценка:
В коде инициализации попробуй изменить строчку:

direct3DParameters.FullScreen_RefreshRateInHz = display.RefreshRate;

на

direct3DParameters.FullScreen_RefreshRateInHz = 0;

Я здесь сталкивался с возникновением ошибки, при 0 чатота обновления ставиться по умолчанию для адаптера.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.