libobs-opengl: Empty VAO

Use an empty VAO for shaders that generate their own vertices.
master
jpark37 2019-06-24 23:13:04 -05:00
parent c938ea712b
commit b8e5cf3a95
4 changed files with 16 additions and 4 deletions

View File

@ -27,8 +27,11 @@ static inline bool gl_success(const char *funcname)
{
GLenum errorcode = glGetError();
if (errorcode != GL_NO_ERROR) {
blog(LOG_ERROR, "%s failed, glGetError returned 0x%X", funcname,
errorcode);
do {
blog(LOG_ERROR, "%s failed, glGetError returned 0x%X",
funcname, errorcode);
errorcode = glGetError();
} while (errorcode != GL_NO_ERROR);
return false;
}

View File

@ -248,6 +248,7 @@ int device_create(gs_device_t **p_device, uint32_t adapter)
glVersion, glShadingLanguage);
gl_enable(GL_CULL_FACE);
gl_gen_vertex_arrays(1, &device->empty_vao);
device_leave_context(device);
device->cur_swap = NULL;
@ -277,6 +278,8 @@ void device_destroy(gs_device_t *device)
while (device->first_program)
gs_program_destroy(device->first_program);
gl_delete_vertex_arrays(1, &device->empty_vao);
da_free(device->proj_stack);
gl_platform_destroy(device->plat);
bfree(device);
@ -987,6 +990,7 @@ static inline struct gs_program *get_shader_program(struct gs_device *device)
void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode,
uint32_t start_vert, uint32_t num_verts)
{
struct gs_vertex_buffer *vb = device->cur_vertex_buffer;
struct gs_index_buffer *ib = device->cur_index_buffer;
GLenum topology = convert_gs_topology(draw_mode);
gs_effect_t *effect = gs_get_effect();
@ -1002,7 +1006,10 @@ void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode,
if (!program)
goto fail;
load_vb_buffers(program, device->cur_vertex_buffer, ib);
if (vb)
load_vb_buffers(program, vb, ib);
else
gl_bind_vertex_array(device->empty_vao);
if (program != device->cur_program && device->cur_program) {
glUseProgram(0);

View File

@ -581,6 +581,8 @@ struct gs_device {
struct gl_platform *plat;
enum copy_type copy_type;
GLuint empty_vao;
gs_texture_t *cur_render_target;
gs_zstencil_t *cur_zstencil_buffer;
int cur_render_side;

View File

@ -256,7 +256,7 @@ bool load_vb_buffers(struct gs_program *program, struct gs_vertex_buffer *vb,
struct gs_shader *shader = program->vertex_shader;
size_t i;
if (vb && !gl_bind_vertex_array(vb->vao))
if (!gl_bind_vertex_array(vb->vao))
return false;
for (i = 0; i < shader->attribs.num; i++) {