Browse Source

Start using C++14. Fix vulkan bugs

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
fc5d15209d

+ 0 - 11
.appveyor.yml

@@ -6,7 +6,6 @@ branches:
 
 cache:
   - x86_64-6.3.0-release-posix-seh-rt_v5-rev1.7z
-  - x86_64-4.8.4-release-posix-seh-rt_v3-rev0.7z
 
 environment:
   MINGW_DIR: mingw64
@@ -22,16 +21,6 @@ environment:
       TOOLS: OFF
       MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/6.3.0/threads-posix/seh/x86_64-6.3.0-release-posix-seh-rt_v5-rev1.7z/download
       MINGW_ARCHIVE: x86_64-6.3.0-release-posix-seh-rt_v5-rev1.7z
-    - BUILD_TYPE: Release
-      ASSERTIONS: OFF
-      TOOLS: ON
-      MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.4/threads-posix/seh/x86_64-4.8.4-release-posix-seh-rt_v3-rev0.7z/download
-      MINGW_ARCHIVE: x86_64-4.8.4-release-posix-seh-rt_v3-rev0.7z
-    - BUILD_TYPE: Debug
-      ASSERTIONS: ON
-      TOOLS: OFF
-      MINGW_URL: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.8.4/threads-posix/seh/x86_64-4.8.4-release-posix-seh-rt_v3-rev0.7z/download
-      MINGW_ARCHIVE: x86_64-4.8.4-release-posix-seh-rt_v3-rev0.7z
 
 install:
   - git submodule update --init --recursive

+ 1 - 1
CMakeLists.txt

@@ -346,7 +346,7 @@ if(ANDROID)
 endif()
 
 # AnKi compiler flags (Mainly warnings)
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -W -Wextra -Wstrict-aliasing -Wwrite-strings -Wunused -Wunused-variable -Wno-unused-parameter -Wundef -Wno-ignored-attributes -Wunused-result -std=c++11")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -W -Wextra -Wstrict-aliasing -Wwrite-strings -Wunused -Wunused-variable -Wno-unused-parameter -Wundef -Wno-ignored-attributes -Wunused-result -std=c++14")
 
 # Set platform specific
 if(LINUX)

+ 2 - 2
README.md

@@ -34,7 +34,7 @@ external dependencies are almost none.
 Prerequisites:
 
 - Cmake 2.8 and up
-- GCC 4.8 and up or Clang 3.7 and up
+- GCC 5.0 and up or Clang 3.7 and up
 - libx11-dev installed
 - [Optional] libxinerama-dev if you want proper multi-monitor support
 
@@ -60,7 +60,7 @@ Prerequisites:
 
 - CMake 2.8 and up
 	- Make sure you add cmake.exe to your PATH environment variable (The installer asks, press yes)
-- MinGW-w64 4.8 and up
+- MinGW-w64 5.0 and up
 	- MinGW has many variants. You need the POSIX version plus SEH (eg x86_64-posix-seh)
 	- Install to a path without spaces (eg C:/mingw-w64)
 	- Append the path where mingw's binaries are located (eg C:/mingw-w64/bin) to the PATH environment variable

+ 7 - 1
samples/sponza/assets/fire.ankimtl

@@ -13,6 +13,8 @@
 
 			<inputs>
 				<input><type>mat4</type><name>anki_mvp</name></input>
+				<input><type>mat3</type><name>anki_cameraRotation</name></input>
+				<input><type>mat4</type><name>anki_viewMatrix</name></input>
 			</inputs>
 
 			<operations>
@@ -20,7 +22,11 @@
 					<id>0</id>
 					<returnType>void</returnType>
 					<function>particle</function>
-					<arguments><argument>anki_mvp</argument></arguments>
+					<arguments>
+						<argument>anki_mvp</argument>
+						<argument>anki_cameraRotation</argument>
+						<argument>anki_viewMatrix</argument>
+					</arguments>
 				</operation>
 			</operations>
 		</program>

+ 7 - 1
samples/sponza/assets/smoke.ankimtl

@@ -14,6 +14,8 @@
 
 			<inputs>
 				<input><type>mat4</type><name>anki_mvp</name></input>
+				<input><type>mat3</type><name>anki_cameraRotation</name></input>
+				<input><type>mat4</type><name>anki_viewMatrix</name></input>
 			</inputs>
 
 			<operations>
@@ -21,7 +23,11 @@
 					<id>0</id>
 					<returnType>void</returnType>
 					<function>particle</function>
-					<arguments><argument>anki_mvp</argument></arguments>
+					<arguments>
+						<argument>anki_mvp</argument>
+						<argument>anki_cameraRotation</argument>
+						<argument>anki_viewMatrix</argument>
+					</arguments>
 				</operation>
 			</operations>
 		</program>

+ 3 - 0
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -194,6 +194,7 @@ public:
 
 	void bindTexture(U32 set, U32 binding, TexturePtr tex_, DepthStencilAspectBit aspect)
 	{
+		commandCommon();
 		const U realBinding = binding;
 		Texture& tex = *tex_;
 		const VkImageLayout lay = tex.m_impl->findLayoutFromTracker(m_texUsageTracker);
@@ -203,6 +204,7 @@ public:
 
 	void bindTextureAndSampler(U32 set, U32 binding, TexturePtr& tex_, SamplerPtr sampler, DepthStencilAspectBit aspect)
 	{
+		commandCommon();
 		const U realBinding = binding;
 		Texture& tex = *tex_;
 		const VkImageLayout lay = tex.m_impl->findLayoutFromTracker(m_texUsageTracker);
@@ -213,6 +215,7 @@ public:
 
 	void bindImage(U32 set, U32 binding, TexturePtr& img, U32 level)
 	{
+		commandCommon();
 		const U realBinding =
 			binding + MAX_TEXTURE_BINDINGS + MAX_UNIFORM_BUFFER_BINDINGS + MAX_STORAGE_BUFFER_BINDINGS;
 		m_dsetState[set].bindImage(realBinding, img.get(), level);

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

@@ -432,10 +432,11 @@ Error DSLayoutCacheEntry::getOrCreateThreadAllocator(ThreadId tid, DSThreadAlloc
 	};
 
 	// Find using binary search
-	auto it = std::lower_bound(m_threadAllocs.getBegin(), m_threadAllocs.getEnd(), tid, Comp());
+	auto it = binarySearch(m_threadAllocs.getBegin(), m_threadAllocs.getEnd(), tid, Comp());
 
 	if(it != m_threadAllocs.getEnd())
 	{
+		ANKI_ASSERT((*it)->m_tid == tid);
 		alloc = *it;
 	}
 	else

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

@@ -468,7 +468,7 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				// Don't add it just yet. Can't enable it at the same time with VK_KHR_maintenance1
 			}
 			else if(CString(extensionInfos[extCount].extensionName) == VK_EXT_DEBUG_MARKER_EXTENSION_NAME
-				&& init.m_config->getNumber("debugContext"))
+				&& init.m_config->getNumber("debugMarkers"))
 			{
 				m_extensions |= VulkanExtensions::EXT_DEBUG_MARKER;
 				extensionsToEnable[extensionsToEnableCount++] = VK_EXT_DEBUG_MARKER_EXTENSION_NAME;

+ 4 - 4
src/anki/misc/ConfigSet.cpp

@@ -119,10 +119,10 @@ void ConfigSet::set(const CString& name, const CString& value)
 
 F64 ConfigSet::getNumber(const CString& name) const
 {
-	const Option* o = tryFind(name);
-	ANKI_ASSERT(o);
-	ANKI_ASSERT(o->m_type == 1);
-	return o->m_fVal;
+	const Option* option = tryFind(name);
+	ANKI_ASSERT(option);
+	ANKI_ASSERT(option->m_type == 1);
+	return option->m_fVal;
 }
 
 CString ConfigSet::getString(const CString& name) const

+ 6 - 7
src/anki/renderer/Fs.cpp

@@ -79,11 +79,6 @@ Error Fs::initVol()
 
 	m_r->createDrawQuadShaderProgram(m_vol.m_frag->getGrShader(), m_vol.m_prog);
 
-	SamplerInitInfo sinit;
-	sinit.m_repeat = false;
-	sinit.m_mipmapFilter = SamplingFilter::NEAREST;
-	m_vol.m_nearestSampler = getGrManager().newInstance<Sampler>(sinit);
-
 	return ErrorCode::NONE;
 }
 
@@ -102,8 +97,8 @@ void Fs::drawVolumetric(RenderingContext& ctx, CommandBufferPtr cmdb)
 	cmdb->informTextureSurfaceCurrentUsage(
 		m_r->getVolumetric().m_main.m_rt, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::SAMPLED_FRAGMENT);
 
-	cmdb->bindTextureAndSampler(0, 0, m_r->getDepthDownscale().m_hd.m_depthRt, m_vol.m_nearestSampler);
-	cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_qd.m_depthRt, m_vol.m_nearestSampler);
+	cmdb->bindTextureAndSampler(0, 0, m_r->getDepthDownscale().m_hd.m_depthRt, m_r->getNearestSampler());
+	cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_qd.m_depthRt, m_r->getNearestSampler());
 	cmdb->bindTexture(0, 2, m_r->getVolumetric().m_main.m_rt);
 	cmdb->bindTexture(0, 3, m_vol.m_noiseTex->getGrTexture());
 
@@ -134,6 +129,10 @@ Error Fs::buildCommandBuffers(RenderingContext& ctx, U threadId, U threadCount)
 	CommandBufferPtr cmdb = m_r->getGrManager().newInstance<CommandBuffer>(cinf);
 	ctx.m_fs.m_commandBuffers[threadId] = cmdb;
 
+	cmdb->informTextureCurrentUsage(m_r->getDepthDownscale().m_hd.m_depthRt,
+		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ);
+	cmdb->informTextureCurrentUsage(m_rt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
+
 	cmdb->bindTexture(1, 0, m_r->getDepthDownscale().m_hd.m_depthRt);
 	cmdb->bindTexture(1, 1, m_r->getSm().m_spotTexArray);
 	cmdb->bindTexture(1, 2, m_r->getSm().m_omniTexArray);

+ 0 - 1
src/anki/renderer/Fs.h

@@ -67,7 +67,6 @@ private:
 	public:
 		ShaderResourcePtr m_frag;
 		ShaderProgramPtr m_prog;
-		SamplerPtr m_nearestSampler;
 		TextureResourcePtr m_noiseTex;
 	} m_vol;
 

+ 1 - 8
src/anki/renderer/FsUpscale.cpp

@@ -32,13 +32,6 @@ Error FsUpscale::initInternal(const ConfigSet& config)
 
 	ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_noiseTex));
 
-	GrManager& gr = getGrManager();
-
-	SamplerInitInfo sinit;
-	sinit.m_repeat = false;
-	sinit.m_mipmapFilter = SamplingFilter::NEAREST;
-	m_nearestSampler = gr.newInstance<Sampler>(sinit);
-
 	// Shader
 	ANKI_CHECK(m_r->createShaderf("shaders/FsUpscale.frag.glsl",
 		m_frag,
@@ -71,7 +64,7 @@ void FsUpscale::run(RenderingContext& ctx)
 	computeLinearizeDepthOptimal(ctx.m_near, ctx.m_far, linearDepth->x(), linearDepth->y());
 
 	cmdb->bindTexture(0, 0, m_r->getMs().m_depthRt);
-	cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_hd.m_depthRt, m_nearestSampler);
+	cmdb->bindTextureAndSampler(0, 1, m_r->getDepthDownscale().m_hd.m_depthRt, m_r->getNearestSampler());
 	cmdb->bindTexture(0, 2, m_r->getFs().getRt());
 	cmdb->bindTexture(0, 3, m_noiseTex->getGrTexture());
 

+ 0 - 1
src/anki/renderer/FsUpscale.h

@@ -30,7 +30,6 @@ private:
 	FramebufferPtr m_fb;
 	ShaderResourcePtr m_frag;
 	ShaderProgramPtr m_prog;
-	SamplerPtr m_nearestSampler;
 
 	TextureResourcePtr m_noiseTex;
 

+ 2 - 4
src/anki/renderer/Ms.cpp

@@ -198,10 +198,8 @@ void Ms::setPostRunBarriers(RenderingContext& ctx)
 	cmdb->setTextureSurfaceBarrier(
 		m_rt2, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
 
-	cmdb->setTextureSurfaceBarrier(m_depthRt,
-		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ,
-		surf);
+	cmdb->setTextureSurfaceBarrier(
+		m_depthRt, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE, TextureUsageBit::SAMPLED_FRAGMENT, surf);
 
 	ANKI_TRACE_STOP_EVENT(RENDER_MS);
 }

+ 10 - 0
src/anki/util/Functions.h

@@ -14,6 +14,8 @@
 #include <utility>
 #include <new>
 #include <cstring>
+#include <algorithm>
+#include <functional>
 
 namespace anki
 {
@@ -208,6 +210,14 @@ ANKI_SPECIALISE_MEMORY_SET(U64)
 ANKI_SPECIALISE_MEMORY_SET(I64)
 
 #undef ANKI_SPECIALISE_MEMORY_SET
+
+/// Find a value in a shorted container.
+template<class TForwardIterator, class T, class TCompare = std::less<>>
+TForwardIterator binarySearch(TForwardIterator first, TForwardIterator last, const T& value, TCompare comp = {})
+{
+	first = std::lower_bound(first, last, value, comp);
+	return (first != last && !comp(value, *first)) ? first : last;
+}
 /// @}
 
 } // end namespace anki