Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

775 lines
22 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //
  7. //===========================================================================//
  8. #include <d3d10.h>
  9. #undef GetCommandLine
  10. #include "meshdx10.h"
  11. #include "utlvector.h"
  12. #include "materialsystem/imaterialsystem.h"
  13. #include "IHardwareConfigInternal.h"
  14. #include "shaderapi_global.h"
  15. #include "shaderapi/ishaderutil.h"
  16. #include "shaderapi/ishaderapi.h"
  17. #include "shaderdevicedx10.h"
  18. #include "materialsystem/imesh.h"
  19. #include "tier0/vprof.h"
  20. #include "tier0/dbg.h"
  21. #include "materialsystem/idebugtextureinfo.h"
  22. #include "materialsystem/ivballoctracker.h"
  23. #include "tier2/tier2.h"
  24. //-----------------------------------------------------------------------------
  25. //
  26. // Dx10 implementation of a vertex buffer
  27. //
  28. //-----------------------------------------------------------------------------
  29. //-----------------------------------------------------------------------------
  30. // globals
  31. //-----------------------------------------------------------------------------
  32. #ifdef _DEBUG
  33. int CVertexBufferDx10::s_nBufferCount = 0;
  34. #endif
  35. //-----------------------------------------------------------------------------
  36. // constructor, destructor
  37. //-----------------------------------------------------------------------------
  38. CVertexBufferDx10::CVertexBufferDx10( ShaderBufferType_t type, VertexFormat_t fmt, int nVertexCount, const char *pBudgetGroupName ) :
  39. BaseClass( pBudgetGroupName )
  40. {
  41. Assert( nVertexCount != 0 );
  42. m_pVertexBuffer = NULL;
  43. m_VertexFormat = fmt;
  44. m_nVertexCount = ( fmt == VERTEX_FORMAT_UNKNOWN ) ? 0 : nVertexCount;
  45. m_nBufferSize = ( fmt == VERTEX_FORMAT_UNKNOWN ) ? nVertexCount : nVertexCount * VertexSize();
  46. m_nFirstUnwrittenOffset = 0;
  47. m_bIsLocked = false;
  48. m_bIsDynamic = ( type == SHADER_BUFFER_TYPE_DYNAMIC ) || ( type == SHADER_BUFFER_TYPE_DYNAMIC_TEMP );
  49. m_bFlush = false;
  50. }
  51. CVertexBufferDx10::~CVertexBufferDx10()
  52. {
  53. Free();
  54. }
  55. //-----------------------------------------------------------------------------
  56. // Creates, destroys the vertex buffer
  57. //-----------------------------------------------------------------------------
  58. bool CVertexBufferDx10::Allocate( )
  59. {
  60. Assert( !m_pVertexBuffer );
  61. m_nFirstUnwrittenOffset = 0;
  62. D3D10_BUFFER_DESC bd;
  63. bd.Usage = D3D10_USAGE_DYNAMIC;
  64. bd.ByteWidth = m_nBufferSize;
  65. bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
  66. bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  67. bd.MiscFlags = 0;
  68. HRESULT hr = D3D10Device()->CreateBuffer( &bd, NULL, &m_pVertexBuffer );
  69. bool bOk = !FAILED( hr ) && ( m_pVertexBuffer != 0 );
  70. if ( bOk )
  71. {
  72. // Track VB allocations
  73. g_VBAllocTracker->CountVB( m_pVertexBuffer, m_bIsDynamic, m_nBufferSize, VertexSize(), GetVertexFormat() );
  74. if ( !m_bIsDynamic )
  75. {
  76. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_STATIC_INDEX_BUFFER,
  77. COUNTER_GROUP_TEXTURE_GLOBAL, m_nBufferSize );
  78. }
  79. else
  80. {
  81. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_DYNAMIC_INDEX_BUFFER,
  82. COUNTER_GROUP_TEXTURE_GLOBAL, m_nBufferSize );
  83. // Dynamic meshes should never be compressed (slows down writing to them)
  84. Assert( CompressionType( GetVertexFormat() ) == VERTEX_COMPRESSION_NONE );
  85. }
  86. #ifdef _DEBUG
  87. ++s_nBufferCount;
  88. #endif
  89. }
  90. return bOk;
  91. }
  92. void CVertexBufferDx10::Free()
  93. {
  94. if ( m_pVertexBuffer )
  95. {
  96. #ifdef _DEBUG
  97. --s_nBufferCount;
  98. #endif
  99. // Track VB allocations
  100. g_VBAllocTracker->UnCountVB( m_pVertexBuffer );
  101. m_pVertexBuffer->Release();
  102. m_pVertexBuffer = NULL;
  103. if ( !m_bIsDynamic )
  104. {
  105. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_STATIC_INDEX_BUFFER,
  106. COUNTER_GROUP_TEXTURE_GLOBAL, - m_nBufferSize );
  107. }
  108. else
  109. {
  110. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_DYNAMIC_INDEX_BUFFER,
  111. COUNTER_GROUP_TEXTURE_GLOBAL, - m_nBufferSize );
  112. }
  113. }
  114. }
  115. //-----------------------------------------------------------------------------
  116. // Vertex Buffer info
  117. //-----------------------------------------------------------------------------
  118. int CVertexBufferDx10::VertexCount() const
  119. {
  120. Assert( !m_bIsDynamic );
  121. return m_nVertexCount;
  122. }
  123. //-----------------------------------------------------------------------------
  124. // Returns the buffer format (only valid for static index buffers)
  125. //-----------------------------------------------------------------------------
  126. VertexFormat_t CVertexBufferDx10::GetVertexFormat() const
  127. {
  128. Assert( !m_bIsDynamic );
  129. return m_VertexFormat;
  130. }
  131. //-----------------------------------------------------------------------------
  132. // Returns true if the buffer is dynamic
  133. //-----------------------------------------------------------------------------
  134. bool CVertexBufferDx10::IsDynamic() const
  135. {
  136. return m_bIsDynamic;
  137. }
  138. //-----------------------------------------------------------------------------
  139. // Only used by dynamic buffers, indicates the next lock should perform a discard.
  140. //-----------------------------------------------------------------------------
  141. void CVertexBufferDx10::Flush()
  142. {
  143. // This strange-looking line makes a flush only occur if the buffer is dynamic.
  144. m_bFlush = m_bIsDynamic;
  145. }
  146. //-----------------------------------------------------------------------------
  147. // Casts a dynamic buffer to be a particular vertex type
  148. //-----------------------------------------------------------------------------
  149. void CVertexBufferDx10::BeginCastBuffer( VertexFormat_t format )
  150. {
  151. Assert( format != MATERIAL_INDEX_FORMAT_UNKNOWN );
  152. Assert( m_bIsDynamic && ( m_VertexFormat == 0 || m_VertexFormat == format ) );
  153. if ( !m_bIsDynamic )
  154. return;
  155. m_VertexFormat = format;
  156. m_nVertexCount = m_nBufferSize / VertexSize();
  157. }
  158. void CVertexBufferDx10::EndCastBuffer( )
  159. {
  160. Assert( m_bIsDynamic && m_VertexFormat != 0 );
  161. if ( !m_bIsDynamic )
  162. return;
  163. m_VertexFormat = 0;
  164. m_nVertexCount = 0;
  165. }
  166. //-----------------------------------------------------------------------------
  167. // Returns the number of indices that can be written into the buffer
  168. //-----------------------------------------------------------------------------
  169. int CVertexBufferDx10::GetRoomRemaining() const
  170. {
  171. return ( m_nBufferSize - m_nFirstUnwrittenOffset ) / VertexSize();
  172. }
  173. //-----------------------------------------------------------------------------
  174. // Lock, unlock
  175. //-----------------------------------------------------------------------------
  176. bool CVertexBufferDx10::Lock( int nMaxVertexCount, bool bAppend, VertexDesc_t &desc )
  177. {
  178. Assert( !m_bIsLocked && ( nMaxVertexCount != 0 ) && ( nMaxVertexCount <= m_nVertexCount ) );
  179. Assert( m_VertexFormat != 0 );
  180. // FIXME: Why do we need to sync matrices now?
  181. ShaderUtil()->SyncMatrices();
  182. g_ShaderMutex.Lock();
  183. void *pLockedData = NULL;
  184. HRESULT hr;
  185. // This can happen if the buffer was locked but a type wasn't bound
  186. if ( m_VertexFormat == 0 )
  187. goto vertexBufferLockFailed;
  188. // Just give the app crap buffers to fill up while we're suppressed...
  189. if ( g_pShaderDevice->IsDeactivated() || ( nMaxVertexCount == 0 ) )
  190. goto vertexBufferLockFailed;
  191. // Did we ask for something too large?
  192. if ( nMaxVertexCount > m_nVertexCount )
  193. {
  194. Warning( "Too many vertices for vertex buffer. . tell a programmer (%d>%d)\n", nMaxVertexCount, m_nVertexCount );
  195. goto vertexBufferLockFailed;
  196. }
  197. // We might not have a buffer owing to alt-tab type stuff
  198. if ( !m_pVertexBuffer )
  199. {
  200. if ( !Allocate() )
  201. goto vertexBufferLockFailed;
  202. }
  203. // Check to see if we have enough memory
  204. int nMemoryRequired = nMaxVertexCount * VertexSize();
  205. bool bHasEnoughMemory = ( m_nFirstUnwrittenOffset + nMemoryRequired <= m_nBufferSize );
  206. D3D10_MAP map;
  207. if ( bAppend )
  208. {
  209. // Can't have the first lock after a flush be an appending lock
  210. Assert( !m_bFlush );
  211. // If we're appending and we don't have enough room, then puke!
  212. if ( !bHasEnoughMemory || m_bFlush )
  213. goto vertexBufferLockFailed;
  214. map = ( m_nFirstUnwrittenOffset == 0 ) ? D3D10_MAP_WRITE_DISCARD : D3D10_MAP_WRITE_NO_OVERWRITE;
  215. }
  216. else
  217. {
  218. // If we're not appending, no overwrite unless we don't have enough room
  219. // If we're a static buffer, always discard if we're not appending
  220. if ( !m_bFlush && bHasEnoughMemory && m_bIsDynamic )
  221. {
  222. map = ( m_nFirstUnwrittenOffset == 0 ) ? D3D10_MAP_WRITE_DISCARD : D3D10_MAP_WRITE_NO_OVERWRITE;
  223. }
  224. else
  225. {
  226. map = D3D10_MAP_WRITE_DISCARD;
  227. m_nFirstUnwrittenOffset = 0;
  228. m_bFlush = false;
  229. }
  230. }
  231. hr = m_pVertexBuffer->Map( map, 0, &pLockedData );
  232. if ( FAILED( hr ) )
  233. {
  234. Warning( "Failed to lock vertex buffer in CVertexBufferDx10::Lock\n" );
  235. goto vertexBufferLockFailed;
  236. }
  237. ComputeVertexDescription( (unsigned char*)pLockedData + m_nFirstUnwrittenOffset, m_VertexFormat, desc );
  238. desc.m_nFirstVertex = 0;
  239. desc.m_nOffset = m_nFirstUnwrittenOffset;
  240. m_bIsLocked = true;
  241. return true;
  242. vertexBufferLockFailed:
  243. g_ShaderMutex.Unlock();
  244. // Set up a bogus index descriptor
  245. ComputeVertexDescription( 0, 0, desc );
  246. desc.m_nFirstVertex = 0;
  247. desc.m_nOffset = 0;
  248. return false;
  249. }
  250. void CVertexBufferDx10::Unlock( int nWrittenVertexCount, VertexDesc_t &desc )
  251. {
  252. Assert( nWrittenVertexCount <= m_nVertexCount );
  253. // NOTE: This can happen if the lock occurs during alt-tab
  254. // or if another application is initializing
  255. if ( !m_bIsLocked )
  256. return;
  257. if ( m_pVertexBuffer )
  258. {
  259. m_pVertexBuffer->Unmap();
  260. }
  261. m_nFirstUnwrittenOffset += nWrittenVertexCount * VertexSize();
  262. m_bIsLocked = false;
  263. g_ShaderMutex.Unlock();
  264. }
  265. //-----------------------------------------------------------------------------
  266. //
  267. // Dx10 implementation of an index buffer
  268. //
  269. //-----------------------------------------------------------------------------
  270. //-----------------------------------------------------------------------------
  271. // globals
  272. //-----------------------------------------------------------------------------
  273. // shove indices into this if you don't actually want indices
  274. static unsigned int s_nScratchIndexBuffer = 0;
  275. #ifdef _DEBUG
  276. int CIndexBufferDx10::s_nBufferCount = 0;
  277. #endif
  278. //-----------------------------------------------------------------------------
  279. // constructor, destructor
  280. //-----------------------------------------------------------------------------
  281. CIndexBufferDx10::CIndexBufferDx10( ShaderBufferType_t type, MaterialIndexFormat_t fmt, int nIndexCount, const char *pBudgetGroupName ) :
  282. BaseClass( pBudgetGroupName )
  283. {
  284. Assert( nIndexCount != 0 );
  285. Assert( IsDynamicBufferType( type ) || ( fmt != MATERIAL_INDEX_FORMAT_UNKNOWN ) );
  286. m_pIndexBuffer = NULL;
  287. m_IndexFormat = fmt;
  288. m_nIndexCount = ( fmt == MATERIAL_INDEX_FORMAT_UNKNOWN ) ? 0 : nIndexCount;
  289. m_nBufferSize = ( fmt == MATERIAL_INDEX_FORMAT_UNKNOWN ) ? nIndexCount : nIndexCount * IndexSize();
  290. m_nFirstUnwrittenOffset = 0;
  291. m_bIsLocked = false;
  292. m_bIsDynamic = IsDynamicBufferType( type );
  293. m_bFlush = false;
  294. // NOTE: This has to happen at the end since m_IndexFormat must be valid for IndexSize() to work
  295. if ( m_bIsDynamic )
  296. {
  297. m_IndexFormat = MATERIAL_INDEX_FORMAT_UNKNOWN;
  298. m_nIndexCount = 0;
  299. }
  300. }
  301. CIndexBufferDx10::~CIndexBufferDx10()
  302. {
  303. Free();
  304. }
  305. //-----------------------------------------------------------------------------
  306. // Creates, destroys the index buffer
  307. //-----------------------------------------------------------------------------
  308. bool CIndexBufferDx10::Allocate( )
  309. {
  310. Assert( !m_pIndexBuffer );
  311. m_nFirstUnwrittenOffset = 0;
  312. D3D10_BUFFER_DESC bd;
  313. bd.Usage = D3D10_USAGE_DYNAMIC;
  314. bd.ByteWidth = m_nBufferSize;
  315. bd.BindFlags = D3D10_BIND_INDEX_BUFFER;
  316. bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
  317. bd.MiscFlags = 0;
  318. HRESULT hr = D3D10Device()->CreateBuffer( &bd, NULL, &m_pIndexBuffer );
  319. bool bOk = !FAILED( hr ) && ( m_pIndexBuffer != NULL );
  320. if ( bOk )
  321. {
  322. if ( !m_bIsDynamic )
  323. {
  324. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_STATIC_INDEX_BUFFER,
  325. COUNTER_GROUP_TEXTURE_GLOBAL, m_nBufferSize );
  326. }
  327. else
  328. {
  329. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_DYNAMIC_INDEX_BUFFER,
  330. COUNTER_GROUP_TEXTURE_GLOBAL, m_nBufferSize );
  331. }
  332. #ifdef _DEBUG
  333. ++s_nBufferCount;
  334. #endif
  335. }
  336. return bOk;
  337. }
  338. void CIndexBufferDx10::Free()
  339. {
  340. if ( m_pIndexBuffer )
  341. {
  342. #ifdef _DEBUG
  343. --s_nBufferCount;
  344. #endif
  345. m_pIndexBuffer->Release();
  346. m_pIndexBuffer = NULL;
  347. if ( !m_bIsDynamic )
  348. {
  349. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_STATIC_INDEX_BUFFER,
  350. COUNTER_GROUP_TEXTURE_GLOBAL, - m_nBufferSize );
  351. }
  352. else
  353. {
  354. VPROF_INCREMENT_GROUP_COUNTER( "TexGroup_global_" TEXTURE_GROUP_DYNAMIC_INDEX_BUFFER,
  355. COUNTER_GROUP_TEXTURE_GLOBAL, - m_nBufferSize );
  356. }
  357. }
  358. }
  359. //-----------------------------------------------------------------------------
  360. // Returns the buffer size (only valid for static index buffers)
  361. //-----------------------------------------------------------------------------
  362. int CIndexBufferDx10::IndexCount() const
  363. {
  364. Assert( !m_bIsDynamic );
  365. return m_nIndexCount;
  366. }
  367. //-----------------------------------------------------------------------------
  368. // Returns the buffer format (only valid for static index buffers)
  369. //-----------------------------------------------------------------------------
  370. MaterialIndexFormat_t CIndexBufferDx10::IndexFormat() const
  371. {
  372. Assert( !m_bIsDynamic );
  373. return m_IndexFormat;
  374. }
  375. //-----------------------------------------------------------------------------
  376. // Returns true if the buffer is dynamic
  377. //-----------------------------------------------------------------------------
  378. bool CIndexBufferDx10::IsDynamic() const
  379. {
  380. return m_bIsDynamic;
  381. }
  382. //-----------------------------------------------------------------------------
  383. // Only used by dynamic buffers, indicates the next lock should perform a discard.
  384. //-----------------------------------------------------------------------------
  385. void CIndexBufferDx10::Flush()
  386. {
  387. // This strange-looking line makes a flush only occur if the buffer is dynamic.
  388. m_bFlush = m_bIsDynamic;
  389. }
  390. //-----------------------------------------------------------------------------
  391. // Casts a dynamic buffer to be a particular index type
  392. //-----------------------------------------------------------------------------
  393. void CIndexBufferDx10::BeginCastBuffer( MaterialIndexFormat_t format )
  394. {
  395. Assert( format != MATERIAL_INDEX_FORMAT_UNKNOWN );
  396. Assert( m_bIsDynamic && ( m_IndexFormat == MATERIAL_INDEX_FORMAT_UNKNOWN || m_IndexFormat == format ) );
  397. if ( !m_bIsDynamic )
  398. return;
  399. m_IndexFormat = format;
  400. m_nIndexCount = m_nBufferSize / IndexSize();
  401. }
  402. void CIndexBufferDx10::EndCastBuffer( )
  403. {
  404. Assert( m_bIsDynamic && m_IndexFormat != MATERIAL_INDEX_FORMAT_UNKNOWN );
  405. if ( !m_bIsDynamic )
  406. return;
  407. m_IndexFormat = MATERIAL_INDEX_FORMAT_UNKNOWN;
  408. m_nIndexCount = 0;
  409. }
  410. //-----------------------------------------------------------------------------
  411. // Returns the number of indices that can be written into the buffer
  412. //-----------------------------------------------------------------------------
  413. int CIndexBufferDx10::GetRoomRemaining() const
  414. {
  415. return ( m_nBufferSize - m_nFirstUnwrittenOffset ) / IndexSize();
  416. }
  417. //-----------------------------------------------------------------------------
  418. // Locks, unlocks the mesh
  419. //-----------------------------------------------------------------------------
  420. bool CIndexBufferDx10::Lock( int nMaxIndexCount, bool bAppend, IndexDesc_t &desc )
  421. {
  422. Assert( !m_bIsLocked && ( nMaxIndexCount != 0 ) && ( nMaxIndexCount <= m_nIndexCount ) );
  423. Assert( m_IndexFormat != MATERIAL_INDEX_FORMAT_UNKNOWN );
  424. // FIXME: Why do we need to sync matrices now?
  425. ShaderUtil()->SyncMatrices();
  426. g_ShaderMutex.Lock();
  427. void *pLockedData = NULL;
  428. HRESULT hr;
  429. // This can happen if the buffer was locked but a type wasn't bound
  430. if ( m_IndexFormat == MATERIAL_INDEX_FORMAT_UNKNOWN )
  431. goto indexBufferLockFailed;
  432. // Just give the app crap buffers to fill up while we're suppressed...
  433. if ( g_pShaderDevice->IsDeactivated() || ( nMaxIndexCount == 0 ) )
  434. goto indexBufferLockFailed;
  435. // Did we ask for something too large?
  436. if ( nMaxIndexCount > m_nIndexCount )
  437. {
  438. Warning( "Too many indices for index buffer. . tell a programmer (%d>%d)\n", nMaxIndexCount, m_nIndexCount );
  439. goto indexBufferLockFailed;
  440. }
  441. // We might not have a buffer owing to alt-tab type stuff
  442. if ( !m_pIndexBuffer )
  443. {
  444. if ( !Allocate() )
  445. goto indexBufferLockFailed;
  446. }
  447. // Check to see if we have enough memory
  448. int nMemoryRequired = nMaxIndexCount * IndexSize();
  449. bool bHasEnoughMemory = ( m_nFirstUnwrittenOffset + nMemoryRequired <= m_nBufferSize );
  450. D3D10_MAP map;
  451. if ( bAppend )
  452. {
  453. // Can't have the first lock after a flush be an appending lock
  454. Assert( !m_bFlush );
  455. // If we're appending and we don't have enough room, then puke!
  456. if ( !bHasEnoughMemory || m_bFlush )
  457. goto indexBufferLockFailed;
  458. map = ( m_nFirstUnwrittenOffset == 0 ) ? D3D10_MAP_WRITE_DISCARD : D3D10_MAP_WRITE_NO_OVERWRITE;
  459. }
  460. else
  461. {
  462. // If we're not appending, no overwrite unless we don't have enough room
  463. if ( !m_bFlush && bHasEnoughMemory && m_bIsDynamic )
  464. {
  465. map = ( m_nFirstUnwrittenOffset == 0 ) ? D3D10_MAP_WRITE_DISCARD : D3D10_MAP_WRITE_NO_OVERWRITE;
  466. }
  467. else
  468. {
  469. map = D3D10_MAP_WRITE_DISCARD;
  470. m_nFirstUnwrittenOffset = 0;
  471. m_bFlush = false;
  472. }
  473. }
  474. hr = m_pIndexBuffer->Map( map, 0, &pLockedData );
  475. if ( FAILED( hr ) )
  476. {
  477. Warning( "Failed to lock index buffer in CIndexBufferDx10::Lock\n" );
  478. goto indexBufferLockFailed;
  479. }
  480. desc.m_pIndices = (unsigned short*)( (unsigned char*)pLockedData + m_nFirstUnwrittenOffset );
  481. desc.m_nIndexSize = IndexSize() >> 1;
  482. desc.m_nFirstIndex = 0;
  483. desc.m_nOffset = m_nFirstUnwrittenOffset;
  484. m_bIsLocked = true;
  485. return true;
  486. indexBufferLockFailed:
  487. g_ShaderMutex.Unlock();
  488. // Set up a bogus index descriptor
  489. desc.m_pIndices = (unsigned short*)( &s_nScratchIndexBuffer );
  490. desc.m_nFirstIndex = 0;
  491. desc.m_nIndexSize = 0;
  492. desc.m_nOffset = 0;
  493. return false;
  494. }
  495. void CIndexBufferDx10::Unlock( int nWrittenIndexCount, IndexDesc_t &desc )
  496. {
  497. Assert( nWrittenIndexCount <= m_nIndexCount );
  498. // NOTE: This can happen if the lock occurs during alt-tab
  499. // or if another application is initializing
  500. if ( !m_bIsLocked )
  501. return;
  502. if ( m_pIndexBuffer )
  503. {
  504. m_pIndexBuffer->Unmap();
  505. }
  506. m_nFirstUnwrittenOffset += nWrittenIndexCount * IndexSize();
  507. m_bIsLocked = false;
  508. g_ShaderMutex.Unlock();
  509. }
  510. //-----------------------------------------------------------------------------
  511. // Locks, unlocks an existing mesh
  512. //-----------------------------------------------------------------------------
  513. void CIndexBufferDx10::ModifyBegin( bool bReadOnly, int nFirstIndex, int nIndexCount, IndexDesc_t& desc )
  514. {
  515. Assert( 0 );
  516. }
  517. void CIndexBufferDx10::ModifyEnd( IndexDesc_t& desc )
  518. {
  519. }
  520. //-----------------------------------------------------------------------------
  521. //
  522. // The empty mesh...
  523. //
  524. //-----------------------------------------------------------------------------
  525. CMeshDx10::CMeshDx10()
  526. {
  527. m_pVertexMemory = new unsigned char[VERTEX_BUFFER_SIZE];
  528. }
  529. CMeshDx10::~CMeshDx10()
  530. {
  531. delete[] m_pVertexMemory;
  532. }
  533. void CMeshDx10::LockMesh( int numVerts, int numIndices, MeshDesc_t& desc )
  534. {
  535. // Who cares about the data?
  536. desc.m_pPosition = (float*)m_pVertexMemory;
  537. desc.m_pNormal = (float*)m_pVertexMemory;
  538. desc.m_pColor = m_pVertexMemory;
  539. int i;
  540. for ( i = 0; i < VERTEX_MAX_TEXTURE_COORDINATES; ++i)
  541. desc.m_pTexCoord[i] = (float*)m_pVertexMemory;
  542. desc.m_pIndices = (unsigned short*)m_pVertexMemory;
  543. desc.m_pBoneWeight = (float*)m_pVertexMemory;
  544. desc.m_pBoneMatrixIndex = (unsigned char*)m_pVertexMemory;
  545. desc.m_pTangentS = (float*)m_pVertexMemory;
  546. desc.m_pTangentT = (float*)m_pVertexMemory;
  547. desc.m_pUserData = (float*)m_pVertexMemory;
  548. desc.m_NumBoneWeights = 2;
  549. desc.m_VertexSize_Position = 0;
  550. desc.m_VertexSize_BoneWeight = 0;
  551. desc.m_VertexSize_BoneMatrixIndex = 0;
  552. desc.m_VertexSize_Normal = 0;
  553. desc.m_VertexSize_Color = 0;
  554. for( i=0; i < VERTEX_MAX_TEXTURE_COORDINATES; i++ )
  555. desc.m_VertexSize_TexCoord[i] = 0;
  556. desc.m_VertexSize_TangentS = 0;
  557. desc.m_VertexSize_TangentT = 0;
  558. desc.m_VertexSize_UserData = 0;
  559. desc.m_ActualVertexSize = 0; // Size of the vertices.. Some of the m_VertexSize_ elements above
  560. desc.m_nFirstVertex = 0;
  561. desc.m_nIndexSize = 0;
  562. }
  563. void CMeshDx10::UnlockMesh( int numVerts, int numIndices, MeshDesc_t& desc )
  564. {
  565. }
  566. void CMeshDx10::ModifyBeginEx( bool bReadOnly, int firstVertex, int numVerts, int firstIndex, int numIndices, MeshDesc_t& desc )
  567. {
  568. // Who cares about the data?
  569. desc.m_pPosition = (float*)m_pVertexMemory;
  570. desc.m_pNormal = (float*)m_pVertexMemory;
  571. desc.m_pColor = m_pVertexMemory;
  572. int i;
  573. for ( i = 0; i < VERTEX_MAX_TEXTURE_COORDINATES; ++i)
  574. desc.m_pTexCoord[i] = (float*)m_pVertexMemory;
  575. desc.m_pIndices = (unsigned short*)m_pVertexMemory;
  576. desc.m_pBoneWeight = (float*)m_pVertexMemory;
  577. desc.m_pBoneMatrixIndex = (unsigned char*)m_pVertexMemory;
  578. desc.m_pTangentS = (float*)m_pVertexMemory;
  579. desc.m_pTangentT = (float*)m_pVertexMemory;
  580. desc.m_pUserData = (float*)m_pVertexMemory;
  581. desc.m_NumBoneWeights = 2;
  582. desc.m_VertexSize_Position = 0;
  583. desc.m_VertexSize_BoneWeight = 0;
  584. desc.m_VertexSize_BoneMatrixIndex = 0;
  585. desc.m_VertexSize_Normal = 0;
  586. desc.m_VertexSize_Color = 0;
  587. for( i=0; i < VERTEX_MAX_TEXTURE_COORDINATES; i++ )
  588. desc.m_VertexSize_TexCoord[i] = 0;
  589. desc.m_VertexSize_TangentS = 0;
  590. desc.m_VertexSize_TangentT = 0;
  591. desc.m_VertexSize_UserData = 0;
  592. desc.m_ActualVertexSize = 0; // Size of the vertices.. Some of the m_VertexSize_ elements above
  593. desc.m_nFirstVertex = 0;
  594. desc.m_nIndexSize = 0;
  595. }
  596. void CMeshDx10::ModifyBegin( int firstVertex, int numVerts, int firstIndex, int numIndices, MeshDesc_t& desc )
  597. {
  598. ModifyBeginEx( false, firstVertex, numVerts, firstIndex, numIndices, desc );
  599. }
  600. void CMeshDx10::ModifyEnd( MeshDesc_t& desc )
  601. {
  602. }
  603. // returns the # of vertices (static meshes only)
  604. int CMeshDx10::VertexCount() const
  605. {
  606. return 0;
  607. }
  608. // Sets the primitive type
  609. void CMeshDx10::SetPrimitiveType( MaterialPrimitiveType_t type )
  610. {
  611. }
  612. // Draws the entire mesh
  613. void CMeshDx10::Draw( int firstIndex, int numIndices )
  614. {
  615. }
  616. void CMeshDx10::Draw(CPrimList *pPrims, int nPrims)
  617. {
  618. }
  619. // Copy verts and/or indices to a mesh builder. This only works for temp meshes!
  620. void CMeshDx10::CopyToMeshBuilder(
  621. int iStartVert, // Which vertices to copy.
  622. int nVerts,
  623. int iStartIndex, // Which indices to copy.
  624. int nIndices,
  625. int indexOffset, // This is added to each index.
  626. CMeshBuilder &builder )
  627. {
  628. }
  629. // Spews the mesh data
  630. void CMeshDx10::Spew( int numVerts, int numIndices, const MeshDesc_t & desc )
  631. {
  632. }
  633. void CMeshDx10::ValidateData( int numVerts, int numIndices, const MeshDesc_t & desc )
  634. {
  635. }
  636. // gets the associated material
  637. IMaterial* CMeshDx10::GetMaterial()
  638. {
  639. // umm. this don't work none
  640. Assert(0);
  641. return 0;
  642. }