221 lines
5.8 KiB
C++
221 lines
5.8 KiB
C++
|
//=============================================================================
|
||
|
// 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__
|