12 #ifndef hifi_RenderDeferredTask_h
13 #define hifi_RenderDeferredTask_h
15 #include <gpu/Pipeline.h>
16 #include <render/RenderFetchCullSortTask.h>
17 #include "AssembleLightingStageTask.h"
18 #include "LightingModel.h"
19 #include "LightClusters.h"
20 #include "RenderShadowTask.h"
22 class RenderTransparentDeferredConfig :
public render::Job::Config {
24 Q_PROPERTY(
int numDrawn READ getNumDrawn NOTIFY newStats)
25 Q_PROPERTY(
int maxDrawn MEMBER maxDrawn NOTIFY dirty)
28 int getNumDrawn() {
return _numDrawn; }
29 void setNumDrawn(
int numDrawn) {
44 class RenderTransparentDeferred {
46 using Inputs = render::VaryingSet7<render::ItemBounds, HazeStage::FramePointer, LightStage::FramePointer, LightingModelPointer, LightClustersPointer, LightStage::ShadowFramePointer, glm::vec2>;
47 using Config = RenderTransparentDeferredConfig;
48 using JobModel = render::Job::ModelI<RenderTransparentDeferred, Inputs, Config>;
50 RenderTransparentDeferred(render::ShapePlumberPointer shapePlumber)
51 : _shapePlumber{ shapePlumber } {}
53 void configure(
const Config& config) { _maxDrawn = config.maxDrawn; }
54 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
57 render::ShapePlumberPointer _shapePlumber;
61 class DrawStateSortConfig :
public render::Job::Config {
63 Q_PROPERTY(
int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
64 Q_PROPERTY(
int maxDrawn MEMBER maxDrawn NOTIFY dirty)
65 Q_PROPERTY(
bool stateSort MEMBER stateSort NOTIFY dirty)
67 int getNumDrawn() {
return numDrawn; }
68 void setNumDrawn(
int num) {
70 emit numDrawnChanged();
74 bool stateSort{
true };
77 void numDrawnChanged();
84 class DrawStateSortDeferred {
86 using Inputs = render::VaryingSet3<render::ItemBounds, LightingModelPointer, glm::vec2>;
88 using Config = DrawStateSortConfig;
89 using JobModel = render::Job::ModelI<DrawStateSortDeferred, Inputs, Config>;
91 DrawStateSortDeferred(render::ShapePlumberPointer shapePlumber)
92 : _shapePlumber{ shapePlumber } {
95 void configure(
const Config& config) {
96 _maxDrawn = config.maxDrawn;
97 _stateSort = config.stateSort;
99 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
102 render::ShapePlumberPointer _shapePlumber;
107 class SetSeparateDeferredDepthBuffer {
109 using Inputs = DeferredFramebufferPointer;
110 using JobModel = render::Job::ModelI<SetSeparateDeferredDepthBuffer, Inputs>;
112 SetSeparateDeferredDepthBuffer() =
default;
114 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
117 gpu::FramebufferPointer _framebuffer;
120 class RenderDeferredTaskConfig :
public render::Task::Config {
122 Q_PROPERTY(
float fadeScale MEMBER fadeScale NOTIFY dirty)
123 Q_PROPERTY(
float fadeDuration MEMBER fadeDuration NOTIFY dirty)
124 Q_PROPERTY(
float resolutionScale MEMBER resolutionScale NOTIFY dirty)
125 Q_PROPERTY(
bool debugFade MEMBER debugFade NOTIFY dirty)
126 Q_PROPERTY(
float debugFadePercent MEMBER debugFadePercent NOTIFY dirty)
128 float fadeScale{ 0.5f };
129 float fadeDuration{ 3.0f };
130 float resolutionScale{ 1.f };
131 float debugFadePercent{ 0.f };
132 bool debugFade{
false };
138 class RenderDeferredTask {
140 using Input = render::VaryingSet4<RenderFetchCullSortTask::Output, LightingModelPointer, AssembleLightingStageTask::Output, RenderShadowTask::Output>;
141 using Config = RenderDeferredTaskConfig;
142 using JobModel = render::Task::ModelI<RenderDeferredTask, Input, Config>;
144 RenderDeferredTask();
146 void configure(
const Config& config);
147 void build(JobModel& task,
const render::Varying& input, render::Varying& output);
153 class PreparePrimaryFramebufferConfig :
public render::Job::Config {
155 Q_PROPERTY(
float resolutionScale WRITE setResolutionScale READ getResolutionScale)
157 float getResolutionScale()
const {
return resolutionScale; }
158 void setResolutionScale(
float scale) {
159 const float SCALE_RANGE_MIN = 0.1f;
160 const float SCALE_RANGE_MAX = 2.0f;
161 resolutionScale = std::max(SCALE_RANGE_MIN, std::min(SCALE_RANGE_MAX, scale));
168 float resolutionScale{ 1.0f };
171 class PreparePrimaryFramebuffer {
174 using Output = gpu::FramebufferPointer;
175 using Config = PreparePrimaryFramebufferConfig;
176 using JobModel = render::Job::ModelO<PreparePrimaryFramebuffer, Output, Config>;
178 PreparePrimaryFramebuffer(
float resolutionScale = 1.0f) : _resolutionScale{ resolutionScale } {}
179 void configure(
const Config& config);
180 void run(
const render::RenderContextPointer& renderContext, Output& primaryFramebuffer);
182 gpu::FramebufferPointer _primaryFramebuffer;
183 float _resolutionScale{ 1.0f };
187 static gpu::FramebufferPointer createFramebuffer(
const char* name,
const glm::uvec2& size);