2013-05-31 15:58:00 +02:00
// Copyright (C) XFX Team
2013-05-05 18:18:41 +02:00
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the copyright holder nor the names of any
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
# include <GraphicsDeviceManager.h>
# include <Game.h>
# include <System/Event.h>
2013-07-22 01:38:59 +02:00
# include <System/Type.h>
2013-05-05 18:18:41 +02:00
# include <sassert.h>
# if DEBUG
extern " C "
{
# include <openxdk/debug.h>
}
# endif
namespace XFX
{
const int GraphicsDeviceManager : : DefaultBackBufferWidth = 640 ;
const int GraphicsDeviceManager : : DefaultBackBufferHeight = 480 ;
SurfaceFormat_t GraphicsDeviceManager : : ValidAdapterFormats [ ] = { SurfaceFormat : : Bgr565 } ; // TODO figure out which ones are really supported
SurfaceFormat_t GraphicsDeviceManager : : ValidBackBufferFormats [ ] = { SurfaceFormat : : Bgr565 , SurfaceFormat : : Bgra5551 , SurfaceFormat : : Color } ; // idem
2013-07-22 01:38:59 +02:00
const Type GraphicsDeviceManagerTypeInfo ( " GraphicsDeviceManager " , " XFX::GraphicsDeviceManager " , TypeCode : : Object ) ;
2013-05-05 18:18:41 +02:00
GraphicsDeviceManager : : GraphicsDeviceManager ( Game * const game )
: _game ( game ) , backBufferFormat ( SurfaceFormat : : Color ) , backBufferHeight ( DefaultBackBufferHeight ) , backBufferWidth ( DefaultBackBufferWidth )
{
SynchronizeWithVerticalRetrace = true ;
preferredDepthStencilFormat = DepthFormat : : Depth24 ;
2013-08-20 11:14:55 +02:00
sassert ( game - > getServices ( ) . GetService ( IGraphicsDeviceManager : : GetType ( ) ) = = null , " A graphics device manager is already registered. The graphics device manager cannot be changed once it is set. " ) ;
2013-05-05 18:18:41 +02:00
# if DEBUG
debugPrint ( " Registering GraphicsDeviceManager \n " ) ;
# endif
2013-08-20 11:14:55 +02:00
game - > getServices ( ) . AddService ( IGraphicsDeviceManager : : GetType ( ) , this ) ;
game - > getServices ( ) . AddService ( IGraphicsDeviceService : : GetType ( ) , this ) ;
2013-05-05 18:18:41 +02:00
}
GraphicsDeviceManager : : GraphicsDeviceManager ( const GraphicsDeviceManager & obj )
: _game ( obj . _game ) , backBufferFormat ( obj . backBufferFormat ) , backBufferHeight ( obj . backBufferHeight ) , backBufferWidth ( obj . backBufferWidth )
{
}
GraphicsDeviceManager : : ~ GraphicsDeviceManager ( )
{
// TODO: implement
}
GraphicsDevice * GraphicsDeviceManager : : getGraphicsDevice ( ) const
{
return graphicsDevice ;
}
bool GraphicsDeviceManager : : IsFullScreen ( )
{
return isFullScreen ;
}
void GraphicsDeviceManager : : ApplyChanges ( )
{
}
bool GraphicsDeviceManager : : BeginDraw ( )
{
return true ;
}
bool GraphicsDeviceManager : : CanResetDevice ( const GraphicsDeviceInformation newDeviceInfo )
{
/*if (graphicsDevice->getDeviceType() != newDeviceInfo.DeviceType_)
2013-08-20 11:14:55 +02:00
{
return false ;
} */
return true ;
2013-05-05 18:18:41 +02:00
}
void GraphicsDeviceManager : : CreateDevice ( )
{
# if DEBUG
debugPrint ( " Creating GraphicsDevice \n " ) ;
# endif
PresentationParameters * p = new PresentationParameters ( ) ;
p - > BackBufferWidth = backBufferWidth ;
p - > BackBufferHeight = backBufferHeight ;
p - > BackBufferFormat = backBufferFormat ;
p - > IsFullScreen = true ;
// TODO: properly construct the GraphicsDevice- requires lots of additional coding in multiple places
graphicsDevice = new GraphicsDevice ( null , p ) ;
graphicsDevice - > Disposing + = new EventHandler : : T < GraphicsDeviceManager > ( this , & GraphicsDeviceManager : : OnDeviceDisposing ) ;
graphicsDevice - > DeviceResetting + = new EventHandler : : T < GraphicsDeviceManager > ( this , & GraphicsDeviceManager : : OnDeviceResetting ) ;
graphicsDevice - > DeviceReset + = new EventHandler : : T < GraphicsDeviceManager > ( this , & GraphicsDeviceManager : : OnDeviceReset ) ;
2013-08-20 11:14:55 +02:00
OnDeviceCreated ( this , EventArgs : : Empty ) ;
2013-05-05 18:18:41 +02:00
}
void GraphicsDeviceManager : : Dispose ( )
{
Dispose ( true ) ;
delete graphicsDevice ;
}
void GraphicsDeviceManager : : Dispose ( bool disposing )
{
if ( disposing )
{
graphicsDevice - > Dispose ( ) ;
}
}
void GraphicsDeviceManager : : EndDraw ( )
{
graphicsDevice - > Present ( ) ;
}
2013-07-22 01:38:59 +02:00
const Type & GraphicsDeviceManager : : GetType ( )
2013-05-05 18:18:41 +02:00
{
2013-07-22 01:38:59 +02:00
return GraphicsDeviceManagerTypeInfo ;
2013-05-05 18:18:41 +02:00
}
2013-08-20 11:14:55 +02:00
void GraphicsDeviceManager : : OnDeviceCreated ( Object * const sender , EventArgs * const args )
2013-05-05 18:18:41 +02:00
{
DeviceCreated ( sender , args ) ;
}
2013-08-20 11:14:55 +02:00
void GraphicsDeviceManager : : OnDeviceDisposing ( Object * const sender , EventArgs * const args )
2013-05-05 18:18:41 +02:00
{
DeviceDisposing ( sender , args ) ;
}
2013-08-20 11:14:55 +02:00
void GraphicsDeviceManager : : OnDeviceReset ( Object * const sender , EventArgs * const args )
2013-05-05 18:18:41 +02:00
{
DeviceReset ( sender , args ) ;
}
2013-08-20 11:14:55 +02:00
void GraphicsDeviceManager : : OnDeviceResetting ( Object * const sender , EventArgs * const args )
2013-05-05 18:18:41 +02:00
{
DeviceResetting ( sender , args ) ;
}
void GraphicsDeviceManager : : ToggleFullscreen ( )
{
isFullScreen = ! isFullScreen ;
PresentationParameters * p = graphicsDevice - > getPresentationParameters ( ) ;
p - > IsFullScreen = isFullScreen ;
graphicsDevice - > Reset ( p ) ;
}
}