From 93268cb47a69b8432068c0922feedc01c96ae975 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 16 Dec 2016 17:03:45 -0500 Subject: DRTVWR-418: Put TYPE_INDEX within TYPE_MAX: stop undefined indexing. LLVertexBuffer::TYPE_INDEX was past TYPE_MAX, which is used to set the maximum sizes of various (scattered) arrays, bleh. The alarm bells that this SHOULD set off are indeed correct: TYPE_INDEX was being used to index at least one of those arrays, meaning we've been indexing past the end of that array, meaning undefined behavior. The enum that defines both TYPE_INDEX and TYPE_MAX provides a helpful comment indicating what things must be updated when modifying the enum. (Far better to define things centrally in a single place... but another time.) Update the designated arrays to include a final TYPE_INDEX entry. Contents of those entries are wild guesses -- but even wild guesses are better than completely indeterminate data. --- indra/llrender/llshadermgr.cpp | 3 ++- indra/llrender/llvertexbuffer.cpp | 7 ++++++- indra/llrender/llvertexbuffer.h | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 55f0791174..0a479feccc 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -986,7 +986,8 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedAttribs.push_back("weight4"); mReservedAttribs.push_back("clothing"); mReservedAttribs.push_back("texture_index"); - + mReservedAttribs.push_back("index"); + //matrix state mReservedUniforms.push_back("modelview_matrix"); mReservedUniforms.push_back("projection_matrix"); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 0fae600a90..59024b7730 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -339,6 +339,7 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] = sizeof(LLVector4), // TYPE_WEIGHT4, sizeof(LLVector4), // TYPE_CLOTHWEIGHT, sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes + sizeof(U16), // TYPE_INDEX }; static std::string vb_type_name[] = @@ -356,8 +357,8 @@ static std::string vb_type_name[] = "TYPE_WEIGHT4", "TYPE_CLOTHWEIGHT", "TYPE_TEXTURE_INDEX", + "TYPE_INDEX", "TYPE_MAX", - "TYPE_INDEX", }; U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] = @@ -1368,6 +1369,7 @@ void LLVertexBuffer::setupVertexArray() 4, //TYPE_WEIGHT4, 4, //TYPE_CLOTHWEIGHT, 1, //TYPE_TEXTURE_INDEX + 1, //TYPE_INDEX }; U32 attrib_type[] = @@ -1385,6 +1387,7 @@ void LLVertexBuffer::setupVertexArray() GL_FLOAT, //TYPE_WEIGHT4, GL_FLOAT, //TYPE_CLOTHWEIGHT, GL_UNSIGNED_INT, //TYPE_TEXTURE_INDEX + GL_UNSIGNED_INT, //TYPE_INDEX }; bool attrib_integer[] = @@ -1402,6 +1405,7 @@ void LLVertexBuffer::setupVertexArray() false, //TYPE_WEIGHT4, false, //TYPE_CLOTHWEIGHT, true, //TYPE_TEXTURE_INDEX + true, //TYPE_INDEX }; U32 attrib_normalized[] = @@ -1419,6 +1423,7 @@ void LLVertexBuffer::setupVertexArray() GL_FALSE, //TYPE_WEIGHT4, GL_FALSE, //TYPE_CLOTHWEIGHT, GL_FALSE, //TYPE_TEXTURE_INDEX + GL_FALSE, //TYPE_INDEX }; bindGLBuffer(true); diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index c05fd01595..36038eee7b 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -179,8 +179,8 @@ public: TYPE_WEIGHT4, TYPE_CLOTHWEIGHT, TYPE_TEXTURE_INDEX, + TYPE_INDEX, TYPE_MAX, - TYPE_INDEX, }; enum { MAP_VERTEX = (1< Date: Fri, 16 Dec 2016 19:05:59 -0500 Subject: DRTVWR-418: Adjust HttpStatus::toHex() test for 64-bit result. --- indra/llcorehttp/tests/test_httpstatus.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/llcorehttp/tests/test_httpstatus.hpp b/indra/llcorehttp/tests/test_httpstatus.hpp index 4502d32fe1..10cda799e7 100644 --- a/indra/llcorehttp/tests/test_httpstatus.hpp +++ b/indra/llcorehttp/tests/test_httpstatus.hpp @@ -244,7 +244,11 @@ void HttpStatusTestObjectType::test<7>() HttpStatus status(404); std::string msg = status.toHex(); // std::cout << "Result: " << msg << std::endl; - ensure(msg == "01940001"); +#if ADDRESS_SIZE == 32 + ensure_equals(msg, "01940001"); +#else + ensure_equals(msg, "19400000001"); +#endif } -- cgit v1.2.3 From c1ae63a872a90c234437bfc6f114964a65a1a562 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 16 Dec 2016 19:08:24 -0500 Subject: DRTVWR-418: Work around dubious cast from S32 to GLvoid* when passing -- something -- to glVertexAttribPointerARB() in LLVertexBuffer::setupVertexArray(). --- indra/llrender/llvertexbuffer.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 59024b7730..b6fae1ad26 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -1441,13 +1441,24 @@ void LLVertexBuffer::setupVertexArray() //glVertexattribIPointer requires GLSL 1.30 or later if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 30) { - glVertexAttribIPointer(i, attrib_size[i], attrib_type[i], sTypeSize[i], (void*) mOffsets[i]); + glVertexAttribIPointer(i, attrib_size[i], attrib_type[i], sTypeSize[i], (const GLvoid*) mOffsets[i]); } #endif } else { - glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i], attrib_normalized[i], sTypeSize[i], (void*) mOffsets[i]); + // nat 2016-12-16: With 64-bit clang compile, the compiler + // produces an error if we simply cast mOffsets[i] -- an S32 + // -- to (GLvoid *), the type of the parameter. It correctly + // points out that there's no way an S32 could fit a real + // pointer value. Since I do not know what we're trying to + // achieve here, I'm going to grit my teeth and try to + // persuade the compiler we know what we're doing, until + // someone who actually does know fixes it better. + uintptr_t fake_offset(mOffsets[i]); + glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i], + attrib_normalized[i], sTypeSize[i], + reinterpret_cast(fake_offset)); } } else -- cgit v1.2.3 From 050294a23cffe41ca59581d4b73c881d484c8f5a Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 16 Dec 2016 19:14:55 -0500 Subject: DRTVWR-418: Fix a (correct) clang correctness complaint. LLStatGraph::Threshold has an operator<(const Threshold& other) -- but because the method itself wasn't marked const, it could only be used on a non-const instance. This change fixes a case when it was applied to const instances. --- indra/llui/llstatgraph.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llui/llstatgraph.h b/indra/llui/llstatgraph.h index f381e92a4d..ba7cfc5d10 100644 --- a/indra/llui/llstatgraph.h +++ b/indra/llui/llstatgraph.h @@ -126,7 +126,7 @@ private: F32 mValue; LLUIColor mColor; - bool operator <(const Threshold& other) + bool operator <(const Threshold& other) const { return mValue < other.mValue; } -- cgit v1.2.3 From 129896106638884ff41bdcd8441a5bcc221aa580 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sat, 17 Dec 2016 11:07:20 -0500 Subject: DRTVWR-418: Update dubious llvertexbuffer.cpp cast comment. Ruslan assures me that in fact this usage is valid. --- indra/llrender/llvertexbuffer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index b6fae1ad26..8ec78f605b 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -1451,14 +1451,12 @@ void LLVertexBuffer::setupVertexArray() // produces an error if we simply cast mOffsets[i] -- an S32 // -- to (GLvoid *), the type of the parameter. It correctly // points out that there's no way an S32 could fit a real - // pointer value. Since I do not know what we're trying to - // achieve here, I'm going to grit my teeth and try to - // persuade the compiler we know what we're doing, until - // someone who actually does know fixes it better. - uintptr_t fake_offset(mOffsets[i]); + // pointer value. Ruslan asserts that in this case the last + // param is interpreted as an array data offset within the VBO + // rather than as an actual pointer, so it's okay. glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i], attrib_normalized[i], sTypeSize[i], - reinterpret_cast(fake_offset)); + reinterpret_cast(mOffsets[i])); } } else -- cgit v1.2.3 From 4c95587dc3c0943d3cf455df6ecb5c7dcbf78738 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sat, 17 Dec 2016 11:09:09 -0500 Subject: Backed out changeset bb47510bda62: don't change TYPE_MAX. Ruslan points out that changing TYPE_MAX could lead to extra (useless) render passes. We will have to solve the TYPE_INDEX > TYPE_MAX problem another way. --- indra/llrender/llshadermgr.cpp | 3 +-- indra/llrender/llvertexbuffer.cpp | 7 +------ indra/llrender/llvertexbuffer.h | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 0a479feccc..55f0791174 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -986,8 +986,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedAttribs.push_back("weight4"); mReservedAttribs.push_back("clothing"); mReservedAttribs.push_back("texture_index"); - mReservedAttribs.push_back("index"); - + //matrix state mReservedUniforms.push_back("modelview_matrix"); mReservedUniforms.push_back("projection_matrix"); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 59024b7730..0fae600a90 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -339,7 +339,6 @@ S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] = sizeof(LLVector4), // TYPE_WEIGHT4, sizeof(LLVector4), // TYPE_CLOTHWEIGHT, sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes - sizeof(U16), // TYPE_INDEX }; static std::string vb_type_name[] = @@ -357,8 +356,8 @@ static std::string vb_type_name[] = "TYPE_WEIGHT4", "TYPE_CLOTHWEIGHT", "TYPE_TEXTURE_INDEX", - "TYPE_INDEX", "TYPE_MAX", + "TYPE_INDEX", }; U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] = @@ -1369,7 +1368,6 @@ void LLVertexBuffer::setupVertexArray() 4, //TYPE_WEIGHT4, 4, //TYPE_CLOTHWEIGHT, 1, //TYPE_TEXTURE_INDEX - 1, //TYPE_INDEX }; U32 attrib_type[] = @@ -1387,7 +1385,6 @@ void LLVertexBuffer::setupVertexArray() GL_FLOAT, //TYPE_WEIGHT4, GL_FLOAT, //TYPE_CLOTHWEIGHT, GL_UNSIGNED_INT, //TYPE_TEXTURE_INDEX - GL_UNSIGNED_INT, //TYPE_INDEX }; bool attrib_integer[] = @@ -1405,7 +1402,6 @@ void LLVertexBuffer::setupVertexArray() false, //TYPE_WEIGHT4, false, //TYPE_CLOTHWEIGHT, true, //TYPE_TEXTURE_INDEX - true, //TYPE_INDEX }; U32 attrib_normalized[] = @@ -1423,7 +1419,6 @@ void LLVertexBuffer::setupVertexArray() GL_FALSE, //TYPE_WEIGHT4, GL_FALSE, //TYPE_CLOTHWEIGHT, GL_FALSE, //TYPE_TEXTURE_INDEX - GL_FALSE, //TYPE_INDEX }; bindGLBuffer(true); diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 36038eee7b..c05fd01595 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -179,8 +179,8 @@ public: TYPE_WEIGHT4, TYPE_CLOTHWEIGHT, TYPE_TEXTURE_INDEX, - TYPE_INDEX, TYPE_MAX, + TYPE_INDEX, }; enum { MAP_VERTEX = (1<