diff --git a/libobs/graphics/graphics.c b/libobs/graphics/graphics.c index aa886fb183f85c56a7165c28b7305d17e0b40c48..191a0fc814a57ec31864ade3be8383ca75a4eeaf 100644 --- a/libobs/graphics/graphics.c +++ b/libobs/graphics/graphics.c @@ -1468,6 +1468,46 @@ gs_vertbuffer_t *gs_vertexbuffer_create(struct gs_vb_data *data, if (!gs_valid("gs_vertexbuffer_create")) return NULL; + if (data && data->num && (flags & GS_DUP_BUFFER) != 0) { + struct gs_vb_data *new_data = gs_vbdata_create(); + + new_data->num = data->num; + +#define DUP_VAL(val) \ + do { \ + if (data->val) \ + new_data->val = bmemdup(data->val, \ + sizeof(*data->val) * \ + data->num); \ + } while (false) + + DUP_VAL(points); + DUP_VAL(normals); + DUP_VAL(tangents); + DUP_VAL(colors); +#undef DUP_VAL + + if (data->tvarray && data->num_tex) { + new_data->num_tex = data->num_tex; + new_data->tvarray = bzalloc( + sizeof(struct gs_tvertarray) * + data->num_tex); + + for (size_t i = 0; i < data->num_tex; i++) { + struct gs_tvertarray *tv = &data->tvarray[i]; + struct gs_tvertarray *new_tv = + &new_data->tvarray[i]; + size_t size = tv->width * sizeof(float); + + new_tv->width = tv->width; + new_tv->array = bmemdup(tv->array, + size * data->num); + } + } + + data = new_data; + } + return graphics->exports.device_vertexbuffer_create(graphics->device, data, flags); } @@ -1480,6 +1520,13 @@ gs_indexbuffer_t *gs_indexbuffer_create(enum gs_index_type type, if (!gs_valid("gs_indexbuffer_create")) return NULL; + if (indices && num && (flags & GS_DUP_BUFFER) != 0) { + size_t size = type == GS_UNSIGNED_SHORT + ? sizeof(unsigned short) + : sizeof(unsigned long); + indices = bmemdup(indices, size * num); + } + return graphics->exports.device_indexbuffer_create(graphics->device, type, indices, num, flags); } diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h index ff1166163d07f1778ab077915e1884e5ba7eb3c2..505b04bbc8eb2240ba76a06ebf8ed56dfe58ca03 100644 --- a/libobs/graphics/graphics.h +++ b/libobs/graphics/graphics.h @@ -419,6 +419,8 @@ EXPORT gs_texture_t *gs_texrender_get_texture(const gs_texrender_t *texrender); #define GS_DYNAMIC (1<<1) #define GS_RENDER_TARGET (1<<2) #define GS_GL_DUMMYTEX (1<<3) /**<< texture with no allocated texture data */ +#define GS_DUP_BUFFER (1<<4) /**<< do not pass buffer ownership when + * creating a vertex/index buffer */ /* ---------------- */ /* global functions */