Browse Source

Small performance optimization for mesh drawing.

Sasha Szpakowski 1 year ago
parent
commit
2d606b1f0c

+ 14 - 6
src/modules/graphics/Mesh.cpp

@@ -141,7 +141,12 @@ void Mesh::setupAttachedAttributes()
 		if (getAttachedAttributeIndex(name) != -1)
 			throw love::Exception("Duplicate vertex attribute name: %s", name.c_str());
 
-		attachedAttributes.push_back({name, vertexBuffer, nullptr, name, (int) i, 0, STEP_PER_VERTEX, true});
+		BuiltinVertexAttribute builtinattrib;
+		int builtinAttribIndex = -1;
+		if (getConstant(name.c_str(), builtinattrib))
+			builtinAttribIndex = (int)builtinattrib;
+
+		attachedAttributes.push_back({name, vertexBuffer, nullptr, name, (int) i, 0, STEP_PER_VERTEX, builtinAttribIndex, true});
 	}
 }
 
@@ -168,6 +173,12 @@ void Mesh::finalizeAttribute(BufferAttribute &attrib) const
 	if (indexInBuffer < 0)
 		throw love::Exception("Buffer does not have a vertex attribute with name '%s'.", attrib.nameInBuffer.c_str());
 
+	BuiltinVertexAttribute builtinattrib;
+	if (getConstant(attrib.name.c_str(), builtinattrib))
+		attrib.builtinAttributeIndex = (int)builtinattrib;
+	else
+		attrib.builtinAttributeIndex = -1;
+
 	attrib.indexInBuffer = indexInBuffer;
 }
 
@@ -593,14 +604,11 @@ void Mesh::drawInternal(Graphics *gfx, const Matrix4 &m, int instancecount, Buff
 			continue;
 
 		Buffer *buffer = attrib.buffer.get();
-		int attributeindex = -1;
+		int attributeindex = attrib.builtinAttributeIndex;
 
 		// If the attribute is one of the LOVE-defined ones, use the constant
 		// attribute index for it, otherwise query the index from the shader.
-		BuiltinVertexAttribute builtinattrib;
-		if (getConstant(attrib.name.c_str(), builtinattrib))
-			attributeindex = (int) builtinattrib;
-		else if (Shader::current)
+		if (attributeindex < 0 && Shader::current)
 			attributeindex = Shader::current->getVertexAttributeIndex(attrib.name);
 
 		if (attributeindex >= 0)

+ 1 - 0
src/modules/graphics/Mesh.h

@@ -60,6 +60,7 @@ public:
 		int indexInBuffer;
 		int startArrayIndex;
 		AttributeStep step;
+		int builtinAttributeIndex;
 		bool enabled;
 	};
 

+ 8 - 5
src/modules/graphics/SpriteBatch.cpp

@@ -285,6 +285,12 @@ void SpriteBatch::attachAttribute(const std::string &name, Buffer *buffer, Mesh
 	newattrib.buffer = buffer;
 	newattrib.mesh = mesh;
 
+	BuiltinVertexAttribute builtinattrib;
+	if (getConstant(name.c_str(), builtinattrib))
+		newattrib.builtinAttributeIndex = (int)builtinattrib;
+	else
+		newattrib.builtinAttributeIndex = -1;
+
 	attached_attributes[name] = newattrib;
 }
 
@@ -355,14 +361,11 @@ void SpriteBatch::draw(Graphics *gfx, const Matrix4 &m)
 		if (buffer->getArrayLength() < (size_t) next * 4)
 			throw love::Exception("Buffer with attribute '%s' attached to this SpriteBatch has too few vertices", it.first.c_str());
 
-		int attributeindex = -1;
+		int attributeindex = it.second.builtinAttributeIndex;
 
 		// If the attribute is one of the LOVE-defined ones, use the constant
 		// attribute index for it, otherwise query the index from the shader.
-		BuiltinVertexAttribute builtinattrib;
-		if (getConstant(it.first.c_str(), builtinattrib))
-			attributeindex = (int) builtinattrib;
-		else if (Shader::current)
+		if (attributeindex < 0 && Shader::current)
 			attributeindex = Shader::current->getVertexAttributeIndex(it.first);
 
 		if (attributeindex >= 0)

+ 1 - 0
src/modules/graphics/SpriteBatch.h

@@ -113,6 +113,7 @@ private:
 		StrongRef<Buffer> buffer;
 		StrongRef<Mesh> mesh;
 		int index;
+		int builtinAttributeIndex;
 	};
 
 	/**