void yagl_gles_api_ts_cleanup(struct yagl_gles_api_ts *gles_api_ts)
{
if (gles_api_ts->num_arrays > 0) {
+ uint32_t i;
+
yagl_ensure_ctx(0);
- gles_api_ts->driver->DeleteBuffers(gles_api_ts->num_arrays,
- gles_api_ts->arrays);
+
+ for (i = 0; i < gles_api_ts->num_arrays; ++i) {
+ gles_api_ts->driver->DeleteBuffers(1,
+ &gles_api_ts->arrays[i].vbo);
+ }
+
yagl_unensure_ctx(0);
}
struct yagl_gles_driver;
struct yagl_gles_api_ps;
+/*
+ * OpenGL 3.1+ core profile doesn't allow one to
+ * call glVertexAttribPointer and friends without a VBO, thus,
+ * we need to have a backing VBO in order to support GLESv2.
+ */
+struct yagl_gles_array
+{
+ GLuint vbo;
+ uint32_t size;
+};
+
struct yagl_gles_api_ts
{
struct yagl_gles_driver *driver;
struct yagl_gles_api_ps *ps;
- GLuint *arrays;
+ struct yagl_gles_array *arrays;
uint32_t num_arrays;
};
int32_t data_count)
{
GLuint current_vbo;
+ uint32_t size;
if (indx >= gles_api_ts->num_arrays) {
- GLuint *arrays;
+ struct yagl_gles_array *arrays;
+ uint32_t i;
arrays = g_malloc((indx + 1) * sizeof(arrays[0]));
gles_api_ts->arrays,
gles_api_ts->num_arrays * sizeof(arrays[0]));
- gles_api_ts->driver->GenBuffers(indx + 1 - gles_api_ts->num_arrays,
- &arrays[gles_api_ts->num_arrays]);
+ for (i = gles_api_ts->num_arrays; i <= indx; ++i) {
+ gles_api_ts->driver->GenBuffers(1, &arrays[i].vbo);
+ arrays[i].size = 0;
+ }
g_free(gles_api_ts->arrays);
gles_api_ts->driver->GetIntegerv(GL_ARRAY_BUFFER_BINDING,
(GLint*)¤t_vbo);
- gles_api_ts->driver->BindBuffer(GL_ARRAY_BUFFER, gles_api_ts->arrays[indx]);
+ gles_api_ts->driver->BindBuffer(GL_ARRAY_BUFFER, gles_api_ts->arrays[indx].vbo);
+
+ size = first * stride + data_count;
+
+ if (size > gles_api_ts->arrays[indx].size) {
+ gles_api_ts->driver->BufferData(GL_ARRAY_BUFFER,
+ size, NULL,
+ GL_STREAM_DRAW);
+ gles_api_ts->arrays[indx].size = size;
+ }
+
- gles_api_ts->driver->BufferData(GL_ARRAY_BUFFER,
- first * stride + data_count, NULL,
- GL_STREAM_DRAW);
gles_api_ts->driver->BufferSubData(GL_ARRAY_BUFFER,
first * stride, data_count, data);