예제 #1
0
static void enumerateDecks(void)
{
  uint8_t nDecks = 0;
  bool noError = true;

  owInit();

  if (owScan(&nDecks))
  {
    DECK_INFO_DBG_PRINT("Found %d deck memor%s.\n", nDecks, nDecks>1?"ies":"y");
  } else {
    DEBUG_PRINT("Error scanning for deck memories, "
                "no deck drivers will be initialised\n");
    nDecks = 0;
  }

#ifndef IGNORE_OW_DECKS
  for (int i = 0; i < nDecks; i++)
  {
    DECK_INFO_DBG_PRINT("Enumerating deck %i\n", i);
    if (owRead(i, 0, sizeof(deckInfos[0].raw), (uint8_t *)&deckInfos[i]))
    {
      if (infoDecode(&deckInfos[i]))
      {
        deckInfos[i].driver = findDriver(&deckInfos[i]);
        printDeckInfo(&deckInfos[i]);
      } else {
#ifdef DEBUG
        DEBUG_PRINT("Deck %i has corrupt OW memory. "
                    "Ignoring the deck in DEBUG mode.\n", i);
        deckInfos[i].driver = &dummyDriver;
#else
        DEBUG_PRINT("Deck %i has corrupt OW memory. "
                    "No driver will be initialized!\n", i);
        noError = false;
#endif
      }
    }
    else
    {
      DEBUG_PRINT("Reading deck nr:%d [FAILED]. "
                  "No driver will be initialized!\n", i);
      noError = false;
    }
  }
#else
  DEBUG_PRINT("Ignoring all OW decks because of compile flag.\n");
  nDecks = 0;
#endif

  // Add build-forced driver
  if (strlen(deck_force) > 0) {
    DEBUG_PRINT("DECK_FORCE=%s found\n", deck_force);
  	//split deck_force into multiple, separated by colons, if available 
    char delim[] = ":"; 

    char temp_deck_force[strlen(deck_force)]; 
    strcpy(temp_deck_force, deck_force); 
    char * token = strtok(temp_deck_force, delim); 
 
    while (token) { 
      deck_force = token; 

      const DeckDriver *driver = deckFindDriverByName(deck_force);
      if (!driver) {
        DEBUG_PRINT("WARNING: compile-time forced driver %s not found\n", deck_force);
      } else if (driver->init || driver->test) {
        if (nDecks <= DECK_MAX_COUNT)
        {
          nDecks++;
          deckInfos[nDecks - 1].driver = driver;
          DEBUG_PRINT("compile-time forced driver %s added\n", deck_force);
        } else {
          DEBUG_PRINT("WARNING: No room for compile-time forced driver\n");
        }
      }
      token = strtok(NULL, delim); 
	}
  }

  if (noError) {
    count = nDecks;
  }

  return;
}
예제 #2
0
//---------------------------------------------------------------------
D3D9Device* D3D9DeviceManager::selectDevice(D3D9RenderWindow* renderWindow, D3D9RenderWindowList& renderWindowsGroup)
{
    D3D9RenderSystem*       renderSystem     = static_cast<D3D9RenderSystem*>(Root::getSingleton().getRenderSystem());
    D3D9Device*             renderDevice     = NULL;
    IDirect3D9*             direct3D9        = D3D9RenderSystem::getDirect3D9();
    UINT                    nAdapterOrdinal  = D3DADAPTER_DEFAULT;
    D3DDEVTYPE              devType          = D3DDEVTYPE_HAL;
    DWORD                   extraFlags       = 0;
    D3D9DriverList*         driverList = renderSystem->getDirect3DDrivers();
    bool                    nvAdapterFound = false;


    // Default group includes at least the given render window.
    renderWindowsGroup.push_back(renderWindow);

    // Case we use nvidia performance HUD, override the device settings.
    if (renderWindow->isNvPerfHUDEnable())
    {
        // Look for 'NVIDIA NVPerfHUD' adapter (<= v4)
        // or 'NVIDIA PerfHUD' (v5)
        // If it is present, override default settings
        for (UINT adapter=0; adapter < direct3D9->GetAdapterCount(); ++adapter)
        {
            D3D9Driver* currDriver = driverList->item(adapter);
            const D3DADAPTER_IDENTIFIER9& currAdapterIdentifier = currDriver->getAdapterIdentifier();

            if(strstr(currAdapterIdentifier.Description, "PerfHUD") != NULL)
            {
                renderDevice = NULL;
                nAdapterOrdinal = adapter;
                renderSystem->mActiveD3DDriver = currDriver;
                devType = D3DDEVTYPE_REF;
                nvAdapterFound = true;
                break;
            }
        }
    }

    // No special adapter should be used.
    if (nvAdapterFound == false)
    {
        renderSystem->mActiveD3DDriver = findDriver(renderWindow);
        nAdapterOrdinal = renderSystem->mActiveD3DDriver->getAdapterNumber();

        bool bTryUsingMultiheadDevice = false;

        if (renderWindow->isFullScreen())
        {
            bTryUsingMultiheadDevice = true;
            if (renderSystem->getMultiheadUse() == D3D9RenderSystem::mutAuto)
            {
                OSVERSIONINFO osVersionInfo;

                osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

                // Case version info failed -> assume we run on XP.
                if (FALSE == GetVersionEx(&osVersionInfo))
                {
                    osVersionInfo.dwMajorVersion = 5;
                }

                // XP and below - multi-head will cause artifacts when vsync is on.
                if (osVersionInfo.dwMajorVersion <= 5 && renderWindow->isVSync())
                {
                    bTryUsingMultiheadDevice = false;
                    LogManager::getSingleton().logMessage("D3D9 : Multi head disabled. It causes horizontal line when used in XP + VSync combination");
                }

                // Vista and SP1 or SP2 - multi-head device can not be reset - it causes memory corruption.
                if (osVersionInfo.dwMajorVersion == 6 &&
                        (_stricmp(osVersionInfo.szCSDVersion, "Service Pack 1") == 0 ||
                         _stricmp(osVersionInfo.szCSDVersion, "Service Pack 2") == 0))

                {
                    bTryUsingMultiheadDevice = false;
                    LogManager::getSingleton().logMessage("D3D9 : Multi head disabled. It causes application run time crashes when used in Vista + SP 1 or 2 combination");
                }
            }
            else
            {
                bTryUsingMultiheadDevice = renderSystem->getMultiheadUse() == D3D9RenderSystem::mutYes ? true : false;
            }
        }


        // Check if we can create a group of render windows
        // on the same device using the multi-head feature.
        if (bTryUsingMultiheadDevice)
        {
            const D3DCAPS9& targetAdapterCaps = renderSystem->mActiveD3DDriver->getD3D9DeviceCaps();
            D3DCAPS9        masterAdapterCaps;

            // Find the master device caps.
            if (targetAdapterCaps.MasterAdapterOrdinal == targetAdapterCaps.AdapterOrdinal)
            {
                masterAdapterCaps = targetAdapterCaps;
            }
            else
            {
                for (uint i = 0; i < driverList->count(); ++i)
                {
                    D3D9Driver* currDriver = driverList->item(i);
                    const D3DCAPS9& currDeviceCaps = currDriver->getD3D9DeviceCaps();

                    if (currDeviceCaps.AdapterOrdinal == targetAdapterCaps.MasterAdapterOrdinal)
                    {
                        masterAdapterCaps = currDeviceCaps;
                        break;
                    }
                }
            }

            // Case the master adapter can handle multiple adapters.
            if (masterAdapterCaps.NumberOfAdaptersInGroup > 1)
            {
                // Create empty list of render windows composing this group.
                renderWindowsGroup.resize(masterAdapterCaps.NumberOfAdaptersInGroup);
                for (uint i = 0; i < renderWindowsGroup.size(); ++i)
                    renderWindowsGroup[i] = NULL;


                // Assign the current render window to it's place in the group.
                renderWindowsGroup[targetAdapterCaps.AdapterOrdinalInGroup] = renderWindow;


                // For each existing window - check if it belongs to the group.
                for (uint i = 0; i < renderSystem->mRenderWindows.size(); ++i)
                {
                    D3D9RenderWindow* currRenderWindow = renderSystem->mRenderWindows[i];

                    if (currRenderWindow->isFullScreen())
                    {
                        D3D9Driver* currDriver = findDriver(currRenderWindow);
                        const D3DCAPS9& currDeviceCaps = currDriver->getD3D9DeviceCaps();

                        if (currDeviceCaps.MasterAdapterOrdinal == masterAdapterCaps.AdapterOrdinal)
                        {
                            renderWindowsGroup[currDeviceCaps.AdapterOrdinalInGroup] = currRenderWindow;
                            break;
                        }
                    }
                }

                bool bDeviceGroupFull = true;


                // Check if render windows group is full and ready to be driven by
                // the master device.
                for (uint i = 0; i < renderWindowsGroup.size(); ++i)
                {
                    // This group misses required window -> go back to default.
                    if (renderWindowsGroup[i] == NULL)
                    {
                        bDeviceGroupFull = false;
                        renderWindowsGroup.clear();
                        renderWindowsGroup.push_back(renderWindow);
                        break;
                    }
                }

                // Case device group is full -> we can use multi head device.
                if (bDeviceGroupFull)
                {
                    bool validateAllDevices = false;

                    for (uint i = 0; i < renderWindowsGroup.size(); ++i)
                    {
                        D3D9RenderWindow* currRenderWindow = renderWindowsGroup[i];
                        D3D9Device* currDevice = currRenderWindow->getDevice();

                        // This is the master window
                        if (i == 0)
                        {
                            // If master device exists - just release it.
                            if (currDevice != NULL)
                            {
                                renderDevice = currDevice;
                                renderDevice->release();
                            }
                        }

                        // This is subordinate window.
                        else
                        {
                            // If subordinate device exists - destroy it.
                            if (currDevice != NULL)
                            {
                                currDevice->destroy();
                                validateAllDevices = true;
                            }
                        }
                    }

                    // In case some device was destroyed - make sure all other devices are valid.
                    // A possible scenario is that full screen window has been destroyed and it's handle
                    // was used and the shared focus handle. All other devices used this handle and must be
                    // recreated using other handles otherwise create device will fail.
                    if (validateAllDevices)
                    {
                        for (uint i = 0; i < mRenderDevices.size(); ++i)
                            mRenderDevices[i]->validateFocusWindow();
                    }
                }
            }
        }
    }



    // Do we want to preserve the FPU mode? Might be useful for scientific apps
    ConfigOptionMap& options = renderSystem->getConfigOptions();
    ConfigOptionMap::iterator opti = options.find("Floating-point mode");
    if (opti != options.end() && opti->second.currentValue == "Consistent")
        extraFlags |= D3DCREATE_FPU_PRESERVE;

#if OGRE_THREAD_SUPPORT == 1
    extraFlags |= D3DCREATE_MULTITHREADED;
#endif


    // Try to find a matching device from current device list.
    if (renderDevice == NULL)
    {
        for (uint i = 0; i < mRenderDevices.size(); ++i)
        {
            D3D9Device* currDevice = mRenderDevices[i];

            if (currDevice->getAdapterNumber() == nAdapterOrdinal &&
                    currDevice->getDeviceType() == devType &&
                    currDevice->isFullScreen() == renderWindow->isFullScreen())
            {
                renderDevice = currDevice;
                break;
            }
        }
    }

    // No matching device found -> try reference device type (might have been
    // previously created as a fallback, but don't change devType because HAL
    // should be preferred on creation)
    if (renderDevice == NULL)
    {
        for (uint i = 0; i < mRenderDevices.size(); ++i)
        {
            D3D9Device* currDevice = mRenderDevices[i];

            if (currDevice->getAdapterNumber() == nAdapterOrdinal &&
                    currDevice->getDeviceType() == D3DDEVTYPE_REF)
            {
                renderDevice = currDevice;
                break;
            }
        }
    }


    // No matching device found -> create new one.
    if (renderDevice == NULL)
    {
        renderDevice = OGRE_NEW D3D9Device(this, nAdapterOrdinal, direct3D9->GetAdapterMonitor(nAdapterOrdinal), devType, extraFlags);
        mRenderDevices.push_back(renderDevice);
        if (mActiveDevice == NULL)
            setActiveDevice(renderDevice);
    }

    return renderDevice;
}
예제 #3
0
파일: main.c 프로젝트: ErikPshat/cxmb
int install_cxmb( void )
{
	int fd = sceIoOpen( CXMB_CONF_FILE, PSP_O_RDONLY, 0644 );
	if ( fd < 0 )
	{
		log( "no conf file found!\n" );
		fd = sceIoOpen( CXMB_CONF_FILE, PSP_O_RDWR | PSP_O_CREAT | PSP_O_TRUNC, 0777 );
		if ( fd < 0 )
		{
			log( "failed in creating conf file!\n" );
			return -1;
		}
		strcpy( theme_file, CXMB_DEFAULT_THEME );
		sceIoWrite( fd, theme_file, strlen( theme_file ) + 1 );
	}
	readLine( fd, theme_file, 64 );
	if ( truncpath( theme_file, ".ctf" ) < 0 )
	{
		if ( truncpath( theme_file, ".CTF" ) < 0 )
		{
			strcpy( theme_file, CXMB_DEFAULT_THEME );
		}
	}
	sceIoClose( fd );
	
	if ( endwithistr( theme_file, "random.ctf" ) )
	{
		log( "random\n" );
		randomCtf( theme_file );
	}
	
	sprintf( cxmb_theme_file, "ms0:%s", theme_file );
	log( "Theme file: %s\n", theme_file );
	
	#if _CXMB_LITE == 0
	makeCxmbThemeFile( cxmb_magic, cxmb_theme_file );
	#endif
	
	lflash_drv = findDriver( "flashfat" );
	fatms_drv = findDriver( "fatms" );
	
	if ( !lflash_drv || !fatms_drv )
		return -1;
		
	msIoOpen	= fatms_drv->funcs->IoOpen;
	msIoGetstat	= fatms_drv->funcs->IoGetstat;
	IoOpen		= lflash_drv->funcs->IoOpen;
	IoRead		= lflash_drv->funcs->IoRead;
	IoLseek		= lflash_drv->funcs->IoLseek;
	IoIoctl		= lflash_drv->funcs->IoIoctl;
	IoClose		= lflash_drv->funcs->IoClose;
	IoGetstat	= lflash_drv->funcs->IoGetstat;
	
	int intr = sceKernelCpuSuspendIntr();
	
	fatms_drv->funcs->IoOpen	= msIoOpen_new;
	fatms_drv->funcs->IoGetstat	= msIoGetstat_new;
	lflash_drv->funcs->IoOpen	= IoOpen_new;
	lflash_drv->funcs->IoRead	= IoRead_new;
	lflash_drv->funcs->IoLseek	= IoLseek_new;
	lflash_drv->funcs->IoIoctl	= IoIoctl_new;
	lflash_drv->funcs->IoClose	= IoClose_new;
	lflash_drv->funcs->IoGetstat= IoGetstat_new;
	
	sceKernelCpuResumeIntr( intr );
	sceKernelIcacheInvalidateAll();
	sceKernelDcacheWritebackInvalidateAll();
	
	sceIoOpen( "ms0:/dummy.prx", PSP_O_RDONLY, 0644 );
	
	log( "redirected io_driver!\n" );
	log( "ms_drv_arg: %08x\n", ( unsigned int )ms_drv );

	previous = setStartModuleHandler( OnModuleStart );
	log("startModuleHandler setup!\n");
	
	fd = sceIoOpen( cxmb_theme_file, PSP_O_RDONLY, 0644 );
	if ( fd < 0 )
	{
		log( "no ctf file found!\n" );
		return 0;
	}
	
	mem_id = sceKernelCreateHeap( 2, 1024 * 5 , 1, "cxmb_heap");
	if ( mem_id < 0 )
	{
		log( "failed in creating cxmb_heap!\n" );
		sceIoClose( fd );
		return -1;
	}
	
	unsigned int magic;
	sceIoLseek( fd, 0x10, PSP_SEEK_SET );
	sceIoRead( fd, &magic, 4 );
	if ( magic != cxmb_magic )
	{
		log( "magic not match!\n" );
		sceIoClose( fd );
		return -1;
	}
	sceIoRead( fd, &ctf_sig, 4 );
	sceIoRead( fd, &header_size, 4 );
	log( "header size: %d\n", header_size );
	
	ctf_header = sceKernelAllocHeapMemory( mem_id, sizeof( CtfHeader ) * header_size );
	int offset = - sizeof( CtfHeader ) * header_size;
	sceIoLseek( fd, offset, PSP_SEEK_END );
	sceIoRead( fd, ctf_header, sizeof( CtfHeader ) * header_size );
	sceIoClose( fd );
	
	log( "read ctf_header!\n" );
	
	ctf_handler = sceKernelAllocHeapMemory( mem_id, sizeof( CtfHandler ) * 32 );
	memset( ctf_handler, 0, sizeof( CtfHandler ) * 32 );
	
	return 0;
}