[Bf-blender-cvs] [2237ee3ed71] blender2.8: Gawain: VBO: Add possibility to use external datablock.

Clément Foucault noreply at git.blender.org
Tue Jan 9 15:17:23 CET 2018


Commit: 2237ee3ed7181a0c14d84fd26dc37cf5292d232d
Author: Clément Foucault
Date:   Tue Jan 9 13:37:52 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB2237ee3ed7181a0c14d84fd26dc37cf5292d232d

Gawain: VBO: Add possibility to use external datablock.

Adds the possibility to specify the data buffer directly and precise ownership.
By not passing ownership to gawain the memory block can be reused.

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

M	intern/gawain/gawain/gwn_vertex_buffer.h
M	intern/gawain/src/gwn_vertex_buffer.c

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

diff --git a/intern/gawain/gawain/gwn_vertex_buffer.h b/intern/gawain/gawain/gwn_vertex_buffer.h
index 5ad82251e79..faa1921b069 100644
--- a/intern/gawain/gawain/gwn_vertex_buffer.h
+++ b/intern/gawain/gawain/gwn_vertex_buffer.h
@@ -24,6 +24,7 @@
 typedef struct Gwn_VertBuf {
 	Gwn_VertFormat format;
 	unsigned vertex_ct;
+	bool own_data; // does gawain own the data an is able to free it
 	GLubyte* data; // NULL indicates data in VRAM (unmapped) or not yet allocated
 	GLuint vbo_id; // 0 indicates not yet sent to VRAM
 } Gwn_VertBuf;
@@ -39,6 +40,7 @@ void GWN_vertbuf_init_with_format(Gwn_VertBuf*, const Gwn_VertFormat*);
 
 unsigned GWN_vertbuf_size_get(const Gwn_VertBuf*);
 void GWN_vertbuf_data_alloc(Gwn_VertBuf*, unsigned v_ct);
+void GWN_vertbuf_data_set(Gwn_VertBuf*, unsigned v_ct, void *data, bool pass_ownership);
 void GWN_vertbuf_data_resize(Gwn_VertBuf*, unsigned v_ct);
 
 // The most important set_attrib variant is the untyped one. Get it right first.
diff --git a/intern/gawain/src/gwn_vertex_buffer.c b/intern/gawain/src/gwn_vertex_buffer.c
index 2019d7d50bc..f6d3be1c7e9 100644
--- a/intern/gawain/src/gwn_vertex_buffer.c
+++ b/intern/gawain/src/gwn_vertex_buffer.c
@@ -63,7 +63,7 @@ void GWN_vertbuf_clear(Gwn_VertBuf* verts)
 #if KEEP_SINGLE_COPY
 	else
 #endif
-	if (verts->data)
+	if (verts->data && verts->own_data)
 		{
 		free(verts->data);
 		verts->data = NULL;
@@ -72,15 +72,18 @@ void GWN_vertbuf_clear(Gwn_VertBuf* verts)
 
 void GWN_vertbuf_discard(Gwn_VertBuf* verts)
 	{
-	if (verts->vbo_id) {
+	if (verts->vbo_id)
+		{
 		GWN_buf_id_free(verts->vbo_id);
 		vbo_memory_usage -= GWN_vertbuf_size_get(verts);
-	}
+		}
 #if KEEP_SINGLE_COPY
 	else
 #endif
-	if (verts->data)
+	if (verts->data && verts->own_data)
+		{
 		free(verts->data);
+		}
 
 
 	free(verts);
@@ -98,11 +101,25 @@ void GWN_vertbuf_data_alloc(Gwn_VertBuf* verts, unsigned v_ct)
 		VertexFormat_pack(format);
 
 	verts->vertex_ct = v_ct;
+	verts->own_data = true;
 
 	// Data initially lives in main memory. Will be transferred to VRAM when we "prime" it.
 	verts->data = malloc(GWN_vertbuf_size_get(verts));
 	}
 
+void GWN_vertbuf_data_set(Gwn_VertBuf* verts, unsigned v_ct, void *data, bool pass_ownership)
+	{
+	Gwn_VertFormat* format = &verts->format;
+	if (!format->packed)
+		VertexFormat_pack(format);
+
+	verts->vertex_ct = v_ct;
+	verts->own_data = pass_ownership;
+
+	// Data initially lives in main memory. Will be transferred to VRAM when we "prime" it.
+	verts->data = data;
+	}
+
 void GWN_vertbuf_data_resize(Gwn_VertBuf* verts, unsigned v_ct)
 	{
 #if TRUST_NO_ONE
@@ -203,8 +220,11 @@ static void VertexBuffer_prime(Gwn_VertBuf* verts)
 
 #if KEEP_SINGLE_COPY
 	// now that GL has a copy, discard original
-	free(verts->data);
-	verts->data = NULL;
+	if (verts->own_data)
+		{
+		free(verts->data);
+		verts->data = NULL;
+		}
 #endif
 	}



More information about the Bf-blender-cvs mailing list