diff --git a/panda/src/dxgsg9/config_dxgsg9.cxx b/panda/src/dxgsg9/config_dxgsg9.cxx index 16f822112c..17352cf218 100755 --- a/panda/src/dxgsg9/config_dxgsg9.cxx +++ b/panda/src/dxgsg9/config_dxgsg9.cxx @@ -179,6 +179,18 @@ ConfigVariableInt dx_lru_debug_frames_til_output ConfigVariableBool dx_use_dynamic_textures ("dx-use-dynamic-textures", true); +// DX device option +ConfigVariableBool dx_use_multithread +("dx-use-multithread", false); + +// DX device option +ConfigVariableBool dx_use_puredevice +("dx-use-puredevice", false); + +// nVidia's performace heads up display +ConfigVariableBool dx_use_nvperfhud +("dx-use-nvperfhud", false); + ConfigureFn(config_dxgsg9) { init_libdxgsg9(); } diff --git a/panda/src/dxgsg9/config_dxgsg9.h b/panda/src/dxgsg9/config_dxgsg9.h index 493162d894..5ae2cea11c 100755 --- a/panda/src/dxgsg9/config_dxgsg9.h +++ b/panda/src/dxgsg9/config_dxgsg9.h @@ -73,6 +73,15 @@ extern ConfigVariableInt dx_lru_maximum_page_updates_per_frame; extern ConfigVariableBool dx_lru_debug; extern ConfigVariableInt dx_lru_debug_frames_til_output; +extern ConfigVariableBool dx_use_dynamic_textures; + +// DX device options +extern ConfigVariableBool dx_use_multithread; +extern ConfigVariableBool dx_use_puredevice; + +// nVidia's performace heads up display +extern ConfigVariableBool dx_use_nvperfhud; + extern EXPCL_PANDADX void init_libdxgsg9(); #endif diff --git a/panda/src/dxgsg9/wdxGraphicsWindow9.cxx b/panda/src/dxgsg9/wdxGraphicsWindow9.cxx index 47861144ff..1983e11b6e 100755 --- a/panda/src/dxgsg9/wdxGraphicsWindow9.cxx +++ b/panda/src/dxgsg9/wdxGraphicsWindow9.cxx @@ -278,7 +278,7 @@ open_window() { _dxgsg = new DXGraphicsStateGuardian9(_pipe); _gsg = _dxgsg; } - + if (!choose_device()) { return false; } @@ -525,8 +525,31 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer D3DCAPS9 *pD3DCaps = &display._d3dcaps; D3DPRESENT_PARAMETERS* presentation_params = &display._presentation_params; RECT view_rect; + UINT adapter; + D3DDEVTYPE device_type; HRESULT hr; + adapter = display._card_id; + device_type = D3DDEVTYPE_HAL; + + // NVIDIA NVPerfHUD + if (dx_use_nvperfhud) { + UINT adapter_id; + UINT total_adapters; + + total_adapters = _d3d9 -> GetAdapterCount ( ); + for (adapter_id = 0; adapter_id < total_adapters; adapter_id++) { + D3DADAPTER_IDENTIFIER9 identifier; + + _d3d9 -> GetAdapterIdentifier (adapter_id, 0, &identifier); + if (strcmp ("NVIDIA NVPerfHUD", identifier.Description) == 0) { + adapter = adapter_id; + device_type = D3DDEVTYPE_REF; + break; + } + } + } + wdxdisplay9_cat.debug() << "Display Width " << dwRenderWidth << " and PresParam Width " << _wcontext._presentation_params.BackBufferWidth << "\n"; // BUGBUG: need to change panda to put frame buffer properties with GraphicsWindow, not GSG!! @@ -554,9 +577,9 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer if (bWantAlpha) { presentation_params->BackBufferFormat = D3DFMT_A8R8G8B8; // verify the rendertarget fmt - if (FAILED(_d3d9->CheckDeviceFormat(display._card_id, D3DDEVTYPE_HAL, display._display_mode.Format, D3DUSAGE_RENDERTARGET, + if (FAILED(_d3d9->CheckDeviceFormat(adapter, device_type, display._display_mode.Format, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, presentation_params->BackBufferFormat))) { - wdxdisplay9_cat.error() << "device #" << display._card_id << " CheckDeviceFmt failed for surface fmt " << D3DFormatStr(presentation_params->BackBufferFormat) << endl; + wdxdisplay9_cat.error() << "adpater #" << adapter << " CheckDeviceFmt failed for surface fmt " << D3DFormatStr(presentation_params->BackBufferFormat) << endl; } else { check_device_format = true; @@ -567,18 +590,18 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer if (check_device_format == false) { presentation_params->BackBufferFormat = display._display_mode.Format; // verify the rendertarget fmt - if (FAILED(_d3d9->CheckDeviceFormat(display._card_id, D3DDEVTYPE_HAL, display._display_mode.Format, D3DUSAGE_RENDERTARGET, + if (FAILED(_d3d9->CheckDeviceFormat(adapter, device_type, display._display_mode.Format, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, presentation_params->BackBufferFormat))) { - wdxdisplay9_cat.error() << "device #" << display._card_id << " CheckDeviceFmt failed for surface fmt " << D3DFormatStr(presentation_params->BackBufferFormat) << endl; + wdxdisplay9_cat.error() << "adapter #" << adapter << " CheckDeviceFmt failed for surface fmt " << D3DFormatStr(presentation_params->BackBufferFormat) << endl; } else { check_device_format = true; } } - if (FAILED(_d3d9->CheckDeviceType(display._card_id, D3DDEVTYPE_HAL, display._display_mode.Format, presentation_params->BackBufferFormat, + if (FAILED(_d3d9->CheckDeviceType(adapter, device_type, display._display_mode.Format, presentation_params->BackBufferFormat, is_fullscreen()))) { - wdxdisplay9_cat.error() << "device #" << display._card_id << " CheckDeviceType failed for surface fmt " << D3DFormatStr(presentation_params->BackBufferFormat) << endl; + wdxdisplay9_cat.error() << "adapter #" << adapter << " CheckDeviceType failed for surface fmt " << D3DFormatStr(presentation_params->BackBufferFormat) << endl; goto Fallback_to_16bpp_buffers; } @@ -588,7 +611,7 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer bWantStencil, false)) { wdxdisplay9_cat.error() << "find_best_depth_format failed in CreateScreenBuffers for device #" - << display._card_id << endl; + << adapter << endl; goto Fallback_to_16bpp_buffers; } _depth_buffer_bpp = D3DFMT_to_DepthBits(display._presentation_params.AutoDepthStencilFormat); @@ -600,18 +623,18 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer if (dx_multisample_antialiasing_level>1) { // need to check both rendertarget and zbuffer fmts - hr = _d3d9->CheckDeviceMultiSampleType(display._card_id, D3DDEVTYPE_HAL, display._display_mode.Format, + hr = _d3d9->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, display._display_mode.Format, is_fullscreen(), D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level.get_value()), NULL); if (FAILED(hr)) { - wdxdisplay9_cat.fatal() << "device #" << display._card_id << " doesnt support multisample level " << dx_multisample_antialiasing_level << "surface fmt " << D3DFormatStr(display._display_mode.Format) << endl; + wdxdisplay9_cat.fatal() << "adapter #" << adapter << " doesnt support multisample level " << dx_multisample_antialiasing_level << "surface fmt " << D3DFormatStr(display._display_mode.Format) << endl; return false; } if (display._presentation_params.EnableAutoDepthStencil) { - hr = _d3d9->CheckDeviceMultiSampleType(display._card_id, D3DDEVTYPE_HAL, display._presentation_params.AutoDepthStencilFormat, + hr = _d3d9->CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, display._presentation_params.AutoDepthStencilFormat, is_fullscreen(), D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level.get_value()), NULL); if (FAILED(hr)) { - wdxdisplay9_cat.fatal() << "device #" << display._card_id << " doesnt support multisample level " << dx_multisample_antialiasing_level << "surface fmt " << D3DFormatStr(display._presentation_params.AutoDepthStencilFormat) << endl; + wdxdisplay9_cat.fatal() << "adapter #" << adapter << " doesnt support multisample level " << dx_multisample_antialiasing_level << "surface fmt " << D3DFormatStr(display._presentation_params.AutoDepthStencilFormat) << endl; return false; } } @@ -619,7 +642,7 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer presentation_params->MultiSampleType = D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level.get_value()); if (wdxdisplay9_cat.is_info()) - wdxdisplay9_cat.info() << "device #" << display._card_id << " using multisample antialiasing level " << dx_multisample_antialiasing_level << endl; + wdxdisplay9_cat.info() << "adapter #" << adapter << " using multisample antialiasing level " << dx_multisample_antialiasing_level << endl; } presentation_params->BackBufferCount = 1; @@ -652,14 +675,12 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer wdxdisplay9_cat.warning() << "SetForegroundWindow() failed!\n"; } - // TURN THIS ON IF MULTITHREADED DX IS NEEDED - if (false) - { + if (dx_use_multithread) { dwBehaviorFlags |= D3DCREATE_MULTITHREADED; } - - // option -// dwBehaviorFlags |= D3DCREATE_PUREDEVICE; + if (dx_use_puredevice) { + dwBehaviorFlags |= D3DCREATE_PUREDEVICE; + } if (is_fullscreen()) { // CREATE FULLSCREEN BUFFERS @@ -670,11 +691,11 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer ClearToBlack(display._window, get_properties()); - hr = _d3d9->CreateDevice(display._card_id, D3DDEVTYPE_HAL, _hWnd, - dwBehaviorFlags, presentation_params, &display._d3d_device); + hr = _d3d9->CreateDevice(adapter, device_type, _hWnd, + dwBehaviorFlags, presentation_params, &display._d3d_device); if (FAILED(hr)) { - wdxdisplay9_cat.fatal() << "D3D CreateDevice failed for device #" << display._card_id << ", " << D3DERRORSTRING(hr); + wdxdisplay9_cat.fatal() << "D3D CreateDevice failed for adapter #" << adapter << ", " << D3DERRORSTRING(hr); if (hr == D3DERR_OUTOFVIDEOMEMORY) goto Fallback_to_16bpp_buffers; @@ -688,7 +709,7 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer // CREATE WINDOWED BUFFERS D3DDISPLAYMODE dispmode; - hr = display._d3d9->GetAdapterDisplayMode(display._card_id, &dispmode); + hr = display._d3d9->GetAdapterDisplayMode(adapter, &dispmode); if (FAILED(hr)) { wdxdisplay9_cat.fatal() @@ -728,15 +749,15 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer //assert((dwRenderWidth == presentation_params->BackBufferWidth)&&(dwRenderHeight == presentation_params->BackBufferHeight)); - hr = _d3d9->CreateDevice(display._card_id, D3DDEVTYPE_HAL, _hWnd, - dwBehaviorFlags, presentation_params, &display._d3d_device); + hr = _d3d9->CreateDevice(adapter, device_type, _hWnd, + dwBehaviorFlags, presentation_params, &display._d3d_device); if (FAILED(hr)) { wdxdisplay9_cat.warning() << "presentation_params->BackBufferWidth : " << presentation_params->BackBufferWidth << endl; wdxdisplay9_cat.warning() << "presentation_params->BackBufferHeight : " << presentation_params->BackBufferHeight << endl; wdxdisplay9_cat.warning() << "presentation_params->BackBufferFormat : " << presentation_params->BackBufferFormat << endl; wdxdisplay9_cat.warning() << "presentation_params->BackBufferCount : " << presentation_params->BackBufferCount << endl; - wdxdisplay9_cat.warning() << "D3D CreateDevice failed for device #" << display._card_id << D3DERRORSTRING(hr); + wdxdisplay9_cat.warning() << "D3D CreateDevice failed for adapter #" << adapter << D3DERRORSTRING(hr); goto Fallback_to_16bpp_buffers; } } // end create windowed buffers @@ -771,15 +792,15 @@ create_screen_buffers_and_device(DXScreenData &display, bool force_16bpp_zbuffer if (wdxdisplay9_cat.info()) { wdxdisplay9_cat.info() - << "CreateDevice failed with out-of-vidmem or invalid BackBufferFormat, retrying w/16bpp buffers on device #" - << display._card_id << endl; + << "CreateDevice failed with out-of-vidmem or invalid BackBufferFormat, retrying w/16bpp buffers on adapter #" + << adapter << endl; } return create_screen_buffers_and_device(display, true); //return; } else if (!((dwRenderWidth == 640)&&(dwRenderHeight == 480))) { if (wdxdisplay9_cat.info()) - wdxdisplay9_cat.info() << "CreateDevice failed w/out-of-vidmem, retrying at 640x480 w/16bpp buffers on device #" << display._card_id << endl; + wdxdisplay9_cat.info() << "CreateDevice failed w/out-of-vidmem, retrying at 640x480 w/16bpp buffers on adapter #" << adapter << endl; // try final fallback to 640x480x16 display._display_mode.Width = 640; display._display_mode.Height = 480;