|
|
#ifndef __DXGINT_H__
#define __DXGINT_H__
// COM interface stuff to allow functions such as CoCreateInstance and the like
#include <unknwn.h>
#include "d3d8p.h"
#include "d3d8ddi.h"
#include "enum.hpp"
// Forward decls
class CResource; class CResourceManager; class CBaseTexture; class CBaseSurface; class CSwapChain; class CEnum;
#undef DPF_MODNAME
#define DPF_MODNAME "CBaseDevice"
class CBaseDevice : public CLockOwner, public IDirect3DDevice8 { public: // IUnknown methods
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR*); // 0
STDMETHODIMP_(ULONG) AddRef(void); // 1
STDMETHODIMP_(ULONG) Release(void); // 2
// IDirectGraphicsDevice methods
STDMETHODIMP TestCooperativeLevel(); // 3
STDMETHODIMP_(UINT) GetAvailableTextureMem(void); // 4
// ResourceManagerDiscardBytes is declared in d3di.hpp = 5
STDMETHODIMP GetDirect3D(LPDIRECT3D8 *pD3D8); // 6
STDMETHODIMP GetDeviceCaps(D3DCAPS8 *pCaps); // 7
STDMETHODIMP GetDisplayMode(D3DDISPLAYMODE *pMode); // 8
STDMETHODIMP GetCreationParameters(D3DDEVICE_CREATION_PARAMETERS *pParameters); // 9
STDMETHODIMP SetCursorProperties( UINT xHotSpot,UINT yHotSpot, IDirect3DSurface8 *pCursorBitmap); // 10
STDMETHODIMP_(void) SetCursorPosition(UINT xScreenSpace,UINT yScreenSpace,DWORD Flags); // 11
STDMETHODIMP_(INT) ShowCursor(BOOL bShow); // 12
// Swap Chain stuff
STDMETHODIMP CreateAdditionalSwapChain( D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain8 **pSwapChain); // 13
STDMETHODIMP Reset( D3DPRESENT_PARAMETERS *pPresentationParameters); // 14
STDMETHODIMP Present( CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hTargetWindow, CONST RGNDATA *pDestinationRegion); // 15
STDMETHODIMP GetBackBuffer(UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8 **ppBackBuffer); // 16
STDMETHODIMP GetRasterStatus(D3DRASTER_STATUS *pRasterStatus); // 17
STDMETHODIMP_(void) SetGammaRamp(DWORD dwFlags, CONST D3DGAMMARAMP *pRamp); // 18
STDMETHODIMP_(void) GetGammaRamp(D3DGAMMARAMP *pRamp); // 19
STDMETHODIMP CreateTexture(UINT cpWidth,UINT cpHeight,UINT cLevels,DWORD dwUsage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture8 **ppTexture); // 20
STDMETHODIMP CreateVolumeTexture(UINT cpWidth,UINT cpHeight,UINT cpDepth,UINT cLevels,DWORD dwUsage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture8 **ppVolumeTexture); // 21
STDMETHODIMP CreateCubeTexture(UINT cpEdge,UINT cLevels,DWORD dwUsage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture8 **ppCubeTexture); // 22
STDMETHODIMP CreateVertexBuffer(UINT cbLength,DWORD Usage,DWORD dwFVF,D3DPOOL Pool,IDirect3DVertexBuffer8 **ppVertexBuffer); // 23
STDMETHODIMP CreateIndexBuffer(UINT cbLength,DWORD dwUsage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer8 **ppIndexBuffer); // 24
STDMETHODIMP CreateRenderTarget(UINT cpWidth,UINT cpHeight,D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8 **ppSurface); // 25
STDMETHODIMP CreateDepthStencilSurface(UINT cpWidth,UINT cpHeight,D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8 **ppSurface); // 26
STDMETHODIMP CreateImageSurface(UINT cpWidth,UINT cpHeight,D3DFORMAT Format, IDirect3DSurface8 **ppSurface); // 27
STDMETHODIMP CopyRects(IDirect3DSurface8 *pSourceSurface, CONST RECT *pSourceRectsArray,UINT cRects,IDirect3DSurface8 *pDestinationSurface, CONST POINT *pDestPointsArray); // 28
STDMETHODIMP UpdateTexture(IDirect3DBaseTexture8 *pSourceTexture,IDirect3DBaseTexture8 *pDestinationTexture); // 29
STDMETHODIMP GetFrontBuffer(IDirect3DSurface8 *pDestSurface); // 30
// Constructor/deconstructor
CBaseDevice(); virtual ~CBaseDevice(); HRESULT Init( PD3D8_DEVICEDATA pDeviceData, D3DDEVTYPE DeviceType, HWND hwndFocusWindow, DWORD dwBehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, UINT AdapterIndex, CEnum* Parent);
PD3D8_CALLBACKS GetHalCallbacks(void) { return &m_DeviceData.Callbacks; } // GetHalCallbacks
// Get a handle for the device; used for kernel calls
HANDLE GetHandle(void) const { return m_DeviceData.hDD; } // GetHandle
BOOL CanTexBlt(void) const { if (GetDeviceType() == D3DDEVTYPE_SW || GetDeviceType() == D3DDEVTYPE_REF) { // TexBlt is not supported for software
// devices
return FALSE; } // DX7 and above
return (m_ddiType >= D3DDDITYPE_DX7); } // CanTexBlt
BOOL CanBufBlt(void) const { if (GetDeviceType() == D3DDEVTYPE_SW || GetDeviceType() == D3DDEVTYPE_REF) { // BufBlt is not supported for software
// devices
return FALSE; } // DX8 and above
return (m_ddiType >= D3DDDITYPE_DX8); } // CanBufBlt
BOOL CanDriverManageResource(void) const { if (m_dwBehaviorFlags & D3DCREATE_DISABLE_DRIVER_MANAGEMENT) { return FALSE; } else if (GetD3DCaps()->Caps2 & DDCAPS2_CANMANAGERESOURCE) { DDASSERT(m_ddiType >= D3DDDITYPE_DX8); return TRUE; } else { return FALSE; } } // CanDriverManage
D3DDDITYPE GetDDIType(void) const { return m_ddiType; } // GetDDIType
const D3D8_DRIVERCAPS* GetCoreCaps() const { return &m_DeviceData.DriverData; } // GetCoreCaps
const D3DCAPS8* GetD3DCaps() const { return &m_DeviceData.DriverData.D3DCaps; } // GetD3DCaps
D3DDISPLAYMODE* GetModeTable() const { return m_pD3DClass->GetModeTable(m_AdapterIndex); } // GetModeTable
VOID* GetInitFunction() const { if (m_DeviceType == D3DDEVTYPE_SW) { return m_pD3DClass->GetInitFunction(); } return NULL; } // GetModeTable
const DWORD GetNumModes() const { return m_pD3DClass->GetNumModes(m_AdapterIndex); } // GetNumModes
D3D8_DEVICEDATA* GetDeviceData() { return &m_DeviceData; } // GetDeviceData
CBaseSurface *ZBuffer() const { return m_pZBuffer; } // ZBuffer
CBaseSurface *RenderTarget() const { return m_pRenderTarget; } // RenderTarget
void UpdateRenderTarget(CBaseSurface *pRenderTarget, CBaseSurface *pZStencil);
CResourceManager* ResourceManager() const { // return the ResourceManager
return m_pResourceManager; } // ResourceManager
CEnum * Enum() const { // return the enumerator that created us
return m_pD3DClass; } // Enum
// Internal version of CopyRects (no parameter validation)
HRESULT InternalCopyRects(CBaseSurface *pSourceSurface, CONST RECT *pSourceRectsArray, UINT cRects, CBaseSurface *pDestinationSurface, CONST POINT *pDestPointsArray);
// Internal function for format validation
HRESULT CheckDeviceFormat(DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) { return Enum()->CheckDeviceFormat(AdapterIndex(), GetDeviceType(), DisplayFormat(), Usage, RType, CheckFormat); } // CheckDeviceFormats
HRESULT CheckDepthStencilMatch(D3DFORMAT RTFormat, D3DFORMAT DSFormat) { return Enum()->CheckDepthStencilMatch(AdapterIndex(), GetDeviceType(), DisplayFormat(), RTFormat, DSFormat); } // CheckDepthStencilMatch
// Internal function for multi-sample validation
HRESULT CheckDeviceMultiSampleType(D3DFORMAT RenderTargetFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType) { return Enum()->CheckDeviceMultiSampleType( AdapterIndex(), GetDeviceType(), RenderTargetFormat, Windowed, MultiSampleType); } // CheckDeviceMultiSampleType
D3DFORMAT MapDepthStencilFormat(D3DFORMAT Format) const { return Enum()->MapDepthStencilFormat( AdapterIndex(), GetDeviceType(), Format); } // MapDepthStencilFormat
UINT DisplayWidth() const { return m_DeviceData.DriverData.DisplayWidth; } UINT DisplayHeight() const { return m_DeviceData.DriverData.DisplayHeight; } D3DFORMAT DisplayFormat() const { return m_DeviceData.DriverData.DisplayFormatWithoutAlpha; } UINT DisplayRate() const { return m_DeviceData.DriverData.DisplayFrequency; } D3DDEVTYPE GetDeviceType() const { // Check this value is correct; pure types shouldn't happen
// and other values are wrong. Users of this method
// assume that these three are the only possible values.
DDASSERT(m_DeviceType == D3DDEVTYPE_REF || m_DeviceType == D3DDEVTYPE_SW || m_DeviceType == D3DDEVTYPE_HAL);
return m_DeviceType; } HWND FocusWindow() { return m_hwndFocusWindow; } // FocusWindow
CSwapChain* SwapChain() const { DDASSERT(m_pSwapChain); return m_pSwapChain; } D3DDISPLAYMODE DesktopMode() const { return m_DesktopMode; } UINT AdapterIndex() const { return m_AdapterIndex; } DWORD BehaviorFlags() const { return m_dwBehaviorFlags; } void ResetZStencil() { m_pAutoZStencil = NULL; } CBaseSurface* GetZStencil() const { return m_pAutoZStencil; }
void EnableVidmemVBs() { m_DeviceData.DriverData.D3DCaps.DevCaps |= (D3DDEVCAPS_HWVERTEXBUFFER); }
void DisableVidmemVBs() { m_DeviceData.DriverData.D3DCaps.DevCaps &= ~(D3DDEVCAPS_HWVERTEXBUFFER); }
BOOL DriverSupportsVidmemVBs() const { return (GetD3DCaps()->DevCaps & D3DDEVCAPS_HWVERTEXBUFFER); }
BOOL DriverSupportsVidmemIBs() const { return (GetD3DCaps()->DevCaps & D3DDEVCAPS_HWINDEXBUFFER); }
BOOL VBFailOversDisabled() const { return m_bVBFailOversDisabled; }
CResource* GetResourceList() const { return m_pResourceList; }
void SetResourceList(CResource *pRes) { m_pResourceList = pRes; }
#ifdef DEBUG
// debugging helper
UINT RefCount() const { return m_cRef; } // RefCount
#endif // DEBUG
protected: // This is the section for access to things that
// the derived versions of the base device need.
D3DDDITYPE m_ddiType;
private: // We mark "main" as a friend so that gensym can
// access everything it wants to
friend int main(void);
DWORD m_cRef; BOOL m_fullscreen; // should be a flag?
BOOL m_bVBFailOversDisabled;
CResource *m_pResourceList; CResourceManager *m_pResourceManager;
D3D8_DEVICEDATA m_DeviceData; HWND m_hwndFocusWindow; DWORD m_dwBehaviorFlags; DWORD m_dwOriginalBehaviorFlags;
CBaseSurface *m_pZBuffer; CSwapChain *m_pSwapChain; CBaseSurface *m_pRenderTarget; CBaseSurface *m_pAutoZStencil;
D3DDEVTYPE m_DeviceType; UINT m_AdapterIndex; CEnum *m_pD3DClass;
D3DDISPLAYMODE m_DesktopMode; };
#endif // define __DXGINT_H__
|