/** * Sets the filter shaders with the provided filter samples. * @param SamplerStateRHI - The sampler state to use for the source texture. * @param FilterTextureRHI - The source texture. * @param AdditiveTextureRHI - The additional source texture, used in CombineMethod=1 * @param CombineMethodInt 0:weighted filtering, 1: weighted filtering + additional texture, 2: max magnitude * @param SampleOffsets - A pointer to an array of NumSamples UV offsets * @param SampleWeights - A pointer to an array of NumSamples 4-vector weights * @param NumSamples - The number of samples used by the filter. * @param OutVertexShader - The vertex shader used for the filter */ void SetFilterShaders( FRHICommandListImmediate& RHICmdList, ERHIFeatureLevel::Type FeatureLevel, FSamplerStateRHIParamRef SamplerStateRHI, FTextureRHIParamRef FilterTextureRHI, FTextureRHIParamRef AdditiveTextureRHI, uint32 CombineMethodInt, FVector2D* SampleOffsets, FLinearColor* SampleWeights, uint32 NumSamples, FShader** OutVertexShader ) { check(CombineMethodInt <= 2); auto ShaderMap = GetGlobalShaderMap(FeatureLevel); // A macro to handle setting the filter shader for a specific number of samples. #define SET_FILTER_SHADER_TYPE(NumSamples) \ case NumSamples: \ { \ TShaderMapRef<TFilterVS<NumSamples> > VertexShader(ShaderMap); \ *OutVertexShader = *VertexShader; \ if(CombineMethodInt == 0) \ { \ TShaderMapRef<TFilterPS<NumSamples, 0> > PixelShader(ShaderMap); \ { \ static FGlobalBoundShaderState BoundShaderState; \ SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); \ } \ PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights); \ } \ else if(CombineMethodInt == 1) \ { \ TShaderMapRef<TFilterPS<NumSamples, 1> > PixelShader(ShaderMap); \ { \ static FGlobalBoundShaderState BoundShaderState; \ SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); \ } \ PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights); \ } \ else\ { \ TShaderMapRef<TFilterPS<NumSamples, 2> > PixelShader(ShaderMap); \ { \ static FGlobalBoundShaderState BoundShaderState; \ SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); \ } \ PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights); \ } \ VertexShader->SetParameters(RHICmdList, SampleOffsets); \ break; \ }; // Set the appropriate filter shader for the given number of samples. switch(NumSamples) { SET_FILTER_SHADER_TYPE(1); SET_FILTER_SHADER_TYPE(2); SET_FILTER_SHADER_TYPE(3); SET_FILTER_SHADER_TYPE(4); SET_FILTER_SHADER_TYPE(5); SET_FILTER_SHADER_TYPE(6); SET_FILTER_SHADER_TYPE(7); SET_FILTER_SHADER_TYPE(8); SET_FILTER_SHADER_TYPE(9); SET_FILTER_SHADER_TYPE(10); SET_FILTER_SHADER_TYPE(11); SET_FILTER_SHADER_TYPE(12); SET_FILTER_SHADER_TYPE(13); SET_FILTER_SHADER_TYPE(14); SET_FILTER_SHADER_TYPE(15); SET_FILTER_SHADER_TYPE(16); SET_FILTER_SHADER_TYPE(17); SET_FILTER_SHADER_TYPE(18); SET_FILTER_SHADER_TYPE(19); SET_FILTER_SHADER_TYPE(20); SET_FILTER_SHADER_TYPE(21); SET_FILTER_SHADER_TYPE(22); SET_FILTER_SHADER_TYPE(23); SET_FILTER_SHADER_TYPE(24); SET_FILTER_SHADER_TYPE(25); SET_FILTER_SHADER_TYPE(26); SET_FILTER_SHADER_TYPE(27); SET_FILTER_SHADER_TYPE(28); SET_FILTER_SHADER_TYPE(29); SET_FILTER_SHADER_TYPE(30); SET_FILTER_SHADER_TYPE(31); SET_FILTER_SHADER_TYPE(32); default: UE_LOG(LogRenderer, Fatal,TEXT("Invalid number of samples: %u"),NumSamples); } #undef SET_FILTER_SHADER_TYPE }
/** * Sets the filter shaders with the provided filter samples. * @param SamplerStateRHI - The sampler state to use for the source texture. * @param FilterTextureRHI - The source texture. * @param AdditiveTextureRHI - The additional source texture, used in CombineMethod=1 * @param CombineMethodInt 0:weighted filtering, 1: weighted filtering + additional texture, 2: max magnitude * @param SampleOffsets - A pointer to an array of NumSamples UV offsets * @param SampleWeights - A pointer to an array of NumSamples 4-vector weights * @param NumSamples - The number of samples used by the filter. * @param OutVertexShader - The vertex shader used for the filter */ void SetFilterShaders( FRHICommandListImmediate& RHICmdList, ERHIFeatureLevel::Type FeatureLevel, FSamplerStateRHIParamRef SamplerStateRHI, FTextureRHIParamRef FilterTextureRHI, FTextureRHIParamRef AdditiveTextureRHI, uint32 CombineMethodInt, FVector2D* SampleOffsets, FLinearColor* SampleWeights, uint32 NumSamples, FShader** OutVertexShader ) { check(CombineMethodInt <= 2); check(NumSamples <= MAX_FILTER_SAMPLES && NumSamples > 0); auto ShaderMap = GetGlobalShaderMap(FeatureLevel); const auto DynamicNumSample = CVarLoopMode.GetValueOnRenderThread(); if ((NumSamples > MAX_FILTER_COMPILE_TIME_SAMPLES && DynamicNumSample != 0) || (DynamicNumSample == 2)) { // there is to many samples, so we use the dynamic sample count shader TShaderMapRef<FPostProcessVS> VertexShader(ShaderMap); *OutVertexShader = *VertexShader; if(CombineMethodInt == 0) { TShaderMapRef<TFilterPS<0, 0> > PixelShader(ShaderMap); { static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); } PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights, SampleOffsets, NumSamples); } else if(CombineMethodInt == 1) { TShaderMapRef<TFilterPS<0, 1> > PixelShader(ShaderMap); { static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); } PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights, SampleOffsets, NumSamples); } else\ { TShaderMapRef<TFilterPS<0, 2> > PixelShader(ShaderMap); { static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); } PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights, SampleOffsets, NumSamples); } return; } // A macro to handle setting the filter shader for a specific number of samples. #define SET_FILTER_SHADER_TYPE(CompileTimeNumSamples) \ case CompileTimeNumSamples: \ { \ TShaderMapRef<TFilterVS<CompileTimeNumSamples> > VertexShader(ShaderMap); \ *OutVertexShader = *VertexShader; \ if(CombineMethodInt == 0) \ { \ TShaderMapRef<TFilterPS<CompileTimeNumSamples, 0> > PixelShader(ShaderMap); \ { \ static FGlobalBoundShaderState BoundShaderState; \ SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); \ } \ PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights, SampleOffsets, NumSamples); \ } \ else if(CombineMethodInt == 1) \ { \ TShaderMapRef<TFilterPS<CompileTimeNumSamples, 1> > PixelShader(ShaderMap); \ { \ static FGlobalBoundShaderState BoundShaderState; \ SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); \ } \ PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights, SampleOffsets, NumSamples); \ } \ else\ { \ TShaderMapRef<TFilterPS<CompileTimeNumSamples, 2> > PixelShader(ShaderMap); \ { \ static FGlobalBoundShaderState BoundShaderState; \ SetGlobalBoundShaderState(RHICmdList, FeatureLevel, BoundShaderState, GFilterVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader); \ } \ PixelShader->SetParameters(RHICmdList, SamplerStateRHI, FilterTextureRHI, AdditiveTextureRHI, SampleWeights, SampleOffsets, NumSamples); \ } \ VertexShader->SetParameters(RHICmdList, SampleOffsets); \ break; \ }; check(NumSamples <= MAX_FILTER_COMPILE_TIME_SAMPLES); // Set the appropriate filter shader for the given number of samples. switch(NumSamples) { SET_FILTER_SHADER_TYPE(1); SET_FILTER_SHADER_TYPE(2); SET_FILTER_SHADER_TYPE(3); SET_FILTER_SHADER_TYPE(4); SET_FILTER_SHADER_TYPE(5); SET_FILTER_SHADER_TYPE(6); SET_FILTER_SHADER_TYPE(7); SET_FILTER_SHADER_TYPE(8); SET_FILTER_SHADER_TYPE(9); SET_FILTER_SHADER_TYPE(10); SET_FILTER_SHADER_TYPE(11); SET_FILTER_SHADER_TYPE(12); SET_FILTER_SHADER_TYPE(13); SET_FILTER_SHADER_TYPE(14); SET_FILTER_SHADER_TYPE(15); SET_FILTER_SHADER_TYPE(16); SET_FILTER_SHADER_TYPE(17); SET_FILTER_SHADER_TYPE(18); SET_FILTER_SHADER_TYPE(19); SET_FILTER_SHADER_TYPE(20); SET_FILTER_SHADER_TYPE(21); SET_FILTER_SHADER_TYPE(22); SET_FILTER_SHADER_TYPE(23); SET_FILTER_SHADER_TYPE(24); SET_FILTER_SHADER_TYPE(25); SET_FILTER_SHADER_TYPE(26); SET_FILTER_SHADER_TYPE(27); SET_FILTER_SHADER_TYPE(28); SET_FILTER_SHADER_TYPE(29); SET_FILTER_SHADER_TYPE(30); SET_FILTER_SHADER_TYPE(31); SET_FILTER_SHADER_TYPE(32); default: UE_LOG(LogRenderer, Fatal,TEXT("Invalid number of samples: %u"),NumSamples); } #undef SET_FILTER_SHADER_TYPE }