|
|
//=============================================================================
// Copyright (c) 1999 Microsoft Corporation
//
// swapchan.hpp
//
// Swap chain implementation. A swap chain contains a primary surface, back
// buffers, and exclusive mode state such as fullscreen, stereoscopy, cover
// window, and the what is required to flip back buffers.
//
// Created 11/16/1999 johnstep (John Stephens)
//=============================================================================
#ifndef __SWAPCHAN_HPP__
#define __SWAPCHAN_HPP__
#include "surface.hpp"
#include "dxcursor.hpp"
//-----------------------------------------------------------------------------
// CSwapChain
//-----------------------------------------------------------------------------
class CSwapChain : public CBaseObject, public IDirect3DSwapChain8 { public: CSwapChain( CBaseDevice *pDevice, REF_TYPE refType);
void Init( D3DPRESENT_PARAMETERS *pPresentationParameters, HRESULT *pHr );
virtual ~CSwapChain();
CDriverSurface *PrimarySurface() const { return m_pPrimarySurface; }
CDriverSurface *BackBuffer(UINT i) const { if (m_ppBackBuffers && i < m_PresentationData.BackBufferCount) return m_ppBackBuffers[i]; else return NULL; }
UINT Width() const { return m_PresentationData.BackBufferWidth; } UINT Height() const { return m_PresentationData.BackBufferHeight; }
D3DFORMAT BackBufferFormat() const { return m_PresentationData.BackBufferFormat; }
BOOL Windowed() const { return m_PresentationData.Windowed; }
BOOL PresentUseBlt() const { return m_PresentUseBlt; } // IUnknown methods
STDMETHODIMP QueryInterface(REFIID iid, void **ppInterface); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release();
// IDirect3D8SwapChain8 methods
STDMETHODIMP GetBackBuffer( UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8 **ppBackBuffer ); STDMETHODIMP Present( CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hTargetWindow, CONST RGNDATA *pDstRegion );
// Internal methods
HRESULT Reset( D3DPRESENT_PARAMETERS *pPresentationParameters );
HRESULT FlipToGDISurface(void);
void SetGammaRamp(DWORD dwFlags, CONST D3DGAMMARAMP *pRamp);
void GetGammaRamp(D3DGAMMARAMP *pRamp); #ifdef WINNT
void MakeFullscreen(); void DoneExclusiveMode(BOOL); void StartExclusiveMode(BOOL); void HIDESHOW_IME(); BOOL IsWinProcDeactivated() const;
DWORD PickRefreshRate( DWORD Width, DWORD Height, DWORD RefreshRate, D3DFORMAT Format); #endif //WINNT
VOID Destroy();
protected: UINT m_presentnext;
CDriverSurface *m_pPrimarySurface; //HEL and REF allocate the render targets in system memory themselves
//but the blt from system memory to the primary surface will cause tearing,
//so ideally we'd put the n backbuffers in system memory and then a single
//m_pMirrorSurface in video memory. When presenting the system
//memory backbuffer,
//we can blt to the video memory backbuffer and then flip
//Naturally device has to have enough video memory and support flip
//otherwise m_pMirrorSurface will be NULL, and Present will
//simply Blt from m_ppBackBuffers to m_pPrimarySurface
CDriverSurface *m_pMirrorSurface; CDriverSurface **m_ppBackBuffers; UINT m_cBackBuffers;
HRESULT CreateWindowed( UINT width, UINT height, D3DFORMAT backBufferFormat, UINT cBackBuffers, D3DMULTISAMPLE_TYPE MultiSampleType, BOOL bDiscard, BOOL bLockable );
HRESULT CreateFullscreen( UINT width, UINT height, D3DFORMAT backBufferFormat, UINT cBackBuffers, UINT presentationRate, D3DMULTISAMPLE_TYPE MultiSampleType, BOOL bDiscard, BOOL bLockable );
#ifdef DEBUG
void DebugDiscardBackBuffer(HANDLE SurfaceToClear) const; #else
void DebugDiscardBackBuffer(HANDLE SurfaceToClear) const { // No-op in retail
}; // DebugDiscardBackBuffer
#endif
private: friend CBaseDevice; friend CCursor; D3DPRESENT_PARAMETERS m_PresentationData; CCursor* m_pCursor; HANDLE m_hGDISurface; HRESULT SetCooperativeLevel(); HRESULT SetAppHWnd(); HRESULT FlipToSurface(HANDLE hTargetSurface); void UpdateFrameRate( void ); BOOL m_bExclusiveMode; LPVOID m_pCursorShadow; LPVOID m_pHotTracking; LONG m_lIMEState; LONG m_lSetIME; UINT m_uiErrorMode; DWORD m_dwFlipFlags; D3D8_BLTDATA m_BltData; UINT m_ClientWidth; UINT m_ClientHeight; BOOL m_bClientChanged; RECT m_DstRect; RECT m_SrcRect; RECT* m_pDstRect; RECT* m_pSrcRect; DWORD m_dwFlags; #ifdef WINNT
DWORD m_dwForceRefreshRate; #endif
DWORD m_dwFlipCnt; DWORD m_dwFlipTime; BOOL m_PresentUseBlt; D3DSWAPEFFECT m_UserSwapEffect; // what the user specified
// Please keep this entry at the end of the struct... it'll make assembly-
// level debugging easier.
BOOL m_GammaSet; D3DGAMMARAMP m_DesiredGammaRamp;
// DO NOT PUT ANYTHING HERE
}; // class CSwapChain
#define D3D_REGFLAGS_SHOWFRAMERATE 0x01
#ifdef WINNT
#define D3D_REGFLAGS_FLIPNOVSYNC 0x02
#endif
#endif // __SWAPCHAN_HPP__
|