Browse Source

Vulkan: Enable (and require) KHR_maintenance1. Need it for y flip

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
0dbe14136c

+ 1 - 0
CMakeLists.txt

@@ -303,6 +303,7 @@ include_directories("src"
 	"thirdparty/newton/packages/dContainers" 
 	"thirdparty/newton/packages/dContainers" 
 	"thirdparty/newton/packages/dMath" 
 	"thirdparty/newton/packages/dMath" 
 	"thirdparty/newton/packages/thirdParty/timeTracker/"
 	"thirdparty/newton/packages/thirdParty/timeTracker/"
+	"thirdparty/khronos" 
 	"${CMAKE_CURRENT_BINARY_DIR}" 
 	"${CMAKE_CURRENT_BINARY_DIR}" 
 	"${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glslang" 
 	"${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glslang" 
 	"thirdparty")
 	"thirdparty")

+ 1 - 1
src/anki/gr/gl/CommandBuffer.cpp

@@ -232,7 +232,7 @@ void CommandBuffer::setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy)
 
 
 	if(m_impl->m_state.setViewport(minx, miny, maxx, maxy))
 	if(m_impl->m_state.setViewport(minx, miny, maxx, maxy))
 	{
 	{
-		m_impl->pushBackNewCommand<ViewportCommand>(minx, miny, maxx, maxy);
+		m_impl->pushBackNewCommand<ViewportCommand>(minx, miny, maxx - minx, maxy - miny);
 	}
 	}
 }
 }
 
 

+ 0 - 34
src/anki/gr/vulkan/CommandBufferImpl.cpp

@@ -781,38 +781,4 @@ void CommandBufferImpl::flushWriteQueryResults()
 	m_writeQueryAtomCount = 0;
 	m_writeQueryAtomCount = 0;
 }
 }
 
 
-void CommandBufferImpl::setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy)
-{
-	ANKI_ASSERT(minx < maxx && miny < maxy);
-	commandCommon();
-
-	if(m_viewport[0] != minx || m_viewport[1] != miny || m_viewport[2] != maxx || m_viewport[3] != maxy)
-	{
-		VkViewport s;
-		s.x = minx;
-		s.y = miny;
-		s.width = maxx - minx;
-		s.height = maxy - miny;
-		s.minDepth = 0.0;
-		s.maxDepth = 1.0;
-		ANKI_CMD(vkCmdSetViewport(m_handle, 0, 1, &s), ANY_OTHER_COMMAND);
-
-		VkRect2D scissor = {};
-		scissor.extent.width = maxx - minx;
-		scissor.extent.height = maxy - miny;
-		scissor.offset.x = minx;
-		scissor.offset.y = miny;
-		ANKI_CMD(vkCmdSetScissor(m_handle, 0, 1, &scissor), ANY_OTHER_COMMAND);
-
-		m_viewport[0] = minx;
-		m_viewport[1] = miny;
-		m_viewport[2] = maxx;
-		m_viewport[3] = maxy;
-	}
-	else
-	{
-		// Skip
-	}
-}
-
 } // end namespace anki
 } // end namespace anki

+ 16 - 1
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -72,7 +72,21 @@ public:
 
 
 	void setPrimitiveRestart(Bool enable);
 	void setPrimitiveRestart(Bool enable);
 
 
-	void setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy);
+	void setViewport(U16 minx, U16 miny, U16 maxx, U16 maxy)
+	{
+		ANKI_ASSERT(minx < maxx && miny < maxy);
+		commandCommon();
+
+		if(m_viewport[0] != minx || m_viewport[1] != miny || m_viewport[2] != maxx || m_viewport[3] != maxy)
+		{
+			m_viewportDirty = true;
+
+			m_viewport[0] = minx;
+			m_viewport[1] = miny;
+			m_viewport[2] = maxx;
+			m_viewport[3] = maxy;
+		}
+	}
 
 
 	void setPolygonOffset(F32 factor, F32 units);
 	void setPolygonOffset(F32 factor, F32 units);
 
 
@@ -187,6 +201,7 @@ private:
 	/// @name state_opts
 	/// @name state_opts
 	/// @{
 	/// @{
 	Array<U16, 4> m_viewport = {{0, 0, 0, 0}};
 	Array<U16, 4> m_viewport = {{0, 0, 0, 0}};
+	Bool8 m_viewportDirty = true;
 	F32 m_polygonOffsetFactor = MAX_F32;
 	F32 m_polygonOffsetFactor = MAX_F32;
 	F32 m_polygonOffsetUnits = MAX_F32;
 	F32 m_polygonOffsetUnits = MAX_F32;
 	Array<U32, 2> m_stencilCompareMasks = {{0x5A5A5A5A, 0x5A5A5A5A}}; ///< Use a stupid number to initialize.
 	Array<U32, 2> m_stencilCompareMasks = {{0x5A5A5A5A, 0x5A5A5A5A}}; ///< Use a stupid number to initialize.

+ 32 - 0
src/anki/gr/vulkan/CommandBufferImpl.inl.h

@@ -481,6 +481,38 @@ inline void CommandBufferImpl::drawcallCommon()
 		}
 		}
 	}
 	}
 
 
+	// Flush viewport
+	if(ANKI_UNLIKELY(m_viewportDirty))
+	{
+		// Do some hacks to flip the viewport
+
+		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 = fbHeight - miny; // Move to the bottom
+		s.width = maxx - minx;
+		s.height = -(maxy - miny); // Negative to flip
+		s.minDepth = 0.0;
+		s.maxDepth = 1.0;
+		ANKI_CMD(vkCmdSetViewport(m_handle, 0, 1, &s), ANY_OTHER_COMMAND);
+
+		VkRect2D scissor = {};
+		scissor.extent.width = maxx - minx;
+		scissor.extent.height = maxy - miny;
+		scissor.offset.x = minx;
+		scissor.offset.y = fbHeight - maxy;
+		ANKI_CMD(vkCmdSetScissor(m_handle, 0, 1, &scissor), ANY_OTHER_COMMAND);
+
+		m_viewportDirty = false;
+	}
+
 	ANKI_TRACE_INC_COUNTER(GR_DRAWCALLS, 1);
 	ANKI_TRACE_INC_COUNTER(GR_DRAWCALLS, 1);
 }
 }
 
 

+ 5 - 0
src/anki/gr/vulkan/Common.cpp

@@ -545,6 +545,11 @@ VkBufferUsageFlags convertBufferUsageBit(BufferUsageBit usageMask)
 		out |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
 		out |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
 	}
 	}
 
 
+	if(!!(usageMask & BufferUsageBit::TEXTURE_ALL))
+	{
+		out |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
+	}
+
 	ANKI_ASSERT(out);
 	ANKI_ASSERT(out);
 
 
 	return out;
 	return out;

+ 2 - 1
src/anki/gr/vulkan/GrManager.cpp

@@ -117,7 +117,8 @@ void GrManager::getStorageBufferInfo(U32& bindOffsetAlignment, PtrSize& maxStora
 
 
 void GrManager::getTextureBufferInfo(U32& bindOffsetAlignment, PtrSize& maxRange) const
 void GrManager::getTextureBufferInfo(U32& bindOffsetAlignment, PtrSize& maxRange) const
 {
 {
-	ANKI_ASSERT(!"TODO");
+	bindOffsetAlignment = m_impl->getPhysicalDeviceProperties().limits.minTexelBufferOffsetAlignment;
+	maxRange = MAX_U32;
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 8 - 1
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -358,7 +358,14 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 	q.queueCount = 1;
 	q.queueCount = 1;
 	q.pQueuePriorities = &priority;
 	q.pQueuePriorities = &priority;
 
 
-	static Array<const char*, 1> DEV_EXTENSIONS = {{VK_KHR_SWAPCHAIN_EXTENSION_NAME}};
+	static Array<const char*, 2> DEV_EXTENSIONS = {
+		{VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_MAINTENANCE1_EXTENSION_NAME}};
+
+	ANKI_VK_LOGI("Will enable the following device extensions:");
+	for(const char* ext : DEV_EXTENSIONS)
+	{
+		ANKI_VK_LOGI("\t%s", ext);
+	}
 
 
 	VkDeviceCreateInfo ci = {};
 	VkDeviceCreateInfo ci = {};
 	ci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
 	ci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;

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

@@ -245,7 +245,7 @@ const VkGraphicsPipelineCreateInfo& PipelineStateTracker::updatePipelineCreateIn
 	rastCi.rasterizerDiscardEnable = false;
 	rastCi.rasterizerDiscardEnable = false;
 	rastCi.polygonMode = convertFillMode(m_state.m_rasterizer.m_fillMode);
 	rastCi.polygonMode = convertFillMode(m_state.m_rasterizer.m_fillMode);
 	rastCi.cullMode = convertCullMode(m_state.m_rasterizer.m_cullMode);
 	rastCi.cullMode = convertCullMode(m_state.m_rasterizer.m_cullMode);
-	rastCi.frontFace = VK_FRONT_FACE_CLOCKWISE; // Use CW to workaround Vulkan's y flip
+	rastCi.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
 	rastCi.depthBiasEnable =
 	rastCi.depthBiasEnable =
 		m_state.m_rasterizer.m_depthBiasConstantFactor != 0.0 && m_state.m_rasterizer.m_depthBiasSlopeFactor != 0.0;
 		m_state.m_rasterizer.m_depthBiasConstantFactor != 0.0 && m_state.m_rasterizer.m_depthBiasSlopeFactor != 0.0;
 	rastCi.depthBiasConstantFactor = m_state.m_rasterizer.m_depthBiasConstantFactor;
 	rastCi.depthBiasConstantFactor = m_state.m_rasterizer.m_depthBiasConstantFactor;

+ 5 - 0
src/anki/gr/vulkan/ShaderImpl.cpp

@@ -178,6 +178,11 @@ static const char* SHADER_HEADER = R"(#version 450 core
 
 
 ShaderImpl::~ShaderImpl()
 ShaderImpl::~ShaderImpl()
 {
 {
+	for(auto& x : m_bindings)
+	{
+		x.destroy(getAllocator());
+	}
+
 	if(m_handle)
 	if(m_handle)
 	{
 	{
 		vkDestroyShaderModule(getDevice(), m_handle, nullptr);
 		vkDestroyShaderModule(getDevice(), m_handle, nullptr);

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit a9e034b8d28ac5c5331dba3360342ebfe703020c
+Subproject commit db8b921bac34e1971d59bf390cbbb502410f143b