Bläddra i källkod

Minor optimizations

Panagiotis Christopoulos Charitos 8 år sedan
förälder
incheckning
41e688a248

+ 2 - 4
programs/Is.ankiprog

@@ -27,10 +27,8 @@ out gl_PerVertex
 
 
 void main()
 void main()
 {
 {
-	const vec2 POSITIONS[3] = vec2[](vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));
-
-	vec2 pos = POSITIONS[gl_VertexID];
-	out_uv = NDC_TO_UV(pos);
+	out_uv = vec2(gl_VertexID & 1, gl_VertexID >> 1) * 2.0;
+	vec2 pos = out_uv * 2.0 - 1.0;
 	ANKI_WRITE_POSITION(vec4(pos, 0.0, 1.0));
 	ANKI_WRITE_POSITION(vec4(pos, 0.0, 1.0));
 
 
 	out_clusterIJ = vec2(CLUSTER_COUNT_X, CLUSTER_COUNT_Y) * out_uv;
 	out_clusterIJ = vec2(CLUSTER_COUNT_X, CLUSTER_COUNT_Y) * out_uv;

+ 3 - 4
shaders/FsCommonVert.glsl

@@ -36,15 +36,14 @@ out gl_PerVertex
 
 
 void particle(in mat4 mvp, in mat3 camRot, in mat4 viewMat)
 void particle(in mat4 mvp, in mat3 camRot, in mat4 viewMat)
 {
 {
-	const vec2 POSITIONS[4] = vec2[](vec2(-0.5, -0.5), vec2(0.5, -0.5), vec2(-0.5, 0.5), vec2(0.5, 0.5));
-	vec3 worldPos = camRot * vec3(POSITIONS[gl_VertexID] * in_scale, 0.0) + in_position;
+	out_uv = vec2(gl_VertexID & 1, gl_VertexID >> 1);
+
+	vec3 worldPos = camRot * vec3((out_uv - 0.5) * in_scale, 0.0) + in_position;
 	ANKI_WRITE_POSITION(mvp * vec4(worldPos, 1.0));
 	ANKI_WRITE_POSITION(mvp * vec4(worldPos, 1.0));
 
 
 	out_posViewSpace = (viewMat * vec4(worldPos, 1.0)).xyz;
 	out_posViewSpace = (viewMat * vec4(worldPos, 1.0)).xyz;
 
 
 	out_alpha = in_alpha;
 	out_alpha = in_alpha;
-
-	out_uv = POSITIONS[gl_VertexID] + 0.5;
 }
 }
 
 
 #endif
 #endif

+ 1 - 3
shaders/LfSpritePass.vert.glsl

@@ -31,9 +31,7 @@ out gl_PerVertex
 
 
 void main()
 void main()
 {
 {
-	const vec2 POSITIONS[4] = vec2[](vec2(-1.0, -1.0), vec2(1.0, -1.0), vec2(-1.0, 1.0), vec2(1.0, 1.0));
-
-	vec2 position = POSITIONS[gl_VertexID];
+	vec2 position = UV_TO_NDC(vec2(gl_VertexID & 1, gl_VertexID >> 1));
 
 
 	Sprite sprite = u_sprites[gl_InstanceID];
 	Sprite sprite = u_sprites[gl_InstanceID];
 
 

+ 2 - 7
shaders/Quad.vert.glsl

@@ -5,10 +5,6 @@
 
 
 #include "shaders/Common.glsl"
 #include "shaders/Common.glsl"
 
 
-#if !defined(UV_OFFSET)
-#define UV_OFFSET (0.0)
-#endif
-
 out gl_PerVertex
 out gl_PerVertex
 {
 {
 	vec4 gl_Position;
 	vec4 gl_Position;
@@ -18,9 +14,8 @@ layout(location = 0) out vec2 out_uv;
 
 
 void main()
 void main()
 {
 {
-	const vec2 POSITIONS[3] = vec2[](vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));
+	out_uv = vec2(gl_VertexID & 1, gl_VertexID >> 1) * 2.0;
+	vec2 pos = out_uv * 2.0 - 1.0;
 
 
-	vec2 pos = POSITIONS[gl_VertexID];
-	out_uv = pos * 0.5 + (0.5 + UV_OFFSET);
 	ANKI_WRITE_POSITION(vec4(pos, 0.0, 1.0));
 	ANKI_WRITE_POSITION(vec4(pos, 0.0, 1.0));
 }
 }

+ 2 - 0
src/anki/core/Config.cpp

@@ -20,6 +20,8 @@ Config::Config()
 	newOption("sm.resolution", 512);
 	newOption("sm.resolution", 512);
 	newOption("sm.maxLights", 4);
 	newOption("sm.maxLights", 4);
 
 
+	newOption("r.ms.earlyZDistance", 10.0);
+
 	newOption("is.maxPointLights", 384);
 	newOption("is.maxPointLights", 384);
 	newOption("is.maxSpotLights", 16);
 	newOption("is.maxSpotLights", 16);
 	newOption("is.maxSpotTexLights", 8);
 	newOption("is.maxSpotTexLights", 8);

+ 2 - 0
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -567,10 +567,12 @@ Error GrManagerImpl::initSwapchain(const GrManagerInitInfo& init)
 	VkPresentModeKHR presentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
 	VkPresentModeKHR presentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
 	if(init.m_config->getNumber("vsync"))
 	if(init.m_config->getNumber("vsync"))
 	{
 	{
+		ANKI_VK_LOGI("vsync is on");
 		presentMode = VK_PRESENT_MODE_FIFO_KHR;
 		presentMode = VK_PRESENT_MODE_FIFO_KHR;
 	}
 	}
 	else
 	else
 	{
 	{
+		ANKI_VK_LOGI("vsync is off");
 		for(U i = 0; i < presentModeCount; ++i)
 		for(U i = 0; i < presentModeCount; ++i)
 		{
 		{
 			if(presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR)
 			if(presentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR)

+ 14 - 9
src/anki/scene/SoftwareRasterizer.cpp

@@ -110,8 +110,9 @@ void SoftwareRasterizer::clipTriangle(const Vec4* inVerts, Vec4* outVerts, U& ou
 		outVerts[1] = intersection0.xyz1();
 		outVerts[1] = intersection0.xyz1();
 		outVerts[2] = intersection1.xyz1();
 		outVerts[2] = intersection1.xyz1();
 		outVertCount = 3;
 		outVertCount = 3;
+
+		break;
 	}
 	}
-	break;
 	case 2:
 	case 2:
 	{
 	{
 		U in0, in1, out;
 		U in0, in1, out;
@@ -161,12 +162,13 @@ void SoftwareRasterizer::clipTriangle(const Vec4* inVerts, Vec4* outVerts, U& ou
 		outVerts[4] = inVerts[in0];
 		outVerts[4] = inVerts[in0];
 		outVerts[5] = inVerts[in1];
 		outVerts[5] = inVerts[in1];
 		outVertCount = 6;
 		outVertCount = 6;
+
+		break;
 	}
 	}
-	break;
 	}
 	}
 }
 }
 
 
-void SoftwareRasterizer::draw(const F32* verts, U vertCount, U stride)
+void SoftwareRasterizer::draw(const F32* verts, U vertCount, U stride, Bool backfaceCulling)
 {
 {
 	ANKI_ASSERT(verts && vertCount > 0 && (vertCount % 3) == 0);
 	ANKI_ASSERT(verts && vertCount > 0 && (vertCount % 3) == 0);
 	ANKI_ASSERT(stride >= sizeof(F32) * 3 && (stride % sizeof(F32)) == 0);
 	ANKI_ASSERT(stride >= sizeof(F32) * 3 && (stride % sizeof(F32)) == 0);
@@ -184,13 +186,16 @@ void SoftwareRasterizer::draw(const F32* verts, U vertCount, U stride)
 		}
 		}
 
 
 		// Cull if backfacing
 		// Cull if backfacing
-		Vec4 norm = (triVspace[1] - triVspace[0]).cross(triVspace[2] - triVspace[1]);
-		ANKI_ASSERT(norm.w() == 0.0f);
-
-		Vec4 eye = triVspace[0].xyz0();
-		if(norm.dot(eye) >= 0.0f)
+		if(backfaceCulling)
 		{
 		{
-			continue;
+			Vec4 norm = (triVspace[1] - triVspace[0]).cross(triVspace[2] - triVspace[1]);
+			ANKI_ASSERT(norm.w() == 0.0f);
+
+			Vec4 eye = triVspace[0].xyz0();
+			if(norm.dot(eye) >= 0.0f)
+			{
+				continue;
+			}
 		}
 		}
 
 
 		// Clip it
 		// Clip it

+ 2 - 1
src/anki/scene/SoftwareRasterizer.h

@@ -41,7 +41,8 @@ public:
 	/// @param[in] verts Pointer to the first vertex to draw.
 	/// @param[in] verts Pointer to the first vertex to draw.
 	/// @param vertCount The number of verts to draw.
 	/// @param vertCount The number of verts to draw.
 	/// @param stride The stride (in bytes) of the next vertex.
 	/// @param stride The stride (in bytes) of the next vertex.
-	void draw(const F32* verts, U vertCount, U stride);
+	/// @param backfaceCulling If true it will do backface culling.
+	void draw(const F32* verts, U vertCount, U stride, Bool backfaceCulling);
 
 
 	/// Perform visibility tests.
 	/// Perform visibility tests.
 	/// @param cs The collision shape in world space.
 	/// @param cs The collision shape in world space.

+ 1 - 1
src/anki/scene/Visibility.cpp

@@ -204,7 +204,7 @@ void RasterizeTrianglesTask::rasterize()
 		U count = (end - start) * 3;
 		U count = (end - start) * 3;
 		ANKI_ASSERT(count <= m_gatherTask->m_vertCount);
 		ANKI_ASSERT(count <= m_gatherTask->m_vertCount);
 
 
-		m_gatherTask->m_r.draw(&first[0][0], count, sizeof(Vec3));
+		m_gatherTask->m_r.draw(&first[0][0], count, sizeof(Vec3), false);
 	}
 	}
 
 
 	ANKI_TRACE_STOP_EVENT(SCENE_VISIBILITY_RASTERIZE);
 	ANKI_TRACE_STOP_EVENT(SCENE_VISIBILITY_RASTERIZE);