-------------------------------------------------------------------------------------- Description: Refreshes effect-dependent variables. --------------------------------------------------------------------------------------
| 216 | // Refreshes effect-dependent variables. |
| 217 | // -------------------------------------------------------------------------------------- |
| 218 | void Tr2Shader::ProcessEffect() |
| 219 | { |
| 220 | m_sortValue = 0; |
| 221 | if( m_effect.techniques.empty() ) |
| 222 | { |
| 223 | return; |
| 224 | } |
| 225 | auto& technique = m_effect.techniques[0]; |
| 226 | |
| 227 | if( !technique.passes.empty() ) |
| 228 | { |
| 229 | // Construct sort value so that the following parameters affect it, in the order given: |
| 230 | // 1) Number of passes |
| 231 | // 2) Pixel shader in the first pass |
| 232 | // 3) Vertex shader in the first pass |
| 233 | // 4) Render states set in the first pass |
| 234 | |
| 235 | unsigned int ps = technique.passes[0].stageInputs[PIXEL_SHADER].m_shader & 0x3ff; |
| 236 | unsigned int vs = technique.passes[0].stageInputs[VERTEX_SHADER].m_shader & 0x3ff; |
| 237 | unsigned int states = technique.passes[0].renderStates & 0x3ff; |
| 238 | unsigned int numPasses = technique.passes.size() & 0x3; |
| 239 | |
| 240 | m_sortValue = ( numPasses << 30 ) | ( ps << 20 ) | ( vs << 10 ) | states; |
| 241 | } |
| 242 | |
| 243 | #if TRINITY_PLATFORM == TRINITY_DIRECTX12 || TRINITY_PLATFORM == TRINITY_METAL |
| 244 | USE_MAIN_THREAD_RENDER_CONTEXT(); |
| 245 | |
| 246 | for( auto& t : m_effect.techniques ) |
| 247 | { |
| 248 | for( auto& pass : t.passes ) |
| 249 | { |
| 250 | if( auto program = renderContext.m_esm.GetShaderProgram( pass.shaderProgram ) ) |
| 251 | { |
| 252 | pass.indirectLayout = Tr2IndirectDrawBufferLayout( *program, renderContext ); |
| 253 | } |
| 254 | } |
| 255 | } |
| 256 | |
| 257 | m_hasVertexBufferAccessInRtShadow = false; |
| 258 | const BlueSharedString techniqueName = BlueSharedString( "RtShadow" ); |
| 259 | auto effect = GetEffect(); |
| 260 | uint32_t techniqueIndex; |
| 261 | if( GetTechniqueIndex( techniqueName, techniqueIndex ) ) |
| 262 | { |
| 263 | for( const auto& library : effect.techniques[techniqueIndex].libraries ) |
| 264 | { |
| 265 | for( const auto& localRegister : library.localInput.signature.registers ) |
| 266 | { |
| 267 | if( localRegister.registerType == Tr2ShaderRegisterAL::CONSTANT_BUFFER && |
| 268 | localRegister.registerIndex == Tr2Renderer::GetPerObjectRTVertexBufferDataRegister() ) |
| 269 | { |
| 270 | m_hasVertexBufferAccessInRtShadow = true; |
| 271 | } |
| 272 | } |
| 273 | } |
| 274 | } |
| 275 | #endif |
no test coverage detected