#ifndef __BUFFER_HPP__ #define __BUFFER_HPP__ /*==========================================================================; * * Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. * * File: buffer.hpp * Content: Class header the buffer base class; this class * contains all the logic that is shared between * the Index/Vertex/Command buffer types. * ***************************************************************************/ // Includes #include "resource.hpp" // // The CBuffer is a base class for the index and vertex buffers // class CBuffer : public CResource { public: // Methods for Resource management virtual HRESULT UpdateDirtyPortion(CResource *pResourceTarget) { return S_OK; } virtual void MarkAllDirty(); virtual BYTE* Data() const = 0; BOOL IsLocked() const { return m_LockCount > 0; } // IsLocked protected: // Constructor returns an error code // if the object could not be fully // constructed CBuffer(CBaseDevice *pDevice, DWORD cbLength, DWORD dwFVF, D3DFORMAT Format, D3DRESOURCETYPE Type, DWORD Usage, DWORD ActualUsage, D3DPOOL Pool, D3DPOOL ActualPool, REF_TYPE refType, HRESULT *phr ); void LockImpl(UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags, DWORD cbLength) { *ppbData = m_pbBuffer + cbOffsetToLock; // Do dirty rect stuff if (IsD3DManaged() && (dwFlags & D3DLOCK_READONLY) == 0) { OnBufferChangeImpl(cbOffsetToLock, cbSizeToLock); } } void OnBufferChangeImpl(UINT cbOffsetToLock, UINT cbSizeToLock); BYTE* GetPrivateDataPointer() const { return m_pbBuffer; } #if DBG BOOL m_isLockable; DWORD m_SceneStamp; DWORD m_TimesLocked; #endif // DBG DWORD m_LockCount; DWORD m_cbDirtyMin; DWORD m_cbDirtyMax; // Destructor virtual ~CBuffer(); private: BYTE *m_pbBuffer; }; // class CBuffer // HACK: Ok; here's a minimal command buffer... This is probably not // the final implementation; but hey there you go. class CCommandBuffer : public CBuffer { public: // Static creation method static HRESULT Create(CBaseDevice *pDevice, DWORD cbLength, D3DPOOL Pool, CCommandBuffer **ppIndexBuffer); HRESULT Clone(D3DPOOL Pool, CResource **ppResource) const; const D3DBUFFER_DESC * GetBufferDesc() const { return &m_desc; } // GetDesc // You must call Release to free this guy. No support for // addref UINT Release() { return ReleaseImpl(); }; // Lock and Unlock support STDMETHOD(Lock)(THIS_ UINT cbOffsetToLock, UINT cbSizeToLock, BYTE **ppbData, DWORD dwFlags) { #if DBG if (m_LockCount != 0) { DPF_ERR("Lock failed for command buffer; buffer was already locked."); return D3DERR_INVALIDCALL; } #endif // DBG m_LockCount = 1; LockImpl(cbOffsetToLock, cbSizeToLock, ppbData, dwFlags, m_cbLength); return S_OK; } // Lock STDMETHOD(Unlock)(THIS) { #if DBG // If we aren't locked; then something is wrong if (m_LockCount != 1) { DPF_ERR("Unlock failed on a command buffer; buffer wasn't locked."); return D3DERR_INVALIDCALL; } #endif // DBG // Clear our locked state m_LockCount = 0; return S_OK; } // Unlock BYTE* Data() const { DXGASSERT(FALSE); // Direct access not supported return 0; } private: CCommandBuffer(CBaseDevice *pDevice, DWORD cbLength, D3DPOOL Pool, HRESULT *phr) : CBuffer(pDevice, cbLength, 0, // dwFVF D3DFMT_UNKNOWN, D3DRTYPE_COMMANDBUFFER, D3DUSAGE_LOCK, // Usage D3DUSAGE_LOCK, // ActualUsage Pool, // Pool Pool, // ActualPool REF_INTERNAL, phr), m_cbLength(cbLength) { m_desc.Pool = Pool; m_desc.Usage = 0; m_desc.Format = D3DFMT_UNKNOWN; m_desc.Type = D3DRTYPE_COMMANDBUFFER; }; // CCommandBuffer::CCommandBuffer DWORD m_cbLength; D3DBUFFER_DESC m_desc; }; // class CCommandBuffer #endif // __BUFFER_HPP__