9 #ifndef hifi_RenderCommonTask_h
10 #define hifi_RenderCommonTask_h
12 #include <gpu/Pipeline.h>
13 #include "LightStage.h"
14 #include "HazeStage.h"
15 #include "LightingModel.h"
17 class BeginGPURangeTimer {
19 using JobModel = render::Job::ModelO<BeginGPURangeTimer, gpu::RangeTimerPointer>;
21 BeginGPURangeTimer(
const std::string& name) : _gpuTimer(std::make_shared<gpu::RangeTimer>(name)) {}
23 void run(
const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer);
26 gpu::RangeTimerPointer _gpuTimer;
29 using GPURangeTimerConfig = render::GPUJobConfig;
31 class EndGPURangeTimer {
33 using Config = GPURangeTimerConfig;
34 using JobModel = render::Job::ModelI<EndGPURangeTimer, gpu::RangeTimerPointer, Config>;
38 void configure(
const Config& config) {}
39 void run(
const render::RenderContextPointer& renderContext,
const gpu::RangeTimerPointer& timer);
44 class DrawLayered3DConfig :
public render::Job::Config {
46 Q_PROPERTY(
int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
47 Q_PROPERTY(
int maxDrawn MEMBER maxDrawn NOTIFY dirty)
49 int getNumDrawn() {
return numDrawn; }
50 void setNumDrawn(
int num) { numDrawn = num; emit numDrawnChanged(); }
55 void numDrawnChanged();
64 using Inputs = render::VaryingSet4<render::ItemBounds, LightingModelPointer, HazeStage::FramePointer, glm::vec2>;
65 using Config = DrawLayered3DConfig;
66 using JobModel = render::Job::ModelI<DrawLayered3D, Inputs, Config>;
68 DrawLayered3D(
bool opaque);
70 void configure(
const Config& config) { _maxDrawn = config.maxDrawn; }
71 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
74 render::ShapePlumberPointer _shapePlumber;
76 bool _opaquePass {
true };
81 using JobModel = render::Job::ModelI<Blit, gpu::FramebufferPointer>;
83 void run(
const render::RenderContextPointer& renderContext,
const gpu::FramebufferPointer& srcFramebuffer);
86 class NewFramebuffer {
88 using Output = gpu::FramebufferPointer;
89 using JobModel = render::Job::ModelO<NewFramebuffer, Output>;
91 NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32);
93 void run(
const render::RenderContextPointer& renderContext, Output& output);
95 gpu::Element _pixelFormat;
97 gpu::FramebufferPointer _outputFramebuffer;
100 class NewOrDefaultFramebuffer {
102 using Input = glm::uvec2;
103 using Output = gpu::FramebufferPointer;
104 using JobModel = render::Job::ModelIO<NewOrDefaultFramebuffer, Input, Output>;
106 void run(
const render::RenderContextPointer& renderContext,
const Input& input, Output& output);
108 gpu::FramebufferPointer _outputFramebuffer;
111 class ResolveFramebuffer {
113 using Inputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
114 using Outputs = gpu::FramebufferPointer;
115 using JobModel = render::Job::ModelIO<ResolveFramebuffer, Inputs, Outputs>;
117 void run(
const render::RenderContextPointer& renderContext,
const Inputs& source, Outputs& dest);
120 class ExtractFrustums {
124 SHADOW_CASCADE0_FRUSTUM = 0,
125 SHADOW_CASCADE1_FRUSTUM,
126 SHADOW_CASCADE2_FRUSTUM,
127 SHADOW_CASCADE3_FRUSTUM,
129 SHADOW_CASCADE_FRUSTUM_COUNT,
131 VIEW_FRUSTUM = SHADOW_CASCADE_FRUSTUM_COUNT,
136 using Inputs = LightStage::ShadowFramePointer;
137 using Outputs = render::VaryingArray<ViewFrustumPointer, FRUSTUM_COUNT>;
138 using JobModel = render::Job::ModelIO<ExtractFrustums, Inputs, Outputs>;
140 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& output);
143 class SetRenderMethod {
145 using JobModel = render::Job::Model<SetRenderMethod>;
147 SetRenderMethod(render::Args::RenderMethod method) : _method(method) {}
149 void run(
const render::RenderContextPointer& renderContext) { renderContext->args->_renderMethod = _method; }
152 render::Args::RenderMethod _method;