"L. Spiro Engine"
|
00001 00016 #ifndef __LSG_DIRECTX10_H__ 00017 #define __LSG_DIRECTX10_H__ 00018 00019 #ifdef LSG_DX10 00020 00021 #include "../Fnd/LSGFndBase.h" 00022 #include "../Fnd/LSGFndConstants.h" 00023 #include "Windows/LSSTDWindows.h" 00024 00025 #include <d3d10.h> 00026 #include <d3dx10.h> 00027 00028 namespace lsg { 00029 00030 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00031 // CONSTANTS 00032 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00036 enum LSG_BUFFERS { 00037 LSG_B_COLOR_BUFFER = (1UL << 16UL), 00038 LSG_B_STENCIL_BUFFER = D3D10_CLEAR_STENCIL, 00039 LSG_B_DEPTH_BUFFER = D3D10_CLEAR_DEPTH, 00040 LSG_B_ALL = LSG_B_COLOR_BUFFER | LSG_B_STENCIL_BUFFER | LSG_B_DEPTH_BUFFER, 00041 }; 00042 00043 00044 00045 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00046 // TYPES 00047 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00051 typedef class CDirectX10ShaderManager CShaderManager; 00052 class CShader; 00053 00054 00055 00056 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00057 // INTERFACE 00058 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00065 class CDirectX10 { 00066 public : 00067 // == Types. 00071 typedef struct LSG_DIRECTX10_INIT { 00075 HWND hWnd; 00076 00080 LSBOOL bWindowed; 00081 } * LPLSG_DIRECTX10_INIT, * const LPCLSG_DIRECTX10_INIT; 00082 00083 // == Functions. 00090 static LSBOOL LSE_CALL InitDirectX10( LPCLSG_DIRECTX10_INIT _lpdiInit ); 00091 00095 static LSVOID LSE_CALL PostInitDirectX10(); 00096 00100 static LSVOID LSE_CALL DestroyDirectX10(); 00101 00105 static LSVOID LSE_CALL LoseDevice(); 00106 00112 static LSBOOL LSE_CALL ResetDevice(); 00113 00117 static LSVOID LSE_CALL SetInitialValues(); 00118 00124 static LSE_INLINE ID3D10Device * LSE_CALL GetDirectX10Device(); 00125 00139 static CMatrix4x4 LSE_CALL OffsetOrtho( LSREAL _fLeft, LSREAL _fRight, LSREAL _fBottom, LSREAL _fTop, LSREAL _fNear, LSREAL _fFar ); 00140 00141 00142 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00143 // INTERFACE 00144 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00148 static LSE_INLINE LSVOID LSE_FCALL AssertError(); 00149 00153 static LSE_INLINE LSVOID LSE_FCALL Present(); 00154 00160 static LSE_INLINE LSVOID LSE_FCALL Clear( LSUINT32 _ui32Mask ); 00161 00165 static LSE_INLINE LSVOID LSE_FCALL ClearAll(); 00166 00175 static LSVOID LSE_CALL SetClearColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA ); 00176 00182 static LSE_INLINE LSVOID LSE_FCALL SetClearDepth( LSREAL _fValue ); 00183 00192 static LSE_INLINE LSVOID LSE_FCALL SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ); 00193 00199 static LSE_INLINE LSVOID LSE_FCALL SetDepthTest( LSBOOL _bVal ); 00200 00206 static LSE_INLINE LSVOID LSE_FCALL SetDepthFunc( LSG_DEPTH_TEST _dtFunc ); 00207 00213 static LSE_INLINE LSVOID LSE_FCALL SetDepthWrite( LSBOOL _bVal ); 00214 00220 static LSE_INLINE LSVOID LSE_FCALL SetCulling( LSBOOL _bVal ); 00221 00227 static LSE_INLINE LSVOID LSE_FCALL SetCullMode( LSG_CULL_MODES _cmMode ); 00228 00234 static LSE_INLINE LSG_CULL_MODES LSE_CALL GetCullMode(); 00235 00241 static LSE_INLINE LSVOID LSE_FCALL SetBlendEnabled( LSBOOL _bVal ); 00242 00249 static LSE_INLINE LSVOID LSE_FCALL SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ); 00250 00256 static LSE_INLINE LSVOID LSE_FCALL SetFillMode( LSG_FILL_MODES _fmMode ); 00257 00263 static LSE_INLINE LSBOOL LSE_FCALL BeginRender(); 00264 00268 static LSE_INLINE LSVOID LSE_FCALL EndRender(); 00269 00275 static LSE_INLINE CShaderManager * LSE_FCALL 00276 GetShaderManager(); 00277 00284 static LSVOID LSE_FCALL SetShader( CShader * _psShader ); 00285 00291 static CShader * LSE_FCALL GetShader(); 00292 00296 static LSVOID LSE_CALL PreRender(); 00297 00298 00299 00300 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00301 // METRICS 00302 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00308 static LSE_INLINE LSBOOL LSE_CALL NonPo2(); 00309 00315 template <typename tnType> 00316 static LSE_INLINE LSVOID LSE_CALL SafeRelease( tnType &_tObj ); 00317 00318 00319 // == Members. 00323 static const void * m_pvShaderSignature; 00324 00328 static SIZE_T m_stShaderSize; 00329 00333 static ID3D10ShaderResourceView * m_psrvActiveTextures[LSG_MAX_TEXTURE_UNITS]; 00334 00335 00336 protected : 00337 // == Members. 00341 static ID3D10Device * m_pdDevice; 00342 00346 static IDXGISwapChain * m_pscSwapChain; 00347 00351 static D3D10_DRIVER_TYPE m_dtDriver; 00352 00356 static ID3D10RenderTargetView * m_prtvRenderTarget; 00357 00361 static ID3D10DepthStencilState * m_pdssDepthStencil; 00362 00366 static ID3D10RasterizerState * m_prsRasterizerState; 00367 00371 static ID3D10DepthStencilView * m_pdsvDepthStencilView; 00372 00376 static ID3D10BlendState * m_pbsBlendState; 00377 00381 static ID3D10Texture2D * m_pt2dDepthStencilBuffer; 00382 00386 static CShaderManager * m_psmShaderMan; 00387 00391 static ID3D10ShaderResourceView * m_psrvLastActiveTextures[LSG_MAX_TEXTURE_UNITS]; 00392 00396 static D3D10_DEPTH_STENCIL_DESC m_dsdDepthStencilDesc; 00397 00401 static D3D10_RASTERIZER_DESC m_rdRasterizerDesc; 00402 00406 static D3D10_BLEND_DESC m_bdBlendDesc; 00407 00411 static LSUINT32 m_ui32ClearColor; 00412 00416 static LSFLOAT m_fDepthClear; 00417 00421 static D3D10_CULL_MODE m_cmLastCull; 00422 00423 00424 // == Functions. 00428 static LSVOID LSE_CALL ResetInternal(); 00429 00430 }; 00431 00432 00433 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00434 // DEFINITIONS 00435 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00436 // == Functions. 00442 LSE_INLINE ID3D10Device * LSE_CALL CDirectX10::GetDirectX10Device() { 00443 return m_pdDevice; 00444 } 00445 00449 LSE_INLINE LSVOID LSE_FCALL CDirectX10::AssertError() { 00450 } 00451 00455 LSE_INLINE LSVOID LSE_FCALL CDirectX10::Present() { 00456 m_pscSwapChain->Present( 0UL, 0UL ); 00457 } 00458 00464 LSE_INLINE LSVOID LSE_FCALL CDirectX10::Clear( LSUINT32 _ui32Mask ) { 00465 if ( _ui32Mask & LSG_B_COLOR_BUFFER ) { 00466 // Clearing color. 00467 const FLOAT fColor[4] = { 00468 (m_ui32ClearColor >> 24) * (1.0f / 255.0f), // Red. 00469 ((m_ui32ClearColor >> 16) & 0xFF) * (1.0f / 255.0f), // Green. 00470 ((m_ui32ClearColor >> 8) & 0xFF) * (1.0f / 255.0f), // Blue. 00471 (m_ui32ClearColor & 0xFF) * (1.0f / 255.0f), // Alpha. 00472 }; 00473 m_pdDevice->ClearRenderTargetView( m_prtvRenderTarget, fColor ); 00474 } 00475 m_pdDevice->ClearDepthStencilView( m_pdsvDepthStencilView, _ui32Mask & (LSG_B_DEPTH_BUFFER | LSG_B_STENCIL_BUFFER), 00476 m_fDepthClear, 0 ); 00477 } 00478 00482 LSE_INLINE LSVOID LSE_FCALL CDirectX10::ClearAll() { 00483 Clear( LSG_B_ALL ); 00484 } 00485 00491 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetClearDepth( LSREAL _fValue ) { 00492 m_fDepthClear = static_cast<LSFLOAT>(_fValue); 00493 } 00494 00503 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ) { 00504 if ( m_pdDevice ) { 00505 D3D10_VIEWPORT vpViewPort = { 00506 _i32X, 00507 _i32Y, 00508 _i32Width, 00509 _i32Height, 00510 D3D10_MIN_DEPTH, 00511 D3D10_MAX_DEPTH 00512 }; 00513 m_pdDevice->RSSetViewports( 1UL, &vpViewPort ); 00514 } 00515 } 00516 00522 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetDepthTest( LSBOOL _bVal ) { 00523 _bVal = _bVal != false; 00524 if ( m_dsdDepthStencilDesc.DepthEnable != _bVal ) { 00525 m_dsdDepthStencilDesc.DepthEnable = _bVal; 00526 SafeRelease( m_pdssDepthStencil ); 00527 m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil ); 00528 m_pdDevice->OMSetDepthStencilState( m_pdssDepthStencil, 1UL ); 00529 } 00530 } 00531 00537 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetDepthFunc( LSG_DEPTH_TEST _dtFunc ) { 00538 if ( CFndBase::m_dtDepthTestFunc != _dtFunc ) { 00539 CFndBase::m_dtDepthTestFunc = _dtFunc; 00540 static const D3D10_COMPARISON_FUNC dcfFuncs[] = { 00541 D3D10_COMPARISON_NEVER, // LSG_DT_NEVER 00542 D3D10_COMPARISON_ALWAYS, // LSG_DT_ALWAYS 00543 D3D10_COMPARISON_LESS, // LSG_DT_LESS 00544 D3D10_COMPARISON_EQUAL, // LSG_DT_EQUAL 00545 D3D10_COMPARISON_NOT_EQUAL, // LSG_DT_NOTEQUAL 00546 D3D10_COMPARISON_LESS_EQUAL, // LSG_DT_LESSEQUAL 00547 D3D10_COMPARISON_GREATER, // LSG_DT_GREATER 00548 D3D10_COMPARISON_GREATER_EQUAL, // LSG_DT_GREATEREQUAL 00549 }; 00550 m_dsdDepthStencilDesc.DepthFunc = dcfFuncs[_dtFunc]; 00551 SafeRelease( m_pdssDepthStencil ); 00552 m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil ); 00553 m_pdDevice->OMSetDepthStencilState( m_pdssDepthStencil, 1UL ); 00554 } 00555 } 00556 00562 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetDepthWrite( LSBOOL _bVal ) { 00563 _bVal = _bVal != false; 00564 if ( m_dsdDepthStencilDesc.DepthWriteMask != _bVal ) { 00565 m_dsdDepthStencilDesc.DepthWriteMask = static_cast<D3D10_DEPTH_WRITE_MASK>(_bVal); 00566 SafeRelease( m_pdssDepthStencil ); 00567 m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil ); 00568 m_pdDevice->OMSetDepthStencilState( m_pdssDepthStencil, 1UL ); 00569 } 00570 } 00571 00577 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetCulling( LSBOOL _bVal ) { 00578 _bVal = _bVal != false; 00579 if ( _bVal && m_rdRasterizerDesc.CullMode == D3D10_CULL_NONE ) { 00580 // Turning on culling. 00581 m_rdRasterizerDesc.CullMode = m_cmLastCull; 00582 SafeRelease( m_prsRasterizerState ); 00583 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00584 m_pdDevice->RSSetState( m_prsRasterizerState ); 00585 } 00586 else if ( !_bVal && m_rdRasterizerDesc.CullMode != D3D10_CULL_NONE ) { 00587 // Turning off culling. 00588 m_cmLastCull = m_rdRasterizerDesc.CullMode; 00589 m_rdRasterizerDesc.CullMode = D3D10_CULL_NONE; 00590 SafeRelease( m_prsRasterizerState ); 00591 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00592 m_pdDevice->RSSetState( m_prsRasterizerState ); 00593 } 00594 } 00595 00601 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetCullMode( LSG_CULL_MODES _cmMode ) { 00602 static const D3D10_CULL_MODE cmModes[] = { 00603 D3D10_CULL_FRONT, 00604 D3D10_CULL_BACK, 00605 }; 00606 assert( _cmMode == LSG_CM_CW || _cmMode == LSG_CM_CCW ); 00607 if ( m_rdRasterizerDesc.CullMode == D3D10_CULL_NONE ) { 00608 // Just set the last cull mode. 00609 m_cmLastCull = cmModes[_cmMode]; 00610 } 00611 else if ( m_rdRasterizerDesc.CullMode != cmModes[_cmMode] ) { 00612 // Culling is on and not equal to the current mode. 00613 m_rdRasterizerDesc.CullMode = cmModes[_cmMode]; 00614 00615 SafeRelease( m_prsRasterizerState ); 00616 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00617 m_pdDevice->RSSetState( m_prsRasterizerState ); 00618 } 00619 } 00620 00626 LSE_INLINE LSG_CULL_MODES LSE_CALL CDirectX10::GetCullMode() { 00627 if ( m_rdRasterizerDesc.CullMode == D3D10_CULL_FRONT ) { return LSG_CM_CCW; } 00628 return LSG_CM_CW; 00629 } 00630 00636 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetBlendEnabled( LSBOOL _bVal ) { 00637 _bVal = (_bVal != false); 00638 if ( _bVal != m_bdBlendDesc.BlendEnable[0] ) { 00639 m_bdBlendDesc.BlendEnable[0] = _bVal; 00640 00641 SafeRelease( m_pbsBlendState ); 00642 m_pdDevice->CreateBlendState( &m_bdBlendDesc, &m_pbsBlendState ); 00643 m_pdDevice->OMSetBlendState( m_pbsBlendState, 0, 0xFFFFFFFF ); 00644 } 00645 } 00646 00653 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ) { 00654 static const D3D10_BLEND bModes[] = { 00655 D3D10_BLEND_ZERO, // LSG_BM_ZERO 00656 D3D10_BLEND_ONE, // LSG_BM_ONE 00657 D3D10_BLEND_SRC_COLOR, // LSG_BM_SRC_COLOR 00658 D3D10_BLEND_INV_SRC_COLOR, // LSG_BM_INV_SRC_COLOR 00659 D3D10_BLEND_DEST_COLOR, // LSG_BM_DST_COLOR 00660 D3D10_BLEND_INV_DEST_COLOR, // LSG_BM_INV_DST_COLOR 00661 D3D10_BLEND_SRC_ALPHA, // LSG_BM_SRC_ALPHA 00662 D3D10_BLEND_INV_SRC_ALPHA, // LSG_BM_INV_SRC_ALPHA 00663 D3D10_BLEND_DEST_ALPHA, // LSG_BM_DST_ALPHA 00664 D3D10_BLEND_INV_DEST_ALPHA, // LSG_BM_INV_DEST_ALPHA 00665 D3D10_BLEND_SRC_ALPHA_SAT, // LSG_BM_SRC_ALPHA_SAT 00666 }; 00667 if ( m_bdBlendDesc.SrcBlend != bModes[_bmSrc] || m_bdBlendDesc.DestBlend != bModes[_bmDst] ) { 00668 m_bdBlendDesc.SrcBlend = bModes[_bmSrc]; 00669 m_bdBlendDesc.DestBlend = bModes[_bmDst]; 00670 00671 SafeRelease( m_pbsBlendState ); 00672 m_pdDevice->CreateBlendState( &m_bdBlendDesc, &m_pbsBlendState ); 00673 m_pdDevice->OMSetBlendState( m_pbsBlendState, 0, 0xFFFFFFFF ); 00674 } 00675 } 00676 00682 LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetFillMode( LSG_FILL_MODES _fmMode ) { 00683 static const D3D10_FILL_MODE fmValue[] = { 00684 D3D10_FILL_SOLID, 00685 D3D10_FILL_WIREFRAME, 00686 }; 00687 if ( m_rdRasterizerDesc.FillMode != fmValue[_fmMode] ) { 00688 m_rdRasterizerDesc.FillMode = fmValue[_fmMode]; 00689 00690 SafeRelease( m_prsRasterizerState ); 00691 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00692 m_pdDevice->RSSetState( m_prsRasterizerState ); 00693 } 00694 } 00695 00701 LSE_INLINE LSBOOL LSE_FCALL CDirectX10::BeginRender() { 00702 return true; 00703 } 00704 00708 LSE_INLINE LSVOID LSE_FCALL CDirectX10::EndRender() { 00709 } 00710 00716 LSE_INLINE CShaderManager * LSE_FCALL CDirectX10::GetShaderManager() { 00717 return m_psmShaderMan; 00718 } 00719 00725 LSE_INLINE LSBOOL LSE_CALL CDirectX10::NonPo2() { 00726 return true; 00727 } 00728 00734 template <typename tnType> 00735 LSE_INLINE LSVOID LSE_CALL CDirectX10::SafeRelease( tnType &_tObj ) { 00736 if ( _tObj ) { 00737 _tObj->Release(); 00738 _tObj = NULL; 00739 } 00740 } 00741 00742 } // namespace lsg 00743 00744 #endif // #ifdef LSG_DX10 00745 00746 #endif // __LSG_DIRECTX10_H__