"L. Spiro Engine"
|
00001 00016 #ifndef __LSG_DIRECTX11_H__ 00017 #define __LSG_DIRECTX11_H__ 00018 00019 #ifdef LSG_DX11 00020 00021 #include "../Fnd/LSGFndBase.h" 00022 #include "../Fnd/LSGFndConstants.h" 00023 #include "Windows/LSSTDWindows.h" 00024 00025 #include <d3d11.h> 00026 #include <d3dx11.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 = D3D11_CLEAR_STENCIL, 00039 LSG_B_DEPTH_BUFFER = D3D11_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 CDirectX11ShaderManager CShaderManager; 00052 class CShader; 00053 00054 00055 00056 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00057 // INTERFACE 00058 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00065 class CDirectX11 { 00066 public : 00067 // == Types. 00071 typedef struct LSG_DIRECTX11_INIT { 00075 HWND hWnd; 00076 00080 LSBOOL bWindowed; 00081 } * LPLSG_DIRECTX11_INIT, * const LPCLSG_DIRECTX11_INIT; 00082 00086 typedef struct LSG_VECTOR4 { 00090 FLOAT x; 00091 00095 FLOAT y; 00096 00100 FLOAT z; 00101 00105 FLOAT w; 00106 } * LPLSG_VECTOR4, * const LPCLSG_VECTOR4; 00107 00111 typedef struct LSG_MATRIX { 00115 FLOAT _11, _12, _13, _14; 00116 00120 FLOAT _21, _22, _23, _24; 00121 00125 FLOAT _31, _32, _33, _34; 00126 00130 FLOAT _41, _42, _43, _44; 00131 } * LPLSG_MATRIX, * const LPCLSG_MATRIX; 00132 00133 00134 // == Functions. 00141 static LSBOOL LSE_CALL InitDirectX11( LPCLSG_DIRECTX11_INIT _lpdiInit ); 00142 00146 static LSVOID LSE_CALL PostInitDirectX11(); 00147 00151 static LSVOID LSE_CALL DestroyDirectX11(); 00152 00156 static LSVOID LSE_CALL LoseDevice(); 00157 00163 static LSBOOL LSE_CALL ResetDevice(); 00164 00168 static LSVOID LSE_CALL SetInitialValues(); 00169 00175 static LSE_INLINE ID3D11Device * LSE_CALL GetDirectX11Device(); 00176 00182 static LSE_INLINE ID3D11DeviceContext * LSE_CALL 00183 GetDirectX11Context(); 00184 00198 static CMatrix4x4 LSE_CALL OffsetOrtho( LSREAL _fLeft, LSREAL _fRight, LSREAL _fBottom, LSREAL _fTop, LSREAL _fNear, LSREAL _fFar ); 00199 00200 00201 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00202 // INTERFACE 00203 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00207 static LSE_INLINE LSVOID LSE_FCALL AssertError(); 00208 00212 static LSE_INLINE LSVOID LSE_FCALL Present(); 00213 00219 static LSE_INLINE LSVOID LSE_FCALL Clear( LSUINT32 _ui32Mask ); 00220 00224 static LSE_INLINE LSVOID LSE_FCALL ClearAll(); 00225 00234 static LSVOID LSE_CALL SetClearColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA ); 00235 00241 static LSE_INLINE LSVOID LSE_FCALL SetClearDepth( LSREAL _fValue ); 00242 00251 static LSE_INLINE LSVOID LSE_FCALL SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ); 00252 00258 static LSE_INLINE LSVOID LSE_FCALL SetDepthTest( LSBOOL _bVal ); 00259 00265 static LSE_INLINE LSVOID LSE_FCALL SetDepthFunc( LSG_DEPTH_TEST _dtFunc ); 00266 00272 static LSE_INLINE LSVOID LSE_FCALL SetDepthWrite( LSBOOL _bVal ); 00273 00279 static LSE_INLINE LSVOID LSE_FCALL SetCulling( LSBOOL _bVal ); 00280 00286 static LSE_INLINE LSVOID LSE_FCALL SetCullMode( LSG_CULL_MODES _cmMode ); 00287 00293 static LSE_INLINE LSG_CULL_MODES LSE_CALL GetCullMode(); 00294 00300 static LSE_INLINE LSVOID LSE_FCALL SetBlendEnabled( LSBOOL _bVal ); 00301 00308 static LSE_INLINE LSVOID LSE_FCALL SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ); 00309 00315 static LSE_INLINE LSVOID LSE_FCALL SetFillMode( LSG_FILL_MODES _fmMode ); 00316 00322 static LSE_INLINE LSBOOL LSE_FCALL BeginRender(); 00323 00327 static LSE_INLINE LSVOID LSE_FCALL EndRender(); 00328 00334 static LSE_INLINE CShaderManager * LSE_FCALL 00335 GetShaderManager(); 00336 00343 static LSVOID LSE_FCALL SetShader( CShader * _psShader ); 00344 00350 static CShader * LSE_FCALL GetShader(); 00351 00355 static LSVOID LSE_CALL PreRender(); 00356 00357 00358 00359 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00360 // METRICS 00361 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00367 static LSE_INLINE LSBOOL LSE_CALL NonPo2(); 00368 00374 template <typename tnType> 00375 static LSE_INLINE LSVOID LSE_CALL SafeRelease( tnType &_tObj ); 00376 00377 00378 // == Members. 00382 static const void * m_pvShaderSignature; 00383 00387 static SIZE_T m_stShaderSize; 00388 00392 static ID3D11ShaderResourceView * m_psrvActiveTextures[LSG_MAX_TEXTURE_UNITS]; 00393 00394 00395 protected : 00396 // == Members. 00400 static ID3D11Device * m_pdDevice; 00401 00405 static ID3D11DeviceContext * m_pdcContext; 00406 00410 static IDXGISwapChain * m_pscSwapChain; 00411 00415 static D3D_DRIVER_TYPE m_dtDriver; 00416 00420 static ID3D11RenderTargetView * m_prtvRenderTarget; 00421 00425 static ID3D11DepthStencilState * m_pdssDepthStencil; 00426 00430 static ID3D11RasterizerState * m_prsRasterizerState; 00431 00435 static ID3D11DepthStencilView * m_pdsvDepthStencilView; 00436 00440 static ID3D11BlendState * m_pbsBlendState; 00441 00445 static ID3D11Texture2D * m_pt2dDepthStencilBuffer; 00446 00450 static CShaderManager * m_psmShaderMan; 00451 00455 static ID3D11ShaderResourceView * m_psrvLastActiveTextures[LSG_MAX_TEXTURE_UNITS]; 00456 00460 static D3D11_DEPTH_STENCIL_DESC m_dsdDepthStencilDesc; 00461 00465 static D3D11_RASTERIZER_DESC m_rdRasterizerDesc; 00466 00470 static D3D11_BLEND_DESC m_bdBlendDesc; 00471 00475 static LSUINT32 m_ui32ClearColor; 00476 00480 static LSFLOAT m_fDepthClear; 00481 00485 static D3D11_CULL_MODE m_cmLastCull; 00486 00487 00488 // == Functions. 00492 static LSVOID LSE_CALL ResetInternal(); 00493 }; 00494 00495 00496 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00497 // DEFINITIONS 00498 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00499 // == Functions. 00505 LSE_INLINE ID3D11Device * LSE_CALL CDirectX11::GetDirectX11Device() { 00506 return m_pdDevice; 00507 } 00508 00514 LSE_INLINE ID3D11DeviceContext * LSE_CALL CDirectX11::GetDirectX11Context() { 00515 return m_pdcContext; 00516 } 00517 00521 LSE_INLINE LSVOID LSE_FCALL CDirectX11::AssertError() { 00522 } 00523 00527 LSE_INLINE LSVOID LSE_FCALL CDirectX11::Present() { 00528 m_pscSwapChain->Present( 0UL, 0UL ); 00529 } 00530 00536 LSE_INLINE LSVOID LSE_FCALL CDirectX11::Clear( LSUINT32 _ui32Mask ) { 00537 if ( _ui32Mask & LSG_B_COLOR_BUFFER ) { 00538 // Clearing color. 00539 const FLOAT fColor[4] = { 00540 (m_ui32ClearColor >> 24) * (1.0f / 255.0f), // Red. 00541 ((m_ui32ClearColor >> 16) & 0xFF) * (1.0f / 255.0f), // Green. 00542 ((m_ui32ClearColor >> 8) & 0xFF) * (1.0f / 255.0f), // Blue. 00543 (m_ui32ClearColor & 0xFF) * (1.0f / 255.0f), // Alpha. 00544 }; 00545 m_pdcContext->ClearRenderTargetView( m_prtvRenderTarget, fColor ); 00546 } 00547 m_pdcContext->ClearDepthStencilView( m_pdsvDepthStencilView, _ui32Mask & (LSG_B_DEPTH_BUFFER | LSG_B_STENCIL_BUFFER), 00548 m_fDepthClear, 0 ); 00549 } 00550 00554 LSE_INLINE LSVOID LSE_FCALL CDirectX11::ClearAll() { 00555 Clear( LSG_B_ALL ); 00556 } 00557 00563 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetClearDepth( LSREAL _fValue ) { 00564 m_fDepthClear = static_cast<LSFLOAT>(_fValue); 00565 } 00566 00575 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ) { 00576 if ( m_pdDevice ) { 00577 D3D11_VIEWPORT vpViewPort = { 00578 static_cast<FLOAT>(_i32X), 00579 static_cast<FLOAT>(_i32Y), 00580 static_cast<FLOAT>(_i32Width), 00581 static_cast<FLOAT>(_i32Height), 00582 D3D11_MIN_DEPTH, 00583 D3D11_MAX_DEPTH 00584 }; 00585 m_pdcContext->RSSetViewports( 1UL, &vpViewPort ); 00586 } 00587 } 00588 00594 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetDepthTest( LSBOOL _bVal ) { 00595 _bVal = _bVal != false; 00596 if ( m_dsdDepthStencilDesc.DepthEnable != _bVal ) { 00597 m_dsdDepthStencilDesc.DepthEnable = _bVal; 00598 SafeRelease( m_pdssDepthStencil ); 00599 m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil ); 00600 m_pdcContext->OMSetDepthStencilState( m_pdssDepthStencil, 1UL ); 00601 } 00602 } 00603 00609 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetDepthFunc( LSG_DEPTH_TEST _dtFunc ) { 00610 if ( CFndBase::m_dtDepthTestFunc != _dtFunc ) { 00611 CFndBase::m_dtDepthTestFunc = _dtFunc; 00612 static const D3D11_COMPARISON_FUNC dcfFuncs[] = { 00613 D3D11_COMPARISON_NEVER, // LSG_DT_NEVER 00614 D3D11_COMPARISON_ALWAYS, // LSG_DT_ALWAYS 00615 D3D11_COMPARISON_LESS, // LSG_DT_LESS 00616 D3D11_COMPARISON_EQUAL, // LSG_DT_EQUAL 00617 D3D11_COMPARISON_NOT_EQUAL, // LSG_DT_NOTEQUAL 00618 D3D11_COMPARISON_LESS_EQUAL, // LSG_DT_LESSEQUAL 00619 D3D11_COMPARISON_GREATER, // LSG_DT_GREATER 00620 D3D11_COMPARISON_GREATER_EQUAL, // LSG_DT_GREATEREQUAL 00621 }; 00622 m_dsdDepthStencilDesc.DepthFunc = dcfFuncs[_dtFunc]; 00623 SafeRelease( m_pdssDepthStencil ); 00624 m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil ); 00625 m_pdcContext->OMSetDepthStencilState( m_pdssDepthStencil, 1UL ); 00626 } 00627 } 00628 00634 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetDepthWrite( LSBOOL _bVal ) { 00635 _bVal = _bVal != false; 00636 if ( m_dsdDepthStencilDesc.DepthWriteMask != _bVal ) { 00637 m_dsdDepthStencilDesc.DepthWriteMask = static_cast<D3D11_DEPTH_WRITE_MASK>(_bVal); 00638 SafeRelease( m_pdssDepthStencil ); 00639 m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil ); 00640 m_pdcContext->OMSetDepthStencilState( m_pdssDepthStencil, 1UL ); 00641 } 00642 } 00643 00649 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetCulling( LSBOOL _bVal ) { 00650 _bVal = _bVal != false; 00651 if ( _bVal && m_rdRasterizerDesc.CullMode == D3D11_CULL_NONE ) { 00652 // Turning on culling. 00653 m_rdRasterizerDesc.CullMode = m_cmLastCull; 00654 SafeRelease( m_prsRasterizerState ); 00655 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00656 m_pdcContext->RSSetState( m_prsRasterizerState ); 00657 } 00658 else if ( !_bVal && m_rdRasterizerDesc.CullMode != D3D11_CULL_NONE ) { 00659 // Turning off culling. 00660 m_cmLastCull = m_rdRasterizerDesc.CullMode; 00661 m_rdRasterizerDesc.CullMode = D3D11_CULL_NONE; 00662 SafeRelease( m_prsRasterizerState ); 00663 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00664 m_pdcContext->RSSetState( m_prsRasterizerState ); 00665 } 00666 } 00667 00673 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetCullMode( LSG_CULL_MODES _cmMode ) { 00674 static const D3D11_CULL_MODE cmModes[] = { 00675 D3D11_CULL_FRONT, 00676 D3D11_CULL_BACK, 00677 }; 00678 assert( _cmMode == LSG_CM_CW || _cmMode == LSG_CM_CCW ); 00679 if ( m_rdRasterizerDesc.CullMode == D3D11_CULL_NONE ) { 00680 // Just set the last cull mode. 00681 m_cmLastCull = cmModes[_cmMode]; 00682 } 00683 else if ( m_rdRasterizerDesc.CullMode != cmModes[_cmMode] ) { 00684 // Culling is on and not equal to the current mode. 00685 m_rdRasterizerDesc.CullMode = cmModes[_cmMode]; 00686 00687 SafeRelease( m_prsRasterizerState ); 00688 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00689 m_pdcContext->RSSetState( m_prsRasterizerState ); 00690 } 00691 } 00692 00698 LSE_INLINE LSG_CULL_MODES LSE_CALL CDirectX11::GetCullMode() { 00699 if ( m_rdRasterizerDesc.CullMode == D3D11_CULL_FRONT ) { return LSG_CM_CCW; } 00700 return LSG_CM_CW; 00701 } 00702 00708 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetBlendEnabled( LSBOOL _bVal ) { 00709 _bVal = (_bVal != false); 00710 if ( _bVal != m_bdBlendDesc.RenderTarget[0].BlendEnable ) { 00711 m_bdBlendDesc.RenderTarget[0].BlendEnable = _bVal; 00712 00713 SafeRelease( m_pbsBlendState ); 00714 m_pdDevice->CreateBlendState( &m_bdBlendDesc, &m_pbsBlendState ); 00715 m_pdcContext->OMSetBlendState( m_pbsBlendState, 0, 0xFFFFFFFF ); 00716 } 00717 } 00718 00725 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ) { 00726 static const D3D11_BLEND bModes[] = { 00727 D3D11_BLEND_ZERO, // LSG_BM_ZERO 00728 D3D11_BLEND_ONE, // LSG_BM_ONE 00729 D3D11_BLEND_SRC_COLOR, // LSG_BM_SRC_COLOR 00730 D3D11_BLEND_INV_SRC_COLOR, // LSG_BM_INV_SRC_COLOR 00731 D3D11_BLEND_DEST_COLOR, // LSG_BM_DST_COLOR 00732 D3D11_BLEND_INV_DEST_COLOR, // LSG_BM_INV_DST_COLOR 00733 D3D11_BLEND_SRC_ALPHA, // LSG_BM_SRC_ALPHA 00734 D3D11_BLEND_INV_SRC_ALPHA, // LSG_BM_INV_SRC_ALPHA 00735 D3D11_BLEND_DEST_ALPHA, // LSG_BM_DST_ALPHA 00736 D3D11_BLEND_INV_DEST_ALPHA, // LSG_BM_INV_DEST_ALPHA 00737 D3D11_BLEND_SRC_ALPHA_SAT, // LSG_BM_SRC_ALPHA_SAT 00738 }; 00739 if ( m_bdBlendDesc.RenderTarget[0].SrcBlend != bModes[_bmSrc] || m_bdBlendDesc.RenderTarget[0].DestBlend != bModes[_bmDst] ) { 00740 m_bdBlendDesc.RenderTarget[0].SrcBlend = bModes[_bmSrc]; 00741 m_bdBlendDesc.RenderTarget[0].DestBlend = bModes[_bmDst]; 00742 00743 SafeRelease( m_pbsBlendState ); 00744 m_pdDevice->CreateBlendState( &m_bdBlendDesc, &m_pbsBlendState ); 00745 m_pdcContext->OMSetBlendState( m_pbsBlendState, 0, 0xFFFFFFFF ); 00746 } 00747 } 00748 00754 LSE_INLINE LSVOID LSE_FCALL CDirectX11::SetFillMode( LSG_FILL_MODES _fmMode ) { 00755 static const D3D11_FILL_MODE fmValue[] = { 00756 D3D11_FILL_SOLID, 00757 D3D11_FILL_WIREFRAME, 00758 }; 00759 if ( m_rdRasterizerDesc.FillMode != fmValue[_fmMode] ) { 00760 m_rdRasterizerDesc.FillMode = fmValue[_fmMode]; 00761 00762 SafeRelease( m_prsRasterizerState ); 00763 m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState ); 00764 m_pdcContext->RSSetState( m_prsRasterizerState ); 00765 } 00766 } 00767 00773 LSE_INLINE LSBOOL LSE_FCALL CDirectX11::BeginRender() { 00774 return true; 00775 } 00776 00780 LSE_INLINE LSVOID LSE_FCALL CDirectX11::EndRender() { 00781 } 00782 00788 LSE_INLINE CShaderManager * LSE_FCALL CDirectX11::GetShaderManager() { 00789 return m_psmShaderMan; 00790 } 00791 00797 LSE_INLINE LSBOOL LSE_CALL CDirectX11::NonPo2() { 00798 return true; 00799 } 00800 00806 template <typename tnType> 00807 LSE_INLINE LSVOID LSE_CALL CDirectX11::SafeRelease( tnType &_tObj ) { 00808 if ( _tObj ) { 00809 _tObj->Release(); 00810 _tObj = NULL; 00811 } 00812 } 00813 00814 } // namespace lsg 00815 00816 #endif // #ifdef LSG_DX11 00817 00818 #endif // __LSG_DIRECTX11_H__