libobs: Add vertex/index buffer "direct" flush functions

(Note: This commit also modifies libobs-d3d11 and libobs-opengl)

Allows the ability to flush data directly without having to use the
buffer's internal data.

Allows the caller to manage his/her own vertex/index buffer data if
desired, working around the design flaw of having to rely on a
vertex/index buffer's internal data.
This commit is contained in:
jp9000
2017-11-27 02:19:48 -08:00
parent a46f0b4808
commit c111fa68b8
7 changed files with 118 additions and 34 deletions

View File

@@ -70,15 +70,15 @@ void gs_indexbuffer_destroy(gs_indexbuffer_t *ib)
}
}
void gs_indexbuffer_flush(gs_indexbuffer_t *ib)
static inline void gs_indexbuffer_flush_internal(gs_indexbuffer_t *ib,
const void *data)
{
if (!ib->dynamic) {
blog(LOG_ERROR, "Index buffer is not dynamic");
goto fail;
}
if (!update_buffer(GL_ELEMENT_ARRAY_BUFFER, ib->buffer, ib->data,
ib->size))
if (!update_buffer(GL_ELEMENT_ARRAY_BUFFER, ib->buffer, data, ib->size))
goto fail;
return;
@@ -87,6 +87,16 @@ fail:
blog(LOG_ERROR, "gs_indexbuffer_flush (GL) failed");
}
void gs_indexbuffer_flush(gs_indexbuffer_t *ib)
{
gs_indexbuffer_flush_internal(ib, ib->data);
}
void gs_indexbuffer_flush_direct(gs_indexbuffer_t *ib, const void *data)
{
gs_indexbuffer_flush_internal(ib, data);
}
void *gs_indexbuffer_get_data(const gs_indexbuffer_t *ib)
{
return ib->data;

View File

@@ -120,45 +120,51 @@ void gs_vertexbuffer_destroy(gs_vertbuffer_t *vb)
}
}
void gs_vertexbuffer_flush(gs_vertbuffer_t *vb)
static inline void gs_vertexbuffer_flush_internal(gs_vertbuffer_t *vb,
const struct gs_vb_data *data)
{
size_t i;
size_t num_tex = data->num_tex < vb->data->num_tex
? data->num_tex
: vb->data->num_tex;
if (!vb->dynamic) {
blog(LOG_ERROR, "vertex buffer is not dynamic");
goto failed;
}
if (!update_buffer(GL_ARRAY_BUFFER, vb->vertex_buffer,
vb->data->points,
vb->data->num * sizeof(struct vec3)))
goto failed;
if (data->points) {
if (!update_buffer(GL_ARRAY_BUFFER, vb->vertex_buffer,
data->points,
data->num * sizeof(struct vec3)))
goto failed;
}
if (vb->normal_buffer) {
if (vb->normal_buffer && data->normals) {
if (!update_buffer(GL_ARRAY_BUFFER, vb->normal_buffer,
vb->data->normals,
vb->data->num * sizeof(struct vec3)))
data->normals,
data->num * sizeof(struct vec3)))
goto failed;
}
if (vb->tangent_buffer) {
if (vb->tangent_buffer && data->tangents) {
if (!update_buffer(GL_ARRAY_BUFFER, vb->tangent_buffer,
vb->data->tangents,
vb->data->num * sizeof(struct vec3)))
data->tangents,
data->num * sizeof(struct vec3)))
goto failed;
}
if (vb->color_buffer) {
if (vb->color_buffer && data->colors) {
if (!update_buffer(GL_ARRAY_BUFFER, vb->color_buffer,
vb->data->colors,
vb->data->num * sizeof(uint32_t)))
data->colors,
data->num * sizeof(uint32_t)))
goto failed;
}
for (i = 0; i < vb->data->num_tex; i++) {
for (i = 0; i < num_tex; i++) {
GLuint buffer = vb->uv_buffers.array[i];
struct gs_tvertarray *tv = vb->data->tvarray+i;
size_t size = vb->data->num * tv->width * sizeof(float);
struct gs_tvertarray *tv = data->tvarray+i;
size_t size = data->num * tv->width * sizeof(float);
if (!update_buffer(GL_ARRAY_BUFFER, buffer, tv->array, size))
goto failed;
@@ -170,6 +176,17 @@ failed:
blog(LOG_ERROR, "gs_vertexbuffer_flush (GL) failed");
}
void gs_vertexbuffer_flush(gs_vertbuffer_t *vb)
{
gs_vertexbuffer_flush_internal(vb, vb->data);
}
void gs_vertexbuffer_flush_direct(gs_vertbuffer_t *vb,
const struct gs_vb_data *data)
{
gs_vertexbuffer_flush_internal(vb, data);
}
struct gs_vb_data *gs_vertexbuffer_get_data(const gs_vertbuffer_t *vb)
{
return vb->data;