Showing the changes to libraries/render-utils/src/RenderCommonTask.cpp (1 of 1213 files). Show all
Unified · Split
| @@ -0,0 +1,210 @@ | ||
| 1 | +// | |
| 2 | +// Created by Bradley Austin Davis on 2018/01/09 | |
| 3 | +// Copyright 2013-2018 High Fidelity, Inc. | |
| 4 | +// | |
| 5 | +// Distributed under the Apache License, Version 2.0. | |
| 6 | +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html | |
| 7 | +// | |
| 8 | + | |
| 9 | +#include "RenderCommonTask.h" | |
| 10 | + | |
| 11 | +#include <gpu/Context.h> | |
| 12 | + | |
| 13 | +#include "DeferredLightingEffect.h" | |
| 14 | +#include "RenderUtilsLogging.h" | |
| 15 | + | |
| 16 | +using namespace render; | |
| 17 | +extern void initOverlay3DPipelines(render::ShapePlumber& plumber, bool depthTest = false); | |
| 18 | + | |
| 19 | +void BeginGPURangeTimer::run(const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer) { | |
| 20 | + timer = _gpuTimer; | |
| 21 | + gpu::doInBatch("BeginGPURangeTimer::run", renderContext->args->_context, [&](gpu::Batch& batch) { | |
| 22 | + _gpuTimer->begin(batch); | |
| 23 | + }); | |
| 24 | +} | |
| 25 | + | |
| 26 | +void EndGPURangeTimer::run(const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer) { | |
| 27 | + gpu::doInBatch("EndGPURangeTimer::run", renderContext->args->_context, [&](gpu::Batch& batch) { | |
| 28 | + timer->end(batch); | |
| 29 | + }); | |
| 30 | + | |
| 31 | + auto config = std::static_pointer_cast<Config>(renderContext->jobConfig); | |
| 32 | + config->setGPUBatchRunTime(timer->getGPUAverage(), timer->getBatchAverage()); | |
| 33 | +} | |
| 34 | + | |
| 35 | +DrawOverlay3D::DrawOverlay3D(bool opaque) : | |
| 36 | + _shapePlumber(std::make_shared<ShapePlumber>()), | |
| 37 | + _opaquePass(opaque) { | |
| 38 | + initOverlay3DPipelines(*_shapePlumber); | |
| 39 | +} | |
| 40 | + | |
| 41 | +void DrawOverlay3D::run(const RenderContextPointer& renderContext, const Inputs& inputs) { | |
| 42 | + assert(renderContext->args); | |
| 43 | + assert(renderContext->args->hasViewFrustum()); | |
| 44 | + | |
| 45 | + auto config = std::static_pointer_cast<Config>(renderContext->jobConfig); | |
| 46 | + | |
| 47 | + const auto& inItems = inputs.get0(); | |
| 48 | + const auto& lightingModel = inputs.get1(); | |
| 49 | + | |
| 50 | + config->setNumDrawn((int)inItems.size()); | |
| 51 | + emit config->numDrawnChanged(); | |
| 52 | + | |
| 53 | + if (!inItems.empty()) { | |
| 54 | + RenderArgs* args = renderContext->args; | |
| 55 | + | |
| 56 | + // Clear the framebuffer without stereo | |
| 57 | + // Needs to be distinct from the other batch because using the clear call | |
| 58 | + // while stereo is enabled triggers a warning | |
| 59 | + if (_opaquePass) { | |
| 60 | + gpu::doInBatch("DrawOverlay3D::run::clear", args->_context, [&](gpu::Batch& batch){ | |
| 61 | + batch.enableStereo(false); | |
| 62 | + batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0, false); | |
| 63 | + }); | |
| 64 | + } | |
| 65 | + | |
| 66 | + // Render the items | |
| 67 | + gpu::doInBatch("DrawOverlay3D::run", args->_context, [&](gpu::Batch& batch) { | |
| 68 | + args->_batch = &batch; | |
| 69 | + batch.setViewportTransform(args->_viewport); | |
| 70 | + batch.setStateScissorRect(args->_viewport); | |
| 71 | + | |
| 72 | + glm::mat4 projMat; | |
| 73 | + Transform viewMat; | |
| 74 | + args->getViewFrustum().evalProjectionMatrix(projMat); | |
| 75 | + args->getViewFrustum().evalViewTransform(viewMat); | |
| 76 | + | |
| 77 | + batch.setProjectionTransform(projMat); | |
| 78 | + batch.setViewTransform(viewMat); | |
| 79 | + | |
| 80 | + // Setup lighting model for all items; | |
| 81 | + batch.setUniformBuffer(render::ShapePipeline::Slot::LIGHTING_MODEL, lightingModel->getParametersBuffer()); | |
| 82 | + | |
| 83 | + renderShapes(renderContext, _shapePlumber, inItems, _maxDrawn); | |
| 84 | + args->_batch = nullptr; | |
| 85 | + }); | |
| 86 | + } | |
| 87 | +} | |
| 88 | + | |
| 89 | +void CompositeHUD::run(const RenderContextPointer& renderContext) { | |
| 90 | + assert(renderContext->args); | |
| 91 | + assert(renderContext->args->_context); | |
| 92 | + | |
| 93 | + // We do not want to render HUD elements in secondary camera | |
| 94 | + if (renderContext->args->_renderMode == RenderArgs::RenderMode::SECONDARY_CAMERA_RENDER_MODE) { | |
| 95 | + return; | |
| 96 | + } | |
| 97 | + | |
| 98 | + // Grab the HUD texture | |
| 99 | +#if !defined(DISABLE_QML) | |
| 100 | + gpu::doInBatch("CompositeHUD::run", renderContext->args->_context, [&](gpu::Batch& batch) { | |
| 101 | + if (renderContext->args->_hudOperator) { | |
| 102 | + renderContext->args->_hudOperator(batch, renderContext->args->_hudTexture, renderContext->args->_renderMode == RenderArgs::RenderMode::MIRROR_RENDER_MODE); | |
| 103 | + } | |
| 104 | + }); | |
| 105 | +#endif | |
| 106 | +} | |
| 107 | + | |
| 108 | +void Blit::run(const RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer) { | |
| 109 | + assert(renderContext->args); | |
| 110 | + assert(renderContext->args->_context); | |
| 111 | + | |
| 112 | + RenderArgs* renderArgs = renderContext->args; | |
| 113 | + auto blitFbo = renderArgs->_blitFramebuffer; | |
| 114 | + | |
| 115 | + if (!blitFbo) { | |
| 116 | + qCWarning(renderutils) << "Blit::run - no blit frame buffer."; | |
| 117 | + return; | |
| 118 | + } | |
| 119 | + | |
| 120 | + // Determine size from viewport | |
| 121 | + int width = renderArgs->_viewport.z; | |
| 122 | + int height = renderArgs->_viewport.w; | |
| 123 | + | |
| 124 | + // Blit primary to blit FBO | |
| 125 | + auto primaryFbo = srcFramebuffer; | |
| 126 | + | |
| 127 | + gpu::doInBatch("Blit::run", renderArgs->_context, [&](gpu::Batch& batch) { | |
| 128 | + batch.setFramebuffer(blitFbo); | |
| 129 | + | |
| 130 | + if (renderArgs->_renderMode == RenderArgs::MIRROR_RENDER_MODE) { | |
| 131 | + if (renderArgs->isStereo()) { | |
| 132 | + gpu::Vec4i srcRectLeft; | |
| 133 | + srcRectLeft.z = width / 2; | |
| 134 | + srcRectLeft.w = height; | |
| 135 | + | |
| 136 | + gpu::Vec4i srcRectRight; | |
| 137 | + srcRectRight.x = width / 2; | |
| 138 | + srcRectRight.z = width; | |
| 139 | + srcRectRight.w = height; | |
| 140 | + | |
| 141 | + gpu::Vec4i destRectLeft; | |
| 142 | + destRectLeft.x = srcRectLeft.z; | |
| 143 | + destRectLeft.z = srcRectLeft.x; | |
| 144 | + destRectLeft.y = srcRectLeft.y; | |
| 145 | + destRectLeft.w = srcRectLeft.w; | |
| 146 | + | |
| 147 | + gpu::Vec4i destRectRight; | |
| 148 | + destRectRight.x = srcRectRight.z; | |
| 149 | + destRectRight.z = srcRectRight.x; | |
| 150 | + destRectRight.y = srcRectRight.y; | |
| 151 | + destRectRight.w = srcRectRight.w; | |
| 152 | + | |
| 153 | + // Blit left to right and right to left in stereo | |
| 154 | + batch.blit(primaryFbo, srcRectRight, blitFbo, destRectLeft); | |
| 155 | + batch.blit(primaryFbo, srcRectLeft, blitFbo, destRectRight); | |
| 156 | + } else { | |
| 157 | + gpu::Vec4i srcRect; | |
| 158 | + srcRect.z = width; | |
| 159 | + srcRect.w = height; | |
| 160 | + | |
| 161 | + gpu::Vec4i destRect; | |
| 162 | + destRect.x = width; | |
| 163 | + destRect.y = 0; | |
| 164 | + destRect.z = 0; | |
| 165 | + destRect.w = height; | |
| 166 | + | |
| 167 | + batch.blit(primaryFbo, srcRect, blitFbo, destRect); | |
| 168 | + } | |
| 169 | + } else { | |
| 170 | + gpu::Vec4i rect; | |
| 171 | + rect.z = width; | |
| 172 | + rect.w = height; | |
| 173 | + | |
| 174 | + batch.blit(primaryFbo, rect, blitFbo, rect); | |
| 175 | + } | |
| 176 | + }); | |
| 177 | +} | |
| 178 | + | |
| 179 | +void ExtractFrustums::run(const render::RenderContextPointer& renderContext, Output& output) { | |
| 180 | + assert(renderContext->args); | |
| 181 | + assert(renderContext->args->_context); | |
| 182 | + | |
| 183 | + RenderArgs* args = renderContext->args; | |
| 184 | + | |
| 185 | + // Return view frustum | |
| 186 | + auto& viewFrustum = output[VIEW_FRUSTUM].edit<ViewFrustumPointer>(); | |
| 187 | + if (!viewFrustum) { | |
| 188 | + viewFrustum = std::make_shared<ViewFrustum>(args->getViewFrustum()); | |
| 189 | + } else { | |
| 190 | + *viewFrustum = args->getViewFrustum(); | |
| 191 | + } | |
| 192 | + | |
| 193 | + // Return shadow frustum | |
| 194 | + auto lightStage = args->_scene->getStage<LightStage>(LightStage::getName()); | |
| 195 | + for (auto i = 0; i < SHADOW_CASCADE_FRUSTUM_COUNT; i++) { | |
| 196 | + auto& shadowFrustum = output[SHADOW_CASCADE0_FRUSTUM+i].edit<ViewFrustumPointer>(); | |
| 197 | + if (lightStage) { | |
| 198 | + auto globalShadow = lightStage->getCurrentKeyShadow(); | |
| 199 | + | |
| 200 | + if (globalShadow && i<(int)globalShadow->getCascadeCount()) { | |
| 201 | + auto& cascade = globalShadow->getCascade(i); | |
| 202 | + shadowFrustum = cascade.getFrustum(); | |
| 203 | + } else { | |
| 204 | + shadowFrustum.reset(); | |
| 205 | + } | |
| 206 | + } else { | |
| 207 | + shadowFrustum.reset(); | |
| 208 | + } | |
| 209 | + } | |
| 210 | +} | |