diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl | 44 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl | 38 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 126 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 11 | ||||
| -rw-r--r-- | indra/newview/llviewercontrol.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewerdisplay.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 24 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.h | 2 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 45 | 
9 files changed, 154 insertions, 143 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl new file mode 100644 index 0000000000..6195e2f1ec --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowCubeV.glsl @@ -0,0 +1,44 @@ +/**  + * @file shadowCubeV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +VARYING vec4 post_pos; + +uniform vec3 box_center; +uniform vec3 box_size; + +void main() +{ +	//transform vertex +	vec3 p = position*box_size+box_center; +	vec4 pos = modelview_projection_matrix*vec4(p.xyz, 1.0); +	 +	post_pos = pos; +	 +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl new file mode 100644 index 0000000000..5c479d27a9 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/occlusionCubeV.glsl @@ -0,0 +1,38 @@ +/**  + * @file occlusionCubeV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +uniform vec3 box_center; +uniform vec3 box_size; + +void main() +{ +	vec3 p = position*box_size+box_center; +	gl_Position = modelview_projection_matrix * vec4(p.xyz, 1.0); +} + diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 10cdea1c09..d398df5100 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -314,77 +314,6 @@ LLVertexBuffer* ll_create_cube_vb(U32 type_mask, U32 usage)  static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion"); -void LLSpatialGroup::buildOcclusion() -{ -	//if (mOcclusionVerts.isNull()) -	{ -		mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX,  -			LLVertexBuffer::sUseStreamDraw ? mBufferUsage : 0); //if GL has a hard time with VBOs, don't use them for occlusion culling. -		mOcclusionVerts->allocateBuffer(8, 64, true); -	 -		LLStrider<U16> idx; -		mOcclusionVerts->getIndexStrider(idx); -		for (U32 i = 0; i < 64; i++) -		{ -			*idx++ = sOcclusionIndices[i]; -		} -	} - -	LLVector4a fudge; -	fudge.splat(SG_OCCLUSION_FUDGE); - -	LLVector4a r; -	r.setAdd(mBounds[1], fudge); - -	LLStrider<LLVector3> pos; -	 -	{ -		LLFastTimer t(FTM_BUILD_OCCLUSION); -		mOcclusionVerts->getVertexStrider(pos); -	} - -	{ -		LLVector4a* v = (LLVector4a*) pos.get(); - -		const LLVector4a& c = mBounds[0]; -		const LLVector4a& s = r; -		 -		static const LLVector4a octant[] = -		{ -			LLVector4a(-1.f, -1.f, -1.f), -			LLVector4a(-1.f, -1.f, 1.f), -			LLVector4a(-1.f, 1.f, -1.f), -			LLVector4a(-1.f, 1.f, 1.f), - -			LLVector4a(1.f, -1.f, -1.f), -			LLVector4a(1.f, -1.f, 1.f), -			LLVector4a(1.f, 1.f, -1.f), -			LLVector4a(1.f, 1.f, 1.f), -		}; - -		//vertex positions are encoded so the 3 bits of their vertex index  -		//correspond to their axis facing, with bit position 3,2,1 matching -		//axis facing x,y,z, bit set meaning positive facing, bit clear  -		//meaning negative facing -		 -		for (S32 i = 0; i < 8; ++i) -		{ -			LLVector4a p; -			p.setMul(s, octant[i]); -			p.add(c); -			v[i] = p; -		} -	} -	 -	{ -		mOcclusionVerts->flush(); -		LLVertexBuffer::unbind(); -	} - -	clearState(LLSpatialGroup::OCCLUSION_DIRTY); -} - -  BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group);  //returns: @@ -446,8 +375,6 @@ LLSpatialGroup::~LLSpatialGroup()  		}  	} -	mOcclusionVerts = NULL; -  	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);  	clearDrawMap();  	clearAtlasList() ; @@ -1001,11 +928,6 @@ void LLSpatialGroup::shift(const LLVector4a &offset)  		setState(GEOM_DIRTY);  		gPipeline.markRebuild(this, TRUE);  	} - -	if (mOcclusionVerts.notNull()) -	{ -		setState(OCCLUSION_DIRTY); -	}  }  class LLSpatialSetState : public LLSpatialGroup::OctreeTraveler @@ -1304,8 +1226,6 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :  		mVisible[i] = 0;  	} -	mOcclusionVerts = NULL; -  	mRadius = 1;  	mPixelArea = 1024.f;  } @@ -1559,8 +1479,6 @@ void LLSpatialGroup::destroyGL(bool keep_occlusion)  				mOcclusionQuery[i] = 0;  			}  		} - -		mOcclusionVerts = NULL;  	} @@ -1636,8 +1554,6 @@ BOOL LLSpatialGroup::rebound()  		mBounds[1].mul(0.5f);  	} -	setState(OCCLUSION_DIRTY); -	  	clearState(DIRTY);  	return TRUE; @@ -1774,12 +1690,6 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)  						mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();  					} -					if (mOcclusionVerts.isNull() || isState(LLSpatialGroup::OCCLUSION_DIRTY)) -					{ -						LLFastTimer t(FTM_OCCLUSION_BUILD); -						buildOcclusion(); -					} -					  					// Depth clamp all water to avoid it being culled as a result of being  					// behind the far clip plane, and in the case of edge water to avoid  					// it being culled while still visible. @@ -1810,10 +1720,13 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)  							glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);					  						} -						{ -							LLFastTimer t(FTM_OCCLUSION_SET_BUFFER); -							mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX); -						} +						LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; +						llassert(shader); + +						shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, mBounds[0].getF32ptr()); +						shader->uniform3f(LLShaderMgr::BOX_SIZE, mBounds[1][0]+SG_OCCLUSION_FUDGE,  +																 mBounds[1][1]+SG_OCCLUSION_FUDGE,  +																 mBounds[1][2]+SG_OCCLUSION_FUDGE);  						if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)  						{ @@ -1822,12 +1735,12 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)  							LLGLSquashToFarClip squash(glh_get_current_projection(), 1);  							if (camera->getOrigin().isExactlyZero())  							{ //origin is invalid, draw entire box -								mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); -								mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				 +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				  							}  							else  							{ -								mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0])); +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));  							}  						}  						else @@ -1835,12 +1748,12 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)  							LLFastTimer t(FTM_OCCLUSION_DRAW);  							if (camera->getOrigin().isExactlyZero())  							{ //origin is invalid, draw entire box -								mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); -								mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				 +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				  							}  							else  							{ -								mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0])); +								gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));  							}  						} @@ -2844,19 +2757,6 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)  			gGL.diffuseColor4f(0.f, 0.75f, 0.f, 0.5f);  			pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);  		} -		/*else if (camera && group->mOcclusionVerts.notNull()) -		{ -			LLVertexBuffer::unbind(); -			group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX); -			 -			gGL.diffuseColor4f(1.0f, 0.f, 0.f, 0.5f); -			group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0])); -			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -			 -			gGL.diffuseColor4f(1.0f, 1.f, 1.f, 1.0f); -			group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0])); -			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -		}*/  	}  } diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 65ae41eeee..f0e4f15a83 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -263,11 +263,10 @@ public:  		SKIP_FRUSTUM_CHECK		= 0x00000020,  		IN_IMAGE_QUEUE			= 0x00000040,  		IMAGE_DIRTY				= 0x00000080, -		OCCLUSION_DIRTY			= 0x00000100, -		MESH_DIRTY				= 0x00000200, -		NEW_DRAWINFO			= 0x00000400, -		IN_BUILD_Q1				= 0x00000800, -		IN_BUILD_Q2				= 0x00001000, +		MESH_DIRTY				= 0x00000100, +		NEW_DRAWINFO			= 0x00000200, +		IN_BUILD_Q1				= 0x00000400, +		IN_BUILD_Q2				= 0x00000800,  		STATE_MASK				= 0x0000FFFF,  	} eSpatialState; @@ -313,7 +312,6 @@ public:  	BOOL boundObjects(BOOL empty, LLVector4a& newMin, LLVector4a& newMax);  	void unbound();  	BOOL rebound(); -	void buildOcclusion(); //rebuild mOcclusionVerts  	void checkOcclusion(); //read back last occlusion query (if any)  	void doOcclusion(LLCamera* camera); //issue occlusion query  	void destroyGL(bool keep_occlusion = false); @@ -415,7 +413,6 @@ public:  	LLSpatialPartition* mSpatialPartition;  	LLPointer<LLVertexBuffer> mVertexBuffer; -	LLPointer<LLVertexBuffer> mOcclusionVerts;  	GLuint					mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];  	U32 mBufferUsage; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 093b84413a..385439ae70 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -316,7 +316,7 @@ static bool handleJoystickChanged(const LLSD& newvalue)  static bool handleUseOcclusionChanged(const LLSD& newvalue)  { -	LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery  +	LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery && LLGLSLShader::sNoFixedFunction  		&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion") && !gUseWireframe) ? 2 : 0;  	return true;  } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 99ed04d1af..000e7404e8 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -622,11 +622,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLSpatialGroup::sNoDelete = TRUE;  		LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName(); -		/*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred) -		{ //force occlusion on for all render types if doing deferred render (tighter shadow frustum) -			LLPipeline::sUseOcclusion = 3; -		}*/ -  		S32 occlusion = LLPipeline::sUseOcclusion;  		if (gDepthDirty)  		{ //depth buffer is invalid, don't overwrite occlusion state diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 220677b227..a6c564a6a1 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -72,6 +72,7 @@ LLGLSLShader			gTransformBinormalProgram;  //utility shaders  LLGLSLShader	gOcclusionProgram; +LLGLSLShader	gOcclusionCubeProgram;  LLGLSLShader	gCustomAlphaProgram;  LLGLSLShader	gGlowCombineProgram;  LLGLSLShader	gSplatTextureRectProgram; @@ -186,6 +187,7 @@ LLGLSLShader			gDeferredSunProgram;  LLGLSLShader			gDeferredBlurLightProgram;  LLGLSLShader			gDeferredSoftenProgram;  LLGLSLShader			gDeferredShadowProgram; +LLGLSLShader			gDeferredShadowCubeProgram;  LLGLSLShader			gDeferredShadowAlphaMaskProgram;  LLGLSLShader			gDeferredAvatarShadowProgram;  LLGLSLShader			gDeferredAttachmentShadowProgram; @@ -655,6 +657,7 @@ void LLViewerShaderMgr::setShaders()  void LLViewerShaderMgr::unloadShaders()  {  	gOcclusionProgram.unload(); +	gOcclusionCubeProgram.unload();  	gDebugProgram.unload();  	gClipProgram.unload();  	gAlphaMaskProgram.unload(); @@ -1076,6 +1079,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredBlurLightProgram.unload();  		gDeferredSoftenProgram.unload();  		gDeferredShadowProgram.unload(); +		gDeferredShadowCubeProgram.unload();  		gDeferredShadowAlphaMaskProgram.unload();  		gDeferredAvatarShadowProgram.unload();  		gDeferredAttachmentShadowProgram.unload(); @@ -1431,6 +1435,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{ +		gDeferredShadowCubeProgram.mName = "Deferred Shadow Cube Shader"; +		gDeferredShadowCubeProgram.mShaderFiles.clear(); +		gDeferredShadowCubeProgram.mShaderFiles.push_back(make_pair("deferred/shadowCubeV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredShadowCubeProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gDeferredShadowCubeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +		success = gDeferredShadowCubeProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";  		gDeferredShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;  		gDeferredShadowAlphaMaskProgram.mShaderFiles.clear(); @@ -2710,6 +2724,16 @@ BOOL LLViewerShaderMgr::loadShadersInterface()  	if (success)  	{ +		gOcclusionCubeProgram.mName = "Occlusion Cube Shader"; +		gOcclusionCubeProgram.mShaderFiles.clear(); +		gOcclusionCubeProgram.mShaderFiles.push_back(make_pair("interface/occlusionCubeV.glsl", GL_VERTEX_SHADER_ARB)); +		gOcclusionCubeProgram.mShaderFiles.push_back(make_pair("interface/occlusionF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gOcclusionCubeProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gOcclusionCubeProgram.createShader(NULL, NULL); +	} + +	if (success) +	{  		gDebugProgram.mName = "Debug Shader";  		gDebugProgram.mShaderFiles.clear();  		gDebugProgram.mShaderFiles.push_back(make_pair("interface/debugV.glsl", GL_VERTEX_SHADER_ARB)); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 03d686e07e..8f7ff8dd2f 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -222,6 +222,7 @@ extern LLGLSLShader			gTransformBinormalProgram;  //utility shaders  extern LLGLSLShader			gOcclusionProgram; +extern LLGLSLShader			gOcclusionCubeProgram;  extern LLGLSLShader			gCustomAlphaProgram;  extern LLGLSLShader			gGlowCombineProgram;  extern LLGLSLShader			gSplatTextureRectProgram; @@ -340,6 +341,7 @@ extern LLGLSLShader			gDeferredBlurLightProgram;  extern LLGLSLShader			gDeferredAvatarProgram;  extern LLGLSLShader			gDeferredSoftenProgram;  extern LLGLSLShader			gDeferredShadowProgram; +extern LLGLSLShader			gDeferredShadowCubeProgram;  extern LLGLSLShader			gDeferredShadowAlphaMaskProgram;  extern LLGLSLShader			gDeferredPostProgram;  extern LLGLSLShader			gDeferredCoFProgram; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index dac9b95dc6..75f8346938 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -958,6 +958,7 @@ void LLPipeline::refreshCachedSettings()  	LLPipeline::sUseOcclusion =   			(!gUseWireframe +			&& LLGLSLShader::sNoFixedFunction  			&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")   			&& gSavedSettings.getBOOL("UseOcclusion")   			&& gGLManager.mHasOcclusionQuery) ? 2 : 0; @@ -2216,8 +2217,6 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	gGLLastMatrix = NULL;  	gGL.loadMatrix(gGLLastModelView); - -	LLVertexBuffer::unbind();  	LLGLDisable blend(GL_BLEND);  	LLGLDisable test(GL_ALPHA_TEST);  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); @@ -2261,7 +2260,16 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	{ //if no shader is currently bound, use the occlusion shader instead of fixed function if we can  		// (shadow render uses a special shader that clamps to clip planes)  		bound_shader = true; -		gOcclusionProgram.bind(); +		gOcclusionCubeProgram.bind(); +	} + +	if (sUseOcclusion > 1) +	{ +		if (mCubeVB.isNull()) +		{ //cube VB will be used for issuing occlusion queries +			mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB); +		} +		mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);  	}  	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  @@ -2293,7 +2301,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	if (bound_shader)  	{ -		gOcclusionProgram.unbind(); +		gOcclusionCubeProgram.unbind();  	}  	camera.disableUserClipPlane(); @@ -2426,14 +2434,20 @@ void LLPipeline::doOcclusion(LLCamera& camera)  		{  			if (LLPipeline::sShadowRender)  			{ -				gDeferredShadowProgram.bind(); +				gDeferredShadowCubeProgram.bind();  			}  			else  			{ -				gOcclusionProgram.bind(); +				gOcclusionCubeProgram.bind();  			}  		} +		if (mCubeVB.isNull()) +		{ //cube VB will be used for issuing occlusion queries +			mCubeVB = ll_create_cube_vb(LLVertexBuffer::MAP_VERTEX, GL_STATIC_DRAW_ARB); +		} +		mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +  		for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)  		{  			LLSpatialGroup* group = *iter; @@ -2445,11 +2459,11 @@ void LLPipeline::doOcclusion(LLCamera& camera)  		{  			if (LLPipeline::sShadowRender)  			{ -				gDeferredShadowProgram.unbind(); +				gDeferredShadowCubeProgram.unbind();  			}  			else  			{ -				gOcclusionProgram.unbind(); +				gOcclusionCubeProgram.unbind();  			}  		} @@ -8388,7 +8402,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	if (use_shader)  	{ -		gDeferredShadowProgram.bind(); +		gDeferredShadowCubeProgram.bind();  	}  	updateCull(shadow_cam, result); @@ -8405,17 +8419,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	stop_glerror();  	gGLLastMatrix = NULL; -	{ -		//LLGLDepthTest depth(GL_TRUE); -		//glClear(GL_DEPTH_BUFFER_BIT); -	} -  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  	stop_glerror(); -	//glCullFace(GL_FRONT); -  	LLVertexBuffer::unbind();  	{ @@ -8423,6 +8430,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  		{ //occlusion program is general purpose depth-only no-textures  			gOcclusionProgram.bind();  		} +		else +		{ +			gDeferredShadowProgram.bind(); +		}  		gGL.diffuseColor4f(1,1,1,1);  		gGL.setColorMask(false, false); @@ -8471,7 +8482,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	//glCullFace(GL_BACK); -	gDeferredShadowProgram.bind(); +	gDeferredShadowCubeProgram.bind();  	gGLLastMatrix = NULL;  	gGL.loadMatrix(gGLModelView);  	doOcclusion(shadow_cam); | 
