public void Render(CommandList cl, ICustomShaderStageModel stage, GpuSurface t0, GpuSurface t1, GpuSurface t2, GpuSurface t3, GpuSurface target) { if (cl == null || stage == null || target == null) { _frameworkMessenger.Report("Warning: you are feeding a Custom Effect Stage Renderer null inputs, aborting"); return; } cl.SetPipeline(stage.Pipeline); cl.SetFramebuffer(target.Framebuffer); _viewportManager.ConfigureViewportForActiveFramebuffer(cl); cl.SetVertexBuffer(0, _ndcQuadVertexBuffer.Buffer); var assignedTextureCount = 0; var numUniforms = stage.NumberUserUniforms; for (var n = 0; n < numUniforms; n++) { if (stage.UserUniformType(n) == ShaderUniformType.Texture) { if (assignedTextureCount < 4) { GpuSurface surface = null; switch (assignedTextureCount) { case 0: surface = t0; break; case 1: surface = t1; break; case 2: surface = t2; break; case 3: surface = t3; break; } var resourceSet = surface == null ? _gpuSurfaceManager.SingleWhitePixel.ResourceSet_TexWrap : surface.ResourceSet_TexWrap; cl.SetGraphicsResourceSet((uint)n, resourceSet); assignedTextureCount++; } else { _frameworkMessenger.Report("Custom shader requires more than 4 textures. Should not have reached this stage..."); } } else { var resourceSet = stage.UserUniformResourceSet(n); cl.SetGraphicsResourceSet((uint)n, resourceSet); } } cl.Draw(6); }
public void DispatchToRenderStage(ICustomShaderStageModel stage, CommandList cl, RenderCommandQueueItem command) { var surface = _surfaceManager.RetrieveSurface(command.Surface, new GpuSurfaceType[] { GpuSurfaceType.Texture, GpuSurfaceType.Internal }); var t0 = command.Camera == 0UL ? null : _surfaceManager.RetrieveSurface(command.Camera, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal }); var t1 = command.Texture0 == 0UL ? null : _surfaceManager.RetrieveSurface(command.Texture0, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal }); var t2 = command.Texture1 == 0UL ? null : _surfaceManager.RetrieveSurface(command.Texture1, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal }); var t3 = command.SpareId0 == 0UL ? null : _surfaceManager.RetrieveSurface(command.SpareId0, new GpuSurfaceType[] { GpuSurfaceType.SwapChainOutput, GpuSurfaceType.Internal }); _customShaderRenderer.Render(cl, stage, t0, t1, t2, t3, surface); }
public void CacheStageModel(ICustomShaderStageModel model) => CachedCustomShaderModel = model;