Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 452 files). Show all
Unified · Split
| @@ -1,3 +1,4 @@ | |||
| 1 | |||
| 1 | // | 2 | // |
| 2 | // RenderDeferredTask.cpp | 3 | // RenderDeferredTask.cpp |
| 3 | // render-utils/src/ | 4 | // render-utils/src/ |
| @@ -10,23 +11,44 @@ · 6 unmodified lines | |||
| 10 | // | 11 | // |
| 11 | #include "RenderDeferredTask.h" | 12 | #include "RenderDeferredTask.h" |
| 12 | 13 | ||
| 13 | #include "gpu/Batch.h" | 14 | #include <PerfStat.h> |
| 14 | #include "gpu/Context.h" | 15 | #include <RenderArgs.h> |
| 16 | #include <ViewFrustum.h> | ||
| 17 | #include <gpu/Context.h> | ||
| 18 | |||
| 19 | #include "FramebufferCache.h" | ||
| 15 | #include "DeferredLightingEffect.h" | 20 | #include "DeferredLightingEffect.h" |
| 16 | #include "ViewFrustum.h" | ||
| 17 | #include "RenderArgs.h" | ||
| 18 | #include "TextureCache.h" | 21 | #include "TextureCache.h" |
| 19 | #include "HitEffect.h" | 22 | #include "HitEffect.h" |
| 20 | 23 | ||
| 21 | #include "render/DrawStatus.h" | 24 | #include "render/DrawStatus.h" |
| 22 | 25 | #include "AmbientOcclusionEffect.h" | |
| 23 | #include <PerfStat.h> | ||
| 24 | 26 | ||
| 25 | #include "overlay3D_vert.h" | 27 | #include "overlay3D_vert.h" |
| 26 | #include "overlay3D_frag.h" | 28 | #include "overlay3D_frag.h" |
| 27 | 29 | ||
| 28 | using namespace render; | 30 | using namespace render; |
| 29 | 31 | ||
| 32 | void SetupDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { | ||
| 33 | RenderArgs* args = renderContext->args; | ||
| 34 | |||
| 35 | auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebufferDepthColor(); | ||
| 36 | |||
| 37 | gpu::Batch batch; | ||
| 38 | batch.setFramebuffer(nullptr); | ||
| 39 | batch.setFramebuffer(primaryFbo); | ||
| 40 | |||
| 41 | batch.setViewportTransform(args->_viewport); | ||
| 42 | batch.setStateScissorRect(args->_viewport); | ||
| 43 | |||
| 44 | batch.clearFramebuffer( | ||
| 45 | gpu::Framebuffer::BUFFER_COLOR0 | | ||
| 46 | gpu::Framebuffer::BUFFER_DEPTH, | ||
| 47 | vec4(vec3(0), 1), 1.0, 0.0, true); | ||
| 48 | |||
| 49 | args->_context->render(batch); | ||
| 50 | } | ||
| 51 | |||
| 30 | void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { | 52 | void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { |
| 31 | DependencyManager::get<DeferredLightingEffect>()->prepare(renderContext->args); | 53 | DependencyManager::get<DeferredLightingEffect>()->prepare(renderContext->args); |
| 32 | } | 54 | } |
| @@ -41,6 +63,7 @@ void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderC · 8 unmodified lines | |||
| 41 | } | 63 | } |
| 42 | 64 | ||
| 43 | RenderDeferredTask::RenderDeferredTask() : Task() { | 65 | RenderDeferredTask::RenderDeferredTask() : Task() { |
| 66 | _jobs.push_back(Job(new SetupDeferred::JobModel("SetupFramebuffer"))); | ||
| 44 | _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); | 67 | _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); |
| 45 | 68 | ||
| 46 | _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); | 69 | _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); |
| @@ -57,9 +80,13 @@ RenderDeferredTask::RenderDeferredTask() : Task() { · 10 unmodified lines | |||
| 57 | _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); | 80 | _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); |
| 58 | 81 | ||
| 59 | _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); | 82 | _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); |
| 60 | _jobs.push_back(Job(new ResetGLState::JobModel())); | ||
| 61 | _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); | 83 | _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); |
| 62 | _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); | 84 | _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); |
| 85 | _jobs.push_back(Job(new AmbientOcclusion::JobModel("AmbientOcclusion"))); | ||
| 86 | |||
| 87 | _jobs.back().setEnabled(false); | ||
| 88 | _occlusionJobIndex = _jobs.size() - 1; | ||
| 89 | |||
| 63 | _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", | 90 | _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", |
| 64 | FetchItems( | 91 | FetchItems( |
| 65 | ItemFilter::Builder::transparentShape().withoutLayered(), | 92 | ItemFilter::Builder::transparentShape().withoutLayered(), |
| @@ -73,17 +100,22 @@ RenderDeferredTask::RenderDeferredTask() : Task() { · 7 unmodified lines | |||
| 73 | _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); | 100 | _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); |
| 74 | 101 | ||
| 75 | _jobs.push_back(Job(new render::DrawStatus::JobModel("DrawStatus", renderedOpaques))); | 102 | _jobs.push_back(Job(new render::DrawStatus::JobModel("DrawStatus", renderedOpaques))); |
| 103 | |||
| 104 | |||
| 76 | _jobs.back().setEnabled(false); | 105 | _jobs.back().setEnabled(false); |
| 77 | _drawStatusJobIndex = _jobs.size() - 1; | 106 | _drawStatusJobIndex = _jobs.size() - 1; |
| 78 | 107 | ||
| 79 | _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); | 108 | _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); |
| 80 | _jobs.push_back(Job(new ResetGLState::JobModel())); | 109 | |
| 81 | 110 | _jobs.push_back(Job(new HitEffect::JobModel("HitEffect"))); | |
| 111 | _jobs.back().setEnabled(false); | ||
| 112 | _drawHitEffectJobIndex = _jobs.size() -1; | ||
| 113 | |||
| 82 | 114 | ||
| 83 | // Give ourselves 3 frmaes of timer queries | 115 | // Give ourselves 3 frmaes of timer queries |
| 84 | _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); | 116 | _timerQueries.push_back(std::make_shared<gpu::Query>()); |
| 85 | _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); | 117 | _timerQueries.push_back(std::make_shared<gpu::Query>()); |
| 86 | _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); | 118 | _timerQueries.push_back(std::make_shared<gpu::Query>()); |
| 87 | _currentTimerQueryIndex = 0; | 119 | _currentTimerQueryIndex = 0; |
| 88 | } | 120 | } |
| 89 | 121 | ||
| @@ -105,6 +137,13 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend · 15 unmodified lines | |||
| 105 | 137 | ||
| 106 | // Make sure we turn the displayItemStatus on/off | 138 | // Make sure we turn the displayItemStatus on/off |
| 107 | setDrawItemStatus(renderContext->_drawItemStatus); | 139 | setDrawItemStatus(renderContext->_drawItemStatus); |
| 140 | |||
| 141 | //Make sure we display hit effect on screen, as desired from a script | ||
| 142 | setDrawHitEffect(renderContext->_drawHitEffect); | ||
| 143 | |||
| 144 | |||
| 145 | // TODO: turn on/off AO through menu item | ||
| 146 | setOcclusionStatus(renderContext->_occlusionStatus); | ||
| 108 | 147 | ||
| 109 | renderContext->args->_context->syncCache(); | 148 | renderContext->args->_context->syncCache(); |
| 110 | 149 | ||
| @@ -135,21 +174,12 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend · 24 unmodified lines | |||
| 135 | batch.setViewTransform(viewMat); | 174 | batch.setViewTransform(viewMat); |
| 136 | 175 | ||
| 137 | { | 176 | { |
| 138 | GLenum buffers[3]; | ||
| 139 | int bufferCount = 0; | ||
| 140 | buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; | ||
| 141 | buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; | ||
| 142 | buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; | ||
| 143 | batch._glDrawBuffers(bufferCount, buffers); | ||
| 144 | const float OPAQUE_ALPHA_THRESHOLD = 0.5f; | 177 | const float OPAQUE_ALPHA_THRESHOLD = 0.5f; |
| 145 | args->_alphaThreshold = OPAQUE_ALPHA_THRESHOLD; | 178 | args->_alphaThreshold = OPAQUE_ALPHA_THRESHOLD; |
| 146 | } | 179 | } |
| 147 | 180 | ||
| 148 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); | 181 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); |
| 149 | 182 | ||
| 150 | // Before rendering the batch make sure we re in sync with gl state | ||
| 151 | args->_context->syncCache(); | ||
| 152 | renderContext->args->_context->syncCache(); | ||
| 153 | args->_context->render((*args->_batch)); | 183 | args->_context->render((*args->_batch)); |
| 154 | args->_batch = nullptr; | 184 | args->_batch = nullptr; |
| 155 | } | 185 | } |
| @@ -173,21 +203,15 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const · 17 unmodified lines | |||
| 173 | } | 203 | } |
| 174 | batch.setProjectionTransform(projMat); | 204 | batch.setProjectionTransform(projMat); |
| 175 | batch.setViewTransform(viewMat); | 205 | batch.setViewTransform(viewMat); |
| 176 | const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; | ||
| 177 | 206 | ||
| 178 | { | 207 | { |
| 179 | GLenum buffers[3]; | 208 | const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; |
| 180 | int bufferCount = 0; | ||
| 181 | buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; | ||
| 182 | batch._glDrawBuffers(bufferCount, buffers); | ||
| 183 | args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; | 209 | args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; |
| 184 | } | 210 | } |
| 185 | 211 | ||
| 186 | 212 | ||
| 187 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); | 213 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); |
| 188 | 214 | ||
| 189 | // Before rendering the batch make sure we re in sync with gl state | ||
| 190 | args->_context->syncCache(); | ||
| 191 | args->_context->render((*args->_batch)); | 215 | args->_context->render((*args->_batch)); |
| 192 | args->_batch = nullptr; | 216 | args->_batch = nullptr; |
| 193 | } | 217 | } |
| @@ -198,8 +222,8 @@ const gpu::PipelinePointer& DrawOverlay3D::getOpaquePipeline() { · 4 unmodified lines | |||
| 198 | auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(overlay3D_vert))); | 222 | auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(overlay3D_vert))); |
| 199 | auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(overlay3D_frag))); | 223 | auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(overlay3D_frag))); |
| 200 | auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); | 224 | auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); |
| 201 | 225 | ||
| 202 | auto state = gpu::StatePointer(new gpu::State()); | 226 | auto state = std::make_shared<gpu::State>(); |
| 203 | state->setDepthTest(true, true, gpu::LESS_EQUAL); | 227 | state->setDepthTest(true, true, gpu::LESS_EQUAL); |
| 204 | 228 | ||
| 205 | _opaquePipeline.reset(gpu::Pipeline::create(program, state)); | 229 | _opaquePipeline.reset(gpu::Pipeline::create(program, state)); |
| @@ -241,17 +265,17 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon · 35 unmodified lines | |||
| 241 | } | 265 | } |
| 242 | batch.setProjectionTransform(projMat); | 266 | batch.setProjectionTransform(projMat); |
| 243 | batch.setViewTransform(viewMat); | 267 | batch.setViewTransform(viewMat); |
| 268 | batch.setViewportTransform(args->_viewport); | ||
| 269 | batch.setStateScissorRect(args->_viewport); | ||
| 244 | 270 | ||
| 245 | batch.setPipeline(getOpaquePipeline()); | 271 | batch.setPipeline(getOpaquePipeline()); |
| 246 | batch.setResourceTexture(0, args->_whiteTexture); | 272 | batch.setResourceTexture(0, args->_whiteTexture); |
| 247 | 273 | ||
| 248 | if (!inItems.empty()) { | 274 | if (!inItems.empty()) { |
| 249 | batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0); | 275 | batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0, true); |
| 250 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOverlay3DItems); | 276 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOverlay3DItems); |
| 251 | } | 277 | } |
| 252 | 278 | ||
| 253 | // Before rendering the batch make sure we re in sync with gl state | ||
| 254 | args->_context->syncCache(); | ||
| 255 | args->_context->render((*args->_batch)); | 279 | args->_context->render((*args->_batch)); |
| 256 | args->_batch = nullptr; | 280 | args->_batch = nullptr; |
| 257 | args->_whiteTexture.reset(); | 281 | args->_whiteTexture.reset(); |