Browse Source

Fixing more vulkan bugs

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
326c30060a

+ 1 - 1
include/anki/renderer/Lf.h

@@ -29,7 +29,7 @@ anki_internal:
 
 
 	ANKI_USE_RESULT Error init(const ConfigSet& config);
 	ANKI_USE_RESULT Error init(const ConfigSet& config);
 
 
-	void runOcclusionTests(RenderingContext& ctx);
+	void runOcclusionTests(RenderingContext& ctx, CommandBufferPtr cmdb);
 
 
 	void run(RenderingContext& ctx);
 	void run(RenderingContext& ctx);
 
 

+ 11 - 0
include/anki/scene/Visibility.h

@@ -114,6 +114,17 @@ public:
 								: nullptr;
 								: nullptr;
 	}
 	}
 
 
+	const VisibleNode* getBegin(VisibilityGroupType type) const
+	{
+		return (getCount(type)) ? &m_groups[type].m_nodes[0] : nullptr;
+	}
+
+	const VisibleNode* getEnd(VisibilityGroupType type) const
+	{
+		return (getCount(type)) ? (&m_groups[type].m_nodes[0] + getCount(type))
+								: nullptr;
+	}
+
 	void moveBack(SceneFrameAllocator<U8> alloc,
 	void moveBack(SceneFrameAllocator<U8> alloc,
 		VisibilityGroupType type,
 		VisibilityGroupType type,
 		VisibleNode& x);
 		VisibleNode& x);

+ 5 - 0
shaders/Common.glsl

@@ -9,7 +9,12 @@
 #ifndef ANKI_SHADERS_COMMON_GLSL
 #ifndef ANKI_SHADERS_COMMON_GLSL
 #define ANKI_SHADERS_COMMON_GLSL
 #define ANKI_SHADERS_COMMON_GLSL
 
 
+// WORKAROUND
+#if defined(ANKI_VENDOR_NVIDIA)
 #define NVIDIA_LINK_ERROR_WORKAROUND 1
 #define NVIDIA_LINK_ERROR_WORKAROUND 1
+#else
+#define NVIDIA_LINK_ERROR_WORKAROUND 0
+#endif
 
 
 // Default precision
 // Default precision
 #ifndef DEFAULT_FLOAT_PRECISION
 #ifndef DEFAULT_FLOAT_PRECISION

+ 2 - 2
shaders/MsCommonFrag.glsl

@@ -245,8 +245,8 @@ vec2 computeTextureCoordParallax(
 	vec3 E = normalize(eyeTangentSpace);
 	vec3 E = normalize(eyeTangentSpace);
 
 
 	float sampleCountf =
 	float sampleCountf =
-		mix(MAX_SAMPLES,
-			MIN_SAMPLES,
+		mix(float(MAX_SAMPLES),
+			float(MIN_SAMPLES),
 			min(dot(E, normTangentSpace),
 			min(dot(E, normTangentSpace),
 				in_vertPosViewSpace.z / -MAX_EFFECTIVE_DISTANCE));
 				in_vertPosViewSpace.z / -MAX_EFFECTIVE_DISTANCE));
 
 

+ 10 - 4
shaders/TmAverageLuminance.comp.glsl

@@ -43,10 +43,16 @@ void main()
 	{
 	{
 		for(uint x = 0; x < PIXEL_READ_X; ++x)
 		for(uint x = 0; x < PIXEL_READ_X; ++x)
 		{
 		{
-			vec3 color =
-				texelFetch(
-					u_isRt, ivec2(xStart, yStart) + ivec2(x, y), IS_RT_MIPMAP)
-					.rgb;
+			ivec2 uv = ivec2(xStart, yStart) + ivec2(x, y);
+// WORKAROUND
+#if defined(ANKI_VK) && defined(ANKI_VENDOR_NVIDIA)
+			vec3 color = textureLod(u_isRt,
+							 vec2(uv) / vec2(MIPMAP_WIDTH, MIPMAP_HEIGHT),
+							 IS_RT_MIPMAP)
+							 .rgb;
+#else
+			vec3 color = texelFetch(u_isRt, uv, IS_RT_MIPMAP).rgb;
+#endif
 			float lum = computeLuminance(color);
 			float lum = computeLuminance(color);
 			// avgLum += log(lum);
 			// avgLum += log(lum);
 			avgLum += lum / float(MIPMAP_WIDTH * MIPMAP_HEIGHT);
 			avgLum += lum / float(MIPMAP_WIDTH * MIPMAP_HEIGHT);

+ 2 - 2
src/gr/vulkan/Common.cpp

@@ -193,13 +193,13 @@ static const ConvertFormat CONVERT_FORMAT_TABLE[] = {
 	ANKI_FMT(NONE, NONE, VK_FORMAT_D16_UNORM_S8_UINT),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_D16_UNORM_S8_UINT),
 	ANKI_FMT(D24, UNORM, VK_FORMAT_D24_UNORM_S8_UINT),
 	ANKI_FMT(D24, UNORM, VK_FORMAT_D24_UNORM_S8_UINT),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_D32_SFLOAT_S8_UINT),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_D32_SFLOAT_S8_UINT),
-	ANKI_FMT(R8G8B8_S3TC, NONE, VK_FORMAT_BC1_RGB_UNORM_BLOCK),
+	ANKI_FMT(R8G8B8_S3TC, UNORM, VK_FORMAT_BC1_RGB_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC1_RGB_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC1_RGB_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC1_RGBA_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC1_RGBA_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC1_RGBA_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC1_RGBA_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC2_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC2_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC2_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC2_SRGB_BLOCK),
-	ANKI_FMT(R8G8B8A8_S3TC, NONE, VK_FORMAT_BC3_UNORM_BLOCK),
+	ANKI_FMT(R8G8B8A8_S3TC, UNORM, VK_FORMAT_BC3_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC3_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC3_SRGB_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC4_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC4_UNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC4_SNORM_BLOCK),
 	ANKI_FMT(NONE, NONE, VK_FORMAT_BC4_SNORM_BLOCK),

+ 3 - 4
src/renderer/Lf.cpp

@@ -158,12 +158,11 @@ Error Lf::initInternal(const ConfigSet& config)
 }
 }
 
 
 //==============================================================================
 //==============================================================================
-void Lf::runOcclusionTests(RenderingContext& ctx)
+void Lf::runOcclusionTests(RenderingContext& ctx, CommandBufferPtr cmdb)
 {
 {
 	// Retrieve some things
 	// Retrieve some things
-	FrustumComponent& camFr = *ctx.m_frustumComponent;
-	CommandBufferPtr& cmdb = ctx.m_commandBuffer;
-	VisibilityTestResults& vi = camFr.getVisibilityTestResults();
+	const FrustumComponent& camFr = *ctx.m_frustumComponent;
+	const VisibilityTestResults& vi = camFr.getVisibilityTestResults();
 
 
 	if(vi.getCount(VisibilityGroupType::FLARES) > m_maxFlares)
 	if(vi.getCount(VisibilityGroupType::FLARES) > m_maxFlares)
 	{
 	{

+ 2 - 0
src/renderer/Ms.cpp

@@ -180,6 +180,8 @@ void Ms::run(RenderingContext& ctx)
 		}
 		}
 	}
 	}
 
 
+	cmdb->endRenderPass();
+
 	ANKI_TRACE_STOP_EVENT(RENDER_MS);
 	ANKI_TRACE_STOP_EVENT(RENDER_MS);
 }
 }
 
 

+ 1 - 1
src/renderer/Pps.cpp

@@ -44,7 +44,7 @@ Error Pps::initInternal(const ConfigSet& config)
 		m_r->getHeight(),
 		m_r->getHeight(),
 		RT_PIXEL_FORMAT,
 		RT_PIXEL_FORMAT,
 		TextureUsageBit::SAMPLED_FRAGMENT
 		TextureUsageBit::SAMPLED_FRAGMENT
-			| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
+			| TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE,
 		SamplingFilter::LINEAR,
 		SamplingFilter::LINEAR,
 		1,
 		1,
 		m_rt);
 		m_rt);

+ 6 - 2
src/renderer/Renderer.cpp

@@ -237,8 +237,6 @@ Error Renderer::render(RenderingContext& ctx)
 	m_sm->run(ctx);
 	m_sm->run(ctx);
 
 
 	m_ms->run(ctx);
 	m_ms->run(ctx);
-	m_lf->runOcclusionTests(ctx);
-	cmdb->endRenderPass();
 
 
 	m_ms->setPostRunBarriers(ctx);
 	m_ms->setPostRunBarriers(ctx);
 	m_sm->setPostRunBarriers(ctx);
 	m_sm->setPostRunBarriers(ctx);
@@ -426,6 +424,12 @@ Error Renderer::buildCommandBuffers(RenderingContext& ctx)
 			ANKI_CHECK(m_r->getMs().buildCommandBuffers(
 			ANKI_CHECK(m_r->getMs().buildCommandBuffers(
 				*m_ctx, threadId, threadsCount));
 				*m_ctx, threadId, threadsCount));
 
 
+			if(threadId == threadsCount - 1)
+			{
+				m_r->m_lf->runOcclusionTests(
+					*m_ctx, m_ctx->m_ms.m_commandBuffers[threadId]);
+			}
+
 			ANKI_CHECK(m_r->getSm().buildCommandBuffers(
 			ANKI_CHECK(m_r->getSm().buildCommandBuffers(
 				*m_ctx, threadId, threadsCount));
 				*m_ctx, threadId, threadsCount));