windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/d3d8/fw/ibuffer.hpp
2020-09-26 16:20:57 +08:00

354 lines
12 KiB
C++

#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__