12 #ifndef hifi_RenderCommonTask_h
13 #define hifi_RenderCommonTask_h
15 #include <gpu/Pipeline.h>
16 #include <render/CullTask.h>
18 #include "LightStage.h"
19 #include "HazeStage.h"
20 #include "LightingModel.h"
21 #include "DeferredFrameTransform.h"
23 class BeginGPURangeTimer {
25 using JobModel = render::Job::ModelO<BeginGPURangeTimer, gpu::RangeTimerPointer>;
27 BeginGPURangeTimer(
const std::string& name) : _gpuTimer(std::make_shared<gpu::RangeTimer>(name)) {}
29 void run(
const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer);
32 gpu::RangeTimerPointer _gpuTimer;
35 using GPURangeTimerConfig = render::GPUJobConfig;
37 class EndGPURangeTimer {
39 using Config = GPURangeTimerConfig;
40 using JobModel = render::Job::ModelI<EndGPURangeTimer, gpu::RangeTimerPointer, Config>;
44 void configure(
const Config& config) {}
45 void run(
const render::RenderContextPointer& renderContext,
const gpu::RangeTimerPointer& timer);
50 class DrawLayered3DConfig :
public render::Job::Config {
52 Q_PROPERTY(
int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
53 Q_PROPERTY(
int maxDrawn MEMBER maxDrawn NOTIFY dirty)
55 int getNumDrawn() {
return numDrawn; }
56 void setNumDrawn(
int num) { numDrawn = num; emit numDrawnChanged(); }
61 void numDrawnChanged();
70 using Inputs = render::VaryingSet4<render::ItemBounds, DeferredFrameTransformPointer, LightingModelPointer, HazeStage::FramePointer>;
71 using Config = DrawLayered3DConfig;
72 using JobModel = render::Job::ModelI<DrawLayered3D, Inputs, Config>;
74 DrawLayered3D(
const render::ShapePlumberPointer& shapePlumber,
bool opaque,
bool jitter, uint transformSlot);
76 void configure(
const Config& config) { _maxDrawn = config.maxDrawn; }
77 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
80 render::ShapePlumberPointer _shapePlumber;
83 bool _opaquePass {
true };
84 bool _isJitterEnabled {
false };
89 using JobModel = render::Job::ModelI<Blit, gpu::FramebufferPointer>;
91 void run(
const render::RenderContextPointer& renderContext,
const gpu::FramebufferPointer& srcFramebuffer);
94 class NewFramebuffer {
96 using Output = gpu::FramebufferPointer;
97 using JobModel = render::Job::ModelO<NewFramebuffer, Output>;
99 NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32);
101 void run(
const render::RenderContextPointer& renderContext, Output& output);
103 gpu::Element _pixelFormat;
105 gpu::FramebufferPointer _outputFramebuffer;
108 class NewOrDefaultFramebuffer {
110 using Input = glm::uvec2;
111 using Output = gpu::FramebufferPointer;
112 using JobModel = render::Job::ModelIO<NewOrDefaultFramebuffer, Input, Output>;
114 void run(
const render::RenderContextPointer& renderContext,
const Input& input, Output& output);
116 gpu::FramebufferPointer _outputFramebuffer;
119 class ResolveFramebuffer {
121 using Inputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
122 using Outputs = gpu::FramebufferPointer;
123 using JobModel = render::Job::ModelIO<ResolveFramebuffer, Inputs, Outputs>;
125 void run(
const render::RenderContextPointer& renderContext,
const Inputs& source, Outputs& dest);
128 class ExtractFrustums {
132 SHADOW_CASCADE0_FRUSTUM = 0,
133 SHADOW_CASCADE1_FRUSTUM,
134 SHADOW_CASCADE2_FRUSTUM,
135 SHADOW_CASCADE3_FRUSTUM,
137 SHADOW_CASCADE_FRUSTUM_COUNT,
139 VIEW_FRUSTUM = SHADOW_CASCADE_FRUSTUM_COUNT,
144 using Inputs = LightStage::ShadowFramePointer;
145 using Outputs = render::VaryingArray<ViewFrustumPointer, FRUSTUM_COUNT>;
146 using JobModel = render::Job::ModelIO<ExtractFrustums, Inputs, Outputs>;
148 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& output);
151 class SetRenderMethod {
153 using JobModel = render::Job::Model<SetRenderMethod>;
155 SetRenderMethod(render::Args::RenderMethod method) : _method(method) {}
157 void run(
const render::RenderContextPointer& renderContext) { renderContext->args->_renderMethod = _method; }
160 render::Args::RenderMethod _method;
163 class RenderMirrorTask {
165 using Inputs = render::VaryingSet2<render::ItemBounds, gpu::FramebufferPointer>;
166 using JobModel = render::Task::ModelI<RenderMirrorTask, Inputs>;
168 RenderMirrorTask() {}
170 void build(JobModel& task,
const render::Varying& inputs, render::Varying& output,
size_t mirrorIndex, render::CullFunctor cullFunctor, uint transformOffset,
size_t depth);
173 static const size_t MAX_MIRROR_DEPTH { 3 };
174 static const size_t MAX_MIRRORS_PER_LEVEL { 3 };
177 class RenderSimulateTask {
179 using Inputs = render::VaryingSet2<render::ItemBounds, gpu::FramebufferPointer>;
180 using JobModel = render::Job::ModelI<RenderSimulateTask, Inputs>;
182 RenderSimulateTask() {}
184 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);