Browse Source

Fix vulkan bugs

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
9e4cdd848a

+ 0 - 4
shaders/Pps.frag.glsl

@@ -107,11 +107,7 @@ vec3 colorGrading(in vec3 color)
 
 void main()
 {
-#if DRAW_TO_DEFAULT && defined(ANKI_VK)
-	vec2 uv = vec2(in_uv.x, 1.0 - in_uv.y);
-#else
 	vec2 uv = in_uv.xy;
-#endif
 
 #if SHARPEN_ENABLED
 	out_color = sharpen(u_isRt, uv);

+ 10 - 3
src/anki/gr/Common.h

@@ -185,13 +185,20 @@ public:
 	/// @name The name of the object.
 	GrBaseInitInfo(CString name)
 	{
-		ANKI_ASSERT(name.getLength() > 0 && name.getLength() <= MAX_GR_OBJECT_NAME_LENGTH);
-		memcpy(&m_name[0], &name[0], name.getLength() + 1);
+		if(name)
+		{
+			ANKI_ASSERT(name.getLength() <= MAX_GR_OBJECT_NAME_LENGTH);
+			memcpy(&m_name[0], &name[0], name.getLength() + 1);
+		}
+		else
+		{
+			m_name[0] = '\0';
+		}
 	}
 
 	GrBaseInitInfo()
+		: GrBaseInitInfo(CString())
 	{
-		m_name[0] = '\0';
 	}
 
 	GrBaseInitInfo(const GrBaseInitInfo& b)

+ 21 - 7
src/anki/gr/Texture.h

@@ -14,7 +14,7 @@ namespace anki
 /// @{
 
 /// Sampler initializer.
-class SamplerInitInfo
+class SamplerInitInfo : public GrBaseInitInfo
 {
 public:
 	F32 m_minLod = -1000.0;
@@ -25,20 +25,26 @@ public:
 	I8 m_anisotropyLevel = 0;
 	Bool8 m_repeat = true; ///< Repeat or clamp.
 
+	SamplerInitInfo() = default;
+
+	SamplerInitInfo(CString name)
+		: GrBaseInitInfo(name)
+	{
+	}
+
 	U64 computeHash() const
 	{
-		return anki::computeHash(this, offsetof(SamplerInitInfo, m_repeat) + sizeof(m_repeat));
+		const U8* start = reinterpret_cast<const U8*>(&m_minLod);
+		const U8* end = reinterpret_cast<const U8*>(&m_repeat) + sizeof(m_repeat);
+		ANKI_ASSERT((end - start == 13) && "Class needs to be tightly packed since we hash it");
+		return anki::computeHash(start, end - start);
 	}
 };
 
-static_assert(offsetof(SamplerInitInfo, m_repeat) == 12, "Class needs to be tightly packed since we hash it");
-
 /// Texture initializer.
-class TextureInitInfo
+class TextureInitInfo : public GrBaseInitInfo
 {
 public:
-	CString m_name; ///< Optional
-
 	TextureType m_type = TextureType::_2D;
 
 	TextureUsageBit m_usage = TextureUsageBit::NONE; ///< How the texture will be used.
@@ -57,6 +63,14 @@ public:
 	U8 m_samples = 1;
 
 	SamplerInitInfo m_sampling;
+
+	TextureInitInfo() = default;
+
+	TextureInitInfo(CString name)
+		: GrBaseInitInfo(name)
+		, m_sampling(name)
+	{
+	}
 };
 
 /// GPU texture

+ 3 - 2
src/anki/gr/vulkan/CommandBuffer.cpp

@@ -56,9 +56,10 @@ void CommandBuffer::finish()
 	}
 }
 
-void CommandBuffer::bindVertexBuffer(U32 binding, BufferPtr buff, PtrSize offset, PtrSize stride)
+void CommandBuffer::bindVertexBuffer(
+	U32 binding, BufferPtr buff, PtrSize offset, PtrSize stride, VertexStepRate stepRate)
 {
-	m_impl->bindVertexBuffer(binding, buff, offset, stride);
+	m_impl->bindVertexBuffer(binding, buff, offset, stride, stepRate);
 }
 
 void CommandBuffer::setVertexAttribute(U32 location, U32 buffBinding, const PixelFormat& fmt, PtrSize relativeOffset)

+ 2 - 2
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -72,10 +72,10 @@ public:
 		return !!(m_flags & CommandBufferFlag::SECOND_LEVEL);
 	}
 
-	void bindVertexBuffer(U32 binding, BufferPtr buff, PtrSize offset, PtrSize stride)
+	void bindVertexBuffer(U32 binding, BufferPtr buff, PtrSize offset, PtrSize stride, VertexStepRate stepRate)
 	{
 		commandCommon();
-		m_state.bindVertexBuffer(binding, stride);
+		m_state.bindVertexBuffer(binding, stride, stepRate);
 		VkBuffer vkbuff = buff->m_impl->getHandle();
 		ANKI_CMD(vkCmdBindVertexBuffers(m_handle, binding, 1, &vkbuff, &offset), ANY_OTHER_COMMAND);
 		m_bufferList.pushBack(m_alloc, buff);

+ 3 - 3
src/anki/gr/vulkan/Pipeline.h

@@ -172,14 +172,14 @@ public:
 	{
 	}
 
-	void bindVertexBuffer(U32 binding, PtrSize stride)
+	void bindVertexBuffer(U32 binding, PtrSize stride, VertexStepRate stepRate)
 	{
 		VertexBufferBinding b;
 		b.m_stride = stride;
-		b.m_stepRate = VertexStepRate::VERTEX;
+		b.m_stepRate = stepRate;
 		if(m_state.m_vertex.m_bindings[binding] != b)
 		{
-			m_state.m_vertex.m_bindings[binding].m_stride = stride;
+			m_state.m_vertex.m_bindings[binding] = b;
 			m_dirty.m_vertBindings.set(binding);
 		}
 		m_set.m_vertBindings.set(binding);

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

@@ -304,7 +304,7 @@ Error TextureImpl::initImage(const TextureInitInfo& init_)
 
 	ANKI_VK_CHECK(vkCreateImage(getDevice(), &ci, nullptr, &m_imageHandle));
 	getGrManagerImpl().trySetVulkanHandleName(
-		init.m_name, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, ptrToNumber(m_imageHandle));
+		init.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, ptrToNumber(m_imageHandle));
 
 	// Allocate memory
 	//

+ 8 - 4
src/anki/renderer/Bloom.cpp

@@ -32,10 +32,12 @@ Error BloomExposure::init(const ConfigSet& config)
 		m_height,
 		BLOOM_RT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"bloomexp"));
 
 	// Create FBs
-	FramebufferInitInfo fbInit("bloomex");
+	FramebufferInitInfo fbInit("bloomexp");
 	fbInit.m_colorAttachmentCount = 1;
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
@@ -103,10 +105,12 @@ Error BloomUpscale::init(const ConfigSet& config)
 		m_height,
 		BLOOM_RT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"bloomupscale"));
 
 	// Create FBs
-	FramebufferInitInfo fbInit("bloomup");
+	FramebufferInitInfo fbInit("bloomupscale");
 	fbInit.m_colorAttachmentCount = 1;
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;

+ 6 - 2
src/anki/renderer/DepthDownscale.cpp

@@ -25,7 +25,9 @@ Error HalfDepth::init(const ConfigSet&)
 		height,
 		MS_DEPTH_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"halfdepth"));
 
 	// Create FB
 	FramebufferInitInfo fbInit("halfdepth");
@@ -89,7 +91,9 @@ Error QuarterDepth::init(const ConfigSet&)
 		height,
 		PixelFormat(ComponentFormat::R32, TransformFormat::FLOAT),
 		TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"quarterdepth"));
 
 	FramebufferInitInfo fbInit("quarterdepth");
 	fbInit.m_colorAttachments[0].m_texture = m_depthRt;

+ 3 - 1
src/anki/renderer/DownscaleBlur.cpp

@@ -38,7 +38,9 @@ Error DownscaleBlur::initSubpass(U idx, const UVec2& inputTexSize)
 		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
 			| TextureUsageBit::SAMPLED_COMPUTE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"downblur"));
 
 	// FB
 	FramebufferInitInfo fbInit("downblur");

+ 3 - 1
src/anki/renderer/Fs.cpp

@@ -43,7 +43,9 @@ Error Fs::initInternal(const ConfigSet&)
 		m_height,
 		FS_COLOR_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"forward"));
 
 	FramebufferInitInfo fbInit("forward");
 	fbInit.m_colorAttachmentCount = 1;

+ 3 - 1
src/anki/renderer/Is.cpp

@@ -127,7 +127,9 @@ Error Is::initInternal(const ConfigSet& config)
 		m_r->getHeight(),
 		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"lightp"));
 
 	FramebufferInitInfo fbInit("lightp");
 	fbInit.m_colorAttachmentCount = 1;

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

@@ -26,26 +26,34 @@ Error Ms::createRt()
 		MS_DEPTH_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE
 			| TextureUsageBit::GENERATE_MIPMAPS,
-		SamplingFilter::NEAREST));
+		SamplingFilter::NEAREST,
+		1,
+		"gbuffdepth"));
 
 	m_rt0 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
 		m_r->getHeight(),
 		MS_COLOR_ATTACHMENT_PIXEL_FORMATS[0],
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::NEAREST));
+		SamplingFilter::NEAREST,
+		1,
+		"gbuffrt0"));
 
 	m_rt1 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
 		m_r->getHeight(),
 		MS_COLOR_ATTACHMENT_PIXEL_FORMATS[1],
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::NEAREST));
+		SamplingFilter::NEAREST,
+		1,
+		"gbuffrt1"));
 
 	m_rt2 = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
 		m_r->getHeight(),
 		MS_COLOR_ATTACHMENT_PIXEL_FORMATS[2],
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
 			| TextureUsageBit::GENERATE_MIPMAPS,
-		SamplingFilter::NEAREST));
+		SamplingFilter::NEAREST,
+		1,
+		"gbuffrt2"));
 
 	AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
 #if ANKI_EXTRA_CHECKS

+ 3 - 1
src/anki/renderer/Pps.cpp

@@ -45,7 +45,9 @@ Error Pps::initInternal(const ConfigSet& config)
 			m_r->getHeight(),
 			RT_PIXEL_FORMAT,
 			TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
-			SamplingFilter::LINEAR));
+			SamplingFilter::LINEAR,
+			1,
+			"pps"));
 
 		FramebufferInitInfo fbInit("pps");
 		fbInit.m_colorAttachmentCount = 1;

+ 1 - 2
src/anki/renderer/Renderer.cpp

@@ -411,9 +411,8 @@ TextureInitInfo Renderer::create2DRenderTargetInitInfo(
 	U32 w, U32 h, const PixelFormat& format, TextureUsageBit usage, SamplingFilter filter, U mipsCount, CString name)
 {
 	ANKI_ASSERT(!!(usage & TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE));
-	TextureInitInfo init;
+	TextureInitInfo init(name);
 
-	init.m_name = name;
 	init.m_width = w;
 	init.m_height = h;
 	init.m_depth = 1;

+ 1 - 1
src/anki/renderer/Sm.cpp

@@ -49,7 +49,7 @@ Error Sm::initInternal(const ConfigSet& config)
 	//
 
 	// Create shadowmaps array
-	TextureInitInfo sminit;
+	TextureInitInfo sminit("shadows");
 	sminit.m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
 	sminit.m_usageWhenEncountered = TextureUsageBit::SAMPLED_FRAGMENT;
 	sminit.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;

+ 7 - 3
src/anki/renderer/Ssao.cpp

@@ -36,7 +36,9 @@ Error SsaoMain::init(const ConfigSet& config)
 		m_ssao->m_height,
 		Ssao::RT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::CLEAR,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"ssaomain"));
 
 	// FB
 	FramebufferInitInfo fbInit("ssaomain");
@@ -97,7 +99,7 @@ void SsaoMain::run(RenderingContext& ctx)
 	cmdb->bindShaderProgram(m_prog);
 
 	cmdb->bindTexture(0, 0, m_r->getDepthDownscale().m_qd.m_depthRt);
-	cmdb->bindTexture(0, 1, m_r->getMs().m_rt2);
+	cmdb->bindTextureAndSampler(0, 1, m_r->getMs().m_rt2, m_r->getLinearSampler());
 	cmdb->bindTexture(0, 2, m_noiseTex->getGrTexture());
 
 	Vec4* unis = allocateAndBindUniforms<Vec4*>(sizeof(Vec4) * 2, cmdb, 0, 0);
@@ -125,7 +127,9 @@ Error SsaoHBlur::init(const ConfigSet& config)
 		m_ssao->m_height,
 		Ssao::RT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"ssaoblur"));
 
 	// FB
 	FramebufferInitInfo fbInit("ssaoblur");

+ 4 - 1
src/anki/renderer/Taa.cpp

@@ -39,7 +39,9 @@ Error Taa::initInternal(const ConfigSet& config)
 			m_r->getHeight(),
 			IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
 			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-			SamplingFilter::LINEAR));
+			SamplingFilter::LINEAR,
+			1,
+			"taa"));
 
 		FramebufferInitInfo fbInit("taa");
 		fbInit.m_colorAttachmentCount = 1;
@@ -69,6 +71,7 @@ void Taa::run(RenderingContext& ctx)
 	cmdb->bindShaderProgram(m_prog);
 	cmdb->bindTextureAndSampler(0, 0, m_r->getMs().m_depthRt, m_r->getNearestSampler());
 	cmdb->bindTextureAndSampler(0, 1, m_r->getIs().getRt(), m_r->getNearestSampler());
+	cmdb->informTextureCurrentUsage(m_rts[(m_r->getFrameCount() + 1) & 1], TextureUsageBit::SAMPLED_FRAGMENT);
 	cmdb->bindTextureAndSampler(0, 2, m_rts[(m_r->getFrameCount() + 1) & 1], m_r->getLinearSampler());
 
 	Mat4* unis = allocateAndBindUniforms<Mat4*>(sizeof(Mat4), cmdb, 0, 0);

+ 10 - 6
src/anki/renderer/Volumetric.cpp

@@ -20,16 +20,18 @@ Error VolumetricMain::init(const ConfigSet& config)
 	ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_noiseTex));
 
 	// RT
-	m_rt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_vol->m_width,
+	TextureInitInfo rtInit = m_r->create2DRenderTargetInitInfo(m_vol->m_width,
 		m_vol->m_height,
 		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
-		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE | TextureUsageBit::CLEAR,
+		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 		SamplingFilter::LINEAR,
 		1,
-		"RVolMain"));
+		"volmain");
+	rtInit.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;
+	m_rt = m_r->createAndClearRenderTarget(rtInit);
 
 	// FB
-	FramebufferInitInfo fbInit;
+	FramebufferInitInfo fbInit("volmain");
 	fbInit.m_colorAttachmentCount = 1;
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::LOAD;
@@ -136,10 +138,12 @@ Error VolumetricHBlur::init(const ConfigSet& config)
 		m_vol->m_height,
 		IS_COLOR_ATTACHMENT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
-		SamplingFilter::LINEAR));
+		SamplingFilter::LINEAR,
+		1,
+		"volblur"));
 
 	// Create FBs
-	FramebufferInitInfo fbInit("volumetric");
+	FramebufferInitInfo fbInit("volblur");
 	fbInit.m_colorAttachmentCount = 1;
 	fbInit.m_colorAttachments[0].m_texture = m_rt;
 	fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;