diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-01-09 15:37:52 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-01-09 16:54:11 +0300 |
commit | 2237ee3ed7181a0c14d84fd26dc37cf5292d232d (patch) | |
tree | 7e369b7ce431f09c2a2776744a132eb34ffc6bd0 | |
parent | b300fa4923424ebff000f0b78fb80148ca690f3c (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.h | 2 | ||||
-rw-r--r-- | intern/gawain/src/gwn_vertex_buffer.c | 32 |
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 } |