#ifndef __VBUFFER_HPP__ #define __VBUFFER_HPP__ /*==========================================================================; * * Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. * * File: vbuffer.hpp * Content: Class header the vertex buffer class * ***************************************************************************/ // Includes #include "buffer.hpp" // The base-class implementation of the vertex buffer assumes // that it is resides system-memory. It may be managed. class CVertexBuffer : public IDirect3DVertexBuffer8, public CBuffer { public: // Creation function for Vertex Buffers static HRESULT Create(CBaseDevice *pDevice, DWORD cbLength, DWORD dwUsage, DWORD dwFVF, D3DPOOL Pool, REF_TYPE refType, IDirect3DVertexBuffer8 **ppVertexBuffer); static HRESULT CreateSysmemVertexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD dwUsage, DWORD dwActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, CVertexBuffer **pVB); static HRESULT CreateDriverVertexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD dwUsage, DWORD dwActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, CVertexBuffer **pVB); static HRESULT CreateDriverManagedVertexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD dwUsage, DWORD dwActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, CVertexBuffer **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; virtual HRESULT LockI(DWORD dwFlags) {return D3D_OK;} virtual HRESULT UnlockI() {return D3D_OK;} virtual void SetCachedDataPointer(BYTE *pData) {} HRESULT UpdateDirtyPortion(CResource *pResourceTarget); DWORD GetFVF() const { return m_desc.FVF; } // 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 IDirect3DVertexBuffer8 STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags); STDMETHOD(Unlock)(); STDMETHOD(GetDesc)(D3DVERTEXBUFFER_DESC *pDesc); DWORD GetVertexSize() const { return m_vertsize; } DWORD GetNumVertices() const { return m_numverts; } WORD* GetClipCodes() const { return m_pClipCodes; } void AllocateClipCodes(); 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: CVertexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD dwUsage, DWORD dwActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr); virtual ~CVertexBuffer() { delete[] m_pClipCodes; } #if DBG HRESULT ValidateLockParams(UINT cbOffsetToLock, UINT SizeToLock, BYTE **ppbData, DWORD dwFlags) const; #endif // DBG D3DVERTEXBUFFER_DESC m_desc; DWORD m_usageUser; DWORD m_numverts; DWORD m_vertsize; WORD* m_pClipCodes; }; // class CVertexBuffer class CVertexBufferMT : public CVertexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { API_ENTER(Device()); return CVertexBuffer::Lock(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags); } STDMETHOD(Unlock)() { API_ENTER(Device()); return CVertexBuffer::Unlock(); } friend CVertexBuffer; protected: CVertexBufferMT(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD Usage, DWORD ActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr) : CVertexBuffer(pDevice, cbLength, dwFVF, Usage, ActualUsage, Pool, ActualPool, refType, phr) { } }; // class CVertexBufferMT // This derived version of the vertex buffer class // overrides lock/unlock to call the driver instead class CDriverVertexBuffer : public CVertexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags); STDMETHOD(Unlock)(); // Alloc CVertexBuffer to construct this object friend CVertexBuffer; HRESULT LockI(DWORD dwFlags); HRESULT UnlockI(); BYTE* GetCachedDataPointer() const { return m_pbData; } void SetCachedDataPointer(BYTE *pData) { m_pbData = pData; } BYTE* Data() const { DXGASSERT(FALSE); // Direct pointer access not supported return 0; } protected: CDriverVertexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD Usage, DWORD ActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr); ~CDriverVertexBuffer(); BYTE* m_pbData; // stores cached pointer }; // class CDriverVertexBuffer class CDriverVertexBufferMT : public CDriverVertexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { API_ENTER(Device()); return CDriverVertexBuffer::Lock(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags); } STDMETHOD(Unlock)() { API_ENTER(Device()); return CDriverVertexBuffer::Unlock(); } friend CVertexBuffer; protected: CDriverVertexBufferMT(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD Usage, DWORD ActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr) : CDriverVertexBuffer(pDevice, cbLength, dwFVF, Usage, ActualUsage, Pool, ActualPool, refType, phr) { } }; // class CVertexBufferMT // This derived version of the vertex buffer class // overrides lock/unlock to call the driver instead class CDriverManagedVertexBuffer : public CVertexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags); STDMETHOD(Unlock)(); HRESULT LockI(DWORD dwFlags) {return D3D_OK;} HRESULT UnlockI() {return D3D_OK;} 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 CVertexBuffer to construct this object friend CVertexBuffer; protected: CDriverManagedVertexBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD Usage, DWORD ActualUsage, 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 CDriverVertexBuffer class CDriverManagedVertexBufferMT : public CDriverManagedVertexBuffer { public: STDMETHOD(Lock)(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { API_ENTER(Device()); return CDriverManagedVertexBuffer::Lock(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags); } STDMETHOD(Unlock)() { API_ENTER(Device()); return CDriverManagedVertexBuffer::Unlock(); } // Alloc CVertexBuffer to construct this object friend CVertexBuffer; protected: CDriverManagedVertexBufferMT(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, DWORD Usage, DWORD ActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr) : CDriverManagedVertexBuffer(pDevice, cbLength, dwFVF, Usage, ActualUsage, Pool, ActualPool, refType, phr) { } }; // class CDriverVertexBufferMT #endif // __VBUFFER_HPP__