diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llcubemap.cpp | 6 | ||||
| -rw-r--r-- | indra/llrender/llgl.cpp | 440 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 63 | ||||
| -rw-r--r-- | indra/llrender/llglheaders.h | 277 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 110 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.h | 2 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 50 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 2 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.cpp | 20 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 200 | 
10 files changed, 169 insertions, 1001 deletions
| diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp index e41765622f..254288a86e 100644 --- a/indra/llrender/llcubemap.cpp +++ b/indra/llrender/llcubemap.cpp @@ -67,7 +67,7 @@ void LLCubeMap::initGL()  {  	llassert(gGLManager.mInited); -	if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) +	if (LLCubeMap::sUseCubeMaps)  	{  		// Not initialized, do stuff.  		if (mImages[0].isNull()) @@ -252,7 +252,7 @@ void LLCubeMap::enable(S32 stage)  void LLCubeMap::enableTexture(S32 stage)  {  	mTextureStage = stage; -	if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps) +	if (stage >= 0 && LLCubeMap::sUseCubeMaps)  	{  		gGL.getTexUnit(stage)->enable(LLTexUnit::TT_CUBE_MAP);  	} @@ -265,7 +265,7 @@ void LLCubeMap::disable(void)  void LLCubeMap::disableTexture(void)  { -	if (gGLManager.mHasCubeMap && mTextureStage >= 0 && LLCubeMap::sUseCubeMaps) +	if (mTextureStage >= 0 && LLCubeMap::sUseCubeMaps)  	{  		gGL.getTexUnit(mTextureStage)->disable();  		if (mTextureStage == 0) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 5253ed3d51..71303b0517 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -86,15 +86,15 @@ void APIENTRY gl_debug_callback(GLenum source,                                  const GLchar* message,                                  GLvoid* userParam)  { -    /*if (severity != GL_DEBUG_SEVERITY_HIGH_ARB // && -        severity != GL_DEBUG_SEVERITY_MEDIUM_ARB && -        severity != GL_DEBUG_SEVERITY_LOW_ARB +    /*if (severity != GL_DEBUG_SEVERITY_HIGH // && +        severity != GL_DEBUG_SEVERITY_MEDIUM && +        severity != GL_DEBUG_SEVERITY_LOW          )      { //suppress out-of-spec messages sent by nvidia driver (mostly vertexbuffer hints)          return;      }*/ -    if (severity == GL_DEBUG_SEVERITY_HIGH_ARB) +    if (severity == GL_DEBUG_SEVERITY_HIGH)      {          LL_WARNS() << "----- GL ERROR --------" << LL_ENDL;      } @@ -107,7 +107,15 @@ void APIENTRY gl_debug_callback(GLenum source,      LL_WARNS() << "Severity: " << std::hex << severity << LL_ENDL;      LL_WARNS() << "Message: " << message << LL_ENDL;      LL_WARNS() << "-----------------------" << LL_ENDL; -    if (severity == GL_DEBUG_SEVERITY_HIGH_ARB) + +    GLint vao = 0; +    glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &vao); +    GLint vbo = 0; +    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &vbo); +    GLint ibo = 0; +    glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &ibo); + +    if (severity == GL_DEBUG_SEVERITY_HIGH)      {          LL_ERRS() << "Halting on GL Error" << LL_ENDL;      } @@ -931,44 +939,12 @@ LLGLManager gGLManager;  LLGLManager::LLGLManager() :  	mInited(FALSE),  	mIsDisabled(FALSE), - -	mHasMultitexture(FALSE), -	mHasATIMemInfo(FALSE), -	mHasAMDAssociations(FALSE), -	mHasNVXMemInfo(FALSE), -	mNumTextureUnits(1), -	mHasMipMapGeneration(FALSE), -	mHasCompressedTextures(FALSE), -	mHasFramebufferObject(FALSE),  	mMaxSamples(0), -	mHasBlendFuncSeparate(FALSE), -	mHasSync(FALSE), -	mHasVertexBufferObject(FALSE), -	mHasVertexArrayObject(FALSE), -	mHasMapBufferRange(FALSE), -	mHasFlushBufferRange(FALSE), -	mHasPBuffer(FALSE), -	mNumTextureImageUnits(0), -	mHasOcclusionQuery(FALSE), -	mHasTimerQuery(FALSE), -	mHasOcclusionQuery2(FALSE), -	mHasPointParameters(FALSE), -	mHasDrawBuffers(FALSE), -	mHasTextureRectangle(FALSE), -	mHasTextureMultisample(FALSE), -	mHasTransformFeedback(FALSE), -    mHasUniformBufferObject(FALSE), +	mNumTextureImageUnits(1),  	mMaxSampleMaskWords(0),  	mMaxColorTextureSamples(0),  	mMaxDepthTextureSamples(0),  	mMaxIntegerSamples(0), - -	mHasAnisotropic(FALSE), -	mHasARBEnvCombine(FALSE), -	mHasCubeMap(FALSE), -	mHasCubeMapArray(FALSE), -	mHasDebugOutput(FALSE), -  	mIsAMD(FALSE),  	mIsNVIDIA(FALSE),  	mIsIntel(FALSE), @@ -976,9 +952,6 @@ LLGLManager::LLGLManager() :  	mIsMobileGF(FALSE),  #endif  	mHasRequirements(TRUE), - -	mHasSeparateSpecularColor(FALSE), -  	mDriverVersionMajor(1),  	mDriverVersionMinor(0),  	mDriverVersionRelease(0), @@ -996,7 +969,6 @@ LLGLManager::LLGLManager() :  //---------------------------------------------------------------------  void LLGLManager::initWGL()  { -	mHasPBuffer = FALSE;  #if LL_WINDOWS && !LL_MESA_HEADLESS  	if (!glh_init_extensions("WGL_ARB_pixel_format"))  	{ @@ -1035,10 +1007,6 @@ void LLGLManager::initWGL()  	{  		LL_WARNS("RenderInit") << "No ARB WGL render texture extensions" << LL_ENDL;  	} - -	mHasPBuffer = ExtensionExists("WGL_ARB_pbuffer", gGLHExts.mSysExts) && -					ExtensionExists("WGL_ARB_render_texture", gGLHExts.mSysExts) && -					ExtensionExists("WGL_ARB_pixel_format", gGLHExts.mSysExts);  #endif  } @@ -1052,7 +1020,7 @@ bool LLGLManager::initGL()  	stop_glerror(); -#if LL_WINDOWS +#if 0 && LL_WINDOWS  	if (!glGetStringi)  	{  		glGetStringi = (PFNGLGETSTRINGIPROC) GLH_EXT_GET_PROC_ADDRESS("glGetStringi"); @@ -1199,23 +1167,6 @@ bool LLGLManager::initGL()  	}  #endif -	if (mHasATIMemInfo && mVRAM == 0) -	{ //ask the gl how much vram is free at startup and attempt to use no more than half of that -		S32 meminfo[4]; -		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); - -		mVRAM = meminfo[0] / 1024; -		LL_WARNS("RenderInit") << "VRAM Detected (ATIMemInfo):" << mVRAM << LL_ENDL; -	} - -	if (mHasNVXMemInfo && mVRAM == 0) -	{ -		S32 dedicated_memory; -		glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory); -		mVRAM = dedicated_memory/1024; -		LL_WARNS("RenderInit") << "VRAM Detected (NVXMemInfo):" << mVRAM << LL_ENDL; -	} -  #if LL_WINDOWS  	if (mVRAM < 256)  	{ @@ -1243,62 +1194,22 @@ bool LLGLManager::initGL()  	stop_glerror(); -	GLint num_tex_image_units; -	glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units); -	mNumTextureImageUnits = llmin(num_tex_image_units, 32); - -    if (mHasMultitexture) +	glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mNumTextureImageUnits); +    stop_glerror(); +	glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples); +    stop_glerror(); +	glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples); +    stop_glerror(); +	glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples); +    stop_glerror(); +	glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords); +    stop_glerror(); +    glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples); +    stop_glerror(); +    if (mGLVersion >= 4.59f)      { -        if (LLRender::sGLCoreProfile) -        { -            mNumTextureUnits = llmin(mNumTextureImageUnits, MAX_GL_TEXTURE_UNITS); -        } -        else -        { -            GLint num_tex_units; -            glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &num_tex_units); -            mNumTextureUnits = llmin(num_tex_units, (GLint)MAX_GL_TEXTURE_UNITS); -            if (mIsIntel) -            { -                mNumTextureUnits = llmin(mNumTextureUnits, 2); -            } -        } +        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &mMaxAnisotropy);      } -	else -	{ -		mHasRequirements = FALSE; - -		// We don't support cards that don't support the GL_ARB_multitexture extension -		LL_WARNS("RenderInit") << "GL Drivers do not support GL_ARB_multitexture" << LL_ENDL; -		return false; -	} -	 -	stop_glerror(); - -	if (mHasTextureMultisample) -	{ -		glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples); -		glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples); -		glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples); -		glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords); -	} - -	stop_glerror(); - -	//HACK always disable texture multisample, use FXAA instead -	mHasTextureMultisample = FALSE; -#if LL_WINDOWS -	if (mIsIntel && mGLVersion <= 3.f) -	{ //never try to use framebuffer objects on older intel drivers (crashy) -		mHasFramebufferObject = FALSE; -	} -#endif - -	if (mHasFramebufferObject) -	{ -		glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples); -	} -  	stop_glerror();  	initGLStates(); @@ -1406,62 +1317,22 @@ void LLGLManager::asLLSD(LLSD& info)  	info["vram"] = mVRAM; -	// Extensions used by everyone -	info["has_multitexture"] = mHasMultitexture; -	info["has_ati_mem_info"] = mHasATIMemInfo; -	info["has_nvx_mem_info"] = mHasNVXMemInfo; -	info["num_texture_units"] = mNumTextureUnits; -	info["has_mip_map_generation"] = mHasMipMapGeneration; -	info["has_compressed_textures"] = mHasCompressedTextures; -	info["has_framebuffer_object"] = mHasFramebufferObject; +	// OpenGL limits  	info["max_samples"] = mMaxSamples; -	info["has_blend_func_separate"] = mHasBlendFuncSeparate || LLRender::sGLCoreProfile; - -	// ARB Extensions -	info["has_vertex_buffer_object"] = mHasVertexBufferObject; -	info["has_vertex_array_object"] = mHasVertexArrayObject; -	info["has_sync"] = mHasSync; -	info["has_map_buffer_range"] = mHasMapBufferRange; -	info["has_flush_buffer_range"] = mHasFlushBufferRange; -	info["has_pbuffer"] = mHasPBuffer; -    info["has_shader_objects"] = std::string("Assumed TRUE");   // was mHasShaderObjects; -	info["has_vertex_shader"] = std::string("Assumed TRUE");    // was mHasVertexShader; -	info["has_fragment_shader"] = std::string("Assumed TRUE");  // was mHasFragmentShader;  	info["num_texture_image_units"] =  mNumTextureImageUnits; -	info["has_occlusion_query"] = mHasOcclusionQuery; -	info["has_timer_query"] = mHasTimerQuery; -	info["has_occlusion_query2"] = mHasOcclusionQuery2; -	info["has_point_parameters"] = mHasPointParameters; -	info["has_draw_buffers"] = mHasDrawBuffers; -	info["has_depth_clamp"] = mHasDepthClamp; -	info["has_texture_rectangle"] = mHasTextureRectangle; -	info["has_texture_multisample"] = mHasTextureMultisample; -	info["has_transform_feedback"] = mHasTransformFeedback;  	info["max_sample_mask_words"] = mMaxSampleMaskWords;  	info["max_color_texture_samples"] = mMaxColorTextureSamples;  	info["max_depth_texture_samples"] = mMaxDepthTextureSamples;  	info["max_integer_samples"] = mMaxIntegerSamples; +    info["max_vertex_range"] = mGLMaxVertexRange; +    info["max_index_range"] = mGLMaxIndexRange; +    info["max_texture_size"] = mGLMaxTextureSize; -	// Other extensions. -	info["has_anisotropic"] = mHasAnisotropic; -	info["has_arb_env_combine"] = mHasARBEnvCombine; -	info["has_cube_map"] = mHasCubeMap; -	info["has_debug_output"] = mHasDebugOutput; -	info["has_srgb_texture"] = mHassRGBTexture; -	info["has_srgb_framebuffer"] = mHassRGBFramebuffer; -    info["has_texture_srgb_decode"] = mHasTexturesRGBDecode; - -	// Vendor-specific extensions +	// Which vendor  	info["is_ati"] = mIsAMD;  // note, do not rename is_ati to is_amd without coordinating with DW  	info["is_nvidia"] = mIsNVIDIA;  	info["is_intel"] = mIsIntel; -	// Other fields -	info["has_requirements"] = mHasRequirements; -	info["has_separate_specular_color"] = mHasSeparateSpecularColor; -	info["max_vertex_range"] = mGLMaxVertexRange; -	info["max_index_range"] = mGLMaxIndexRange; -	info["max_texture_size"] = mGLMaxTextureSize;  	info["gl_renderer"] = mGLRenderer;  } @@ -1480,60 +1351,6 @@ void LLGLManager::shutdownGL()  void LLGLManager::initExtensions()  { -#if LL_MESA_HEADLESS -# ifdef GL_ARB_multitexture -	mHasMultitexture = TRUE; -# else -	mHasMultitexture = FALSE; -# endif // GL_ARB_multitexture -# ifdef GL_ARB_texture_env_combine -	mHasARBEnvCombine = TRUE;	 -# else -	mHasARBEnvCombine = FALSE; -# endif // GL_ARB_texture_env_combine -# ifdef GL_ARB_texture_compression -	mHasCompressedTextures = TRUE; -# else -	mHasCompressedTextures = FALSE; -# endif // GL_ARB_texture_compression -# ifdef GL_ARB_vertex_buffer_object -	mHasVertexBufferObject = TRUE; -# else -	mHasVertexBufferObject = FALSE; -# endif // GL_ARB_vertex_buffer_object -# ifdef GL_EXT_framebuffer_object -	mHasFramebufferObject = TRUE; -# else -	mHasFramebufferObject = FALSE; -# endif // GL_EXT_framebuffer_object -# ifdef GL_ARB_draw_buffers -	mHasDrawBuffers = TRUE; -#else -	mHasDrawBuffers = FALSE; -# endif // GL_ARB_draw_buffers -# if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) -	mHasDepthClamp = TRUE; -#else -	mHasDepthClamp = FALSE; -#endif // defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) -# if GL_EXT_blend_func_separate -	mHasBlendFuncSeparate = TRUE; -#else -	mHasBlendFuncSeparate = FALSE; -# endif // GL_EXT_blend_func_separate -	mHasMipMapGeneration = FALSE; -	mHasSeparateSpecularColor = FALSE; -	mHasAnisotropic = FALSE; -	mHasCubeMap = FALSE; -	mHasOcclusionQuery = FALSE; -	mHasPointParameters = FALSE; -	mHasTextureRectangle = FALSE; -#else // LL_MESA_HEADLESS //important, gGLHExts.mSysExts is uninitialized until after glh_init_extensions is called - -    mHasMultitexture = TRUE; -    mHasCubeMap = TRUE; -    mHasCompressedTextures = TRUE; -  #if LL_DARWIN      GLint num_extensions = 0;      std::string all_extensions{""}; @@ -1550,173 +1367,12 @@ void LLGLManager::initExtensions()      }  #endif -    mHasSeparateSpecularColor = ExtensionExists("GL_EXT_separate_specular_color", gGLHExts.mSysExts); -    mHasAnisotropic = ExtensionExists("GL_EXT_texture_filter_anisotropic", gGLHExts.mSysExts); - -    // In core profile -    mHasARBEnvCombine = TRUE; //ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts); -    mHasTimerQuery = FALSE; //FIXME //ExtensionExists("GL_ARB_timer_query", gGLHExts.mSysExts); -    mHasOcclusionQuery = TRUE; //ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts); -    mHasOcclusionQuery2 = TRUE; // ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts); -    mHasVertexBufferObject = TRUE; //ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts); -    mHasVertexArrayObject = TRUE; //ExtensionExists("GL_ARB_vertex_array_object", gGLHExts.mSysExts); -    mHasMapBufferRange = TRUE; ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts); -    mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts); // Apple has mHasMapBufferRange now -    mHasSync = TRUE; //ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts); -    mHasFramebufferObject = TRUE; //ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts); -    mHassRGBFramebuffer = TRUE; //ExtensionExists("GL_ARB_framebuffer_sRGB", gGLHExts.mSysExts); -    mHasDrawBuffers = TRUE; //ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts); -    mHasTextureRectangle = TRUE; //ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts); -    mHasTextureMultisample = TRUE; //ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts); -    mHasUniformBufferObject = TRUE; //ExtensionExists("GL_ARB_uniform_buffer_object", gGLHExts.mSysExts); -    mHasCubeMapArray = TRUE; //ExtensionExists("GL_ARB_texture_cube_map_array", gGLHExts.mSysExts); -    mHasPointParameters = TRUE; //ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts); - -    mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts); //Basic AMD method, also see mHasAMDAssociations -    mHasNVXMemInfo = ExtensionExists("GL_NVX_gpu_memory_info", gGLHExts.mSysExts); -    // NOTE: Using extensions breaks reflections when Shadows are set to projector.  See: SL-16727 -    //mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts); -    mHasDepthClamp = FALSE; -    // mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad - -#ifdef GL_EXT_texture_sRGB -    mHassRGBTexture = ExtensionExists("GL_EXT_texture_sRGB", gGLHExts.mSysExts); -#endif -     -     -#ifdef GL_EXT_texture_sRGB_decode -    mHasTexturesRGBDecode = ExtensionExists("GL_EXT_texture_sRGB_decode", gGLHExts.mSysExts); -#else -    mHasTexturesRGBDecode = ExtensionExists("GL_ARB_texture_sRGB_decode", gGLHExts.mSysExts); -#endif - -    mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f; +    // OpenGL 4.x capabilities +    mHasCubeMapArray = mGLVersion >= 3.99f;  +    mHasTransformFeedback = mGLVersion >= 3.99f; +    mHasDebugOutput = mGLVersion >= 4.29f; -    mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts); -    mHasDebugOutput = mGLVersion >= 4.3f ? TRUE : FALSE; -    mHasTransformFeedback = mGLVersion >= 4.f ? TRUE : FALSE; -#endif - -#if LL_LINUX -	LL_INFOS() << "initExtensions() checking shell variables to adjust features..." << LL_ENDL; -	// Our extension support for the Linux Client is very young with some -	// potential driver gotchas, so offer a semi-secret way to turn it off. -	if (getenv("LL_GL_NOEXT")) -	{ -		//mHasMultitexture = FALSE; // NEEDED! -		mHasDepthClamp = FALSE; -		mHasARBEnvCombine = FALSE; -		mHasCompressedTextures = FALSE; -		mHasVertexBufferObject = FALSE; -		mHasFramebufferObject = FALSE; -		mHasDrawBuffers = FALSE; -		mHasBlendFuncSeparate = FALSE; -		mHasMipMapGeneration = FALSE; -		mHasSeparateSpecularColor = FALSE; -		mHasAnisotropic = FALSE; -		mHasCubeMap = FALSE; -		mHasOcclusionQuery = FALSE; -		mHasPointParameters = FALSE; -		LL_WARNS("RenderInit") << "GL extension support DISABLED via LL_GL_NOEXT" << LL_ENDL; -	} -	else if (getenv("LL_GL_BASICEXT"))	/* Flawfinder: ignore */ -	{ -		// This switch attempts to turn off all support for exotic -		// extensions which I believe correspond to fatal driver -		// bug reports.  This should be the default until we get a -		// proper blacklist/whitelist on Linux. -		mHasMipMapGeneration = FALSE; -		mHasAnisotropic = FALSE; -		//mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar -		//mHasOcclusionQuery = FALSE; // source of many ATI system hangs -		mHasBlendFuncSeparate = FALSE; -		LL_WARNS("RenderInit") << "GL extension support forced to SIMPLE level via LL_GL_BASICEXT" << LL_ENDL; -	} -	if (getenv("LL_GL_BLACKLIST"))	/* Flawfinder: ignore */ -	{ -		// This lets advanced troubleshooters disable specific -		// GL extensions to isolate problems with their hardware. -		// SL-28126 -		const char *const blacklist = getenv("LL_GL_BLACKLIST");	/* Flawfinder: ignore */ -		LL_WARNS("RenderInit") << "GL extension support partially disabled via LL_GL_BLACKLIST: " << blacklist << LL_ENDL; -		if (strchr(blacklist,'a')) mHasARBEnvCombine = FALSE; -		if (strchr(blacklist,'b')) mHasCompressedTextures = FALSE; -		if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE; -		if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S -// 		if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S -// 		if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S -		if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE; -		if (strchr(blacklist,'i')) mHasAnisotropic = FALSE;//S -		if (strchr(blacklist,'j')) mHasCubeMap = FALSE;//S -// 		if (strchr(blacklist,'k')) mHasATIVAO = FALSE;//S -		if (strchr(blacklist,'l')) mHasOcclusionQuery = FALSE; -		if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S -		if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S -		if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S -		if (strchr(blacklist,'s')) mHasTextureRectangle = FALSE; -		if (strchr(blacklist,'t')) mHasBlendFuncSeparate = FALSE;//S -		if (strchr(blacklist,'u')) mHasDepthClamp = FALSE; -		 -	} -#endif // LL_LINUX -	 -	if (!mHasMultitexture) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize multitexturing" << LL_ENDL; -	} -	if (!mHasMipMapGeneration) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize mipmap generation" << LL_ENDL; -	} -	if (!mHasARBEnvCombine) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_env_combine" << LL_ENDL; -	} -	if (!mHasSeparateSpecularColor) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize separate specular color" << LL_ENDL; -	} -	if (!mHasAnisotropic) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize anisotropic filtering" << LL_ENDL; -	} -	if (!mHasCompressedTextures) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_compression" << LL_ENDL; -	} -	if (!mHasOcclusionQuery) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query" << LL_ENDL; -	} -	if (!mHasOcclusionQuery2) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query2" << LL_ENDL; -	} -	if (!mHasPointParameters) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_point_parameters" << LL_ENDL; -	} -	if (!mHasBlendFuncSeparate && !LLRender::sGLCoreProfile) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_EXT_blend_func_separate" << LL_ENDL; -	} -	if (!mHasDrawBuffers) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_draw_buffers" << LL_ENDL; -	} -	if (!mHasCubeMapArray) -	{ -		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_cube_map_array" << LL_ENDL; -	} - -	// Disable certain things due to known bugs -	if (mIsIntel && mHasMipMapGeneration) -	{ -		LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL; -		mHasMipMapGeneration = FALSE; -	} - -	// Misc +    // Misc  	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);  	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);  	glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize); @@ -2795,7 +2451,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)  	glh::matrix4f identity;  	identity.identity(); -	for (GLint i = 1; i < gGLManager.mNumTextureUnits; i++) +	for (GLint i = 1; i < gGLManager.mNumTextureImageUnits; i++)  	{  		gGL.getTexUnit(i)->activate(); @@ -2833,12 +2489,6 @@ void LLGLState::checkTextureChannels(const std::string& msg)  			for (S32 j = (i == 0 ? 1 : 0);   				j < 9; j++)  			{ -				if (j == 8 && !gGLManager.mHasTextureRectangle || -					j == 9 && !gGLManager.mHasTextureMultisample) -				{ -					continue; -				} -				  				if (glIsEnabled(value[j]))  				{  					error = TRUE; @@ -3329,36 +2979,29 @@ LLGLSquashToFarClip::~LLGLSquashToFarClip()  LLGLSyncFence::LLGLSyncFence()  { -#ifdef GL_ARB_sync  	mSync = 0; -#endif  }  LLGLSyncFence::~LLGLSyncFence()  { -#ifdef GL_ARB_sync  	if (mSync)  	{  		glDeleteSync(mSync);  	} -#endif  }  void LLGLSyncFence::placeFence()  { -#ifdef GL_ARB_sync  	if (mSync)  	{  		glDeleteSync(mSync);  	}  	mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); -#endif  }  bool LLGLSyncFence::isCompleted()  {  	bool ret = true; -#ifdef GL_ARB_sync  	if (mSync)  	{  		GLenum status = glClientWaitSync(mSync, 0, 1); @@ -3367,13 +3010,11 @@ bool LLGLSyncFence::isCompleted()  			ret = false;  		}  	} -#endif  	return ret;  }  void LLGLSyncFence::wait()  { -#ifdef GL_ARB_sync  	if (mSync)  	{  		while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED) @@ -3382,7 +3023,6 @@ void LLGLSyncFence::wait()  			waits++;  		}  	} -#endif  }  LLGLSPipelineSkyBox::LLGLSPipelineSkyBox() diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 3c40f85654..e3c07604aa 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -76,52 +76,27 @@ public:  	BOOL mInited;  	BOOL mIsDisabled; -	// Extensions used by everyone -	BOOL mHasMultitexture; -	BOOL mHasATIMemInfo; -	BOOL mHasAMDAssociations; -	BOOL mHasNVXMemInfo; -	S32	 mNumTextureUnits; -	BOOL mHasMipMapGeneration; -	BOOL mHasCompressedTextures; -	BOOL mHasFramebufferObject; +	// OpenGL limits  	S32 mMaxSamples; -	BOOL mHasBlendFuncSeparate; -		 -	// ARB Extensions -	BOOL mHasVertexBufferObject; -	BOOL mHasVertexArrayObject; -	BOOL mHasSync; -	BOOL mHasMapBufferRange; -	BOOL mHasFlushBufferRange; -	BOOL mHasPBuffer; -	S32  mNumTextureImageUnits; -	BOOL mHasOcclusionQuery; -	BOOL mHasTimerQuery; -	BOOL mHasOcclusionQuery2; -	BOOL mHasPointParameters; -	BOOL mHasDrawBuffers; -	BOOL mHasDepthClamp; -	BOOL mHasTextureRectangle; -	BOOL mHasTextureMultisample; -	BOOL mHasTransformFeedback; -    BOOL mHasUniformBufferObject; +	S32 mNumTextureImageUnits;  	S32 mMaxSampleMaskWords;  	S32 mMaxColorTextureSamples;  	S32 mMaxDepthTextureSamples;  	S32 mMaxIntegerSamples; - -	// Other extensions. -	BOOL mHasAnisotropic; -	BOOL mHasARBEnvCombine; -	BOOL mHasCubeMap; -	BOOL mHasCubeMapArray; -	BOOL mHasDebugOutput; -	BOOL mHassRGBTexture; -	BOOL mHassRGBFramebuffer; -    BOOL mHasTexturesRGBDecode; - +    S32 mGLMaxVertexRange; +    S32 mGLMaxIndexRange; +    S32 mGLMaxTextureSize; +    F32 mMaxAnisotropy = 0.f; + +	// GL 4.x capabilities +	bool mHasCubeMapArray = false; +	bool mHasDebugOutput = false; +    bool mHasTransformFeedback = false; +    bool mHasAnisotropic = false; +	  	// Vendor-specific extensions +    bool mHasAMDAssociations = false; +  	BOOL mIsAMD;  	BOOL mIsNVIDIA;  	BOOL mIsIntel; @@ -134,9 +109,6 @@ public:  	// Whether this version of GL is good enough for SL to use  	BOOL mHasRequirements; -	// Misc extensions -	BOOL mHasSeparateSpecularColor; -  	S32 mDriverVersionMajor;  	S32 mDriverVersionMinor;  	S32 mDriverVersionRelease; @@ -147,9 +119,6 @@ public:  	std::string mGLVersionString;  	S32 mVRAM; // VRAM in MB -	S32 mGLMaxVertexRange; -	S32 mGLMaxIndexRange; -	S32 mGLMaxTextureSize;  	void getPixelFormat(); // Get the best pixel format @@ -415,9 +384,7 @@ public:  class LLGLSyncFence : public LLGLFence  {  public: -#ifdef GL_ARB_sync  	GLsync mSync; -#endif  	LLGLSyncFence();  	virtual ~LLGLSyncFence(); diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index f2b51fbafb..0aacf3bf0e 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -41,277 +41,6 @@  # include "GL/glh_extensions.h"  # undef __APPLE__ -#elif LL_LINUX -//---------------------------------------------------------------------------- -// LL_LINUX - -//---------------------------------------------------------------------------- -// Linux, MESA headers, but not necessarily assuming MESA runtime. -// quotes so we get libraries/.../GL/ version -#include "GL/gl.h" -#include "GL/glext.h" -#include "GL/glu.h" - - -#if LL_LINUX && !LL_MESA_HEADLESS -// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly -# define __APPLE__ -# include "GL/glh_extensions.h" -# undef __APPLE__ - -/* Although SDL very likely ends up calling glXGetProcAddress() itself, -   if we use SDL_GL_GetProcAddress() then we get bogus addresses back on -   some systems.  Weird. */ -/*# include "SDL/SDL.h" -  # define GLH_EXT_GET_PROC_ADDRESS(p) SDL_GL_GetProcAddress(p) */ -#define GLX_GLXEXT_PROTOTYPES 1 -# include "GL/glx.h" -# include "GL/glxext.h" -// Use glXGetProcAddressARB instead of glXGetProcAddress - the ARB symbol -// is considered 'legacy' but works on more machines. -# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddress((const GLubyte*)(p)) -#endif // LL_LINUX && !LL_MESA_HEADLESS - -#if LL_LINUX && defined(WINGDIAPI) -// WINGDIAPI gets set if we are using the linux nvidia gl.h header which needs -// the functions below setting up. -# define LL_LINUX_NV_GL_HEADERS 1 -#else -# define LL_LINUX_NV_GL_HEADERS 0 -#endif // LL_LINUX && defined(WINGDIAPI) - - -#if LL_LINUX_NV_GL_HEADERS -// Missing functions when using nvidia headers: -extern PFNGLACTIVETEXTUREPROC	glActiveTexture; -extern PFNGLCLIENTACTIVETEXTUREPROC	glClientActiveTexture; -extern PFNGLDRAWRANGEELEMENTSPROC 	glDrawRangeElements; -#endif // LL_LINUX_NV_GL_HEADERS - -// GL_ARB_vertex_array_object -extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray; -extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; -extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; -extern PFNGLISVERTEXARRAYPROC glIsVertexArray; - -// GL_ARB_vertex_buffer_object -extern PFNGLBINDBUFFERPROC		glBindBuffer; -extern PFNGLDELETEBUFFERSPROC	glDeleteBuffers; -extern PFNGLGENBUFFERSPROC		glGenBuffers; -extern PFNGLISBUFFERPROC			glIsBuffer; -extern PFNGLBUFFERDATAPROC		glBufferData; -extern PFNGLBUFFERSUBDATAPROC	glBufferSubData; -extern PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData; -extern PFNGLMAPBUFFERPROC		glMapBuffer; -extern PFNGLUNMAPBUFFERPROC		glUnmapBuffer; -extern PFNGLGETBUFFERPARAMETERIVPROC	glGetBufferParameteriv; -extern PFNGLGETBUFFERPOINTERVPROC	glGetBufferPointerv; - -// GL_ARB_sync -extern PFNGLFENCESYNCPROC				glFenceSync; -extern PFNGLISSYNCPROC					glIsSync; -extern PFNGLDELETESYNCPROC				glDeleteSync; -extern PFNGLCLIENTWAITSYNCPROC			glClientWaitSync; -extern PFNGLWAITSYNCPROC				glWaitSync; -extern PFNGLGETINTEGER64VPROC			glGetInteger64v; -extern PFNGLGETSYNCIVPROC				glGetSynciv; - -// GL_APPLE_flush_buffer_range -extern PFNGLBUFFERPARAMETERIAPPLEPROC	glBufferParameteriAPPLE; -extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE; - -// GL_ARB_map_buffer_range -extern PFNGLMAPBUFFERRANGEPROC			glMapBufferRange; -extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC	glFlushMappedBufferRange; - -// GL_ATI_vertex_array_object -extern PFNGLNEWOBJECTBUFFERATIPROC			glNewObjectBufferATI; -extern PFNGLISOBJECTBUFFERATIPROC			glIsObjectBufferATI; -extern PFNGLUPDATEOBJECTBUFFERATIPROC		glUpdateObjectBufferATI; -extern PFNGLGETOBJECTBUFFERFVATIPROC		glGetObjectBufferfvATI; -extern PFNGLGETOBJECTBUFFERIVATIPROC		glGetObjectBufferivATI; -extern PFNGLFREEOBJECTBUFFERATIPROC		    glFreeObjectBufferATI; -extern PFNGLARRAYOBJECTATIPROC				glArrayObjectATI; -extern PFNGLVERTEXATTRIBARRAYOBJECTATIPROC	glVertexAttribArrayObjectATI; -extern PFNGLGETARRAYOBJECTFVATIPROC			glGetArrayObjectfvATI; -extern PFNGLGETARRAYOBJECTIVATIPROC			glGetArrayObjectivATI; -extern PFNGLVARIANTARRAYOBJECTATIPROC		glVariantObjectArrayATI; -extern PFNGLGETVARIANTARRAYOBJECTFVATIPROC	glGetVariantArrayObjectfvATI; -extern PFNGLGETVARIANTARRAYOBJECTIVATIPROC	glGetVariantArrayObjectivATI; - -// GL_ARB_occlusion_query -extern PFNGLGENQUERIESPROC glGenQueries; -extern PFNGLDELETEQUERIESPROC glDeleteQueries; -extern PFNGLISQUERYPROC glIsQuery; -extern PFNGLBEGINQUERYPROC glBeginQuery; -extern PFNGLENDQUERYPROC glEndQuery; -extern PFNGLGETQUERYIVPROC glGetQueryiv; -extern PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv; -extern PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv; - -// GL_ARB_timer_query -extern PFNGLQUERYCOUNTERPROC glQueryCounter; -extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v; -extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; - -// GL_ARB_point_parameters -extern PFNGLPOINTPARAMETERFPROC glPointParameterf; -extern PFNGLPOINTPARAMETERFVPROC glPointParameterfv; - -// GL_ARB_shader_objects -extern PFNGLDELETEOBJECTPROC glDeleteObject; -extern PFNGLGETHANDLEPROC glGetHandle; -extern PFNGLDETACHOBJECTPROC glDetachObject; -extern PFNGLCREATESHADEROBJECTPROC glCreateShaderObject; -extern PFNGLSHADERSOURCEPROC glShaderSource; -extern PFNGLCOMPILESHADERPROC glCompileShader; -extern PFNGLCREATEPROGRAMOBJECTPROC glCreateProgramObject; -extern PFNGLATTACHOBJECTPROC glAttachObject; -extern PFNGLLINKPROGRAMPROC glLinkProgram; -extern PFNGLUSEPROGRAMOBJECTPROC glUseProgramObject; -extern PFNGLVALIDATEPROGRAMPROC glValidateProgram; -extern PFNGLUNIFORM1FPROC glUniform1f; -extern PFNGLUNIFORM2FPROC glUniform2f; -extern PFNGLUNIFORM3FPROC glUniform3f; -extern PFNGLUNIFORM4FPROC glUniform4f; -extern PFNGLUNIFORM1IPROC glUniform1i; -extern PFNGLUNIFORM2IPROC glUniform2i; -extern PFNGLUNIFORM3IPROC glUniform3i; -extern PFNGLUNIFORM4IPROC glUniform4i; -extern PFNGLUNIFORM1FVPROC glUniform1fv; -extern PFNGLUNIFORM2FVPROC glUniform2fv; -extern PFNGLUNIFORM3FVPROC glUniform3fv; -extern PFNGLUNIFORM4FVPROC glUniform4fv; -extern PFNGLUNIFORM1IVPROC glUniform1iv; -extern PFNGLUNIFORM2IVPROC glUniform2iv; -extern PFNGLUNIFORM3IVPROC glUniform3iv; -extern PFNGLUNIFORM4IVPROC glUniform4iv; -extern PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv; -extern PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv; -extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; -extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; -extern PFNGLGETOBJECTPARAMETERFVPROC glGetObjectParameterfv; -extern PFNGLGETOBJECTPARAMETERIVPROC glGetObjectParameteriv; -extern PFNGLGETINFOLOGPROC glGetInfoLog; -extern PFNGLGETATTACHEDOBJECTSPROC glGetAttachedObjects; -extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; -extern PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform; -extern PFNGLGETUNIFORMFVPROC glGetUniformfv; -extern PFNGLGETUNIFORMIVPROC glGetUniformiv; -extern PFNGLGETSHADERSOURCEPROC glGetShaderSource; - -// GL_ARB_vertex_shader -extern PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d; -extern PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv; -extern PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f; -extern PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv; -extern PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s; -extern PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv; -extern PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d; -extern PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv; -extern PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f; -extern PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv; -extern PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s; -extern PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv; -extern PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d; -extern PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv; -extern PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f; -extern PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv; -extern PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s; -extern PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv; -extern PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4nbv; -extern PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4niv; -extern PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4nsv; -extern PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4nub; -extern PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4nubv; -extern PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4nuiv; -extern PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4nusv; -extern PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv; -extern PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d; -extern PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv; -extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f; -extern PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv; -extern PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv; -extern PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s; -extern PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv; -extern PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv; -extern PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv; -extern PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv; -extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; -extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; -extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; -extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; -extern PFNGLPROGRAMSTRINGPROC glProgramString; -extern PFNGLBINDPROGRAMPROC glBindProgram; -extern PFNGLDELETEPROGRAMSPROC glDeletePrograms; -extern PFNGLGENPROGRAMSPROC glGenPrograms; -extern PFNGLPROGRAMENVPARAMETER4DPROC glProgramEnvParameter4d; -extern PFNGLPROGRAMENVPARAMETER4DVPROC glProgramEnvParameter4dv; -extern PFNGLPROGRAMENVPARAMETER4FPROC glProgramEnvParameter4f; -extern PFNGLPROGRAMENVPARAMETER4FVPROC glProgramEnvParameter4fv; -extern PFNGLPROGRAMLOCALPARAMETER4DPROC glProgramLocalParameter4d; -extern PFNGLPROGRAMLOCALPARAMETER4DVPROC glProgramLocalParameter4dv; -extern PFNGLPROGRAMLOCALPARAMETER4FPROC glProgramLocalParameter4f; -extern PFNGLPROGRAMLOCALPARAMETER4FVPROC glProgramLocalParameter4fv; -extern PFNGLGETPROGRAMENVPARAMETERDVPROC glGetProgramEnvParameterdv; -extern PFNGLGETPROGRAMENVPARAMETERFVPROC glGetProgramEnvParameterfv; -extern PFNGLGETPROGRAMLOCALPARAMETERDVPROC glGetProgramLocalParameterdv; -extern PFNGLGETPROGRAMLOCALPARAMETERFVPROC glGetProgramLocalParameterfv; -extern PFNGLGETPROGRAMIVPROC glGetProgramiv; -extern PFNGLGETPROGRAMSTRINGPROC glGetProgramString; -extern PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv; -extern PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv; -extern PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv; -extern PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv; -extern PFNGLISPROGRAMPROC glIsProgram; -extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; -extern PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib; -extern PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; - -extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; -extern PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage; - -//GL_EXT_blend_func_separate -extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; - -//GL_ARB_framebuffer_object -extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer; -extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; -extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; -extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; -extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; -extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; -extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer; -extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; -extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; -extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; -extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; -extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; -extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; -extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; -extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; -extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; -extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; -extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; -extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; -extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; - -//GL_ARB_draw_buffers -extern PFNGLDRAWBUFFERSPROC glDrawBuffers; - -//GL_ARB_texture_multisample -extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; -extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample; -extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv; -extern PFNGLSAMPLEMASKIPROC glSampleMaski; - -//transform feedback (4.0 core) -extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; -extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; -extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; -extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange; -extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; -  #elif LL_WINDOWS  //----------------------------------------------------------------------------  // LL_WINDOWS @@ -345,12 +74,6 @@ extern PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;  // WGL_ARB_create_context  extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; -// GL_VERSION_1_2 -//extern PFNGLDRAWRANGEELEMENTSPROC  glDrawRangeElements; -//extern PFNGLTEXIMAGE3DPROC         glTexImage3D; -//extern PFNGLTEXSUBIMAGE3DPROC      glTexSubImage3D; -//extern PFNGLCOPYTEXSUBIMAGE3DPROC  glCopyTexSubImage3D; -  // GL_VERSION_1_3  extern PFNGLACTIVETEXTUREPROC               glActiveTexture;  extern PFNGLSAMPLECOVERAGEPROC              glSampleCoverage; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index d8e312106c..6eb7da302f 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -352,7 +352,7 @@ void LLImageGL::updateStats(F32 current_time)  //static   void LLImageGL::destroyGL(BOOL save_state)  { -	for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++) +	for (S32 stage = 0; stage < gGLManager.mNumTextureImageUnits; stage++)  	{  		gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);  	} @@ -520,7 +520,6 @@ void LLImageGL::init(BOOL usemipmaps)  	mPickMaskHeight = 0;  	mUseMipMaps = usemipmaps;  	mHasExplicitFormat = FALSE; -	mAutoGenMips = FALSE;  	mIsMask = FALSE;  	mNeedsAlphaAndPickMask = TRUE ; @@ -1069,30 +1068,12 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)                  mFormatType     = GL_UNSIGNED_BYTE;                  break;              case 3: -#if USE_SRGB_DECODE -                if (gGLManager.mHasTexturesRGBDecode) -                { -                    mFormatInternal = GL_SRGB8; -                } -                else -#endif -                { -                    mFormatInternal = GL_RGB8; -                } +                mFormatInternal = GL_RGB8;                  mFormatPrimary = GL_RGB;                  mFormatType    = GL_UNSIGNED_BYTE;                  break;              case 4: -#if USE_SRGB_DECODE -                if (gGLManager.mHasTexturesRGBDecode) -                { -                    mFormatInternal = GL_SRGB8_ALPHA8; -                } -                else -#endif -                { -                    mFormatInternal = GL_RGBA8; -                } +                mFormatInternal = GL_RGBA8;                  mFormatPrimary = GL_RGBA;                  mFormatType    = GL_UNSIGNED_BYTE;                  break; @@ -1525,30 +1506,12 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S              mFormatType = GL_UNSIGNED_BYTE;              break;          case 3: -        #if USE_SRGB_DECODE -            if (gGLManager.mHasTexturesRGBDecode) -            { -                mFormatInternal = GL_SRGB8; -            } -            else -        #endif -            { -                mFormatInternal = GL_RGB8; -            } +            mFormatInternal = GL_RGB8;              mFormatPrimary = GL_RGB;              mFormatType = GL_UNSIGNED_BYTE;              break;          case 4: -        #if USE_SRGB_DECODE -            if (gGLManager.mHasTexturesRGBDecode) -            { -                mFormatInternal = GL_SRGB8_ALPHA8; -            } -            else -        #endif -            { -                mFormatInternal = GL_RGBA8; -            } +            mFormatInternal = GL_RGBA8;              mFormatPrimary = GL_RGBA;              mFormatType = GL_UNSIGNED_BYTE;              break; @@ -1637,7 +1600,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_      if (mUseMipMaps)      { -        mAutoGenMips = gGLManager.mHasMipMapGeneration; +        mAutoGenMips = true;      }      mCurrentDiscardLevel = discard_level; @@ -1694,44 +1657,37 @@ void LLImageGL::syncToMainThread(LLGLuint new_tex_name)      {          LL_PROFILE_ZONE_NAMED("cglt - sync"); -        if (gGLManager.mHasSync) +        if (gGLManager.mIsNVIDIA)          { -            if (gGLManager.mIsNVIDIA) -            { -                // wait for texture upload to finish before notifying main thread -                // upload is complete -                auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); -                glFlush(); -                glClientWaitSync(sync, 0, GL_TIMEOUT_IGNORED); -                glDeleteSync(sync); -            } -            else -            { -                // post a sync to the main thread (will execute before tex name swap lambda below) -                // glFlush calls here are partly superstitious and partly backed by observation -                // on AMD hardware -                glFlush(); -                auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); -                glFlush(); -                LL::WorkQueue::postMaybe( -                    mMainQueue, -                    [=]() -                    { -                        LL_PROFILE_ZONE_NAMED("cglt - wait sync"); -                        { -                            LL_PROFILE_ZONE_NAMED("glWaitSync"); -                            glWaitSync(sync, 0, GL_TIMEOUT_IGNORED); -                        } -                        { -                            LL_PROFILE_ZONE_NAMED("glDeleteSync"); -                            glDeleteSync(sync); -                        } -                    }); -            } +            // wait for texture upload to finish before notifying main thread +            // upload is complete +            auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); +            glFlush(); +            glClientWaitSync(sync, 0, GL_TIMEOUT_IGNORED); +            glDeleteSync(sync);          }          else          { -            glFinish(); +            // post a sync to the main thread (will execute before tex name swap lambda below) +            // glFlush calls here are partly superstitious and partly backed by observation +            // on AMD hardware +            glFlush(); +            auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); +            glFlush(); +            LL::WorkQueue::postMaybe( +                mMainQueue, +                [=]() +                { +                    LL_PROFILE_ZONE_NAMED("cglt - wait sync"); +                    { +                        LL_PROFILE_ZONE_NAMED("glWaitSync"); +                        glWaitSync(sync, 0, GL_TIMEOUT_IGNORED); +                    } +                    { +                        LL_PROFILE_ZONE_NAMED("glDeleteSync"); +                        glDeleteSync(sync); +                    } +                });          }      } diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index b4618fd35c..bbd024abd9 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -219,7 +219,7 @@ private:  	U16 mPickMaskHeight;  	S8 mUseMipMaps;  	BOOL mHasExplicitFormat; // If false (default), GL format is f(mComponents) -	S8 mAutoGenMips; +	bool mAutoGenMips = false;  	BOOL mIsMask;  	BOOL mNeedsAlphaAndPickMask; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 554721399a..6e659641fe 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -335,7 +335,7 @@ bool LLTexUnit::bind(LLCubeMap* cubeMap)  	if (mCurrTexture != cubeMap->mImages[0]->getTexName())  	{ -		if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) +		if (LLCubeMap::sUseCubeMaps)  		{  			activate();  			enable(LLTexUnit::TT_CUBE_MAP); @@ -516,22 +516,15 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio  		}  	} -	if (gGLManager.mHasAnisotropic) +	if (gGLManager.mGLVersion >= 4.59f)  	{  		if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC)  		{ -			if (gGL.mMaxAnisotropy < 1.f) -			{ -				glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gGL.mMaxAnisotropy); - -				LL_INFOS() << "gGL.mMaxAnisotropy: " << gGL.mMaxAnisotropy << LL_ENDL ; -				gGL.mMaxAnisotropy = llmax(1.f, gGL.mMaxAnisotropy) ; -			} -			glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, gGL.mMaxAnisotropy); +			glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY, gGLManager.mMaxAnisotropy);  		}  		else  		{ -			glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f); +			glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY, 1.f);  		}  	}  } @@ -650,29 +643,6 @@ void LLTexUnit::debugTextureUnit(void)  void LLTexUnit::setTextureColorSpace(eTextureColorSpace space)  {      mTexColorSpace = space; - -#if USE_SRGB_DECODE -    if (gGLManager.mHasTexturesRGBDecode) -    { -        if (space == TCS_SRGB) -        { -            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT); -        } -        else -        { -            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); -        } - -        if (gDebugGL) -        { -            assert_glerror(); -        } -    } -    else -    { -        glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); -    } -#endif  }  LLLightState::LLLightState(S32 index) @@ -846,8 +816,7 @@ LLRender::LLRender()      mCount(0),  	mQuadCycle(0),      mMode(LLRender::TRIANGLES), -    mCurrTextureUnitIndex(0), -    mMaxAnisotropy(0.f)  +    mCurrTextureUnitIndex(0)  {	  	mTexUnits.reserve(LL_NUM_TEXTURE_LAYERS);  	for (U32 i = 0; i < LL_NUM_TEXTURE_LAYERS; i++) @@ -912,11 +881,9 @@ void LLRender::init()  	if (sGLCoreProfile && !LLVertexBuffer::sUseVAO)  	{ //bind a dummy vertex array object so we're core profile compliant -#ifdef GL_ARB_vertex_array_object  		U32 ret;  		glGenVertexArrays(1, &ret);  		glBindVertexArray(ret); -#endif  	} @@ -1492,12 +1459,7 @@ void LLRender::blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor,  	llassert(color_dfactor < BF_UNDEF);  	llassert(alpha_sfactor < BF_UNDEF);  	llassert(alpha_dfactor < BF_UNDEF); -	if (!LLRender::sGLCoreProfile && !gGLManager.mHasBlendFuncSeparate) -	{ -		LL_WARNS_ONCE("render") << "no glBlendFuncSeparateEXT(), using color-only blend func" << LL_ENDL; -		blendFunc(color_sfactor, color_dfactor); -		return; -	} +	  	if (mCurrBlendColorSFactor != color_sfactor || mCurrBlendColorDFactor != color_dfactor ||  	    mCurrBlendAlphaSFactor != alpha_sfactor || mCurrBlendAlphaDFactor != alpha_dfactor)  	{ diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index b1fb60cf92..3e4a1fe933 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -493,8 +493,6 @@ private:  	eBlendFactor mCurrBlendAlphaSFactor;  	eBlendFactor mCurrBlendAlphaDFactor; -	F32				mMaxAnisotropy; -  	std::vector<LLVector3> mUIOffset;  	std::vector<LLVector3> mUIScale; diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index fa23654978..015312e570 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -134,7 +134,7 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo  	mUsage = usage;  	mUseDepth = depth; -	if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject) +	if ((sUseFBO || use_fbo))  	{  		if (depth)  		{ @@ -234,11 +234,9 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)  		llassert( offset < 4 );  		return false;  	} -	if( offset > 0 && (mFBO == 0 || !gGLManager.mHasDrawBuffers) ) +	if( offset > 0 && (mFBO == 0) )  	{ -		LL_WARNS() << "FBO not used or no drawbuffers available; mFBO=" << (U32)mFBO << " gGLManager.mHasDrawBuffers=" << (U32)gGLManager.mHasDrawBuffers << LL_ENDL;  		llassert(  mFBO != 0 ); -		llassert( gGLManager.mHasDrawBuffers );  		return false;  	} @@ -484,14 +482,12 @@ void LLRenderTarget::bindTarget()  		sCurFBO = mFBO;  		stop_glerror(); -		if (gGLManager.mHasDrawBuffers) -		{ //setup multiple render targets -			GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, -									GL_COLOR_ATTACHMENT1, -									GL_COLOR_ATTACHMENT2, -									GL_COLOR_ATTACHMENT3}; -			glDrawBuffers(mTex.size(), drawbuffers); -		} +		//setup multiple render targets +		GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, +								GL_COLOR_ATTACHMENT1, +								GL_COLOR_ATTACHMENT2, +								GL_COLOR_ATTACHMENT3}; +		glDrawBuffers(mTex.size(), drawbuffers);  		if (mTex.empty())  		{ //no color buffer to draw to diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index a40ea2eb1e..d05f916d95 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -744,7 +744,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const  //static  void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)  { -	sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject; +    sEnableVBOs = use_vbo;  	sDisableVBOMapping = sEnableVBOs && no_vbo_mapping;  } @@ -753,9 +753,7 @@ void LLVertexBuffer::unbind()  {  	if (sGLRenderArray)  	{ -#if GL_ARB_vertex_array_object  		glBindVertexArray(0); -#endif  		sGLRenderArray = 0;  		sGLRenderIndices = 0;  		sIBOActive = false; @@ -923,9 +921,7 @@ LLVertexBuffer::~LLVertexBuffer()  	if (mGLArray)  	{ -#if GL_ARB_vertex_array_object  		releaseVAOName(mGLArray); -#endif  	}  	sCount--; @@ -956,10 +952,7 @@ void LLVertexBuffer::placeFence() const  {  	/*if (!mFence && useVBOs())  	{ -		if (gGLManager.mHasSync) -		{ -			mFence = new LLGLSyncFence(); -		} +	    mFence = new LLGLSyncFence();  	}  	if (mFence) @@ -1234,11 +1227,9 @@ bool LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)  		//actually allocate space for the vertex buffer if using VBO mapping  		flush(); //unmap -		if (gGLManager.mHasVertexArrayObject && useVBOs() && sUseVAO) +		if (useVBOs() && sUseVAO)  		{ -#if GL_ARB_vertex_array_object  			mGLArray = getVAOName(); -#endif  			setupVertexArray();  		}  	} @@ -1254,9 +1245,7 @@ void LLVertexBuffer::setupVertexArray()  	}      LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX; -#if GL_ARB_vertex_array_object  	glBindVertexArray(mGLArray); -#endif  	sGLRenderArray = mGLArray;  	static const U32 attrib_size[] =  @@ -1443,7 +1432,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  	if (useVBOs())  	{ -		if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange) +		if (!mMappable)  		{  			if (count == -1)  			{ @@ -1492,58 +1481,34 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  			{  				U8* src = NULL;  				waitFence(); -				if (gGLManager.mHasMapBufferRange) +				if (map_range)  				{ -					if (map_range) -					{ -#ifdef GL_ARB_map_buffer_range -						S32 offset = mOffsets[type] + sTypeSize[type]*index; -						S32 length = (sTypeSize[type]*count+0xF) & ~0xF; -						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, offset, length, -							GL_MAP_WRITE_BIT |  -							GL_MAP_FLUSH_EXPLICIT_BIT |  -							GL_MAP_INVALIDATE_RANGE_BIT); -#endif -					} -					else +					S32 offset = mOffsets[type] + sTypeSize[type]*index; +					S32 length = (sTypeSize[type]*count+0xF) & ~0xF; +					src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, offset, length, +						GL_MAP_WRITE_BIT |  +						GL_MAP_FLUSH_EXPLICIT_BIT |  +						GL_MAP_INVALIDATE_RANGE_BIT); +				} +				else +				{ +					if (gDebugGL)  					{ -#ifdef GL_ARB_map_buffer_range +						GLint size = 0; +						glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); -						if (gDebugGL) +						if (size < mSize)  						{ -							GLint size = 0; -							glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); - -							if (size < mSize) -							{ -								LL_ERRS() << "Invalid buffer size." << LL_ENDL; -							} +							LL_ERRS() << "Invalid buffer size." << LL_ENDL;  						} - -						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, 0, mSize, -							GL_MAP_WRITE_BIT |  -							GL_MAP_FLUSH_EXPLICIT_BIT); -#endif -					} -				} -				else if (gGLManager.mHasFlushBufferRange) -				{ -					if (map_range) -					{ -						src = (U8*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); -					} -					else -					{ -						src = (U8*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);  					} -				} -				else -				{ -					map_range = false; -					src = (U8*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + +					src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, 0, mSize, +						GL_MAP_WRITE_BIT |  +						GL_MAP_FLUSH_EXPLICIT_BIT);  				} -				llassert(src != NULL); +                llassert(src != NULL);  				mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);  				mAlignedOffset = mMappedData - src; @@ -1569,7 +1534,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  					//--------------------  					GLint buff; -					glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff); +					glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &buff);  					if ((GLuint)buff != mGLBuffer)  					{  						LL_ERRS() << "Invalid GL vertex buffer bound: " << buff << LL_ENDL; @@ -1590,7 +1555,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  		map_range = false;  	} -	if (map_range && gGLManager.mHasMapBufferRange && mMappable) +	if (map_range && mMappable)  	{  		return mMappedData;  	} @@ -1616,7 +1581,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  	if (useVBOs())  	{ -		if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange) +		if (!mMappable)  		{  			if (count == -1)  			{ @@ -1657,7 +1622,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  			if (gDebugGL && useVBOs())  			{  				GLint elem = 0; -				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &elem); +				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &elem);  				if (elem != mGLIndices)  				{ @@ -1673,48 +1638,24 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  			{  				U8* src = NULL;  				waitFence(); -				if (gGLManager.mHasMapBufferRange) +				if (map_range)  				{ -					if (map_range) -					{ -#ifdef GL_ARB_map_buffer_range -						S32 offset = sizeof(U16)*index; -						S32 length = sizeof(U16)*count; -						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length, -							GL_MAP_WRITE_BIT |  -							GL_MAP_FLUSH_EXPLICIT_BIT |  -							GL_MAP_INVALIDATE_RANGE_BIT); -#endif -					} -					else -					{ -#ifdef GL_ARB_map_buffer_range -						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(U16)*mNumIndices, -							GL_MAP_WRITE_BIT |  -							GL_MAP_FLUSH_EXPLICIT_BIT); -#endif -					} -				} -				else if (gGLManager.mHasFlushBufferRange) -				{ -					if (map_range) -					{ -						src = (U8*) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); -					} -					else -					{ -						src = (U8*) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); -					} +					S32 offset = sizeof(U16)*index; +					S32 length = sizeof(U16)*count; +					src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length, +						GL_MAP_WRITE_BIT |  +						GL_MAP_FLUSH_EXPLICIT_BIT |  +						GL_MAP_INVALIDATE_RANGE_BIT);  				}  				else  				{ -					map_range = false; -					src = (U8*) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); +					src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(U16)*mNumIndices, +						GL_MAP_WRITE_BIT |  +						GL_MAP_FLUSH_EXPLICIT_BIT);  				} - +		  				llassert(src != NULL); -  				mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS<U8>(src);  				mAlignedIndexOffset = mMappedIndexData - src;  				stop_glerror(); @@ -1729,7 +1670,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  			if(mMappable)  			{  				GLint buff; -				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff); +				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &buff);  				if ((GLuint)buff != mGLIndices)  				{  					LL_ERRS() << "Invalid GL index buffer bound: " << buff << LL_ENDL; @@ -1748,7 +1689,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  		map_range = false;  	} -	if (map_range && gGLManager.mHasMapBufferRange && mMappable) +	if (map_range && mMappable)  	{  		return mMappedIndexData;  	} @@ -1812,25 +1753,20 @@ void LLVertexBuffer::unmapBuffer()  		}  		else  		{ -			if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange) +			if (!mMappedVertexRegions.empty())  			{ -				if (!mMappedVertexRegions.empty()) +                LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush vertex"); +				for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)  				{ -                    LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush vertex"); -					for (U32 i = 0; i < mMappedVertexRegions.size(); ++i) -					{ -						const MappedRegion& region = mMappedVertexRegions[i]; -						S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0; -						S32 length = sTypeSize[region.mType]*region.mCount; -						if (gGLManager.mHasMapBufferRange) -						{ -							glFlushMappedBufferRange(GL_ARRAY_BUFFER, offset, length); -						} -					} - -					mMappedVertexRegions.clear(); +					const MappedRegion& region = mMappedVertexRegions[i]; +					S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0; +					S32 length = sTypeSize[region.mType]*region.mCount; +			    	glFlushMappedBufferRange(GL_ARRAY_BUFFER, offset, length);  				} + +				mMappedVertexRegions.clear();  			} +			  			stop_glerror();  			glUnmapBuffer(GL_ARRAY_BUFFER);  			stop_glerror(); @@ -1884,25 +1820,19 @@ void LLVertexBuffer::unmapBuffer()  		}  		else  		{ -			if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange) +			if (!mMappedIndexRegions.empty())  			{ -				if (!mMappedIndexRegions.empty()) +				for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)  				{ -					for (U32 i = 0; i < mMappedIndexRegions.size(); ++i) -					{ -                        LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush index"); -						const MappedRegion& region = mMappedIndexRegions[i]; -						S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0; -						S32 length = sizeof(U16)*region.mCount; -						if (gGLManager.mHasMapBufferRange) -						{ -							glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length); -						} -						stop_glerror(); -					} - -					mMappedIndexRegions.clear(); +                    LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush index"); +					const MappedRegion& region = mMappedIndexRegions[i]; +					S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0; +					S32 length = sizeof(U16)*region.mCount; +					glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length); +					stop_glerror();  				} + +				mMappedIndexRegions.clear();  			}              glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); @@ -2034,9 +1964,7 @@ bool LLVertexBuffer::bindGLArray()  	{  		{              LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX; -#if GL_ARB_vertex_array_object  			glBindVertexArray(mGLArray); -#endif  			sGLRenderArray = mGLArray;  		} @@ -2228,7 +2156,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  		if (gDebugGL && !mGLArray)  		{  			GLint buff; -			glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff); +			glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &buff);  			if ((GLuint)buff != mGLBuffer)  			{  				if (gDebugSession) @@ -2243,7 +2171,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  			if (mGLIndices)  			{ -				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff); +				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &buff);  				if ((GLuint)buff != mGLIndices)  				{  					if (gDebugSession) @@ -2264,9 +2192,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  	{	  		if (sGLRenderArray)  		{ -#if GL_ARB_vertex_array_object  			glBindVertexArray(0); -#endif  			sGLRenderArray = 0;  			sGLRenderIndices = 0;  			sIBOActive = false; | 
