diff options
Diffstat (limited to 'indra/llrender')
-rw-r--r-- | indra/llrender/llimagegl.cpp | 2 | ||||
-rw-r--r-- | indra/llrender/llrender.cpp | 15 | ||||
-rw-r--r-- | indra/llrender/llrendertarget.cpp | 11 | ||||
-rw-r--r-- | indra/llrender/llshadermgr.cpp | 2 | ||||
-rw-r--r-- | indra/llrender/llshadermgr.h | 2 | ||||
-rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 178 | ||||
-rw-r--r-- | indra/llrender/llvertexbuffer.h | 4 |
7 files changed, 121 insertions, 93 deletions
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 42af68c276..9ff483b92b 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -357,7 +357,9 @@ S32 LLImageGL::dataFormatBits(S32 dataformat) case GL_BGRA: return 32; // Used for QuickTime media textures on the Mac #endif case GL_DEPTH_COMPONENT: return 24; + case GL_DEPTH_COMPONENT16: return 16; case GL_DEPTH_COMPONENT24: return 24; + case GL_DEPTH_COMPONENT32: return 32; case GL_RGBA16: return 64; case GL_R16F: return 16; case GL_RG16F: return 32; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 70993393ff..332d15f76c 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -530,7 +530,9 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio { if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC) { - glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy); + //glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy); + //We plan to add a setting. For now we stick to a low value. + glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, 4.0); } else { @@ -1592,7 +1594,6 @@ void LLRender::end(std::string comment_) void LLRender::flush(std::string comment_) { - LOG_GLERROR("LLRender::flush() begin " + comment_); if (mCount > 0) { LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; @@ -1661,9 +1662,9 @@ void LLRender::flush(std::string comment_) } resetStriders(count); - } - LOG_GLERROR("LLRender::flush() end " + comment_); + LOG_GLERROR("LLRender::flush() end " + comment_); + } } void LLRender::flush() @@ -1765,9 +1766,11 @@ LLVertexBuffer* LLRender::genBuffer(U32 attribute_mask, S32 count) vb->setColorData(mColorsp.get()); } -#if LL_DARWIN + if(gGLManager.mIsApple && LLVertexBuffer::getVertexBufferMode() == 0) + { vb->unmapBuffer(); -#endif + } + vb->unbind(); return vb; diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index ddb2bf5df7..e898e03feb 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -326,7 +326,6 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt) { gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR); LOG_GLERROR(mName + " setting address mode to TAM_MIRROR"); - } else #endif @@ -367,8 +366,7 @@ bool LLRenderTarget::allocateDepth() gGL.getTexUnit(0)->bindManual(mUsage, mDepth); U32 internal_type = LLTexUnit::getInternalType(mUsage); - - LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_FLOAT, NULL, false); + LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL, false); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); sBytesAllocated += mResX*mResY*4; @@ -521,9 +519,7 @@ void LLRenderTarget::bindTarget(std::string name_, U32 mode_) { glDrawBuffers(static_cast<GLsizei>(mTex.size()), drawbuffers); glReadBuffer(GL_COLOR_ATTACHMENT0); - LOG_GLERROR(mName+" read and write buffers"); - } else if(mMode == 1) { @@ -557,8 +553,11 @@ void LLRenderTarget::clear(U32 mask_in) U32 mask = 0; if(!mTex.empty()) mask |= GL_COLOR_BUFFER_BIT; - if (mUseDepth) mask |= GL_DEPTH_BUFFER_BIT; + if (mUseDepth) + { + mask |= GL_DEPTH_BUFFER_BIT; + } if (mFBO) { check_framebuffer_status(); diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 6a3f88f9d3..81d45bc431 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1512,6 +1512,8 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("bloomExtractORM"); mReservedUniforms.push_back("bloomExtractMetal"); mReservedUniforms.push_back("bloomExtractNonMetal"); + mReservedUniforms.push_back("bloomClampValue"); + mReservedUniforms.push_back("mpHDRBoost"); llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 8b0bfc6bbe..19416066a5 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -352,6 +352,8 @@ public: BLOOM_EXTRACT_ORM, // "bloomExtractORM" BLOOM_EXTRACT_METAL, // "bloomExtractMetal" BLOOM_EXTRACT_NONMETAL, // "bloomExtractNonMetal" + BLOOM_CLAMP, // "bloomClampValue" + MP_HDR_BOOST, // "mpHDRBoost" END_RESERVED_UNIFORMS } eGLSLReservedUniforms; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 43d780a383..1bd7a57cd9 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -29,7 +29,6 @@ #include "llfasttimer.h" #include "llsys.h" #include "llvertexbuffer.h" -// #include "llrender.h" #include "llglheaders.h" #include "llrender.h" #include "llvector4a.h" @@ -272,13 +271,13 @@ static GLuint gen_buffer() { LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("gen buffer"); sIndex = pool_size; -#if !LL_DARWIN +//#if !LL_DARWIN if (!gGLManager.mIsAMD) { glGenBuffers(pool_size, sNamePool); } else -#endif +//#endif { // work around for AMD driver bug for (U32 i = 0; i < pool_size; ++i) { @@ -355,7 +354,6 @@ public: { //allocate a new buffer LL_PROFILE_GPU_ZONE("vbo alloc"); - data = (U8*) ll_aligned_malloc_16(size); if (type == GL_ARRAY_BUFFER) @@ -383,7 +381,6 @@ public: } mAllocated -= size; - if (name) { delete_buffers(1, &name); @@ -615,6 +612,8 @@ public: static LLVBOPool* sVBOPool = nullptr; +static U32 sMPVertexBufferMode = 0; + void LLVertexBufferData::drawWithMatrix() { if (!mVB) @@ -946,11 +945,13 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const } //static -void LLVertexBuffer::initClass(LLWindow* window) +void LLVertexBuffer::initClass(LLWindow* window, U32 mode_) { llassert(sVBOPool == nullptr); - if (gGLManager.mIsApple) + sMPVertexBufferMode = mode_; + + if (mode_ == 0 && gGLManager.mIsApple) { LL_INFOS() << "VBO Pooling Disabled" << LL_ENDL; sVBOPool = new LLAppleVBOPool(); @@ -973,6 +974,12 @@ void LLVertexBuffer::initClass(LLWindow* window) } //static +U32 LLVertexBuffer::getVertexBufferMode() +{ + return sMPVertexBufferMode; +} + +//static void LLVertexBuffer::unbind() { glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -1291,7 +1298,7 @@ U8* LLVertexBuffer::mapVertexBuffer(LLVertexBuffer::AttributeType type, U32 inde count = mNumVerts - index; } - if (!gGLManager.mIsApple) + if (!gGLManager.mIsApple || sMPVertexBufferMode == 1) { U32 start = mOffsets[type] + sTypeSize[type] * index; U32 end = start + sTypeSize[type] * count-1; @@ -1328,7 +1335,7 @@ U8* LLVertexBuffer::mapIndexBuffer(U32 index, S32 count) count = mNumIndices-index; } - if (!gGLManager.mIsApple) + if (!gGLManager.mIsApple || sMPVertexBufferMode == 1) { U32 start = sizeof(U16) * index; U32 end = start + sizeof(U16) * count-1; @@ -1365,13 +1372,35 @@ void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8 { if (gGLManager.mIsApple) { + if(sMPVertexBufferMode == 1) + { + //LL_WARNS() << "flush_vbo mode 1" << LL_ENDL; + + U32 MapBits = GL_MAP_WRITE_BIT; + //U32 MapBits = GL_MAP_READ_BIT; + U32 buffer_size = end-start+1; + + U8 * mptr = NULL; + mptr = (U8*) glMapBufferRange( target, start, end-start+1, MapBits); + + if (mptr) + { + std::memcpy(mptr, (U8*) data, buffer_size); + if(!glUnmapBuffer(target)) LL_WARNS() << "glUnmapBuffer() failed" << LL_ENDL; + } + else LL_WARNS() << "glMapBufferRange() returned NULL" << LL_ENDL; + + } + else + { + //LL_WARNS() << "flush_vbo mode 0" << LL_ENDL; // on OS X, flush_vbo doesn't actually write to the GL buffer, so be sure to call // _mapBuffer to tag the buffer for flushing to GL _mapBuffer(); LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("vb memcpy"); - //LOG_GLERROR("LLVertexBuffer::flush_vbo()"); // copy into mapped buffer memcpy(dst+start, data, end-start+1); + } } else { @@ -1428,7 +1457,7 @@ void LLVertexBuffer::_unmapBuffer() } }; - if (gGLManager.mIsApple) + if (gGLManager.mIsApple && sMPVertexBufferMode == 0) { LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 1"); if (mMappedData) @@ -1713,80 +1742,70 @@ void LLVertexBuffer::setupVertexBuffer() LOG_GLERROR("LLVertexBuffer::setupVertexBuffer()"); U8* base = nullptr; - AttributeType loc; - void* ptr = nullptr; - U32 data_mask = LLGLSLShader::sCurBoundShaderPtr->mAttributeMask; - if (data_mask & MAP_VERTEX) - { - loc = TYPE_VERTEX; - ptr = (void*)(base + mOffsets[TYPE_VERTEX]); - glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); - - LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_VERTEX"); - } - if (data_mask & MAP_NORMAL) { - loc = TYPE_NORMAL; - ptr = (void*)(base + mOffsets[TYPE_NORMAL]); + AttributeType loc = TYPE_NORMAL; + void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]); glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_NORMAL"); } - - if (data_mask & MAP_TEXCOORD0) + if (data_mask & MAP_TEXCOORD3) { - loc = TYPE_TEXCOORD0; - //glEnableVertexAttribArray(loc); - ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]); - glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); + AttributeType loc = TYPE_TEXCOORD3; + void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]); + glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); - LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD0"); + LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD3"); } + if (data_mask & MAP_TEXCOORD2) + { + AttributeType loc = TYPE_TEXCOORD2; + void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]); + glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); + LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD2"); + } if (data_mask & MAP_TEXCOORD1) { - loc = TYPE_TEXCOORD1; - ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]); + AttributeType loc = TYPE_TEXCOORD1; + void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]); glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD1"); } - - if (data_mask & MAP_TEXCOORD2) + if (data_mask & MAP_TANGENT) { - loc = TYPE_TEXCOORD2; - ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]); - glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); + AttributeType loc = TYPE_TANGENT; + void* ptr = (void*)(base + mOffsets[TYPE_TANGENT]); + glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); - LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD2"); + LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TANGENT"); } - - if (data_mask & MAP_TEXCOORD3) + if (data_mask & MAP_TEXCOORD0) { - loc = TYPE_TEXCOORD3; - ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]); - glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); + AttributeType loc = TYPE_TEXCOORD0; + //glEnableVertexAttribArray(loc); + void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]); + glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); - LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD3"); + LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD0"); } - if (data_mask & MAP_COLOR) { - loc = TYPE_COLOR; + AttributeType loc = TYPE_COLOR; //bind emissive instead of color pointer if emissive is present - ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]); + void* ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]); glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_COLOR"); } - if (data_mask & MAP_EMISSIVE) { - loc = TYPE_EMISSIVE; - ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]); + AttributeType loc = TYPE_EMISSIVE; + void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]); glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_EMISSIVE"); @@ -1799,60 +1818,55 @@ void LLVertexBuffer::setupVertexBuffer() LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_COLOR"); } } - - if (data_mask & MAP_TANGENT) - { - loc = TYPE_TANGENT; - ptr = (void*)(base + mOffsets[TYPE_TANGENT]); - glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); - - LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TANGENT"); - } - if (data_mask & MAP_WEIGHT) { - loc = TYPE_WEIGHT; - ptr = (void*)(base + mOffsets[TYPE_WEIGHT]); + AttributeType loc = TYPE_WEIGHT; + void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]); glVertexAttribPointer(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_WEIGHT"); } - if (data_mask & MAP_WEIGHT4) { - loc = TYPE_WEIGHT4; - ptr = (void*)(base + mOffsets[TYPE_WEIGHT4]); + AttributeType loc = TYPE_WEIGHT4; + void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT4]); glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_WEIGHT4"); } + if (data_mask & MAP_JOINT) + { + AttributeType loc = TYPE_JOINT; + void* ptr = (void*)(base + mOffsets[TYPE_JOINT]); + glVertexAttribIPointer(loc, 4, GL_UNSIGNED_SHORT, LLVertexBuffer::sTypeSize[TYPE_JOINT], ptr); + LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_JOINT"); + } if (data_mask & MAP_CLOTHWEIGHT) { - loc = TYPE_CLOTHWEIGHT; - ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]); + AttributeType loc = TYPE_CLOTHWEIGHT; + void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]); glVertexAttribPointer(loc, 4, GL_FLOAT, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_CLOTHWEIGHT"); } - if (data_mask & MAP_JOINT) - { - loc = TYPE_JOINT; - ptr = (void*)(base + mOffsets[TYPE_JOINT]); - glVertexAttribIPointer(loc, 4, GL_UNSIGNED_SHORT, LLVertexBuffer::sTypeSize[TYPE_JOINT], ptr); - - LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_JOINT"); - } - if (data_mask & MAP_TEXTURE_INDEX) { - loc = TYPE_TEXTURE_INDEX; - ptr = (void*)(base + mOffsets[TYPE_VERTEX] + 12); + AttributeType loc = TYPE_TEXTURE_INDEX; + void* ptr = (void*)(base + mOffsets[TYPE_VERTEX] + 12); glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXTURE_INDEX"); } + if (data_mask & MAP_VERTEX) + { + AttributeType loc = TYPE_VERTEX; + void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]); + glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); + + LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_VERTEX"); + } } void LLVertexBuffer::setPositionData(const LLVector4a* data) @@ -1966,3 +1980,7 @@ void LLVertexBuffer::setIndexData(const U32* data, U32 offset, U32 count) } flush_vbo(GL_ELEMENT_ARRAY_BUFFER, offset * sizeof(U32), (offset + count) * sizeof(U32) - 1, (U8*)data, mMappedIndexData); } + + + + diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 375ad76fb8..bf5f2b5ab6 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -109,7 +109,7 @@ public: return *this; } - static void initClass(LLWindow* window); + static void initClass(LLWindow* window, U32 mode_ = 0); static void cleanupClass(); static void setupClientArrays(U32 data_mask); static void drawArrays(U32 mode, const std::vector<LLVector3>& pos); @@ -128,6 +128,8 @@ public: // flush any pending mapped buffers static void flushBuffers(); + static U32 getVertexBufferMode(); + //WARNING -- when updating these enums you MUST // 1 - update LLVertexBuffer::sTypeSize // 2 - update LLVertexBuffer::vb_type_name |