| 785 | } |
| 786 | |
| 787 | void Tr2RenderContextBase::RenderBatchesWithOverride( ITriRenderBatchAccumulator* batches, Tr2Material* overrideEffect, const BlueSharedString& techniqueName ) |
| 788 | { |
| 789 | CCP_STATS_ZONE( __FUNCTION__ ); |
| 790 | |
| 791 | if( !overrideEffect ) |
| 792 | { |
| 793 | RenderBatches( batches, techniqueName ); |
| 794 | return; |
| 795 | } |
| 796 | |
| 797 | Tr2RenderContext* primaryContext = reinterpret_cast<Tr2RenderContext*>( this ); |
| 798 | Tr2RingBuffer::GetInstance<Float4x3>().PrepareBuffer( *primaryContext ); |
| 799 | Tr2RingBuffer::GetInstance<Tr2MorphTargetAnimationData>().PrepareBuffer( *primaryContext ); |
| 800 | |
| 801 | D3DPERF_EVENT( L"Tr2RenderContextBase::RenderBatchesWithOverride" ); |
| 802 | |
| 803 | auto overrideShader = overrideEffect->GetShaderStateInterface(); |
| 804 | if( !overrideShader ) |
| 805 | { |
| 806 | return; |
| 807 | } |
| 808 | |
| 809 | Tr2RenderContext* renderContext = reinterpret_cast<Tr2RenderContext*>( this ); |
| 810 | UseTextures( batches, techniqueName, *renderContext ); |
| 811 | |
| 812 | Tr2ConstantBufferAL* perObjectConstantBuffers[CBUFFER_COUNT]; |
| 813 | for( uint32_t i = 0; i != CBUFFER_COUNT; ++i ) |
| 814 | { |
| 815 | perObjectConstantBuffers[i] = &m_perObjectConstantBuffers[i]; |
| 816 | } |
| 817 | |
| 818 | auto overrideMaterial = overrideEffect; |
| 819 | |
| 820 | auto RenderBatch = [&]( auto& batch ) { |
| 821 | uint32_t technique; |
| 822 | if( !batch.m_shader->GetTechniqueIndex( techniqueName, technique ) ) |
| 823 | { |
| 824 | return; |
| 825 | } |
| 826 | |
| 827 | m_esm.ApplyStandardStates( batch.m_renderingMode ); |
| 828 | |
| 829 | uint32_t passCount = overrideShader->GetPassCount( technique ); |
| 830 | for( uint32_t passIx = 0; passIx < passCount; ++passIx ) |
| 831 | { |
| 832 | D3DPERF_EVENT1( L"Pass %i", passIx ); |
| 833 | |
| 834 | auto program = batch.m_shader->ApplyShaderOverride( technique, 0, *overrideShader, passIx, *renderContext ); |
| 835 | batch.m_material->ApplyMaterialDataForPassWithOverride( technique, 0, program, *renderContext ); |
| 836 | overrideShader->ApplyRenderStates( 0, passIx, *renderContext ); |
| 837 | |
| 838 | if( batch.m_objectData ) |
| 839 | { |
| 840 | batch.m_objectData->SetPerObjectDataToDevice( perObjectConstantBuffers, overrideShader->GetShaderTypeMask( 0 ), *renderContext ); |
| 841 | } |
| 842 | |
| 843 | Tr2GpuProfiler::GetProfiler().Begin( batch.m_material, GetPassName( passIx ), *renderContext ); |
| 844 |
no test coverage detected