#ifdef USE_D3D9
D3D9RenderTargetSurface::D3D9RenderTargetSurface()
{
_Surface = NULL;
_OffScreenPlainSurface = NULL;
_DepthSurface = NULL;
_Width = 0;
_Height = 0;
}
D3D9RenderTargetSurface::~D3D9RenderTargetSurface()
{
FreeMemory();
}
void D3D9RenderTargetSurface::ReleaseMemory()
{
FreeMemory();
}
void D3D9RenderTargetSurface::FreeMemory()
{
_Width = 0;
_Height = 0;
if(_Surface)
{
_Surface->Release();
_Surface = NULL;
}
if(_DepthSurface)
{
_DepthSurface->Release();
_DepthSurface = NULL;
}
if(_OffScreenPlainSurface)
{
_OffScreenPlainSurface->Release();
_OffScreenPlainSurface = NULL;
}
}
void D3D9RenderTargetSurface::Reset(GraphicsDevice &graphics)
{
FreeMemory();
}
void D3D9RenderTargetSurface::Init(D3D9GraphicsDevice &GD, D3DFORMAT format, UINT Width, UINT Height)
{
FreeMemory();
D3DAlwaysValidate(GD.GetDevice()->CreateRenderTarget(Width, Height, format, D3DMULTISAMPLE_NONE, 0, FALSE, &_Surface, NULL), "CreateRenderTarget");
D3DAlwaysValidate(GD.GetDevice()->CreateOffscreenPlainSurface(Width, Height, format, D3DPOOL_SYSTEMMEM, &_OffScreenPlainSurface, NULL), "CreateOffscreenPlainSurface");
D3DAlwaysValidate(GD.GetDevice()->CreateDepthStencilSurface(Width, Height, D3DFMT_D32F_LOCKABLE, D3DMULTISAMPLE_NONE, 0, FALSE, &_DepthSurface, NULL), "CreateDepthStencilSurface");
_Width = Width;
_Height = Height;
_Format = format;
}
bool D3D9RenderTargetSurface::ReSizeToBackBuffer(D3D9GraphicsDevice &GD, D3DFORMAT format)
{
IDirect3DSurface9 *BackBuffer;
HRESULT hr = GD.GetDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
if(FAILED(hr))
{
FreeMemory();
return false;
}
D3DSURFACE_DESC Desc;
D3DValidate(BackBuffer->GetDesc(&Desc), "GetDesc");
BackBuffer->Release();
if(_Width != Desc.Width || _Height != Desc.Height || _Format != format)
{
Init(GD, format, Desc.Width, Desc.Height);
return true;
}
else
{
return false;
}
}
void D3D9RenderTargetSurface::SetAsRenderTarget(D3D9GraphicsDevice &GD, UINT index)
{
GD.GetDevice()->SetRenderTarget(index, _Surface);
GD.GetDevice()->SetDepthStencilSurface(_DepthSurface);
}
void D3D9RenderTargetSurface::CopySurfaceToOffScreen(D3D9GraphicsDevice &GD)
{
D3DAlwaysValidate(GD.GetDevice()->GetRenderTargetData(_Surface, _OffScreenPlainSurface), "GetRenderTargetData");
}
void D3D9RenderTargetSurface::CopyOffScreenToBackBuffer(D3D9GraphicsDevice &GD)
{
IDirect3DSurface9 *BackBuffer;
HRESULT hr = GD.GetDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
if(FAILED(hr))
{
return;
}
hr = GD.GetDevice()->UpdateSurface(_OffScreenPlainSurface, NULL, BackBuffer, NULL);
BackBuffer->Release();
}
#endif