Browse Source

More bug fixes

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
0fbd5dab8d

+ 7 - 0
include/anki/gr/gl/GlState.h

@@ -66,6 +66,13 @@ public:
 		U64 m_depthStencil = 0;
 		U64 m_color = 0;
 	} m_stateHashes;
+
+	Array2d<Bool, MAX_COLOR_ATTACHMENTS, 4> m_colorWriteMasks  = {{
+		{{true, true, true, true}},
+		{{true, true, true, true}},
+		{{true, true, true, true}},
+		{{true, true, true, true}}}};
+	Bool m_depthWriteMask = true;
 	/// @}
 
 	/// Global UBO ring buffer

+ 10 - 4
include/anki/renderer/Drawer.h

@@ -40,14 +40,21 @@ public:
 	/// The one and only constructor
 	ANKI_USE_RESULT Error create(Renderer* r);
 
-	void prepareDraw(
-		RenderingStage stage, Pass pass, CommandBufferPtr& cmdBuff);
+	void prepareDraw(RenderingStage stage, Pass pass, CommandBufferPtr& cmdBuff)
+	{
+		m_stage = stage;
+		m_pass = pass;
+		m_cmdBuff = cmdBuff;
+	}
 
 	ANKI_USE_RESULT Error render(
 		SceneNode& frsn,
 		VisibleNode& visible);
 
-	void finishDraw();
+	void finishDraw()
+	{
+		m_cmdBuff = CommandBufferPtr();
+	}
 
 private:
 	Renderer* m_r;
@@ -56,7 +63,6 @@ private:
 	/// @name State
 	/// @{
 	CommandBufferPtr m_cmdBuff;
-
 	RenderingStage m_stage;
 	Pass m_pass;
 	/// @}

+ 7 - 6
shaders/BsCommonFrag.glsl

@@ -53,11 +53,11 @@ void particleAlpha(in sampler2D tex, in float alpha)
 //==============================================================================
 #if PASS == COLOR
 #	define particleSoftTextureAlpha_DEFINED
-void particleSoftTextureAlpha(in sampler2D depthMap, in sampler2D tex, 
+void particleSoftTextureAlpha(in sampler2D depthMap, in sampler2D tex,
 	in float alpha)
 {
 	const vec2 screenSize = vec2(
-		1.0 / float(ANKI_RENDERER_WIDTH), 
+		1.0 / float(ANKI_RENDERER_WIDTH),
 		1.0 / float(ANKI_RENDERER_HEIGHT));
 
 	float depth = texture(depthMap, gl_FragCoord.xy * screenSize).r;
@@ -66,7 +66,8 @@ void particleSoftTextureAlpha(in sampler2D depthMap, in sampler2D tex,
 	float softalpha = clamp(delta * 50.0, 0.0, 1.0);
 
 	vec4 color = texture(tex, gl_PointCoord);
-	color.a *= alpha * softalpha;
+	color.a *= alpha;
+	//color.a *= softalpha;
 
 	writeGBuffer(color);
 }
@@ -75,11 +76,11 @@ void particleSoftTextureAlpha(in sampler2D depthMap, in sampler2D tex,
 //==============================================================================
 #if PASS == COLOR
 #	define particleSoftColorAlpha_DEFINED
-void particleSoftColorAlpha(in sampler2D depthMap, in vec3 icolor, 
+void particleSoftColorAlpha(in sampler2D depthMap, in vec3 icolor,
 	in float alpha)
 {
 	const vec2 screenSize = vec2(
-		1.0 / float(ANKI_RENDERER_WIDTH), 
+		1.0 / float(ANKI_RENDERER_WIDTH),
 		1.0 / float(ANKI_RENDERER_HEIGHT));
 
 	float depth = texture(depthMap, gl_FragCoord.xy * screenSize).r;
@@ -103,7 +104,7 @@ void particleSoftColorAlpha(in sampler2D depthMap, in vec3 icolor,
 void fog(in sampler2D depthMap, in vec3 color, in float fogScale)
 {
 	const vec2 screenSize = vec2(
-		1.0 / float(ANKI_RENDERER_WIDTH), 
+		1.0 / float(ANKI_RENDERER_WIDTH),
 		1.0 / float(ANKI_RENDERER_HEIGHT));
 
 	vec2 texCoords = gl_FragCoord.xy * screenSize;

+ 37 - 0
src/gr/gl/FramebufferImpl.cpp

@@ -6,6 +6,9 @@
 #include "anki/gr/gl/FramebufferImpl.h"
 #include "anki/gr/FramebufferCommon.h"
 #include "anki/gr/gl/TextureImpl.h"
+#include "anki/gr/gl/GlState.h"
+#include "anki/gr/gl/GrManagerImpl.h"
+#include "anki/gr/gl/RenderingThread.h"
 #include "anki/util/Logger.h"
 
 namespace anki {
@@ -139,13 +142,35 @@ void FramebufferImpl::bind()
 		}
 
 		// Clear buffers
+		GlState& state =
+			getManager().getImplementation().getRenderingThread().getState();
 		for(U i = 0; i < m_colorAttachmentsCount; i++)
 		{
 			const Attachment& att = m_colorAttachments[i];
 
 			if(att.m_loadOperation == AttachmentLoadOperation::CLEAR)
 			{
+				// Enable write mask in case a pipeline changed it (else no
+				// clear will happen) and then restore state
+				Bool restore = false;
+				if(state.m_colorWriteMasks[i][0] != true
+					|| state.m_colorWriteMasks[i][1] != true
+					|| state.m_colorWriteMasks[i][2] != true
+					|| state.m_colorWriteMasks[i][3] != true)
+				{
+					glColorMaski(i, true, true, true, true);
+					restore = true;
+				}
+
 				glClearBufferfv(GL_COLOR, i, &att.m_clearValue.m_colorf[0]);
+
+				if(restore)
+				{
+					glColorMaski(i, state.m_colorWriteMasks[i][0],
+						state.m_colorWriteMasks[i][1],
+						state.m_colorWriteMasks[i][2],
+						state.m_colorWriteMasks[i][3]);
+				}
 			}
 		}
 
@@ -153,8 +178,20 @@ void FramebufferImpl::bind()
 			&& m_depthStencilAttachment.m_loadOperation
 				== AttachmentLoadOperation::CLEAR)
 		{
+			// Enable write mask in case a pipeline changed it (else no
+			// clear will happen) and then restore state
+			if(state.m_depthWriteMask == false)
+			{
+				glDepthMask(true);
+			}
+
 			glClearBufferfv(GL_DEPTH, 0,
 				&m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth);
+
+			if(state.m_depthWriteMask == false)
+			{
+				glDepthMask(false);
+			}
 		}
 	}
 }

+ 13 - 0
src/gr/gl/PipelineImpl.cpp

@@ -541,6 +541,9 @@ void PipelineImpl::setDepthStencilState(GlState& state) const
 
 	state.m_stateHashes.m_depthStencil = m_hashes.m_depthStencil;
 
+	glDepthMask(m_in.m_depthStencil.m_depthWriteEnabled);
+	state.m_depthWriteMask = m_in.m_depthStencil.m_depthWriteEnabled;
+
 	if(m_cache.m_depthCompareFunction == GL_ALWAYS)
 	{
 		glDisable(GL_DEPTH_TEST);
@@ -588,6 +591,11 @@ void PipelineImpl::setColorState(GlState& state) const
 			glColorMaski(i, att.m_channelWriteMask[0],
 				att.m_channelWriteMask[1], att.m_channelWriteMask[2],
 				att.m_channelWriteMask[3]);
+
+			state.m_colorWriteMasks[i][0] = att.m_channelWriteMask[0];
+			state.m_colorWriteMasks[i][1] = att.m_channelWriteMask[1];
+			state.m_colorWriteMasks[i][2] = att.m_channelWriteMask[2];
+			state.m_colorWriteMasks[i][3] = att.m_channelWriteMask[3];
 		}
 	}
 	else
@@ -601,6 +609,11 @@ void PipelineImpl::setColorState(GlState& state) const
 			glColorMaski(i, att.m_channelWriteMask[0],
 				att.m_channelWriteMask[1], att.m_channelWriteMask[2],
 				att.m_channelWriteMask[3]);
+
+			state.m_colorWriteMasks[i][0] = att.m_channelWriteMask[0];
+			state.m_colorWriteMasks[i][1] = att.m_channelWriteMask[1];
+			state.m_colorWriteMasks[i][2] = att.m_channelWriteMask[2];
+			state.m_colorWriteMasks[i][3] = att.m_channelWriteMask[3];
 		}
 	}
 }

+ 8 - 18
src/renderer/Drawer.cpp

@@ -298,11 +298,18 @@ Error RenderableDrawer::render(SceneNode& frsn, VisibleNode& visibleNode)
 	RenderingBuildData build;
 
 	// Get components
-	FrustumComponent& fr = frsn.getComponent<FrustumComponent>();
 	RenderComponent& renderable =
 		visibleNode.m_node->getComponent<RenderComponent>();
 	const Material& mtl = renderable.getMaterial();
 
+	if((m_stage == RenderingStage::BLEND && !mtl.getForwardShading())
+		|| (m_stage == RenderingStage::MATERIAL && mtl.getForwardShading()))
+	{
+		return ErrorCode::NONE;
+	}
+
+	FrustumComponent& fr = frsn.getComponent<FrustumComponent>();
+
 	// Calculate the key
 	RenderingKey key;
 
@@ -336,21 +343,4 @@ Error RenderableDrawer::render(SceneNode& frsn, VisibleNode& visibleNode)
 	return ErrorCode::NONE;
 }
 
-//==============================================================================
-void RenderableDrawer::prepareDraw(RenderingStage stage, Pass pass,
-	CommandBufferPtr& cmdBuff)
-{
-	// Set some numbers
-	m_stage = stage;
-	m_pass = pass;
-	m_cmdBuff = cmdBuff;
-}
-
-//==============================================================================
-void RenderableDrawer::finishDraw()
-{
-	// Release the job chain
-	m_cmdBuff = CommandBufferPtr();
-}
-
 }  // end namespace anki

+ 2 - 14
src/renderer/Is.cpp

@@ -756,20 +756,8 @@ void Is::binLight(
 //==============================================================================
 void Is::setState(CommandBufferPtr& cmdBuff)
 {
-	Bool isLastStage =
-		!m_r->getPps().getEnabled() && !m_r->getDbg().getEnabled();
-
-	FramebufferPtr fb = m_fb;
-	U32 width = m_r->getWidth();
-	U32 height = m_r->getHeight();
-
-	if(isLastStage)
-	{
-		m_r->getOutputFramebuffer(fb, width, height);
-	}
-
-	fb.bind(cmdBuff);
-	cmdBuff.setViewport(0, 0, width, height);
+	m_fb.bind(cmdBuff);
+	cmdBuff.setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
 }
 
 //==============================================================================

+ 3 - 2
src/renderer/MainRenderer.cpp

@@ -102,7 +102,8 @@ Error MainRenderer::render(SceneGraph& scene)
 
 	// Find where the m_r should draw
 	Bool rDrawToDefault;
-	if(m_renderingQuality == 1.0 && !m_r->getDbg().getEnabled())
+	if(m_renderingQuality == 1.0 && !m_r->getDbg().getEnabled()
+		&& m_r->getPps().getEnabled())
 	{
 		rDrawToDefault = true;
 	}
@@ -142,7 +143,7 @@ Error MainRenderer::render(SceneGraph& scene)
 			rt = &m_r->getIs().getRt();
 		}
 
-		//rt = &m_r->getIs().getRt();
+		//rt = &m_r->getMs().getRt0();
 		//rt = &getPps().getHdr()._getRt();
 
 		rt->bind(cmdb, 0);