[Bf-blender-cvs] [0f5b6bd] strand_gpu: Fix for integer attribute uploading in gpu code.

Lukas Tönne noreply at git.blender.org
Tue Jul 5 09:57:18 CEST 2016


Commit: 0f5b6bdbc198a91e4827a1fbaf5ad72f23d761c3
Author: Lukas Tönne
Date:   Mon Jul 4 10:02:10 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB0f5b6bdbc198a91e4827a1fbaf5ad72f23d761c3

Fix for integer attribute uploading in gpu code.

OpenGL has a separate function for integer attribute pointers.
If the float attribute version is used, the attribute data will be
interpreted and floats and converted to integer values, which
garbles the content of any true int/uint buffer.

===================================================================

M	source/blender/gpu/intern/gpu_buffers.c

===================================================================

diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index e427e68..72e6bc2 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -745,6 +745,9 @@ void GPU_triangle_setup(struct DerivedMesh *dm)
 	GLStates |= GPU_BUFFER_ELEMENT_STATE;
 }
 
+#define SUPPORTED_GL_ATTRIB_TYPES \
+    GL_FLOAT, GL_INT, GL_UNSIGNED_INT, GL_BYTE, GL_UNSIGNED_BYTE
+
 static int GPU_typesize(int type)
 {
 	switch (type) {
@@ -796,15 +799,33 @@ void GPU_interleaved_attrib_setup(GPUBuffer *buffer, GPUAttrib data[], int numda
 	glBindBuffer(GL_ARRAY_BUFFER, buffer->id);
 	
 	for (i = 0; i < numdata; i++) {
-		glEnableVertexAttribArray(data[i].index);
-		int info = 0;
-		if (data[i].type == GL_UNSIGNED_BYTE) {
-			info |= GPU_ATTR_INFO_SRGB;
+		BLI_assert(ELEM(data[i].type, SUPPORTED_GL_ATTRIB_TYPES) &&
+		           "Unsupported attribute data type!");
+		
+		if (data[i].info_index >= 0) {
+			int info = 0;
+			if (data[i].type == GL_UNSIGNED_BYTE) {
+				info |= GPU_ATTR_INFO_SRGB;
+			}
+			glUniform1i(data[i].info_index, info);
 		}
-		glUniform1i(data[i].info_index, info);
 
-		glVertexAttribPointer(data[i].index, data[i].size, data[i].type,
-		                         GL_TRUE, elementsize, BUFFER_OFFSET(offset));
+		if (data[i].index >= 0) {
+			glEnableVertexAttribArray(data[i].index);
+			switch (data[i].type) {
+				case GL_FLOAT:
+					glVertexAttribPointer(data[i].index, data[i].size, data[i].type,
+					                      GL_TRUE, elementsize, BUFFER_OFFSET(offset));
+					break;
+				case GL_INT:
+				case GL_UNSIGNED_INT:
+				case GL_BYTE:
+				case GL_UNSIGNED_BYTE:
+					glVertexAttribIPointer(data[i].index, data[i].size, data[i].type,
+					                       elementsize, BUFFER_OFFSET(offset));
+					break;
+			}
+		}
 		offset += data[i].size * GPU_typesize(data[i].type);
 		
 		attribData[i].index = data[i].index;




More information about the Bf-blender-cvs mailing list