Prechádzať zdrojové kódy

Merge pull request #1936 from jpark37/empty-vao

libobs-opengl: Empty VAO
Jim 6 rokov pred
rodič
commit
c558b81f34

+ 5 - 2
libobs-opengl/gl-helpers.h

@@ -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;
 	}
 

+ 8 - 1
libobs-opengl/gl-subsystem.c

@@ -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);

+ 2 - 0
libobs-opengl/gl-subsystem.h

@@ -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;

+ 1 - 1
libobs-opengl/gl-vertexbuffer.c

@@ -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++) {