|
|
#ifndef __IBUFFER_HPP__
#define __IBUFFER_HPP__
/*==========================================================================;
* * Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. * * File: ibuffer.hpp * Content: Class header the Index buffer class * ***************************************************************************/
// Includes
#include "buffer.hpp"
// The base-class implementation of the Index buffer assumes
// that it is resides system-memory. It may be managed.
class CIndexBuffer : public IDirect3DIndexBuffer8, public CBuffer { public: // Creation function for Index Buffers
static HRESULT Create(CBaseDevice *pDevice, DWORD cbLength, DWORD dwUsage, D3DFORMAT Format, D3DPOOL Pool, REF_TYPE refType, IDirect3DIndexBuffer8 **ppIndexBuffer);
static HRESULT CreateSysmemIndexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwUsage, DWORD dwActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, CIndexBuffer **pIB);
static HRESULT CreateDriverIndexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwUsage, DWORD dwActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, CIndexBuffer **pVB);
static HRESULT CreateDriverManagedIndexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwUsage, DWORD dwActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, CIndexBuffer **pVB);
// Methods for Resource Management
// Create duplicate of current object in new pool;
// LOD is ignored for our type
virtual HRESULT Clone(D3DPOOL Pool, CResource **ppResource) const;
virtual const D3DBUFFER_DESC* GetBufferDesc() const;
HRESULT UpdateDirtyPortion(CResource *pResourceTarget);
// IUnknown methods
STDMETHOD(QueryInterface) (REFIID riid, LPVOID FAR * ppvObj); STDMETHOD_(ULONG,AddRef) (); STDMETHOD_(ULONG,Release) ();
// Some Methods for IDirect3DBuffer
STDMETHOD(SetPrivateData)(REFGUID riid, CONST VOID* pvData, DWORD cbData, DWORD dwFlags);
STDMETHOD(GetPrivateData)(REFGUID riid, LPVOID pvData, LPDWORD pcbData);
STDMETHOD(FreePrivateData)(REFGUID riid);
STDMETHOD(GetDevice)(IDirect3DDevice8 **ppDevice); STDMETHOD_(DWORD, GetPriority)(); STDMETHOD_(DWORD, SetPriority)(DWORD dwPriority); STDMETHOD_(void, PreLoad)(); STDMETHOD_(D3DRESOURCETYPE, GetType)();
// Methods for IDirect3DIndexBuffer8
STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags);
STDMETHOD(Unlock)(); STDMETHOD(GetDesc)(D3DINDEXBUFFER_DESC *pDesc);
BYTE* Data() const { DXGASSERT(m_desc.Usage & D3DUSAGE_SOFTWAREPROCESSING); DXGASSERT(m_desc.Pool == D3DPOOL_SYSTEMMEM || m_desc.Pool == D3DPOOL_MANAGED); DXGASSERT(m_LockCount == 0); return GetPrivateDataPointer(); }
protected:
CIndexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwUsage, DWORD dwActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr);
#if DBG
HRESULT ValidateLockParams(UINT cbOffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD dwFlags) const; #endif // DBG
// Member data
D3DINDEXBUFFER_DESC m_desc; DWORD m_usageUser;
}; // class CIndexBuffer
class CIndexBufferMT : public CIndexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { API_ENTER(Device()); return CIndexBuffer::Lock(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags); }
STDMETHOD(Unlock)() { API_ENTER(Device()); return CIndexBuffer::Unlock(); }
friend CIndexBuffer;
protected:
CIndexBufferMT(CBaseDevice *pDevice, DWORD cbLength, DWORD Usage, DWORD ActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr) : CIndexBuffer(pDevice, cbLength, Usage, ActualUsage, Format, Pool, ActualPool, refType, phr) { }
}; // class CIndexBufferMT
// This derived version of the Index buffer class
// overrides lock/unlock to call the driver instead
class CDriverIndexBuffer : public CIndexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags); STDMETHOD(Unlock)();
HRESULT LockI(DWORD dwFlags); HRESULT UnlockI();
BYTE* Data() const { DXGASSERT(FALSE); // Direct pointer access not supported
return 0; }
// Alloc CIndexBuffer to construct this object
friend CIndexBuffer;
protected: CDriverIndexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD Usage, DWORD ActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr); ~CDriverIndexBuffer();
BYTE* m_pbData; // stores cached pointer
}; // class CDriverIndexBuffer
class CDriverIndexBufferMT : public CDriverIndexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { API_ENTER(Device()); return CDriverIndexBuffer::Lock(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags); }
STDMETHOD(Unlock)() { API_ENTER(Device()); return CDriverIndexBuffer::Unlock(); }
friend CIndexBuffer;
protected: CDriverIndexBufferMT(CBaseDevice *pDevice, DWORD cbLength, DWORD Usage, DWORD ActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr) : CDriverIndexBuffer(pDevice, cbLength, Usage, ActualUsage, Format, Pool, ActualPool, refType, phr) { }
}; // class CIndexBufferMT
// This derived version of the Index buffer class
// overrides lock/unlock to call the driver instead
class CDriverManagedIndexBuffer : public CIndexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags); STDMETHOD(Unlock)();
BYTE* Data() const { DXGASSERT(m_desc.Usage & D3DUSAGE_SOFTWAREPROCESSING); DXGASSERT((m_desc.Usage & D3DUSAGE_WRITEONLY) == 0); DXGASSERT(m_LockCount == 0); DXGASSERT(m_pbData != 0); return m_pbData; }
// Alloc CIndexBuffer to construct this object
friend CIndexBuffer;
protected: CDriverManagedIndexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD Usage, DWORD ActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr);
HRESULT UpdateCachedPointer(CBaseDevice*);
friend HRESULT CResource::RestoreDriverManagementState(CBaseDevice*);
BYTE* m_pbData; // stores cached pointer
BOOL m_bDriverCalled; }; // class CDriverManagedIndexBuffer
class CDriverManagedIndexBufferMT : public CDriverManagedIndexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { API_ENTER(Device()); return CDriverManagedIndexBuffer::Lock(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags); }
STDMETHOD(Unlock)() { API_ENTER(Device()); return CDriverManagedIndexBuffer::Unlock(); }
// Alloc CIndexBuffer to construct this object
friend CIndexBuffer;
protected: CDriverManagedIndexBufferMT(CBaseDevice *pDevice, DWORD cbLength, DWORD Usage, DWORD ActualUsage, D3DFORMAT Format, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr) : CDriverManagedIndexBuffer(pDevice, cbLength, Usage, ActualUsage, Format, Pool, ActualPool, refType, phr) { }
}; // class CDriverIndexBufferMT
#endif // __IBUFFER_HPP__
|