"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/DirectX/LSGDirectX11.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator