Overte C++ Documentation
DebugDeferredBuffer.h
1 //
2 // DebugDeferredBuffer.h
3 // libraries/render-utils/src
4 //
5 // Created by Clement on 12/3/15.
6 // Copyright 2015 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_DebugDeferredBuffer_h
13 #define hifi_DebugDeferredBuffer_h
14 
15 #include <QFileInfo>
16 
17 #include <render/DrawTask.h>
18 #include "DeferredFrameTransform.h"
19 #include "DeferredFramebuffer.h"
20 #include "SurfaceGeometryPass.h"
21 #include "AmbientOcclusionEffect.h"
22 #include "VelocityBufferPass.h"
23 
24 #include "LightStage.h"
25 
26 class DebugDeferredBufferConfig : public render::Job::Config {
27  Q_OBJECT
28  Q_PROPERTY(int mode MEMBER mode WRITE setMode)
29  Q_PROPERTY(glm::vec4 size MEMBER size NOTIFY dirty)
30 public:
31  DebugDeferredBufferConfig() : render::Job::Config(false) {}
32 
33  void setMode(int newMode);
34 
35  int mode{ 0 };
36  glm::vec4 size{ 0.0f, -1.0f, 1.0f, 1.0f };
37 signals:
38  void dirty();
39 };
40 
41 class DebugDeferredBuffer {
42 public:
43  using Inputs = render::VaryingSet7<DeferredFramebufferPointer,
44  LinearDepthFramebufferPointer,
45  SurfaceGeometryFramebufferPointer,
46  AmbientOcclusionFramebufferPointer,
47  VelocityFramebufferPointer,
48  DeferredFrameTransformPointer,
49  LightStage::ShadowFramePointer>;
50  using Config = DebugDeferredBufferConfig;
51  using JobModel = render::Job::ModelI<DebugDeferredBuffer, Inputs, Config>;
52 
53  DebugDeferredBuffer();
54  ~DebugDeferredBuffer();
55 
56  void configure(const Config& config);
57  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
58 
59 protected:
60  friend class DebugDeferredBufferConfig;
61 
62  enum Mode : uint8_t
63  {
64  // Use Mode suffix to avoid collisions
65  Off = 0,
66  DepthMode,
67  AlbedoMode,
68  NormalMode,
69  RoughnessMode,
70  MetallicMode,
71  EmissiveMode,
72  UnlitMode,
73  OcclusionMode,
74  LightmapMode,
75  ScatteringMode,
76  LightingMode,
77  ShadowCascade0Mode,
78  ShadowCascade1Mode,
79  ShadowCascade2Mode,
80  ShadowCascade3Mode,
81  ShadowCascadeIndicesMode,
82  LinearDepthMode,
83  HalfLinearDepthMode,
84  HalfNormalMode,
85  CurvatureMode,
86  NormalCurvatureMode,
87  DiffusedCurvatureMode,
88  DiffusedNormalCurvatureMode,
89  CurvatureOcclusionMode,
90  ScatteringDebugMode,
91  AmbientOcclusionMode,
92  AmbientOcclusionBlurredMode,
93  AmbientOcclusionNormalMode,
94  VelocityMode,
95  CustomMode, // Needs to stay last
96 
97  NumModes,
98  };
99 
100 private:
101  Mode _mode{ Off };
102  glm::vec4 _size;
103 
104 #include "debug_deferred_buffer_shared.slh"
105 
106  using ParametersBuffer = gpu::StructBuffer<DebugParameters>;
107 
108  struct CustomPipeline {
109  gpu::PipelinePointer pipeline;
110  mutable QFileInfo info;
111  };
112  using StandardPipelines = std::array<gpu::PipelinePointer, NumModes>;
113  using CustomPipelines = std::unordered_map<std::string, CustomPipeline>;
114 
115  bool pipelineNeedsUpdate(Mode mode, const std::string& customFile = std::string()) const;
116  const gpu::PipelinePointer& getPipeline(Mode mode, const std::string& customFile = std::string());
117  std::string getShaderSourceCode(Mode mode, const std::string& customFile = std::string());
118 
119  ParametersBuffer _parameters;
120  StandardPipelines _pipelines;
121  CustomPipelines _customPipelines;
122  int _geometryId{ 0 };
123 };
124 
125 #endif // hifi_DebugDeferredBuffer_h