199 lines
5 KiB
C++
199 lines
5 KiB
C++
#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__
|