375 lines
12 KiB
C++
375 lines
12 KiB
C++
|
#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__
|