From ba88db1b14d3e3a72637304c5b65ff535f8d0a9c Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 5 Oct 2016 18:28:19 -0700 Subject: [PATCH] Tried many different things to narrow down the issue of the corrupted memory, it seems to be linked to the grid dimendsions somehow, i m now forcing to reassign the frustum grid dimension on the 10th iteration which seems to fix the issue.... --- libraries/gpu/src/gpu/Buffer.cpp | 3 ++- .../render-utils/src/LightClusterGrid.slh | 6 +++-- libraries/render-utils/src/LightClusters.cpp | 26 ++++++++++++++----- libraries/render-utils/src/LightClusters.h | 24 +++++++++++------ libraries/render-utils/src/LightStage.cpp | 2 +- .../render-utils/src/deferred_light_point.slv | 4 +-- .../render-utils/src/deferred_light_spot.slv | 4 +-- .../src/lightClusters_drawClusterContent.slf | 2 +- .../render-utils/src/local_lights_shading.slf | 2 +- libraries/render-utils/src/spot_light.slf | 4 +-- .../utilities/render/lightClustering.qml | 3 +++ 11 files changed, 53 insertions(+), 27 deletions(-) diff --git a/libraries/gpu/src/gpu/Buffer.cpp b/libraries/gpu/src/gpu/Buffer.cpp index f4cd9e41ba..fb60e0e737 100644 --- a/libraries/gpu/src/gpu/Buffer.cpp +++ b/libraries/gpu/src/gpu/Buffer.cpp @@ -42,7 +42,8 @@ Buffer::Size Buffer::getBufferGPUMemoryUsage() { } Buffer::Buffer(Size pageSize) : - _pages(pageSize) { + _pages(pageSize), + _renderPages(pageSize) { _bufferCPUCount++; } diff --git a/libraries/render-utils/src/LightClusterGrid.slh b/libraries/render-utils/src/LightClusterGrid.slh index 24d4a8fbc8..3cd3bec473 100644 --- a/libraries/render-utils/src/LightClusterGrid.slh +++ b/libraries/render-utils/src/LightClusterGrid.slh @@ -74,10 +74,12 @@ ivec3 clusterGrid_getCluster(int index) { int clusterGrid_getClusterLightId(int index, int offset) { int elementIndex = offset + index; + /* int element = _clusterGridContent[GRID_FETCH_BUFFER(elementIndex)]; return element; - //int element = _clusterGridContent[GRID_FETCH_BUFFER(elementIndex)]; - // return (((elementIndex & 0x00000001) == 1) ? (element >> 16) : element) & 0x0000FFFF; + */ + int element = _clusterGridContent[GRID_FETCH_BUFFER((elementIndex >> 1))]; + return (((elementIndex & 0x00000001) == 1) ? (element >> 16) : element) & 0x0000FFFF; } <@endif@> diff --git a/libraries/render-utils/src/LightClusters.cpp b/libraries/render-utils/src/LightClusters.cpp index a29357f493..98615a72ff 100644 --- a/libraries/render-utils/src/LightClusters.cpp +++ b/libraries/render-utils/src/LightClusters.cpp @@ -101,9 +101,10 @@ void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) { configDimensions.z = std::min(maxNumSlices, configDimensions.z); - + static int numFrames = 0; + numFrames++; auto& dims = _frustumGridBuffer->dims; - if ((dims.x != configDimensions.x) || (dims.y != configDimensions.y) || (dims.z != configDimensions.z)) { + if ((numFrames == 10) || (dims.x != configDimensions.x) || (dims.y != configDimensions.y) || (dims.z != configDimensions.z)) { _frustumGridBuffer.edit().dims = configDimensions; _frustumGridBuffer.edit().generateGridPlanes(_gridPlanes[0], _gridPlanes[1], _gridPlanes[2]); } @@ -115,17 +116,23 @@ void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) { _clusterGrid.resize(_numClusters, EMPTY_CLUSTER); // _clusterGridBuffer._size = _clusterGridBuffer._buffer->resize(_numClusters * sizeof(uint32_t)); _clusterGridBuffer._size = (_numClusters * sizeof(uint32_t)); - _clusterGridBuffer._buffer = std::make_shared(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data()/*, _clusterGridBuffer._size*/); + _clusterGridBuffer._buffer = std::make_shared(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data(), _clusterGridBuffer._size); } auto configListBudget = std::min(MAX_GRID_DIMENSIONS.w, listBudget); - if (configListBudget != _clusterContentBuffer.getNumElements()) { + + // SInce LightINdex is 2bytes, we can fit 2 in a uint32 + if (sizeof(LightIndex) == 2) { + configListBudget *= 2; + } + + if (configListBudget != _clusterContent.size()) { _clusterContent.clear(); _clusterContent.resize(configListBudget, INVALID_LIGHT); // _clusterContentBuffer._size = _clusterContentBuffer._buffer->resize(configListBudget * sizeof(LightIndex)); _clusterContentBuffer._size = (configListBudget * sizeof(LightIndex)); // _clusterContentBuffer._buffer->setData(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data()); - _clusterContentBuffer._buffer = std::make_shared(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data()/*, _clusterContentBuffer._size*/); + _clusterContentBuffer._buffer = std::make_shared(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data(), _clusterContentBuffer._size); } } @@ -287,7 +294,7 @@ uint32_t scanLightVolumeSphere(FrustumGrid& grid, const FrustumGrid::Planes plan return numClustersTouched; } -void LightClusters::updateClusters() { +uint32_t LightClusters::updateClusters() { // Clean up last info std::vector< std::vector< LightIndex > > clusterGridPoint(_numClusters); std::vector< std::vector< LightIndex > > clusterGridSpot(_numClusters); @@ -452,6 +459,8 @@ void LightClusters::updateClusters() { // update the buffers _clusterGridBuffer._buffer->setData(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data()); _clusterContentBuffer._buffer->setSubData(0, indexOffset * sizeof(LightIndex), (gpu::Byte*) _clusterContent.data()); + + return numClusterTouched; } @@ -492,9 +501,12 @@ void LightClusteringPass::run(const render::SceneContextPointer& sceneContext, c _lightClusters->updateLightStage(lightStage); _lightClusters->updateLightFrame(lightStage->_currentFrame, lightingModel->isPointLightEnabled(), lightingModel->isSpotLightEnabled()); - _lightClusters->updateClusters(); + auto numClusterdLights = _lightClusters->updateClusters(); output = _lightClusters; + + auto config = std::static_pointer_cast(renderContext->jobConfig); + config->setNumClusteredLights(numClusterdLights); } DebugLightClusters::DebugLightClusters() { diff --git a/libraries/render-utils/src/LightClusters.h b/libraries/render-utils/src/LightClusters.h index 5c52d44ff1..e01d6c42f7 100644 --- a/libraries/render-utils/src/LightClusters.h +++ b/libraries/render-utils/src/LightClusters.h @@ -24,7 +24,8 @@ public: float rangeFar { 200.0f }; float frustumFar { 10000.0f }; - glm::ivec3 dims { 16, 12, 16 }; + // glm::ivec3 dims { 16, 16, 16 }; + glm::ivec3 dims { 16, 16, 16 }; float spare; glm::mat4 eyeToGridProj; @@ -74,7 +75,7 @@ public: void updateLightFrame(const LightStage::Frame& lightFrame, bool points = true, bool spots = true); - void updateClusters(); + uint32_t updateClusters(); ViewFrustum _frustum; @@ -94,15 +95,12 @@ public: const uint32_t EMPTY_CLUSTER { 0x0000FFFF }; const LightID INVALID_LIGHT { LightStage::INVALID_INDEX }; - using LightIndex = uint32_t; + using LightIndex = uint16_t; std::vector _clusterGrid; std::vector _clusterContent; gpu::BufferView _clusterGridBuffer; gpu::BufferView _clusterContentBuffer; - - - }; using LightClustersPointer = std::shared_ptr; @@ -119,17 +117,26 @@ class LightClusteringPassConfig : public render::Job::Config { Q_PROPERTY(int dimZ MEMBER dimZ NOTIFY dirty) Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) + + Q_PROPERTY(int numClusteredLights MEMBER numClusteredLights NOTIFY dirty) public: LightClusteringPassConfig() : render::Job::Config(true){} float rangeNear{ 0.1f }; float rangeFar{ 200.0f }; - + /* + int dimX { 16 }; + int dimY { 16 }; + int dimZ { 16 }; + */ int dimX { 16 }; int dimY { 16 }; int dimZ { 16 }; + bool freeze{ false }; + void setNumClusteredLights(int numLights) { numClusteredLights = numLights; emit dirty(); } + int numClusteredLights { 0 }; signals: void dirty(); @@ -175,7 +182,8 @@ public: bool doDrawGrid{ false }; bool doDrawClusterFromDepth { false }; - bool doDrawContent { false }; + // bool doDrawContent { false }; + bool doDrawContent { true }; signals: void dirty(); diff --git a/libraries/render-utils/src/LightStage.cpp b/libraries/render-utils/src/LightStage.cpp index bedd22b360..8c6e6d96a4 100644 --- a/libraries/render-utils/src/LightStage.cpp +++ b/libraries/render-utils/src/LightStage.cpp @@ -136,7 +136,7 @@ LightStage::LightPointer LightStage::removeLight(Index index) { void LightStage::updateLightArrayBuffer(Index lightId) { auto lightSize = sizeof(model::Light::LightSchema); if (!_lightArrayBuffer) { - _lightArrayBuffer = std::make_shared(); + _lightArrayBuffer = std::make_shared(lightSize); } assert(checkLightId(lightId)); diff --git a/libraries/render-utils/src/deferred_light_point.slv b/libraries/render-utils/src/deferred_light_point.slv index f126ee9251..88da7dd04c 100644 --- a/libraries/render-utils/src/deferred_light_point.slv +++ b/libraries/render-utils/src/deferred_light_point.slv @@ -20,10 +20,10 @@ <@include model/Light.slh@> -<$declareLightBuffer(120)$> +<$declareLightBuffer(256)$> uniform lightIndexBuffer { - int lightIndex[120]; + int lightIndex[256]; }; out vec4 _texCoord0; diff --git a/libraries/render-utils/src/deferred_light_spot.slv b/libraries/render-utils/src/deferred_light_spot.slv index 5edd889704..f9e81549dd 100755 --- a/libraries/render-utils/src/deferred_light_spot.slv +++ b/libraries/render-utils/src/deferred_light_spot.slv @@ -19,10 +19,10 @@ <$declareStandardTransform()$> <@include model/Light.slh@> -<$declareLightBuffer(120)$> +<$declareLightBuffer(256)$> uniform lightIndexBuffer { - int lightIndex[120]; + int lightIndex[256]; }; out vec4 _texCoord0; diff --git a/libraries/render-utils/src/lightClusters_drawClusterContent.slf b/libraries/render-utils/src/lightClusters_drawClusterContent.slf index fe8d850e8a..f4b9a82b64 100644 --- a/libraries/render-utils/src/lightClusters_drawClusterContent.slf +++ b/libraries/render-utils/src/lightClusters_drawClusterContent.slf @@ -16,7 +16,7 @@ <@include model/Light.slh@> -<$declareLightBuffer(128)$> +<$declareLightBuffer(256)$> <@include LightClusterGrid.slh@> diff --git a/libraries/render-utils/src/local_lights_shading.slf b/libraries/render-utils/src/local_lights_shading.slf index c7d49de979..b144ce13c7 100644 --- a/libraries/render-utils/src/local_lights_shading.slf +++ b/libraries/render-utils/src/local_lights_shading.slf @@ -19,7 +19,7 @@ // Everything about light <@include model/Light.slh@> -<$declareLightBuffer(128)$> +<$declareLightBuffer(256)$> <@include LightingModel.slh@> diff --git a/libraries/render-utils/src/spot_light.slf b/libraries/render-utils/src/spot_light.slf index 9d71832f15..4cacff86c4 100644 --- a/libraries/render-utils/src/spot_light.slf +++ b/libraries/render-utils/src/spot_light.slf @@ -19,9 +19,9 @@ // Everything about light <@include model/Light.slh@> -<$declareLightBuffer(32)$> +<$declareLightBuffer(256)$> uniform lightIndexBuffer { - int lightIndex[32]; + int lightIndex[256]; }; <@include LightingModel.slh@> diff --git a/scripts/developer/utilities/render/lightClustering.qml b/scripts/developer/utilities/render/lightClustering.qml index c772b9e88d..427a818239 100644 --- a/scripts/developer/utilities/render/lightClustering.qml +++ b/scripts/developer/utilities/render/lightClustering.qml @@ -106,6 +106,9 @@ Column { checked: Render.getConfig("DebugLightClusters")["doDrawContent"] onCheckedChanged: { Render.getConfig("DebugLightClusters")["doDrawContent"] = checked } } + Label { + text: "Num Cluster Items = " + Render.getConfig("LightClustering")["numClusteredLights"].toFixed(0) + } } }