Browse Source

Vulkan: Add a better fix for vulkan viewport flip

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
74ae088589

+ 1 - 1
shaders/Irradiance.frag.glsl

@@ -55,5 +55,5 @@ void main()
 		}
 	}
 
-	out_color = outCol / weight;
+	out_color = outCol / weight * (2 * PI);
 }

+ 0 - 3
shaders/Pps.frag.glsl

@@ -108,9 +108,6 @@ vec3 colorGrading(in vec3 color)
 void main()
 {
 	vec2 uv = in_uv.xy;
-#if DRAW_TO_DEFAULT && ANKI_VK
-	uv.y = 1.0 - uv.y;
-#endif
 
 #if SHARPEN_ENABLED
 	out_color = sharpen(u_isRt, uv);

+ 9 - 3
src/anki/gr/vulkan/CommandBufferImpl.inl.h

@@ -519,16 +519,22 @@ inline void CommandBufferImpl::drawcallCommon()
 	// Flush viewport
 	if(ANKI_UNLIKELY(m_viewportDirty))
 	{
+		const Bool flipViewport = m_activeFb->m_impl->isDefaultFramebuffer()
+			&& !!(getGrManagerImpl().getExtensions() & VulkanExtensions::KHR_MAINENANCE1);
+
 		const I minx = m_viewport[0];
 		const I miny = m_viewport[1];
 		const I maxx = m_viewport[2];
 		const I maxy = m_viewport[3];
 
+		U32 fbWidth, fbHeight;
+		m_activeFb->m_impl->getAttachmentsSize(fbWidth, fbHeight);
+
 		VkViewport s;
 		s.x = minx;
-		s.y = miny;
+		s.y = (flipViewport) ? (fbHeight - miny) : miny; // Move to the bottom;
 		s.width = maxx - minx;
-		s.height = maxy - miny;
+		s.height = (flipViewport) ? -(maxy - miny) : (maxy - miny);
 		s.minDepth = 0.0;
 		s.maxDepth = 1.0;
 		ANKI_CMD(vkCmdSetViewport(m_handle, 0, 1, &s), ANY_OTHER_COMMAND);
@@ -537,7 +543,7 @@ inline void CommandBufferImpl::drawcallCommon()
 		scissor.extent.width = maxx - minx;
 		scissor.extent.height = maxy - miny;
 		scissor.offset.x = minx;
-		scissor.offset.y = miny;
+		scissor.offset.y = (flipViewport) ? (fbHeight - maxy) : miny;
 		ANKI_CMD(vkCmdSetScissor(m_handle, 0, 1, &scissor), ANY_OTHER_COMMAND);
 
 		m_viewportDirty = false;

+ 1 - 1
src/anki/gr/vulkan/Pipeline.cpp

@@ -247,7 +247,7 @@ const VkGraphicsPipelineCreateInfo& PipelineStateTracker::updatePipelineCreateIn
 	rastCi.rasterizerDiscardEnable = false;
 	rastCi.polygonMode = convertFillMode(m_state.m_rasterizer.m_fillMode);
 	rastCi.cullMode = convertCullMode(m_state.m_rasterizer.m_cullMode);
-	rastCi.frontFace = VK_FRONT_FACE_CLOCKWISE; // For viewport flip
+	rastCi.frontFace = (!m_defaultFb) ? VK_FRONT_FACE_CLOCKWISE : VK_FRONT_FACE_COUNTER_CLOCKWISE; // For viewport flip
 	rastCi.depthBiasEnable =
 		m_state.m_rasterizer.m_depthBiasConstantFactor != 0.0 && m_state.m_rasterizer.m_depthBiasSlopeFactor != 0.0;
 	rastCi.depthBiasConstantFactor = m_state.m_rasterizer.m_depthBiasConstantFactor;

+ 2 - 0
src/anki/gr/vulkan/Pipeline.h

@@ -365,6 +365,7 @@ public:
 		m_fbDepth = d;
 		m_fbStencil = s;
 		m_rpass = fb->m_impl->getCompatibleRenderPass();
+		m_defaultFb = fb->m_impl->isDefaultFramebuffer();
 	}
 
 	void endRenderPass()
@@ -456,6 +457,7 @@ private:
 	// Renderpass info
 	Bool8 m_fbDepth = false;
 	Bool8 m_fbStencil = false;
+	Bool8 m_defaultFb = false;
 	BitSet<MAX_COLOR_ATTACHMENTS, U8> m_fbColorAttachmentMask = {false};
 	VkRenderPass m_rpass = VK_NULL_HANDLE;