From ca1a14e5b0ca9d3c8cdef0acb5e9cc66aac1d589 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 23 Dec 2016 15:54:22 -0500 Subject: [PATCH] add RenderFetchSortCull task --- interface/src/Application.cpp | 7 ++- .../render-utils/src/RenderDeferredTask.cpp | 51 ++++------------ .../render-utils/src/RenderDeferredTask.h | 14 +---- .../render-utils/src/RenderForwardTask.cpp | 50 +++------------- .../render-utils/src/RenderForwardTask.h | 13 ++-- .../src/render/RenderFetchSortCullTask.cpp | 60 +++++++++++++++++++ .../src/render/RenderFetchSortCullTask.h | 28 +++++++++ tests/render-perf/src/main.cpp | 15 ++++- 8 files changed, 130 insertions(+), 108 deletions(-) create mode 100644 libraries/render/src/render/RenderFetchSortCullTask.cpp create mode 100644 libraries/render/src/render/RenderFetchSortCullTask.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b4b0ad10bb..81053a708c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -101,6 +101,7 @@ #include #include #include +#include #include #include #include @@ -1818,11 +1819,13 @@ void Application::initializeGL() { // Set up the render engine render::CullFunctor cullFunctor = LODManager::shouldRender; _renderEngine->addJob("RenderShadowTask", cullFunctor); + const auto items = _renderEngine->addJob("FetchSortCull", cullFunctor); + assert(items.canCast()); static const QString RENDER_FORWARD = "HIFI_RENDER_FORWARD"; if (QProcessEnvironment::systemEnvironment().contains(RENDER_FORWARD)) { - _renderEngine->addJob("RenderForwardTask", cullFunctor); + _renderEngine->addJob("RenderForwardTask", items.get()); } else { - _renderEngine->addJob("RenderDeferredTask", cullFunctor); + _renderEngine->addJob("RenderDeferredTask", items.get()); } _renderEngine->load(); _renderEngine->registerScene(_main3DScene); diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 4296d5233a..4a99795a70 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -48,49 +48,18 @@ using namespace render; extern void initOverlay3DPipelines(render::ShapePlumber& plumber); extern void initDeferredPipelines(render::ShapePlumber& plumber); -RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { - cullFunctor = cullFunctor ? cullFunctor : [](const RenderArgs*, const AABox&){ return true; }; - +RenderDeferredTask::RenderDeferredTask(RenderFetchSortCullTask::Output items) { // Prepare the ShapePipelines ShapePlumberPointer shapePlumber = std::make_shared(); initDeferredPipelines(*shapePlumber); - // CPU jobs: - // Fetch and cull the items from the scene - auto spatialFilter = ItemFilter::Builder::visibleWorldItems().withoutLayered(); - const auto spatialSelection = addJob("FetchSceneSelection", spatialFilter); - const auto culledSpatialSelection = addJob("CullSceneSelection", spatialSelection, cullFunctor, RenderDetails::ITEM, spatialFilter); - - // Overlays are not culled - const auto nonspatialSelection = addJob("FetchOverlaySelection"); - - // Multi filter visible items into different buckets - const int NUM_FILTERS = 3; - const int OPAQUE_SHAPE_BUCKET = 0; - const int TRANSPARENT_SHAPE_BUCKET = 1; - const int LIGHT_BUCKET = 2; - const int BACKGROUND_BUCKET = 2; - MultiFilterItem::ItemFilterArray spatialFilters = { { - ItemFilter::Builder::opaqueShape(), - ItemFilter::Builder::transparentShape(), - ItemFilter::Builder::light() - } }; - MultiFilterItem::ItemFilterArray nonspatialFilters = { { - ItemFilter::Builder::opaqueShape(), - ItemFilter::Builder::transparentShape(), - ItemFilter::Builder::background() - } }; - const auto filteredSpatialBuckets = addJob>("FilterSceneSelection", culledSpatialSelection, spatialFilters).get::ItemBoundsArray>(); - const auto filteredNonspatialBuckets = addJob>("FilterOverlaySelection", nonspatialSelection, nonspatialFilters).get::ItemBoundsArray>(); - - // Extract / Sort opaques / Transparents / Lights / Overlays - const auto opaques = addJob("DepthSortOpaque", filteredSpatialBuckets[OPAQUE_SHAPE_BUCKET]); - const auto transparents = addJob("DepthSortTransparent", filteredSpatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); - const auto lights = filteredSpatialBuckets[LIGHT_BUCKET]; - - const auto overlayOpaques = addJob("DepthSortOverlayOpaque", filteredNonspatialBuckets[OPAQUE_SHAPE_BUCKET]); - const auto overlayTransparents = addJob("DepthSortOverlayTransparent", filteredNonspatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); - const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; + // Extract opaques / transparents / lights / overlays + const auto opaques = items[0]; + const auto transparents = items[1]; + const auto lights = items[2]; + const auto overlayOpaques = items[3]; + const auto overlayTransparents = items[4]; + const auto background = items[5]; // Prepare deferred, generate the shared Deferred Frame Transform const auto deferredFrameTransform = addJob("DeferredFrameTransform"); @@ -202,8 +171,8 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { // Scene Octree Debuging job { - addJob("DrawSceneOctree", spatialSelection); - addJob("DrawItemSelection", spatialSelection); + // addJob("DrawSceneOctree", spatialSelection); + // addJob("DrawItemSelection", spatialSelection); } // Status icon rendering job diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index c2e9fb8b5e..a52741f2a3 100644 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -13,7 +13,7 @@ #define hifi_RenderDeferredTask_h #include -#include +#include #include "LightingModel.h" @@ -192,19 +192,11 @@ public: void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer); }; -using RenderDeferredTaskConfig = render::GPUTaskConfig; - class RenderDeferredTask : public render::Task { public: - using Config = RenderDeferredTaskConfig; - RenderDeferredTask(render::CullFunctor cullFunctor); + using JobModel = Model; - void configure(const Config& config) {} - - using JobModel = Model; - -protected: - gpu::RangeTimerPointer _gpuTimer; + RenderDeferredTask(RenderFetchSortCullTask::Output items); }; #endif // hifi_RenderDeferredTask_h diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 1f007678b9..2d96dc2e38 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -19,9 +19,6 @@ #include #include -#include -#include - #include "FramebufferCache.h" #include "TextureCache.h" @@ -34,49 +31,18 @@ using namespace render; extern void initOverlay3DPipelines(render::ShapePlumber& plumber); extern void initDeferredPipelines(render::ShapePlumber& plumber); -RenderForwardTask::RenderForwardTask(CullFunctor cullFunctor) { +RenderForwardTask::RenderForwardTask(RenderFetchSortCullTask::Output items) { // Prepare the ShapePipelines ShapePlumberPointer shapePlumber = std::make_shared(); initDeferredPipelines(*shapePlumber); - // CPU jobs: - // Fetch and cull the items from the scene - const auto spatialSelection = addJob("FetchSceneSelection"); - - cullFunctor = cullFunctor ? cullFunctor : [](const RenderArgs*, const AABox&){ return true; }; - auto spatialFilter = ItemFilter::Builder::visibleWorldItems().withoutLayered(); - const auto culledSpatialSelection = addJob("CullSceneSelection", spatialSelection, cullFunctor, RenderDetails::ITEM, spatialFilter); - - // Overlays are not culled - const auto nonspatialSelection = addJob("FetchOverlaySelection"); - - // Multi filter visible items into different buckets - const int NUM_FILTERS = 3; - const int OPAQUE_SHAPE_BUCKET = 0; - const int TRANSPARENT_SHAPE_BUCKET = 1; - const int LIGHT_BUCKET = 2; - const int BACKGROUND_BUCKET = 2; - MultiFilterItem::ItemFilterArray spatialFilters = { { - ItemFilter::Builder::opaqueShape(), - ItemFilter::Builder::transparentShape(), - ItemFilter::Builder::light() - } }; - MultiFilterItem::ItemFilterArray nonspatialFilters = { { - ItemFilter::Builder::opaqueShape(), - ItemFilter::Builder::transparentShape(), - ItemFilter::Builder::background() - } }; - const auto filteredSpatialBuckets = addJob>("FilterSceneSelection", culledSpatialSelection, spatialFilters).get::ItemBoundsArray>(); - const auto filteredNonspatialBuckets = addJob>("FilterOverlaySelection", nonspatialSelection, nonspatialFilters).get::ItemBoundsArray>(); - - // Extract / Sort opaques / Transparents / Lights / Overlays - const auto opaques = addJob("DepthSortOpaque", filteredSpatialBuckets[OPAQUE_SHAPE_BUCKET]); - const auto transparents = addJob("DepthSortTransparent", filteredSpatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); - const auto lights = filteredSpatialBuckets[LIGHT_BUCKET]; - - const auto overlayOpaques = addJob("DepthSortOverlayOpaque", filteredNonspatialBuckets[OPAQUE_SHAPE_BUCKET]); - const auto overlayTransparents = addJob("DepthSortOverlayTransparent", filteredNonspatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); - const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; + // Extract opaques / transparents / lights / overlays + const auto opaques = items[0]; + const auto transparents = items[1]; + const auto lights = items[2]; + const auto overlayOpaques = items[3]; + const auto overlayTransparents = items[4]; + const auto background = items[5]; const auto framebuffer = addJob("PrepareFramebuffer"); diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index 6c392643eb..8615ecbec3 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -13,19 +13,14 @@ #define hifi_RenderForwardTask_h #include -#include +#include #include "LightingModel.h" -using RenderForwardTaskConfig = render::GPUTaskConfig; - class RenderForwardTask : public render::Task { public: - using Config = RenderForwardTaskConfig; - RenderForwardTask(render::CullFunctor cullFunctor); + using JobModel = Model; - void configure(const Config& config) {} - - using JobModel = Model; + RenderForwardTask(RenderFetchSortCullTask::Output items); }; class PrepareFramebuffer { @@ -52,4 +47,4 @@ private: int _scaleLocation { -1 }; }; -#endif // hifi_RenderForwardTask_h \ No newline at end of file +#endif // hifi_RenderForwardTask_h diff --git a/libraries/render/src/render/RenderFetchSortCullTask.cpp b/libraries/render/src/render/RenderFetchSortCullTask.cpp new file mode 100644 index 0000000000..43066e4f1b --- /dev/null +++ b/libraries/render/src/render/RenderFetchSortCullTask.cpp @@ -0,0 +1,60 @@ +// +// RenderFetchSortCullTask.cpp +// render/src/ +// +// Created by Zach Pomerantz on 12/22/2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "RenderFetchSortCullTask.h" + +#include "CullTask.h" +#include "SortTask.h" + +using namespace render; + +RenderFetchSortCullTask::RenderFetchSortCullTask(CullFunctor cullFunctor) { + cullFunctor = cullFunctor ? cullFunctor : [](const RenderArgs*, const AABox&){ return true; }; + + // CPU jobs: + // Fetch and cull the items from the scene + auto spatialFilter = ItemFilter::Builder::visibleWorldItems().withoutLayered(); + const auto spatialSelection = addJob("FetchSceneSelection", spatialFilter); + const auto culledSpatialSelection = addJob("CullSceneSelection", spatialSelection, cullFunctor, RenderDetails::ITEM, spatialFilter); + + // Overlays are not culled + const auto nonspatialSelection = addJob("FetchOverlaySelection"); + + // Multi filter visible items into different buckets + const int NUM_FILTERS = 3; + const int OPAQUE_SHAPE_BUCKET = 0; + const int TRANSPARENT_SHAPE_BUCKET = 1; + const int LIGHT_BUCKET = 2; + const int BACKGROUND_BUCKET = 2; + MultiFilterItem::ItemFilterArray spatialFilters = { { + ItemFilter::Builder::opaqueShape(), + ItemFilter::Builder::transparentShape(), + ItemFilter::Builder::light() + } }; + MultiFilterItem::ItemFilterArray nonspatialFilters = { { + ItemFilter::Builder::opaqueShape(), + ItemFilter::Builder::transparentShape(), + ItemFilter::Builder::background() + } }; + const auto filteredSpatialBuckets = addJob>("FilterSceneSelection", culledSpatialSelection, spatialFilters).get::ItemBoundsArray>(); + const auto filteredNonspatialBuckets = addJob>("FilterOverlaySelection", nonspatialSelection, nonspatialFilters).get::ItemBoundsArray>(); + + // Extract opaques / transparents / lights / overlays + const auto opaques = addJob("DepthSortOpaque", filteredSpatialBuckets[OPAQUE_SHAPE_BUCKET]); + const auto transparents = addJob("DepthSortTransparent", filteredSpatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); + const auto lights = filteredSpatialBuckets[LIGHT_BUCKET]; + + const auto overlayOpaques = addJob("DepthSortOverlayOpaque", filteredNonspatialBuckets[OPAQUE_SHAPE_BUCKET]); + const auto overlayTransparents = addJob("DepthSortOverlayTransparent", filteredNonspatialBuckets[TRANSPARENT_SHAPE_BUCKET], DepthSortItems(false)); + const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; + + setOutput(Output{{ opaques, transparents, lights, overlayOpaques, overlayTransparents, background }}); +} diff --git a/libraries/render/src/render/RenderFetchSortCullTask.h b/libraries/render/src/render/RenderFetchSortCullTask.h new file mode 100644 index 0000000000..17d9f1a005 --- /dev/null +++ b/libraries/render/src/render/RenderFetchSortCullTask.h @@ -0,0 +1,28 @@ +// +// RenderFetchSortCullTask.h +// render/src/ +// +// Created by Zach Pomerantz on 12/22/2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_RenderFetchSortCullTask_h +#define hifi_RenderFetchSortCullTask_h + +#include + +#include "Task.h" +#include "CullTask.h" + +class RenderFetchSortCullTask : public render::Task { +public: + using Output = std::array; + using JobModel = ModelO; + + RenderFetchSortCullTask(render::CullFunctor cullFunctor); +}; + +#endif // hifi_RenderFetchSortCullTask_h diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index bd731564e7..3f6d8b29b0 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -14,6 +14,8 @@ #include #include +#include + #include #include #include @@ -23,7 +25,6 @@ #include #include - #include #include #include @@ -33,7 +34,6 @@ #include #include - #include #include #include @@ -59,8 +59,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -534,7 +536,14 @@ public: _initContext.makeCurrent(); // Render engine init _renderEngine->addJob("RenderShadowTask", _cullFunctor); - _renderEngine->addJob("RenderDeferredTask", _cullFunctor); + const auto items = _renderEngine->addJob("FetchSortCull", _cullFunctor); + assert(items.canCast()); + static const QString RENDER_FORWARD = "HIFI_RENDER_FORWARD"; + if (QProcessEnvironment::systemEnvironment().contains(RENDER_FORWARD)) { + _renderEngine->addJob("RenderForwardTask", items.get()); + } else { + _renderEngine->addJob("RenderDeferredTask", items.get()); + } _renderEngine->load(); _renderEngine->registerScene(_main3DScene);