diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 24e284a416..55a9c8b9e4 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -295,8 +295,7 @@ void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const R batch.setUniformBuffer(render::ShapePipeline::Slot::LIGHTING_MODEL, lightingModel->getParametersBuffer()); if (_stateSort) { - // renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn); - renderStateSortShapesCapped(sceneContext, renderContext, _shapePlumber, inItems, _maxTimeBudget, _maxDrawn); + renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn); } else { renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn); } diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 2d9a7d4888..8a95447e67 100644 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -85,7 +85,6 @@ class DrawStateSortConfig : public render::Job::Config { Q_OBJECT Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY numDrawnChanged) Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty) - Q_PROPERTY(float maxTimeBudget MEMBER maxTimeBudget NOTIFY dirty) Q_PROPERTY(bool stateSort MEMBER stateSort NOTIFY dirty) public: @@ -93,7 +92,6 @@ public: void setNumDrawn(int num) { numDrawn = num; emit numDrawnChanged(); } int maxDrawn{ -1 }; - float maxTimeBudget { 8.0f }; // 8ms maximum bool stateSort{ true }; signals: @@ -113,13 +111,12 @@ public: DrawStateSortDeferred(render::ShapePlumberPointer shapePlumber) : _shapePlumber{ shapePlumber } {} - void configure(const Config& config) { _maxDrawn = config.maxDrawn; _maxTimeBudget = config.maxTimeBudget; _stateSort = config.stateSort; } + void configure(const Config& config) { _maxDrawn = config.maxDrawn; _stateSort = config.stateSort; } void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); protected: render::ShapePlumberPointer _shapePlumber; int _maxDrawn; // initialized by Config - float _maxTimeBudget; //ms time budget bool _stateSort; }; diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index d6f09f735c..2829c6f8e7 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -123,111 +123,6 @@ void render::renderStateSortShapes(const SceneContextPointer& sceneContext, cons } } - -void render::renderStateSortShapesCapped(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, double mstimeBudget, int maxDrawnItems) { - - auto& scene = sceneContext->_scene; - RenderArgs* args = renderContext->args; - auto now = usecTimestampNow(); - - int numItemsToDraw = (int)inItems.size(); - if (maxDrawnItems != -1) { - numItemsToDraw = glm::min(numItemsToDraw, maxDrawnItems); - } - - using SortedPipelines = std::vector; - using SortedShapes = std::unordered_map, render::ShapeKey::Hash, render::ShapeKey::KeyEqual>; - SortedPipelines sortedPipelines; - SortedShapes sortedShapes; - std::vector ownPipelineBucket; - - { - PROFILE_RANGE(render_detail, "sort"); - - for (auto i = 0; i < numItemsToDraw; ++i) { - auto item = scene->getItem(inItems[i].id); - - { - assert(item.getKey().isShape()); - const auto key = item.getShapeKey(); - if (key.isValid() && !key.hasOwnPipeline()) { - auto& bucket = sortedShapes[key]; - if (bucket.empty()) { - sortedPipelines.push_back(key); - } - bucket.push_back(item); - } else if (key.hasOwnPipeline()) { - ownPipelineBucket.push_back(item); - } else { - qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; - } - } - } - } - - { - PROFILE_RANGE(render_detail, "render"); - - // Then render - quint64 usecHalfBudget = 1000 * 0.5 * mstimeBudget; - quint64 usecBudget = 1000 * mstimeBudget; - - int numDrawCalls = 0; - int numDrawcallsChecks = 128; - int numChecks = 0; - int numChecksBudget = 4; - - for (auto& pipelineKey : sortedPipelines) { - auto& bucket = sortedShapes[pipelineKey]; - args->_pipeline = shapeContext->pickPipeline(args, pipelineKey); - if (!args->_pipeline) { - continue; - } - for (auto& item : bucket) { - item.render(args); - - numDrawCalls++; - if ((numDrawCalls % numDrawcallsChecks) == 0) { - auto newNow = usecTimestampNow(); - if ((newNow - now) > usecHalfBudget) { - if ((newNow - now) > usecBudget) { - return; - } - - usecHalfBudget += (usecHalfBudget / 2); - numDrawcallsChecks / 2; - numChecks++; - if (numChecks > numChecksBudget) { - return; - } - } - } - } - } - args->_pipeline = nullptr; - for (auto& item : ownPipelineBucket) { - item.render(args); - - numDrawCalls++; - if ((numDrawCalls % numDrawcallsChecks) == 0) { - auto newNow = usecTimestampNow(); - if ((newNow - now) > usecHalfBudget) { - if ((newNow - now) > usecBudget) { - return; - } - - usecHalfBudget += (usecHalfBudget / 2); - numDrawcallsChecks / 2; - numChecks++; - if (numChecks > numChecksBudget) { - return; - } - } - } - } - } -} - void DrawLight::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inLights) { assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); diff --git a/libraries/render/src/render/DrawTask.h b/libraries/render/src/render/DrawTask.h index 042a927caf..890001ded0 100755 --- a/libraries/render/src/render/DrawTask.h +++ b/libraries/render/src/render/DrawTask.h @@ -19,7 +19,6 @@ namespace render { void renderItems(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems, int maxDrawnItems = -1); void renderShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1); void renderStateSortShapes(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems = -1); -void renderStateSortShapesCapped(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, double mstimeBudget, int maxDrawnItems = -1); class DrawLightConfig : public Job::Config { diff --git a/scripts/developer/utilities/render/culling.qml b/scripts/developer/utilities/render/culling.qml index 4157b5e4dd..e3f5e67bbe 100644 --- a/scripts/developer/utilities/render/culling.qml +++ b/scripts/developer/utilities/render/culling.qml @@ -95,7 +95,6 @@ Column { GroupBox { title: "Render Items" - Column{ Column{ Repeater { @@ -111,20 +110,5 @@ Column { } } } - - Column{ - Repeater { - model: [ "Draw Opaque [ms]:DrawOpaqueDeferred" ] - ConfigSlider { - label: qsTr(modelData.split(":")[0]) - integral: false - config: Render.getConfig(modelData.split(":")[1]) - property: "maxTimeBudget" - max: 10.0 - min: 0.0 - } - } - } - } } }