[Bf-blender-cvs] [b9ac83c] GPU_data_request: single alloc per VertexBuffer, down from 2

Mike Erwin noreply at git.blender.org
Thu Apr 23 11:38:11 CEST 2015


Commit: b9ac83ce9d7e03a549acaf4173429865aadbd70c
Author: Mike Erwin
Date:   Thu Apr 23 05:36:59 2015 -0400
Branches: GPU_data_request
https://developer.blender.org/rBb9ac83ce9d7e03a549acaf4173429865aadbd70c

single alloc per VertexBuffer, down from 2

Using flexible array member from C99.

Tested on LLVM/clang, also supported in GCC and MSVC according to docs:

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
https://msdn.microsoft.com/en-us/library/b6fae073.aspx

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

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

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

diff --git a/source/blender/gpu/intern/gpux_vbo.c b/source/blender/gpu/intern/gpux_vbo.c
index 008b76b..84eb97d 100644
--- a/source/blender/gpu/intern/gpux_vbo.c
+++ b/source/blender/gpu/intern/gpux_vbo.c
@@ -82,10 +82,10 @@ struct VertexBuffer
 {
 	unsigned attrib_ct; /* 1 to 16 */
 	unsigned vertex_ct;
-	Attrib *attribs;
 #ifdef USE_VAO
 	GLuint vao_id;
 #endif /* USE_VAO */
+	Attrib attribs[]; /* flexible array */
 };
 
 #ifdef PRINT
@@ -145,14 +145,12 @@ void GPUx_attrib_print(const VertexBuffer *buff, unsigned attrib_num)
 
 VertexBuffer *GPUx_vertex_buffer_create(unsigned a_ct, unsigned v_ct)
 {
-	VertexBuffer *buff = MEM_callocN(sizeof(VertexBuffer), "VertexBuffer");
+	VertexBuffer *buff = MEM_callocN(offsetof(VertexBuffer, attribs) + a_ct * sizeof(Attrib), "VertexBuffer");
 #ifdef TRUST_NO_ONE
 	BLI_assert(a_ct >= 1 && a_ct <= 16);
 #endif /* TRUST_NO_ONE */
 	buff->attrib_ct = a_ct;
 	buff->vertex_ct = v_ct;
-	buff->attribs = MEM_callocN(a_ct * sizeof(Attrib), "VertexBuffer.attribs");
-	/* TODO: single allocation instead of 2 */
 	return buff;
 }
 
@@ -175,7 +173,6 @@ void GPUx_vertex_buffer_discard(VertexBuffer *buff)
 	if (buff->vao_id)
 		vao_id_free(buff->vao_id);
 #endif /* USE_VAO */
-	MEM_freeN(buff->attribs);
 	MEM_freeN(buff);
 }




More information about the Bf-blender-cvs mailing list