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....

This commit is contained in:
samcake 2016-10-05 18:28:19 -07:00
parent e6572a42e3
commit ba88db1b14
11 changed files with 53 additions and 27 deletions

View file

@ -42,7 +42,8 @@ Buffer::Size Buffer::getBufferGPUMemoryUsage() {
} }
Buffer::Buffer(Size pageSize) : Buffer::Buffer(Size pageSize) :
_pages(pageSize) { _pages(pageSize),
_renderPages(pageSize) {
_bufferCPUCount++; _bufferCPUCount++;
} }

View file

@ -74,10 +74,12 @@ ivec3 clusterGrid_getCluster(int index) {
int clusterGrid_getClusterLightId(int index, int offset) { int clusterGrid_getClusterLightId(int index, int offset) {
int elementIndex = offset + index; int elementIndex = offset + index;
/*
int element = _clusterGridContent[GRID_FETCH_BUFFER(elementIndex)]; int element = _clusterGridContent[GRID_FETCH_BUFFER(elementIndex)];
return element; 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@> <@endif@>

View file

@ -101,9 +101,10 @@ void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) {
configDimensions.z = std::min(maxNumSlices, configDimensions.z); configDimensions.z = std::min(maxNumSlices, configDimensions.z);
static int numFrames = 0;
numFrames++;
auto& dims = _frustumGridBuffer->dims; 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().dims = configDimensions;
_frustumGridBuffer.edit().generateGridPlanes(_gridPlanes[0], _gridPlanes[1], _gridPlanes[2]); _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); _clusterGrid.resize(_numClusters, EMPTY_CLUSTER);
// _clusterGridBuffer._size = _clusterGridBuffer._buffer->resize(_numClusters * sizeof(uint32_t)); // _clusterGridBuffer._size = _clusterGridBuffer._buffer->resize(_numClusters * sizeof(uint32_t));
_clusterGridBuffer._size = (_numClusters * sizeof(uint32_t)); _clusterGridBuffer._size = (_numClusters * sizeof(uint32_t));
_clusterGridBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data()/*, _clusterGridBuffer._size*/); _clusterGridBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data(), _clusterGridBuffer._size);
} }
auto configListBudget = std::min(MAX_GRID_DIMENSIONS.w, listBudget); 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.clear();
_clusterContent.resize(configListBudget, INVALID_LIGHT); _clusterContent.resize(configListBudget, INVALID_LIGHT);
// _clusterContentBuffer._size = _clusterContentBuffer._buffer->resize(configListBudget * sizeof(LightIndex)); // _clusterContentBuffer._size = _clusterContentBuffer._buffer->resize(configListBudget * sizeof(LightIndex));
_clusterContentBuffer._size = (configListBudget * sizeof(LightIndex)); _clusterContentBuffer._size = (configListBudget * sizeof(LightIndex));
// _clusterContentBuffer._buffer->setData(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data()); // _clusterContentBuffer._buffer->setData(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data());
_clusterContentBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data()/*, _clusterContentBuffer._size*/); _clusterContentBuffer._buffer = std::make_shared<gpu::Buffer>(_clusterContentBuffer._size, (gpu::Byte*) _clusterContent.data(), _clusterContentBuffer._size);
} }
} }
@ -287,7 +294,7 @@ uint32_t scanLightVolumeSphere(FrustumGrid& grid, const FrustumGrid::Planes plan
return numClustersTouched; return numClustersTouched;
} }
void LightClusters::updateClusters() { uint32_t LightClusters::updateClusters() {
// Clean up last info // Clean up last info
std::vector< std::vector< LightIndex > > clusterGridPoint(_numClusters); std::vector< std::vector< LightIndex > > clusterGridPoint(_numClusters);
std::vector< std::vector< LightIndex > > clusterGridSpot(_numClusters); std::vector< std::vector< LightIndex > > clusterGridSpot(_numClusters);
@ -452,6 +459,8 @@ void LightClusters::updateClusters() {
// update the buffers // update the buffers
_clusterGridBuffer._buffer->setData(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data()); _clusterGridBuffer._buffer->setData(_clusterGridBuffer._size, (gpu::Byte*) _clusterGrid.data());
_clusterContentBuffer._buffer->setSubData(0, indexOffset * sizeof(LightIndex), (gpu::Byte*) _clusterContent.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->updateLightStage(lightStage);
_lightClusters->updateLightFrame(lightStage->_currentFrame, lightingModel->isPointLightEnabled(), lightingModel->isSpotLightEnabled()); _lightClusters->updateLightFrame(lightStage->_currentFrame, lightingModel->isPointLightEnabled(), lightingModel->isSpotLightEnabled());
_lightClusters->updateClusters(); auto numClusterdLights = _lightClusters->updateClusters();
output = _lightClusters; output = _lightClusters;
auto config = std::static_pointer_cast<Config>(renderContext->jobConfig);
config->setNumClusteredLights(numClusterdLights);
} }
DebugLightClusters::DebugLightClusters() { DebugLightClusters::DebugLightClusters() {

View file

@ -24,7 +24,8 @@ public:
float rangeFar { 200.0f }; float rangeFar { 200.0f };
float frustumFar { 10000.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; float spare;
glm::mat4 eyeToGridProj; glm::mat4 eyeToGridProj;
@ -74,7 +75,7 @@ public:
void updateLightFrame(const LightStage::Frame& lightFrame, bool points = true, bool spots = true); void updateLightFrame(const LightStage::Frame& lightFrame, bool points = true, bool spots = true);
void updateClusters(); uint32_t updateClusters();
ViewFrustum _frustum; ViewFrustum _frustum;
@ -94,15 +95,12 @@ public:
const uint32_t EMPTY_CLUSTER { 0x0000FFFF }; const uint32_t EMPTY_CLUSTER { 0x0000FFFF };
const LightID INVALID_LIGHT { LightStage::INVALID_INDEX }; const LightID INVALID_LIGHT { LightStage::INVALID_INDEX };
using LightIndex = uint32_t; using LightIndex = uint16_t;
std::vector<uint32_t> _clusterGrid; std::vector<uint32_t> _clusterGrid;
std::vector<LightIndex> _clusterContent; std::vector<LightIndex> _clusterContent;
gpu::BufferView _clusterGridBuffer; gpu::BufferView _clusterGridBuffer;
gpu::BufferView _clusterContentBuffer; gpu::BufferView _clusterContentBuffer;
}; };
using LightClustersPointer = std::shared_ptr<LightClusters>; using LightClustersPointer = std::shared_ptr<LightClusters>;
@ -119,17 +117,26 @@ class LightClusteringPassConfig : public render::Job::Config {
Q_PROPERTY(int dimZ MEMBER dimZ NOTIFY dirty) Q_PROPERTY(int dimZ MEMBER dimZ NOTIFY dirty)
Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty) Q_PROPERTY(bool freeze MEMBER freeze NOTIFY dirty)
Q_PROPERTY(int numClusteredLights MEMBER numClusteredLights NOTIFY dirty)
public: public:
LightClusteringPassConfig() : render::Job::Config(true){} LightClusteringPassConfig() : render::Job::Config(true){}
float rangeNear{ 0.1f }; float rangeNear{ 0.1f };
float rangeFar{ 200.0f }; float rangeFar{ 200.0f };
/*
int dimX { 16 };
int dimY { 16 };
int dimZ { 16 };
*/
int dimX { 16 }; int dimX { 16 };
int dimY { 16 }; int dimY { 16 };
int dimZ { 16 }; int dimZ { 16 };
bool freeze{ false }; bool freeze{ false };
void setNumClusteredLights(int numLights) { numClusteredLights = numLights; emit dirty(); }
int numClusteredLights { 0 };
signals: signals:
void dirty(); void dirty();
@ -175,7 +182,8 @@ public:
bool doDrawGrid{ false }; bool doDrawGrid{ false };
bool doDrawClusterFromDepth { false }; bool doDrawClusterFromDepth { false };
bool doDrawContent { false }; // bool doDrawContent { false };
bool doDrawContent { true };
signals: signals:
void dirty(); void dirty();

View file

@ -136,7 +136,7 @@ LightStage::LightPointer LightStage::removeLight(Index index) {
void LightStage::updateLightArrayBuffer(Index lightId) { void LightStage::updateLightArrayBuffer(Index lightId) {
auto lightSize = sizeof(model::Light::LightSchema); auto lightSize = sizeof(model::Light::LightSchema);
if (!_lightArrayBuffer) { if (!_lightArrayBuffer) {
_lightArrayBuffer = std::make_shared<gpu::Buffer>(); _lightArrayBuffer = std::make_shared<gpu::Buffer>(lightSize);
} }
assert(checkLightId(lightId)); assert(checkLightId(lightId));

View file

@ -20,10 +20,10 @@
<@include model/Light.slh@> <@include model/Light.slh@>
<$declareLightBuffer(120)$> <$declareLightBuffer(256)$>
uniform lightIndexBuffer { uniform lightIndexBuffer {
int lightIndex[120]; int lightIndex[256];
}; };
out vec4 _texCoord0; out vec4 _texCoord0;

View file

@ -19,10 +19,10 @@
<$declareStandardTransform()$> <$declareStandardTransform()$>
<@include model/Light.slh@> <@include model/Light.slh@>
<$declareLightBuffer(120)$> <$declareLightBuffer(256)$>
uniform lightIndexBuffer { uniform lightIndexBuffer {
int lightIndex[120]; int lightIndex[256];
}; };
out vec4 _texCoord0; out vec4 _texCoord0;

View file

@ -16,7 +16,7 @@
<@include model/Light.slh@> <@include model/Light.slh@>
<$declareLightBuffer(128)$> <$declareLightBuffer(256)$>
<@include LightClusterGrid.slh@> <@include LightClusterGrid.slh@>

View file

@ -19,7 +19,7 @@
// Everything about light // Everything about light
<@include model/Light.slh@> <@include model/Light.slh@>
<$declareLightBuffer(128)$> <$declareLightBuffer(256)$>
<@include LightingModel.slh@> <@include LightingModel.slh@>

View file

@ -19,9 +19,9 @@
// Everything about light // Everything about light
<@include model/Light.slh@> <@include model/Light.slh@>
<$declareLightBuffer(32)$> <$declareLightBuffer(256)$>
uniform lightIndexBuffer { uniform lightIndexBuffer {
int lightIndex[32]; int lightIndex[256];
}; };
<@include LightingModel.slh@> <@include LightingModel.slh@>

View file

@ -106,6 +106,9 @@ Column {
checked: Render.getConfig("DebugLightClusters")["doDrawContent"] checked: Render.getConfig("DebugLightClusters")["doDrawContent"]
onCheckedChanged: { Render.getConfig("DebugLightClusters")["doDrawContent"] = checked } onCheckedChanged: { Render.getConfig("DebugLightClusters")["doDrawContent"] = checked }
} }
Label {
text: "Num Cluster Items = " + Render.getConfig("LightClustering")["numClusteredLights"].toFixed(0)
}
} }
} }