OpenBarnyard
 
Loading...
Searching...
No Matches
TVertexBlockResource Class Reference

#include <TVertexBlockResource_DX8.h>

Inheritance diagram for TVertexBlockResource:
TResource TObject TNodeTree< T >::TNode

Classes

struct  HALBuffer
 

Public Member Functions

 TDECLARE_CLASS (TVertexBlockResource, TResource)
 
TFORCEINLINE void * operator new (size_t s)
 
TFORCEINLINE void * operator new (size_t s, void *where)
 
TFORCEINLINE void operator delete (void *ptr)
 
TFORCEINLINE void operator delete (void *ptr, void *where)
 
 TVertexBlockResource ()
 
virtual TBOOL Validate () override
 
virtual void Invalidate () override
 
virtual TBOOL TryInvalidate () override
 
virtual TBOOL TryValidate () override
 
TBOOL AttachPool (TVertexPoolResource *a_pPool)
 
TBOOL DettachPool (TVertexPoolResource *a_pPool)
 
TBOOL CanFit (TVertexPoolResource *a_pPoolResource) const
 
void ChildVertexUsedChanged (TINT a_iChange)
 
TBOOL Lock (TVertexPoolResourceInterface::LockBuffer *a_pLockBuffer, TUINT16 a_uiNumVertices)
 
void Unlock ()
 
TBOOL Create (TVertexFactoryResourceInterface *a_pFactory, TUINT16 a_uiMaxVertices, TUINT32 a_uiFlags)
 
TBOOL CreateHAL ()
 
void DestroyHAL ()
 
TBOOL GetHALBuffer (HALBuffer *a_pHALBuffer) const
 
- Public Member Functions inherited from TResource
 TDECLARE_CLASS (TResource, TObject)
 
 TResource ()
 
 ~TResource ()
 
virtual TBOOL Create ()
 
virtual void DestroyResource ()
 
virtual void OnDestroy ()
 
TBOOL IsDead () const
 
TBOOL IsDying () const
 
TBOOL IsValid () const
 
TBOOL IsExternal () const
 
TBOOL IsCreated () const
 
TBOOL IsSceneObject () const
 
TBOOL IsInvalid () const
 
void SetState (TResourceState newState)
 
void AddState (TResourceState state)
 
void SetParent (TResource *a_pParent)
 
const TCHARGetName () const
 
void SetName (const TCHAR *name)
 
TBOOL RecurseSimple (t_RecurseCb a_pCallback, TResource *a_pResource, void *a_pUserData)
 
TRenderInterfaceGetRenderer () const
 
void SetRenderer (TRenderInterface *pRenderer)
 
TUINT32 GetUId () const
 
void SetUId (TUINT32 uid)
 
- Public Member Functions inherited from TObject
virtual Toshi::TClass * GetClass ()
 
virtual void Delete ()
 
virtual ~TObject ()
 
TBOOL IsExactly (TClass *a_pClass)
 
TBOOL IsA (TClass *a_pClass)
 
- Public Member Functions inherited from TNodeTree< T >::TNode
TBOOL IsChildOfDefaultRoot () const
 
TBOOL IsLinked () const
 
T * Parent () const
 
T * Next () const
 
T * Prev () const
 
TNodeTree< T > * Tree () const
 
T * Child () const
 

Static Public Member Functions

static void SetupFreeList (TINT a_iCapacity, TINT a_iGrowSize)
 
static TVertexBlockResourceCreateNew ()
 
- Static Public Member Functions inherited from TResource
static TBOOL Recurse (t_RecurseCb a_pCallback, TResource *a_pResource, TBOOL a_bFlag, void *a_pUserData)
 
- Static Public Member Functions inherited from TObject
static Toshi::TObject * CreateTObject ()
 
static Toshi::TObject * CreateTObjectInPlace (void *a_pPtr)
 
static void InitialiseClass ()
 
static void DeinitialiseClass ()
 
static TFORCEINLINE TClassGetClassStatic ()
 

Static Public Attributes

static Toshi::TFreeList ms_oFreeList = Toshi::TFreeList( sizeof( TVertexBlockResource ), 0, 8, "TVertexBlockResource" )
 
- Static Public Attributes inherited from TResource
static constexpr size_t MAXNAMELEN = 14
 
- Static Public Attributes inherited from TObject
static constexpr Toshi::TClass * PARENTCLASS = TNULL
 
static constinit Toshi::TClass ms_oClass = Toshi::TClass( "TObject", TObject::CreateTObject, TObject::CreateTObjectInPlace, TObject::InitialiseClass, TObject::DeinitialiseClass, 0, 2, sizeof( TObject ), alignof( TObject ) )
 

Protected Attributes

TVertexFactoryResourceInterfacem_pFactory
 
TUINT m_uiFlags
 
TUINT16 m_uiMaxVertices
 
TUINT m_uiOffset
 
TUINT m_uiVerticesUsed
 
TUINT m_uiLockCount
 
TUINT m_Unk1
 
HALBuffer m_HALBuffer
 
- Protected Attributes inherited from TNodeTree< T >::TNode
TNodeTree< T > * m_Tree
 
T * m_Next
 
T * m_Prev
 
T * m_Parent
 
T * m_Child
 

Additional Inherited Members

- Public Types inherited from TResource
using t_RecurseCb = TBOOL ( * )( TResource* a_pResource, void* a_pUserData )
 
- Public Types inherited from TObject
enum  { IsTObject = TTRUE }
 
- Public Attributes inherited from TResource
friend TRenderInterface
 
- Public Attributes inherited from TNodeTree< T >::TNode
friend TNodeTree
 
- Protected Member Functions inherited from TNodeTree< T >::TNode
 TNode ()
 

Detailed Description

Definition at line 14 of file TVertexBlockResource_DX8.h.

Constructor & Destructor Documentation

◆ TVertexBlockResource()

TVertexBlockResource::TVertexBlockResource ( )

Member Function Documentation

◆ AttachPool()

TBOOL TVertexBlockResource::AttachPool ( TVertexPoolResource * a_pPool)

Definition at line 20 of file TVertexBlockResource_DX8.cpp.

21{
22 TVALIDPTR( a_pPool );
23
24 m_uiVerticesUsed += a_pPool->GetNumVertices();
25 a_pPool->SetParent( this );
26
27 if ( m_uiFlags & 1 )
28 {
29 Invalidate();
30 }
31
32 return TTRUE;
33}
#define TVALIDPTR(PTR)
Definition Defines.h:139
#define TTRUE
Definition Typedefs.h:25
virtual void Invalidate() override
void SetParent(TResource *a_pParent)
Definition TResource.cpp:75

◆ CanFit()

TBOOL TVertexBlockResource::CanFit ( TVertexPoolResource * a_pPoolResource) const

Definition at line 36 of file TVertexBlockResource_DX8.cpp.

37{
38 if ( m_uiFlags & 1 && a_pPoolResource->GetFlags() & 1 )
39 {
40 return m_uiMaxVertices >= a_pPoolResource->GetNumVertices() + m_uiVerticesUsed;
41 }
42
43 return TFALSE;
44}
#define TFALSE
Definition Typedefs.h:24

◆ ChildVertexUsedChanged()

void TVertexBlockResource::ChildVertexUsedChanged ( TINT a_iChange)

Definition at line 159 of file TVertexBlockResource_DX8.cpp.

160{
161 if ( a_iChange < 0 )
162 {
163 TASSERT( m_uiVerticesUsed >= TUINT( -a_iChange ) );
164 }
165
166 m_uiVerticesUsed += a_iChange;
167}
#define TASSERT(X,...)
Definition Defines.h:138
unsigned int TUINT
Definition Typedefs.h:8

◆ Create()

TBOOL TVertexBlockResource::Create ( TVertexFactoryResourceInterface * a_pFactory,
TUINT16 a_uiMaxVertices,
TUINT32 a_uiFlags )

Definition at line 64 of file TVertexBlockResource_DX8.cpp.

65{
66 m_pFactory = a_pFactory;
67 m_uiMaxVertices = a_uiMaxVertices;
68 m_uiFlags = a_uiFlags;
69 return TResource::Create();
70}
virtual TBOOL Create()
Definition TResource.cpp:28

◆ CreateHAL()

TBOOL TVertexBlockResource::CreateHAL ( )

Definition at line 73 of file TVertexBlockResource_DX8.cpp.

74{
75 DestroyHAL();
76
77 auto pRenderer = TRenderD3DInterface::Interface();
78 auto& vertexFormat = m_pFactory->GetVertexFormat();
79 m_HALBuffer.uiNumStreams = vertexFormat.m_uiNumStreams;
80
81 for ( TUINT i = 0; i < m_HALBuffer.uiNumStreams; i++ )
82 {
83 UINT length = vertexFormat.m_aStreamFormats[ i ].m_uiVertexSize * m_uiMaxVertices;
84 DWORD usage = D3DUSAGE_WRITEONLY;
85
86 if ( ISZERO( m_uiFlags & 1 ) )
87 {
88 usage = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY;
89 m_uiOffset = 0;
90 }
91
92 if ( !pRenderer->GetCurrentDevice()->SupportsHardwareTransfomations() )
93 {
94 usage |= D3DUSAGE_SOFTWAREPROCESSING;
95 }
96
97 HRESULT hRes = pRenderer->GetDirect3DDevice()->CreateVertexBuffer(
98 length,
99 usage,
100 0,
101 ( m_uiFlags & 1 ) ? D3DPOOL_MANAGED : D3DPOOL_DEFAULT,
102 &m_HALBuffer.apVertexBuffers[ i ]
103 );
104
105 if ( FAILED( hRes ) )
106 {
107 TRenderD3DInterface::PrintError( hRes, "Unable to create a new vertex buffer!" );
108 return TFALSE;
109 }
110
111 TMemory::HALMemInfo memInfoHAL;
112 TMemory::GetHALMemInfo( memInfoHAL );
113
114 s_iHALMemoryUsage += memInfoHAL.m_uiMemUsage;
115 s_iCurrentNumHALCreated += 1;
116 s_iTotalNumHALCreated += 1;
117 s_iTotalVertexBufferBytesAllocated += length;
118 s_iCurrentVertexBufferBytesAllocated += length;
119
120 if ( s_iTotalVertexBufferBytesAllocated < s_iHALMemoryUsage )
121 {
122 s_iWastedVertexBufferBytesAllocated = s_iHALMemoryUsage - s_iTotalVertexBufferBytesAllocated;
123 }
124 }
125
126 return TTRUE;
127}
#define ISZERO(X)
Definition Defines.h:3
static void GetHALMemInfo(HALMemInfo &a_rHALMemInfo)
Definition TMemory.cpp:956
TSIZE m_uiMemUsage
Total memory usage.
Definition TMemory.h:165
static void PrintError(TINT32 a_eError, const TCHAR *a_szInfo)
Prints error text caused by some directx call.
static TFORCEINLINE TRenderD3DInterface * Interface()
Gets the render interface singleton.

◆ CreateNew()

static TVertexBlockResource * TVertexBlockResource::CreateNew ( )
inlinestatic

Definition at line 20 of file TVertexBlockResource_DX8.h.

21 {
22 return new TVertexBlockResource();
23 }

◆ DestroyHAL()

void TVertexBlockResource::DestroyHAL ( )

Definition at line 130 of file TVertexBlockResource_DX8.cpp.

131{
132 TMemory::HALMemInfo memInfoHAL;
133 TMemory::GetHALMemInfo( memInfoHAL );
134
135 for ( TUINT i = 0; i < m_HALBuffer.uiNumStreams; i++ )
136 {
137 if ( m_HALBuffer.apVertexBuffers[ i ] )
138 {
139 m_HALBuffer.apVertexBuffers[ i ]->Release();
140 m_HALBuffer.apVertexBuffers[ i ] = TNULL;
141 s_iCurrentNumHALCreated -= 1;
142 s_iTotalNumHALDestroyed += 1;
143 s_iCurrentVertexBufferBytesAllocated -= m_pFactory->GetVertexFormat().m_aStreamFormats[ i ].m_uiVertexSize * m_uiMaxVertices;
144 }
145 }
146
147 m_HALBuffer.uiNumStreams = 0;
148
149 TMemory::GetHALMemInfo( memInfoHAL );
150 s_iHALMemoryUsage = s_iHALMemoryUsage - memInfoHAL.m_uiMemUsage;
151
152 if ( s_iTotalVertexBufferBytesAllocated < s_iHALMemoryUsage )
153 {
154 s_iWastedVertexBufferBytesAllocated = s_iHALMemoryUsage - s_iTotalVertexBufferBytesAllocated;
155 }
156}

◆ DettachPool()

TBOOL TVertexBlockResource::DettachPool ( TVertexPoolResource * a_pPool)

Definition at line 47 of file TVertexBlockResource_DX8.cpp.

48{
49 TASSERT( TTRUE == Parent()->IsExactly( &TGetClass( TVertexFactoryResource ) ) );
50 a_pPool->SetParent( Parent() == Tree()->GetRoot() ? TNULL : Parent() );
51
52 m_uiVerticesUsed -= a_pPool->GetNumVertices();
53
54 if ( m_uiVerticesUsed == 0 && Child() == TNULL )
55 {
57 return TTRUE;
58 }
59
60 return TFALSE;
61}
#define TGetClass(CLASS)
Definition TObject.h:13
void DestroyResource(TResource *resource)
TRenderInterface * GetRenderer() const
T * Parent() const
Definition TNodeTree.h:33
T * Child() const
Definition TNodeTree.h:37
TNodeTree< T > * Tree() const
Definition TNodeTree.h:36
TBOOL IsExactly(TClass *a_pClass)
Definition TObject.h:191

◆ GetHALBuffer()

TBOOL TVertexBlockResource::GetHALBuffer ( HALBuffer * a_pHALBuffer) const

Definition at line 368 of file TVertexBlockResource_DX8.cpp.

369{
370 TVALIDPTR( a_pHALBuffer );
371
372 if ( a_pHALBuffer )
373 {
374 *a_pHALBuffer = m_HALBuffer;
375 return TTRUE;
376 }
377
378 return TFALSE;
379}

◆ Invalidate()

void TVertexBlockResource::Invalidate ( )
overridevirtual

Reimplemented from TResource.

Definition at line 255 of file TVertexBlockResource_DX8.cpp.

256{
257 if ( IsValid() && IsCreated() )
258 {
259 TASSERT( m_uiLockCount == 0 );
260
261 DestroyHAL();
263 }
264}
TBOOL IsCreated() const
Definition TResource.h:46
virtual void Invalidate()
Definition TResource.cpp:47
TBOOL IsValid() const
Definition TResource.h:44

◆ Lock()

TBOOL TVertexBlockResource::Lock ( TVertexPoolResourceInterface::LockBuffer * a_pLockBuffer,
TUINT16 a_uiNumVertices )

Definition at line 267 of file TVertexBlockResource_DX8.cpp.

268{
269 TVALIDPTR( a_pLockBuffer );
270
271 auto& vertexFormat = m_pFactory->GetVertexFormat();
272 a_pLockBuffer->uiNumStreams = vertexFormat.m_uiNumStreams;
273
274 DWORD uiFlags;
275 TUINT uiNumVertices = 0;
276 TUINT uiUnk1 = m_uiFlags & 7;
277
278 if ( uiUnk1 == 1 )
279 {
280 uiFlags = D3DLOCK_NOSYSLOCK;
281 a_pLockBuffer->uiOffset = 0;
282 }
283 else
284 {
285 if ( uiUnk1 != 2 )
286 {
287 if ( uiUnk1 != 4 )
288 {
289 return TFALSE;
290 }
291
292 Validate();
293 uiNumVertices = a_uiNumVertices;
294
295 if ( m_uiMaxVertices < m_uiOffset + uiNumVertices )
296 {
297 uiFlags = D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK;
298 a_pLockBuffer->uiOffset = 0;
299 m_uiOffset = uiNumVertices;
300 }
301 else
302 {
303 uiFlags = D3DLOCK_NOOVERWRITE | D3DLOCK_NOSYSLOCK;
304 a_pLockBuffer->uiOffset = m_uiOffset;
305 m_uiOffset += uiNumVertices;
306 }
307 }
308 else
309 {
310 Validate();
311 uiFlags = D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK;
312 a_pLockBuffer->uiOffset = 0;
313 }
314 }
315
316 for ( TUINT i = 0; i < a_pLockBuffer->uiNumStreams; i++ )
317 {
318 HRESULT hRes = m_HALBuffer.apVertexBuffers[ i ]->Lock(
319 a_pLockBuffer->uiOffset * vertexFormat.m_aStreamFormats[ i ].m_uiVertexSize,
320 uiNumVertices * vertexFormat.m_aStreamFormats[ i ].m_uiVertexSize,
321 &a_pLockBuffer->apStreams[ i ],
322 uiFlags
323 );
324
325 if ( FAILED( hRes ) )
326 {
327 TRenderD3DInterface::PrintError( hRes, "Couldn\'t lock stream vertex buffer" );
328 }
329 }
330
331 m_uiLockCount += 1;
332 return TTRUE;
333}
virtual TBOOL Validate() override
TBYTE * apStreams[TVertexFactoryFormat::MAX_NUM_STREAMS]

◆ operator delete() [1/2]

TFORCEINLINE void TVertexBlockResource::operator delete ( void * ptr)
inline

Definition at line 18 of file TVertexBlockResource_DX8.h.

◆ operator delete() [2/2]

TFORCEINLINE void TVertexBlockResource::operator delete ( void * ptr,
void * where )
inline

Definition at line 18 of file TVertexBlockResource_DX8.h.

◆ operator new() [1/2]

TFORCEINLINE void * TVertexBlockResource::operator new ( size_t s)
inline

Definition at line 18 of file TVertexBlockResource_DX8.h.

◆ operator new() [2/2]

TFORCEINLINE void * TVertexBlockResource::operator new ( size_t s,
void * where )
inline

Definition at line 18 of file TVertexBlockResource_DX8.h.

◆ SetupFreeList()

static void TVertexBlockResource::SetupFreeList ( TINT a_iCapacity,
TINT a_iGrowSize )
inlinestatic

Definition at line 18 of file TVertexBlockResource_DX8.h.

◆ TDECLARE_CLASS()

TVertexBlockResource::TDECLARE_CLASS ( TVertexBlockResource ,
TResource  )

◆ TryInvalidate()

TBOOL TVertexBlockResource::TryInvalidate ( )
overridevirtual

Reimplemented from TResource.

Definition at line 170 of file TVertexBlockResource_DX8.cpp.

171{
172 if ( m_uiFlags & 1 )
173 {
174 Invalidate();
175 }
176
177 return TTRUE;
178}

◆ TryValidate()

TBOOL TVertexBlockResource::TryValidate ( )
overridevirtual

Reimplemented from TResource.

Definition at line 181 of file TVertexBlockResource_DX8.cpp.

182{
183 if ( m_uiFlags & 1 )
184 {
185 Validate();
186 }
187
188 return TTRUE;
189}

◆ Unlock()

void TVertexBlockResource::Unlock ( )

Definition at line 336 of file TVertexBlockResource_DX8.cpp.

337{
338 TASSERT( 0 != m_uiLockCount );
339
340 if ( m_uiLockCount > 0 )
341 {
342 for ( TUINT i = 0; i < m_pFactory->GetVertexFormat().m_uiNumStreams; i++ )
343 {
344 HRESULT hRes = m_HALBuffer.apVertexBuffers[ i ]->Unlock();
345
346 if ( FAILED( hRes ) )
347 {
348 TRenderD3DInterface::PrintError( hRes, "Couldn\'t unlock stream vertex buffer!" );
349 }
350 }
351
352 m_uiLockCount -= 1;
353 }
354}

◆ Validate()

TBOOL TVertexBlockResource::Validate ( )
overridevirtual

Reimplemented from TResource.

Definition at line 192 of file TVertexBlockResource_DX8.cpp.

193{
194 if ( IsValid() && IsCreated() )
195 {
196 return TTRUE;
197 }
198
199 if ( !CreateHAL() )
200 {
201 return TFALSE;
202 }
203
204 if ( m_uiFlags & 1 )
205 {
206 using Pair = T2Pair<TVertexBlockResource*, TVertexPoolResourceInterface::LockBuffer>;
207 Pair pair;
208
209 if ( Lock( &pair.second, 0 ) )
210 {
211 pair.first = this;
212
214 []( TResource* a_pResource, void* a_pUserData ) {
215 if ( a_pResource->IsExactly( &TGetClass( TVertexPoolResource ) ) )
216 {
217 auto pPool = TSTATICCAST( TVertexPoolResource, a_pResource );
218 auto pPair = TSTATICCAST( Pair, a_pUserData );
219
220 auto pFactory = pPool->GetFactory();
221 auto vertexFormat = pFactory->GetVertexFormat();
222
223 if ( pPool->m_uiFlags & 1 )
224 {
225 pPool->m_uiVertexOffset = pPair->second.uiOffset;
226 pPair->second.uiOffset += pPool->GetNumVertices();
227
228 for ( TUINT i = 0; i < vertexFormat.GetNumStreams(); i++ )
229 {
230 auto uiVertexSize = vertexFormat.m_aStreamFormats[ i ].m_uiVertexSize;
231
233 pPair->second.apStreams[ i ] + pPool->m_uiVertexOffset * uiVertexSize,
234 pPool->GetManagedStream( i ),
235 pPool->GetNumVertices() * uiVertexSize
236 );
237 }
238 }
239 }
240
241 return TTRUE;
242 },
243 this,
244 &pair
245 );
246
247 Unlock();
248 }
249 }
250
251 return TResource::Validate();
252}
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
TBOOL Lock(TVertexPoolResourceInterface::LockBuffer *a_pLockBuffer, TUINT16 a_uiNumVertices)
virtual TBOOL Validate()
Definition TResource.cpp:36
TBOOL RecurseSimple(t_RecurseCb a_pCallback, TResource *a_pResource, void *a_pUserData)
static void * MemCopy(void *dst, const void *src, TSIZE size)
Definition TUtil.h:90

Member Data Documentation

◆ m_HALBuffer

HALBuffer TVertexBlockResource::m_HALBuffer
protected

Definition at line 76 of file TVertexBlockResource_DX8.h.

◆ m_pFactory

TVertexFactoryResourceInterface* TVertexBlockResource::m_pFactory
protected

Definition at line 69 of file TVertexBlockResource_DX8.h.

◆ m_uiFlags

TUINT TVertexBlockResource::m_uiFlags
protected

Definition at line 70 of file TVertexBlockResource_DX8.h.

◆ m_uiLockCount

TUINT TVertexBlockResource::m_uiLockCount
protected

Definition at line 74 of file TVertexBlockResource_DX8.h.

◆ m_uiMaxVertices

TUINT16 TVertexBlockResource::m_uiMaxVertices
protected

Definition at line 71 of file TVertexBlockResource_DX8.h.

◆ m_uiOffset

TUINT TVertexBlockResource::m_uiOffset
protected

Definition at line 72 of file TVertexBlockResource_DX8.h.

◆ m_uiVerticesUsed

TUINT TVertexBlockResource::m_uiVerticesUsed
protected

Definition at line 73 of file TVertexBlockResource_DX8.h.

◆ m_Unk1

TUINT TVertexBlockResource::m_Unk1
protected

Definition at line 75 of file TVertexBlockResource_DX8.h.

◆ ms_oFreeList

Toshi::TFreeList TVertexBlockResource::ms_oFreeList = Toshi::TFreeList( sizeof( TVertexBlockResource ), 0, 8, "TVertexBlockResource" )
static

Definition at line 18 of file TVertexBlockResource_DX8.h.


The documentation for this class was generated from the following files: