- For windowed and pixel doubled modes, use a chain of two TempRenderTextures and

swap between them each frame. The one that's not the TempRenderTexture is used
  as the FrontCopySurface without the need for a copy operation. This removes the
  performance penalty the previous commit introduced for these modes.

SVN r2014 (trunk)
This commit is contained in:
Randy Heit 2009-12-02 05:49:45 +00:00
parent d924575b1e
commit 88b4ab52ad
3 changed files with 53 additions and 28 deletions

View file

@ -247,6 +247,8 @@ D3DFB::D3DFB (int width, int height, bool fullscreen)
IndexBuffer = NULL; IndexBuffer = NULL;
FBTexture = NULL; FBTexture = NULL;
TempRenderTexture = NULL; TempRenderTexture = NULL;
RenderTexture[0] = NULL;
RenderTexture[1] = NULL;
InitialWipeScreen = NULL; InitialWipeScreen = NULL;
ScreenshotTexture = NULL; ScreenshotTexture = NULL;
ScreenshotSurface = NULL; ScreenshotSurface = NULL;
@ -277,6 +279,8 @@ D3DFB::D3DFB (int width, int height, bool fullscreen)
Packs = NULL; Packs = NULL;
PixelDoubling = 0; PixelDoubling = 0;
SkipAt = -1; SkipAt = -1;
CurrRenderTexture = 0;
RenderTextureToggle = 0;
Gamma = 1.0; Gamma = 1.0;
FlashColor0 = 0; FlashColor0 = 0;
@ -624,15 +628,9 @@ void D3DFB::ReleaseResources ()
void D3DFB::ReleaseDefaultPoolItems() void D3DFB::ReleaseDefaultPoolItems()
{ {
SAFE_RELEASE( FBTexture ); SAFE_RELEASE( FBTexture );
if (FinalWipeScreen != NULL) SAFE_RELEASE( FinalWipeScreen );
{ SAFE_RELEASE( RenderTexture[0] );
if (FinalWipeScreen != TempRenderTexture) SAFE_RELEASE( RenderTexture[1] );
{
FinalWipeScreen->Release();
}
FinalWipeScreen = NULL;
}
SAFE_RELEASE( TempRenderTexture );
SAFE_RELEASE( InitialWipeScreen ); SAFE_RELEASE( InitialWipeScreen );
SAFE_RELEASE( VertexBuffer ); SAFE_RELEASE( VertexBuffer );
SAFE_RELEASE( IndexBuffer ); SAFE_RELEASE( IndexBuffer );
@ -772,24 +770,42 @@ bool D3DFB::CreateFBTexture ()
FBWidth = Width; FBWidth = Width;
FBHeight = Height; FBHeight = Height;
} }
if (FAILED(D3DDevice->CreateTexture(FBWidth, FBHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &TempRenderTexture, NULL))) RenderTextureToggle = 0;
RenderTexture[0] = NULL;
RenderTexture[1] = NULL;
if (FAILED(D3DDevice->CreateTexture(FBWidth, FBHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &RenderTexture[0], NULL)))
{ {
TempRenderTexture = NULL; return false;
}
if (Windowed || PixelDoubling)
{
// Windowed or pixel doubling: Create another render texture so we can flip between them.
RenderTextureToggle = 1;
if (FAILED(D3DDevice->CreateTexture(FBWidth, FBHeight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &RenderTexture[1], NULL)))
{
return false;
}
} }
else else
{ {
// Initialize the TempRenderTexture to black. // Fullscreen and not pixel doubling: Create a render target to have the back buffer copied to.
if (FAILED(D3DDevice->CreateRenderTarget(Width, Height, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, FALSE, &FrontCopySurface, NULL)))
{
return false;
}
}
// Initialize the TempRenderTextures to black.
for (int i = 0; i <= RenderTextureToggle; ++i)
{
IDirect3DSurface9 *surf; IDirect3DSurface9 *surf;
if (SUCCEEDED(TempRenderTexture->GetSurfaceLevel(0, &surf))) if (SUCCEEDED(RenderTexture[i]->GetSurfaceLevel(0, &surf)))
{ {
D3DDevice->ColorFill(surf, NULL, D3DCOLOR_XRGB(0,0,0)); D3DDevice->ColorFill(surf, NULL, D3DCOLOR_XRGB(0,0,0));
surf->Release(); surf->Release();
} }
} }
if (FAILED(D3DDevice->CreateRenderTarget(Width, Height, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, FALSE, &FrontCopySurface, NULL))) TempRenderTexture = RenderTexture[0];
{ CurrRenderTexture = 0;
return false;
}
return true; return true;
} }
@ -1179,6 +1195,13 @@ void D3DFB::Flip()
} }
D3DDevice->Present(NULL, NULL, NULL, NULL); D3DDevice->Present(NULL, NULL, NULL, NULL);
InScene = false; InScene = false;
if (RenderTextureToggle)
{
// Flip the TempRenderTexture to the other one now.
CurrRenderTexture ^= RenderTextureToggle;
TempRenderTexture = RenderTexture[CurrRenderTexture];
}
} }
//========================================================================== //==========================================================================
@ -1198,10 +1221,10 @@ void D3DFB::CopyNextFrontBuffer()
if (Windowed || PixelDoubling) if (Windowed || PixelDoubling)
{ {
// Windowed mode or pixel doubling: TempRenderTexture has what we want // Windowed mode or pixel doubling: TempRenderTexture has what we want
SAFE_RELEASE( FrontCopySurface );
if (SUCCEEDED(TempRenderTexture->GetSurfaceLevel(0, &backbuff))) if (SUCCEEDED(TempRenderTexture->GetSurfaceLevel(0, &backbuff)))
{ {
D3DDevice->StretchRect(backbuff, NULL, FrontCopySurface, NULL, D3DTEXF_NONE); FrontCopySurface = backbuff;
backbuff->Release();
} }
} }
else else

View file

@ -173,14 +173,14 @@ bool D3DFB::WipeStartScreen(int type)
1, D3DUSAGE_RENDERTARGET, desc.Format, D3DPOOL_DEFAULT, 1, D3DUSAGE_RENDERTARGET, desc.Format, D3DPOOL_DEFAULT,
&FinalWipeScreen, NULL))) &FinalWipeScreen, NULL)))
{ {
FinalWipeScreen = TempRenderTexture; (FinalWipeScreen = TempRenderTexture)->AddRef();
} }
tsurf->Release(); tsurf->Release();
} }
} }
else else
{ {
FinalWipeScreen = TempRenderTexture; (FinalWipeScreen = TempRenderTexture)->AddRef();
} }
// Make even fullscreen model render to the TempRenderTexture, so // Make even fullscreen model render to the TempRenderTexture, so
@ -229,7 +229,11 @@ void D3DFB::WipeEndScreen()
// If these are different, reverse their roles so we don't need to // If these are different, reverse their roles so we don't need to
// waste time copying from TempRenderTexture to FinalWipeScreen. // waste time copying from TempRenderTexture to FinalWipeScreen.
swap(FinalWipeScreen, TempRenderTexture); if (FinalWipeScreen != TempRenderTexture)
{
swap(RenderTexture[CurrRenderTexture], FinalWipeScreen);
TempRenderTexture = RenderTexture[CurrRenderTexture];
}
// At this point, InitialWipeScreen holds the screen we are wiping from. // At this point, InitialWipeScreen holds the screen we are wiping from.
// FinalWipeScreen holds the screen we are wiping to, which may be the // FinalWipeScreen holds the screen we are wiping to, which may be the
@ -315,11 +319,7 @@ void D3DFB::WipeCleanup()
ScreenWipe = NULL; ScreenWipe = NULL;
} }
SAFE_RELEASE( InitialWipeScreen ); SAFE_RELEASE( InitialWipeScreen );
if (FinalWipeScreen != NULL && FinalWipeScreen != TempRenderTexture) SAFE_RELEASE( FinalWipeScreen );
{
FinalWipeScreen->Release();
}
FinalWipeScreen = NULL;
GatheringWipeScreen = false; GatheringWipeScreen = false;
if (!Accel2D) if (!Accel2D)
{ {

View file

@ -395,6 +395,8 @@ private:
int PixelDoubling; int PixelDoubling;
int SkipAt; int SkipAt;
int LBOffsetI; int LBOffsetI;
int RenderTextureToggle;
int CurrRenderTexture;
float LBOffset; float LBOffset;
float Gamma; float Gamma;
bool UpdatePending; bool UpdatePending;
@ -415,7 +417,7 @@ private:
IDirect3DDevice9 *D3DDevice; IDirect3DDevice9 *D3DDevice;
IDirect3DTexture9 *FBTexture; IDirect3DTexture9 *FBTexture;
IDirect3DTexture9 *TempRenderTexture; IDirect3DTexture9 *TempRenderTexture, *RenderTexture[2];
IDirect3DTexture9 *PaletteTexture; IDirect3DTexture9 *PaletteTexture;
IDirect3DTexture9 *GammaTexture; IDirect3DTexture9 *GammaTexture;
IDirect3DTexture9 *ScreenshotTexture; IDirect3DTexture9 *ScreenshotTexture;