Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-01-09 15:37:52 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-01-09 16:54:11 +0300
commit2237ee3ed7181a0c14d84fd26dc37cf5292d232d (patch)
tree7e369b7ce431f09c2a2776744a132eb34ffc6bd0
parentb300fa4923424ebff000f0b78fb80148ca690f3c (diff)
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.
-rw-r--r--intern/gawain/gawain/gwn_vertex_buffer.h2
-rw-r--r--intern/gawain/src/gwn_vertex_buffer.c32
2 files changed, 28 insertions, 6 deletions
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
}