windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/d3d8/fw/swapchan.hpp
2020-09-26 16:20:57 +08:00

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__