13 #ifndef hifi_RenderDeferredTask_h
14 #define hifi_RenderDeferredTask_h
16 #include <gpu/Pipeline.h>
17 #include <render/RenderFetchCullSortTask.h>
18 #include "AssembleLightingStageTask.h"
19 #include "LightingModel.h"
20 #include "LightClusters.h"
21 #include "RenderShadowTask.h"
23 class RenderTransparentDeferredConfig :
public render::Job::Config {
25 Q_PROPERTY(
int numDrawn READ getNumDrawn NOTIFY newStats)
26 Q_PROPERTY(
int maxDrawn MEMBER maxDrawn NOTIFY dirty)
29 int getNumDrawn() {
return _numDrawn; }
30 void setNumDrawn(
int numDrawn) {
45 class RenderTransparentDeferred {
47 using Inputs = render::VaryingSet8<render::ItemBounds, HazeStage::FramePointer, LightStage::FramePointer, LightingModelPointer, LightClustersPointer, LightStage::ShadowFramePointer, DeferredFrameTransformPointer, DeferredFramebufferPointer>;
48 using Config = RenderTransparentDeferredConfig;
49 using JobModel = render::Job::ModelI<RenderTransparentDeferred, Inputs, Config>;
51 RenderTransparentDeferred(render::ShapePlumberPointer shapePlumber, uint transformSlot)
52 : _shapePlumber(shapePlumber), _transformSlot(transformSlot) {}
54 void configure(
const Config& config) { _maxDrawn = config.maxDrawn; }
55 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
58 render::ShapePlumberPointer _shapePlumber;
63 class DrawStateSortConfig :
public render::Job::Config {
65 Q_PROPERTY(
int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
66 Q_PROPERTY(
int maxDrawn MEMBER maxDrawn NOTIFY dirty)
67 Q_PROPERTY(
bool stateSort MEMBER stateSort NOTIFY dirty)
69 int getNumDrawn() {
return numDrawn; }
70 void setNumDrawn(
int num) {
72 emit numDrawnChanged();
76 bool stateSort{
true };
79 void numDrawnChanged();
86 class DrawStateSortDeferred {
88 using Inputs = render::VaryingSet3<render::ItemBounds, LightingModelPointer, DeferredFrameTransformPointer>;
90 using Config = DrawStateSortConfig;
91 using JobModel = render::Job::ModelI<DrawStateSortDeferred, Inputs, Config>;
93 DrawStateSortDeferred(render::ShapePlumberPointer shapePlumber, uint transformSlot)
94 : _shapePlumber(shapePlumber), _transformSlot(transformSlot) {
97 void configure(
const Config& config) {
98 _maxDrawn = config.maxDrawn;
99 _stateSort = config.stateSort;
101 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
104 render::ShapePlumberPointer _shapePlumber;
110 class SetSeparateDeferredDepthBuffer {
112 using Inputs = DeferredFramebufferPointer;
113 using JobModel = render::Job::ModelI<SetSeparateDeferredDepthBuffer, Inputs>;
115 SetSeparateDeferredDepthBuffer() =
default;
117 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
120 gpu::FramebufferPointer _framebuffer;
123 class RenderDeferredTaskConfig :
public render::Task::Config {
125 Q_PROPERTY(
float fadeScale MEMBER fadeScale NOTIFY dirty)
126 Q_PROPERTY(
float fadeDuration MEMBER fadeDuration NOTIFY dirty)
127 Q_PROPERTY(
float resolutionScale MEMBER resolutionScale NOTIFY dirty)
128 Q_PROPERTY(
bool debugFade MEMBER debugFade NOTIFY dirty)
129 Q_PROPERTY(
float debugFadePercent MEMBER debugFadePercent NOTIFY dirty)
131 float fadeScale{ 0.5f };
132 float fadeDuration{ 3.0f };
133 float resolutionScale{ 1.f };
134 float debugFadePercent{ 0.f };
135 bool debugFade{
false };
141 class RenderDeferredTask {
143 using Input = render::VaryingSet4<RenderFetchCullSortTask::Output, LightingModelPointer, AssembleLightingStageTask::Output, RenderShadowTask::Output>;
144 using Config = RenderDeferredTaskConfig;
145 using JobModel = render::Task::ModelI<RenderDeferredTask, Input, Config>;
147 void configure(
const Config& config);
148 void build(JobModel& task,
const render::Varying& input, render::Varying& output, render::CullFunctor cullFunctor, uint transformOffset,
size_t depth);
152 class PreparePrimaryFramebufferConfig :
public render::Job::Config {
154 Q_PROPERTY(
float resolutionScale WRITE setResolutionScale READ getResolutionScale)
156 float getResolutionScale()
const {
return resolutionScale; }
157 void setResolutionScale(
float scale) {
158 const float SCALE_RANGE_MIN = 0.1f;
159 const float SCALE_RANGE_MAX = 2.0f;
160 resolutionScale = std::max(SCALE_RANGE_MIN, std::min(SCALE_RANGE_MAX, scale));
167 float resolutionScale{ 1.0f };
170 class PreparePrimaryFramebuffer {
173 using Output = gpu::FramebufferPointer;
174 using Config = PreparePrimaryFramebufferConfig;
175 using JobModel = render::Job::ModelO<PreparePrimaryFramebuffer, Output, Config>;
177 PreparePrimaryFramebuffer(
float resolutionScale = 1.0f) : _resolutionScale{ resolutionScale } {}
178 void configure(
const Config& config);
179 void run(
const render::RenderContextPointer& renderContext, Output& primaryFramebuffer);
181 gpu::FramebufferPointer _primaryFramebuffer;
182 float _resolutionScale{ 1.0f };
186 static gpu::FramebufferPointer createFramebuffer(
const char* name,
const glm::uvec2& size);