Commit: 110d68ca1d315540dc4cda1800db35582e54d62d Author: Mike Erwin Date: Wed Sep 14 16:28:16 2016 +0200 Branches: blender2.8 https://developer.blender.org/rB110d68ca1d315540dc4cda1800db35582e54d62d
Gawain: flesh out VertexBuffer create, specify, fill with data =================================================================== M source/blender/gpu/gawain/vertex_buffer.c M source/blender/gpu/gawain/vertex_buffer.h =================================================================== diff --git a/source/blender/gpu/gawain/vertex_buffer.c b/source/blender/gpu/gawain/vertex_buffer.c index 1a9a9cd..0541484 100644 --- a/source/blender/gpu/gawain/vertex_buffer.c +++ b/source/blender/gpu/gawain/vertex_buffer.c @@ -10,5 +10,82 @@ // the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. #include "vertex_buffer.h" +#include <stdlib.h> +#include <string.h> -// TODO: implement C functions +VertexBuffer* create_VertexBuffer() + { + VertexBuffer* verts = malloc(sizeof(VertexBuffer)); + init_VertexBuffer(verts); + return verts; + } + +void init_VertexBuffer(VertexBuffer* verts) + { + memset(verts, 0, sizeof(VertexBuffer)); + } + +void allocate_vertex_data(VertexBuffer* verts, unsigned v_ct) + { + VertexFormat* format = &verts->format; + if (!format->packed) + pack(format); + + verts->vertex_ct = v_ct; + + // Data initially lives in main memory. Will be transferred to VRAM when we "prime" it. + verts->data = malloc(vertex_buffer_size(format, v_ct)); + } + +void setAttrib(VertexBuffer* verts, unsigned a_idx, unsigned v_idx, const void* data) + { + const VertexFormat* format = &verts->format; + const Attrib* a = format->attribs + a_idx; + +#if TRUST_NO_ONE + assert(a_idx < format->attrib_ct); + assert(v_idx < verts->vertex_ct); + assert(verts->data != NULL); // data must be in main mem +#endif + + memcpy((GLubyte*)verts->data + a->offset + v_idx * format->stride, data, a->sz); + } + +void fillAttrib(VertexBuffer* verts, unsigned a_idx, const void* data) + { + const VertexFormat* format = &verts->format; + const Attrib* a = format->attribs + a_idx; + +#if TRUST_NO_ONE + assert(a_idx < format->attrib_ct); +#endif + + const unsigned stride = a->sz; // tightly packed input data + + fillAttribStride(verts, a_idx, stride, data); + } + +void fillAttribStride(VertexBuffer* verts, unsigned a_idx, unsigned stride, const void* data) + { + const VertexFormat* format = &verts->format; + const Attrib* a = format->attribs + a_idx; + +#if TRUST_NO_ONE + assert(a_idx < format->attrib_ct); + assert(verts->data != NULL); // data must be in main mem +#endif + + const unsigned vertex_ct = verts->vertex_ct; + + if (format->attrib_ct == 1 && stride == format->stride) + { + // we can copy it all at once + memcpy(verts->data, data, vertex_ct * a->sz); + } + else + { + // we must copy it per vertex + for (unsigned v = 0; v < vertex_ct; ++v) + memcpy((GLubyte*)verts->data + a->offset + v * format->stride, (const GLubyte*)data + v * stride, a->sz); + } + } diff --git a/source/blender/gpu/gawain/vertex_buffer.h b/source/blender/gpu/gawain/vertex_buffer.h index da4f614..631b665 100644 --- a/source/blender/gpu/gawain/vertex_buffer.h +++ b/source/blender/gpu/gawain/vertex_buffer.h @@ -13,6 +13,15 @@ #include "vertex_format.h" +// How to create a VertexBuffer: +// 1) verts = create_VertexBuffer() or init_VertexBuffer(verts) +// 2) add_attrib(verts->format, ...) +// 3) allocate_vertex_data(verts, vertex_ct) <-- finalizes/packs vertex format +// 4) fillAttrib(verts, pos, application_pos_buffer) +// 5) prime_VertexBuffer(verts); + +// Is VertexBuffer always used as part of a Batch? + typedef struct { VertexFormat format; unsigned vertex_ct; @@ -20,8 +29,13 @@ typedef struct { GLuint vbo_id; // 0 indicates not yet sent to VRAM } VertexBuffer; -VertexBuffer* create_VertexBuffer(VertexFormat*, unsigned v_ct); // create means allocate, then init -void init_VertexBuffer(VertexBuffer*, VertexFormat*, unsigned v_ct); +VertexBuffer* create_VertexBuffer(void); // create means allocate, then init +void init_VertexBuffer(VertexBuffer*); + +// TODO: use copy of existing format +// void init_VertexBuffer_with_format(VertexBuffer*, VertexFormat*); + +void allocate_vertex_data(VertexBuffer*, unsigned v_ct); // The most important setAttrib variant is the untyped one. Get it right first. // It takes a void* so the app developer is responsible for matching their app data types @@ -29,9 +43,12 @@ void init_VertexBuffer(VertexBuffer*, VertexFormat*, unsigned v_ct); // should not be a problem. void setAttrib(VertexBuffer*, unsigned a_idx, unsigned v_idx, const void* data); -void fillAttrib(VertexBuffer*, unsigned a_idx, const void* data); +void fillAttrib(VertexBuffer*, unsigned a_idx, const void* data); // tightly packed, non interleaved input data void fillAttribStride(VertexBuffer*, unsigned a_idx, unsigned stride, const void* data); +// TODO: decide whether to keep the functions below +// doesn't immediate mode satisfy these needs? + // void setAttrib1f(unsigned a_idx, unsigned v_idx, float x); // void setAttrib2f(unsigned a_idx, unsigned v_idx, float x, float y); // void setAttrib3f(unsigned a_idx, unsigned v_idx, float x, float y, float z); _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
