Overte C++ Documentation
RenderCommonTask.h
1 //
2 // RenderCommonTask.h
3 //
4 // Created by Bradley Austin Davis on 2018/01/09
5 // Copyright 2013-2018 High Fidelity, Inc.
6 // Copyright 2024 Overte e.V.
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_RenderCommonTask_h
13 #define hifi_RenderCommonTask_h
14 
15 #include <gpu/Pipeline.h>
16 #include <render/CullTask.h>
17 
18 #include "LightStage.h"
19 #include "HazeStage.h"
20 #include "LightingModel.h"
21 #include "DeferredFrameTransform.h"
22 
23 class BeginGPURangeTimer {
24 public:
25  using JobModel = render::Job::ModelO<BeginGPURangeTimer, gpu::RangeTimerPointer>;
26 
27  BeginGPURangeTimer(const std::string& name) : _gpuTimer(std::make_shared<gpu::RangeTimer>(name)) {}
28 
29  void run(const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer);
30 
31 protected:
32  gpu::RangeTimerPointer _gpuTimer;
33 };
34 
35 using GPURangeTimerConfig = render::GPUJobConfig;
36 
37 class EndGPURangeTimer {
38 public:
39  using Config = GPURangeTimerConfig;
40  using JobModel = render::Job::ModelI<EndGPURangeTimer, gpu::RangeTimerPointer, Config>;
41 
42  EndGPURangeTimer() {}
43 
44  void configure(const Config& config) {}
45  void run(const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer);
46 
47 protected:
48 };
49 
50 class DrawLayered3DConfig : public render::Job::Config {
51  Q_OBJECT
52  Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
53  Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty)
54 public:
55  int getNumDrawn() { return numDrawn; }
56  void setNumDrawn(int num) { numDrawn = num; emit numDrawnChanged(); }
57 
58  int maxDrawn{ -1 };
59 
60 signals:
61  void numDrawnChanged();
62  void dirty();
63 
64 protected:
65  int numDrawn{ 0 };
66 };
67 
68 class DrawLayered3D {
69 public:
70  using Inputs = render::VaryingSet4<render::ItemBounds, DeferredFrameTransformPointer, LightingModelPointer, HazeStage::FramePointer>;
71  using Config = DrawLayered3DConfig;
72  using JobModel = render::Job::ModelI<DrawLayered3D, Inputs, Config>;
73 
74  DrawLayered3D(const render::ShapePlumberPointer& shapePlumber, bool opaque, bool jitter, uint transformSlot);
75 
76  void configure(const Config& config) { _maxDrawn = config.maxDrawn; }
77  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
78 
79 protected:
80  render::ShapePlumberPointer _shapePlumber;
81  int _maxDrawn; // initialized by Config
82  uint _transformSlot;
83  bool _opaquePass { true };
84  bool _isJitterEnabled { false };
85 };
86 
87 class Blit {
88 public:
89  using JobModel = render::Job::ModelI<Blit, gpu::FramebufferPointer>;
90 
91  void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer);
92 };
93 
94 class NewFramebuffer {
95 public:
96  using Output = gpu::FramebufferPointer;
97  using JobModel = render::Job::ModelO<NewFramebuffer, Output>;
98 
99  NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32);
100 
101  void run(const render::RenderContextPointer& renderContext, Output& output);
102 protected:
103  gpu::Element _pixelFormat;
104 private:
105  gpu::FramebufferPointer _outputFramebuffer;
106 };
107 
108 class NewOrDefaultFramebuffer {
109 public:
110  using Input = glm::uvec2;
111  using Output = gpu::FramebufferPointer;
112  using JobModel = render::Job::ModelIO<NewOrDefaultFramebuffer, Input, Output>;
113 
114  void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output);
115 private:
116  gpu::FramebufferPointer _outputFramebuffer;
117 };
118 
119 class ResolveFramebuffer {
120 public:
121  using Inputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
122  using Outputs = gpu::FramebufferPointer;
123  using JobModel = render::Job::ModelIO<ResolveFramebuffer, Inputs, Outputs>;
124 
125  void run(const render::RenderContextPointer& renderContext, const Inputs& source, Outputs& dest);
126 };
127 
128 class ExtractFrustums {
129 public:
130 
131  enum Frustum {
132  SHADOW_CASCADE0_FRUSTUM = 0,
133  SHADOW_CASCADE1_FRUSTUM,
134  SHADOW_CASCADE2_FRUSTUM,
135  SHADOW_CASCADE3_FRUSTUM,
136 
137  SHADOW_CASCADE_FRUSTUM_COUNT,
138 
139  VIEW_FRUSTUM = SHADOW_CASCADE_FRUSTUM_COUNT,
140 
141  FRUSTUM_COUNT
142  };
143 
144  using Inputs = LightStage::ShadowFramePointer;
145  using Outputs = render::VaryingArray<ViewFrustumPointer, FRUSTUM_COUNT>;
146  using JobModel = render::Job::ModelIO<ExtractFrustums, Inputs, Outputs>;
147 
148  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output);
149 };
150 
151 class SetRenderMethod {
152 public:
153  using JobModel = render::Job::Model<SetRenderMethod>;
154 
155  SetRenderMethod(render::Args::RenderMethod method) : _method(method) {}
156 
157  void run(const render::RenderContextPointer& renderContext) { renderContext->args->_renderMethod = _method; }
158 
159 protected:
160  render::Args::RenderMethod _method;
161 };
162 
163 class RenderMirrorTask {
164 public:
165  using Inputs = render::VaryingSet2<render::ItemBounds, gpu::FramebufferPointer>;
166  using JobModel = render::Task::ModelI<RenderMirrorTask, Inputs>;
167 
168  RenderMirrorTask() {}
169 
170  void build(JobModel& task, const render::Varying& inputs, render::Varying& output, size_t mirrorIndex, render::CullFunctor cullFunctor, uint transformOffset, size_t depth);
171 
172  // NOTE: if these change, must also change Batch::MAX_TRANSFORM_SAVE_SLOT_COUNT
173  static const size_t MAX_MIRROR_DEPTH { 3 };
174  static const size_t MAX_MIRRORS_PER_LEVEL { 3 };
175 };
176 
177 class RenderSimulateTask {
178 public:
179  using Inputs = render::VaryingSet2<render::ItemBounds, gpu::FramebufferPointer>;
180  using JobModel = render::Job::ModelI<RenderSimulateTask, Inputs>;
181 
182  RenderSimulateTask() {}
183 
184  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
185 };
186 
187 #endif // hifi_RenderDeferredTask_h