static void ResolveColorWideInternal2( FRHICommandList& RHICmdList, const ERHIFeatureLevel::Type CurrentFeatureLevel, const FTextureRHIRef& SrcTexture, const FIntPoint& SrcOrigin) { auto ShaderMap = GetGlobalShaderMap(CurrentFeatureLevel); TShaderMapRef<FWideCustomResolveVS> VertexShader(ShaderMap); TShaderMapRef<FWideCustomResolvePS<MSAA, Width>> PixelShader(ShaderMap); static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, CurrentFeatureLevel, BoundShaderState, GetVertexDeclarationFVector4(), *VertexShader, *PixelShader); PixelShader->SetParameters(RHICmdList, SrcTexture, SrcOrigin); RHICmdList.DrawPrimitive(PT_TriangleList, 0, 1, 1); }
void FLightPropagationVolume::Visualise(FRHICommandList& RHICmdList, const FViewInfo& View) const { SCOPED_DRAW_EVENT(RHICmdList, LpvVisualise); check(View.GetFeatureLevel() == ERHIFeatureLevel::SM5); TShaderMapRef<FLpvVisualiseVS> VertexShader(View.ShaderMap); TShaderMapRef<FLpvVisualiseGS> GeometryShader(View.ShaderMap); TShaderMapRef<FLpvVisualisePS> PixelShader(View.ShaderMap); RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always>::GetRHI()); RHICmdList.SetRasterizerState(TStaticRasterizerState<FM_Solid, CM_None>::GetRHI()); RHICmdList.SetBlendState(TStaticBlendState<CW_RGB, BO_Add, BF_One, BF_One>::GetRHI()); SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), LpvVisBoundShaderState, GSimpleElementVertexDeclaration.VertexDeclarationRHI, *VertexShader, *PixelShader, *GeometryShader); VertexShader->SetParameters(RHICmdList, View); GeometryShader->SetParameters(RHICmdList, View); PixelShader->SetParameters(RHICmdList, this, View); RHICmdList.SetStreamSource(0, NULL, 0, 0); RHICmdList.DrawPrimitive(PT_PointList, 0, 1, 32 * 3); PixelShader->UnbindBuffers(RHICmdList); }
void RunBenchmarkShader(FRHICommandList& RHICmdList, FVertexBufferRHIParamRef VertexThroughputBuffer, const FSceneView& View, TRefCountPtr<IPooledRenderTarget>& Src, float WorkScale) { auto ShaderMap = GetGlobalShaderMap(View.GetFeatureLevel()); TShaderMapRef<FPostProcessBenchmarkVS<VsMethod>> VertexShader(ShaderMap); TShaderMapRef<FPostProcessBenchmarkPS<PsMethod>> PixelShader(ShaderMap); bool bVertexTest = VsMethod == 1; FVertexDeclarationRHIParamRef VertexDeclaration = bVertexTest ? GVertexThroughputDeclaration.DeclRHI : GFilterVertexDeclaration.VertexDeclarationRHI; static FGlobalBoundShaderState BoundShaderState; SetGlobalBoundShaderState(RHICmdList, View.GetFeatureLevel(), BoundShaderState, VertexDeclaration, *VertexShader, *PixelShader); PixelShader->SetParameters(RHICmdList, View, Src); VertexShader->SetParameters(RHICmdList, View); if (bVertexTest) { // Vertex Tests uint32 TotalNumPrimitives = FMath::CeilToInt(GBenchmarkPrimitives * WorkScale); uint32 TotalNumVertices = TotalNumPrimitives * 3; while (TotalNumVertices != 0) { uint32 VerticesThisPass = FMath::Min(TotalNumVertices, GBenchmarkVertices); uint32 PrimitivesThisPass = VerticesThisPass / 3; RHICmdList.SetStreamSource(0, VertexThroughputBuffer, sizeof(FBenchmarkVertex), 0); RHICmdList.DrawPrimitive(PT_TriangleList, 0, PrimitivesThisPass, 1); TotalNumVertices -= VerticesThisPass; } } else { // Pixel Tests // single pass was not fine grained enough so we reduce the pass size based on the fractional part of WorkScale float TotalHeight = GBenchmarkResolution * WorkScale; // rounds up uint32 PassCount = (uint32)FMath::CeilToFloat(TotalHeight / GBenchmarkResolution); for (uint32 i = 0; i < PassCount; ++i) { float Top = i * GBenchmarkResolution; float Bottom = FMath::Min(Top + GBenchmarkResolution, TotalHeight); float LocalHeight = Bottom - Top; DrawRectangle( RHICmdList, 0, 0, GBenchmarkResolution, LocalHeight, 0, 0, GBenchmarkResolution, LocalHeight, FIntPoint(GBenchmarkResolution, GBenchmarkResolution), FIntPoint(GBenchmarkResolution, GBenchmarkResolution), *VertexShader, EDRF_Default); } } }