00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright © 2000-2002 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 #include "OgreD3D7RenderSystem.h" 00026 #include "OgreD3D7DeviceList.h" 00027 #include "OgreD3D7Device.h" 00028 #include "OgreDDDriver.h" 00029 #include "OgreLogManager.h" 00030 #include "OgreException.h" 00031 00032 namespace Ogre 00033 { 00034 00035 // Non-member callback functions 00036 static HRESULT CALLBACK D3DEnumDevicesCallback( 00037 LPSTR lpDeviceDescription, 00038 LPSTR lpDeviceName, 00039 LPD3DDEVICEDESC7 lpD3DDeviceDesc, 00040 LPVOID lpContext) 00041 { 00042 D3DDeviceList* deviceList; 00043 00044 deviceList = (D3DDeviceList*) lpContext; 00045 00046 deviceList->AddDevice(lpDeviceDescription, lpDeviceName, 00047 lpD3DDeviceDesc); 00048 00049 // Continue enumeration 00050 return D3DENUMRET_OK; 00051 } 00052 00053 00054 D3DDeviceList::D3DDeviceList(LPDIRECT3D7 direct3D) 00055 { 00056 // Will create a new driver list and enumerate it 00057 if (direct3D == NULL) 00058 throw Exception(Exception::ERR_INVALIDPARAMS, "NULL has been incorrectly passed as a " 00059 "D3D interface pointer.", "D3DDeviceList Contructor"); 00060 00061 lpD3D = direct3D; 00062 // Enumerate the list 00063 enumerate(); 00064 00065 } 00066 00067 D3DDeviceList::~D3DDeviceList() 00068 { 00069 for(size_t i=0; i<count(); i++) 00070 { 00071 item(i)->Cleanup(); 00072 } 00073 mDeviceList.clear(); 00074 00075 } 00076 00077 00078 BOOL D3DDeviceList::enumerate() 00079 { 00080 HRESULT hr; 00081 00082 LogManager::getSingleton().logMessage("----- Direct3D Detection Starts"); 00083 00084 hr = lpD3D->EnumDevices(D3DEnumDevicesCallback, this); 00085 if (FAILED(hr)) 00086 throw Exception(Exception::ERR_RENDERINGAPI_ERROR, "Error enumerating 3D devices", "D3DDeviceList - enumerate"); 00087 00088 LogManager::getSingleton().logMessage("----- Direct3D Detection Ends"); 00089 00090 return TRUE; 00091 } 00092 00093 void D3DDeviceList::AddDevice(LPSTR lpDeviceDesc, 00094 LPSTR lpDeviceName, 00095 LPD3DDEVICEDESC7 lpD3DDeviceDesc) 00096 { 00097 D3DDevice *newD3D; 00098 00099 // Check to see if this is a duff driver 00100 // Handle specific device GUIDs. NullDevice renders nothing 00101 if (IsEqualGUID(lpD3DDeviceDesc->deviceGUID, IID_IDirect3DNullDevice)) 00102 return; 00103 00104 00105 // Create new driver 00106 newD3D = new D3DDevice(lpD3D, lpDeviceDesc, lpDeviceName, lpD3DDeviceDesc); 00107 00108 // Add it to my list 00109 mDeviceList.push_back(*newD3D); 00110 00111 delete newD3D; 00112 } 00113 00114 size_t D3DDeviceList::count(void) 00115 { 00116 return mDeviceList.size(); 00117 } 00118 00119 D3DDevice* D3DDeviceList::item(size_t index) 00120 { 00121 return &mDeviceList[index]; 00122 } 00123 00124 D3DDevice* D3DDeviceList::getBest(unsigned int minColourDepth) 00125 { 00126 char msg[255]; 00127 00128 std::vector<D3DDevice>::iterator p = mDeviceList.begin(); 00129 std::vector<D3DDevice>::iterator bestDevice = mDeviceList.end(); 00130 static D3DDevice* savedBest = 0; 00131 00132 if (savedBest) 00133 return savedBest; 00134 LogManager::getSingleton().logMessage("Determining best 3D Device..."); 00135 00136 // For now, just get ANY hardware device that can match the following 00137 // minimum requirements 00138 // 2. Colour depth = primary surface colour depth 00139 // Add preference to TnL devices 00140 while (p != mDeviceList.end()) 00141 { 00142 if (p->HardwareAccelerated()) 00143 { 00144 // Check minimum render depth 00145 if ( (p->RenderBitDepth() >= minColourDepth)) 00146 { 00147 // Ok, minimum caps have been satisfied so we can consider using HW 00148 // Any device yet? 00149 if (bestDevice == mDeviceList.end()) 00150 bestDevice = p; 00151 // Always override SW device 00152 else if (!bestDevice->HardwareAccelerated()) 00153 bestDevice = p; 00154 // Add preference to HW TnL 00155 else if (p->CanHWTransformAndLight()) 00156 bestDevice = p; 00157 00158 } 00159 } 00160 else 00161 { 00162 // Software device, save for fallback 00163 if (bestDevice == mDeviceList.end()) 00164 bestDevice = p; 00165 } 00166 00167 p++; 00168 00169 } 00170 00171 sprintf(msg, "Best 3D Device is: %s", bestDevice->DeviceDescription().c_str()); 00172 LogManager::getSingleton().logMessage(msg); 00173 00174 savedBest = &(*bestDevice); 00175 return savedBest; 00176 00177 } 00178 00179 } // Namespace
Copyright © 2002-2003 by The OGRE Team
Last modified Fri May 14 23:21:59 2004