Skip to content
Snippets Groups Projects
Commit 529d56ed authored by Cosmic Linden's avatar Cosmic Linden
Browse files

SL-20606: Fix cached probe flags for material preview potentially exceeding storage bounds

parent 8a3d82dd
No related branches found
No related tags found
No related merge requests found
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include "llreflectionmapmanager.h" #include "llreflectionmapmanager.h"
#include <bitset> #include <vector>
#include "llviewercamera.h" #include "llviewercamera.h"
#include "llspatialpartition.h" #include "llspatialpartition.h"
...@@ -1389,14 +1389,16 @@ void LLReflectionMapManager::doOcclusion() ...@@ -1389,14 +1389,16 @@ void LLReflectionMapManager::doOcclusion()
void LLReflectionMapManager::forceDefaultProbeAndUpdateUniforms(bool force) void LLReflectionMapManager::forceDefaultProbeAndUpdateUniforms(bool force)
{ {
static std::bitset<LL_MAX_REFLECTION_PROBE_COUNT> mProbeWasOccluded; static std::vector<bool> mProbeWasOccluded;
if (force) if (force)
{ {
llassert(mProbeWasOccluded.empty());
for (size_t i = 0; i < mProbes.size(); ++i) for (size_t i = 0; i < mProbes.size(); ++i)
{ {
auto& probe = mProbes[i]; auto& probe = mProbes[i];
mProbeWasOccluded[i] = probe->mOccluded; mProbeWasOccluded.push_back(probe->mOccluded);
if (probe != nullptr && probe != mDefaultProbe) if (probe != nullptr && probe != mDefaultProbe)
{ {
probe->mOccluded = true; probe->mOccluded = true;
...@@ -1407,11 +1409,16 @@ void LLReflectionMapManager::forceDefaultProbeAndUpdateUniforms(bool force) ...@@ -1407,11 +1409,16 @@ void LLReflectionMapManager::forceDefaultProbeAndUpdateUniforms(bool force)
} }
else else
{ {
for (size_t i = 0; i < mProbes.size(); ++i) llassert(mProbes.size() == mProbeWasOccluded.size());
const size_t n = llmin(mProbes.size(), mProbeWasOccluded.size());
for (size_t i = 0; i < n; ++i)
{ {
auto& probe = mProbes[i]; auto& probe = mProbes[i];
llassert(probe->mOccluded == (probe != mDefaultProbe)); llassert(probe->mOccluded == (probe != mDefaultProbe));
probe->mOccluded = mProbeWasOccluded[i]; probe->mOccluded = mProbeWasOccluded[i];
} }
mProbeWasOccluded.clear();
mProbeWasOccluded.shrink_to_fit();
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment