diff options
| author | Dave Parks <davep@lindenlab.com> | 2023-02-22 11:01:18 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2023-02-22 11:01:18 -0600 | 
| commit | 65d69ce80dca112ea0bfd06f2749d4d6fcb366b4 (patch) | |
| tree | 30c5e6f3ad1bc0b4d9ce32334695b0499fce434f /indra/newview | |
| parent | 0336c1a06de89937d5c0f971e06270afc868ddfa (diff) | |
DRTVWR-559 Fix for stall in probe occlusion culling and fix for culled neighbors getting sampled (badly).
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llreflectionmap.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llreflectionmap.h | 2 | ||||
| -rw-r--r-- | indra/newview/llreflectionmapmanager.cpp | 2 | 
3 files changed, 18 insertions, 4 deletions
| diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp index fb934da02e..37ad74e54d 100644 --- a/indra/newview/llreflectionmap.cpp +++ b/indra/newview/llreflectionmap.cpp @@ -41,6 +41,14 @@ LLReflectionMap::LLReflectionMap()  {  } +LLReflectionMap::~LLReflectionMap() +{ +    if (mOcclusionQuery) +    { +        glDeleteQueries(1, &mOcclusionQuery); +    } +} +  void LLReflectionMap::update(U32 resolution, U32 face)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; @@ -276,18 +284,21 @@ void LLReflectionMap::doOcclusion(const LLVector4a& eye)      if (mOcclusionQuery == 0)      { // no query was previously issued, allocate one and issue +        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("rmdo - glGenQueries");          glGenQueries(1, &mOcclusionQuery);          do_query = true;      }      else      { // query was previously issued, check it and only issue a new query          // if previous query is available -        GLuint result = (GLuint) 0xFFFFFFFF; -        glGetQueryObjectuiv(mOcclusionQuery, GL_QUERY_RESULT_NO_WAIT, &result); +        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("rmdo - glGetQueryObject"); +        GLuint result = 0; +        glGetQueryObjectuiv(mOcclusionQuery, GL_QUERY_RESULT_AVAILABLE, &result); -        if (result != (GLuint) 0xFFFFFFFF) +        if (result > 0)          {              do_query = true; +            glGetQueryObjectuiv(mOcclusionQuery, GL_QUERY_RESULT, &result);              mOccluded = result == 0;              mOcclusionPendingFrames = 0;          } @@ -299,6 +310,7 @@ void LLReflectionMap::doOcclusion(const LLVector4a& eye)      if (do_query)      { +        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("rmdo - push query");          glBeginQuery(GL_ANY_SAMPLES_PASSED, mOcclusionQuery);          LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h index 0405d06eb5..6eff607ea5 100644 --- a/indra/newview/llreflectionmap.h +++ b/indra/newview/llreflectionmap.h @@ -39,6 +39,8 @@ public:      // allocate an environment map of the given resolution       LLReflectionMap(); +    ~LLReflectionMap(); +      // update this environment map      // resolution - size of cube map to generate      void update(U32 resolution, U32 face); diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index bfc8b595c2..608585acf5 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -862,7 +862,7 @@ void LLReflectionMapManager::updateUniforms()                  }                  GLint idx = neighbor->mProbeIndex; -                if (idx == -1) +                if (idx == -1 || neighbor->mOccluded)                  {                      continue;                  } | 
