[Bf-blender-cvs] [e53ab2b] blender2.8: Gawain: fixups & progress for batch API

Mike Erwin noreply at git.blender.org
Mon Oct 24 05:39:30 CEST 2016


Commit: e53ab2b9eccdc9b427beef4c045f297bb463c64c
Author: Mike Erwin
Date:   Sun Oct 23 23:16:54 2016 -0400
Branches: blender2.8
https://developer.blender.org/rBe53ab2b9eccdc9b427beef4c045f297bb463c64c

Gawain: fixups & progress for batch API

===================================================================

M	source/blender/gpu/gawain/batch.c
M	source/blender/gpu/gawain/batch.h
M	source/blender/gpu/gawain/element.c
M	source/blender/gpu/gawain/element.h
M	source/blender/gpu/gawain/vertex_buffer.c
M	source/blender/gpu/gawain/vertex_buffer.h

===================================================================

diff --git a/source/blender/gpu/gawain/batch.c b/source/blender/gpu/gawain/batch.c
index 3bf353e..d11ac6b 100644
--- a/source/blender/gpu/gawain/batch.c
+++ b/source/blender/gpu/gawain/batch.c
@@ -12,6 +12,10 @@
 #include "batch.h"
 #include <stdlib.h>
 
+// necessary functions from matrix API
+extern void gpuBindMatrices(GLuint program);
+extern bool gpuMatricesDirty(void); // how best to use this here?
+
 Batch* Batch_create(GLenum prim_type, VertexBuffer* verts, ElementList* elem)
 	{
 #if TRUST_NO_ONE
@@ -30,30 +34,54 @@ Batch* Batch_create(GLenum prim_type, VertexBuffer* verts, ElementList* elem)
 	return batch;
 	}
 
+void Batch_discard(Batch* batch)
+	{
+	// TODO: clean up
+	}
+
+void Batch_discard_all(Batch* batch)
+	{
+	VertexBuffer_discard(batch->verts);
+	if (batch->elem)
+		ElementList_discard(batch->elem);
+	Batch_discard(batch);
+	}
+
 void Batch_set_program(Batch* batch, GLuint program)
 	{
+#if TRUST_NO_ONE
+	assert(glIsProgram(program));
+#endif
+
 	batch->program = program;
 	batch->program_dirty = true;
 	}
 
 static void Batch_update_program_bindings(Batch* batch)
 	{
-#if TRUST_NO_ONE
-	assert(glIsProgram(batch->program));
-#endif
-
 	const VertexFormat* format = &batch->verts->format;
 
 	const unsigned attrib_ct = format->attrib_ct;
 	const unsigned stride = format->stride;
 
+	// disable all as a precaution
+	// why are we not using prev_attrib_enabled_bits?? see immediate.c
+	for (unsigned a_idx = 0; a_idx < MAX_VERTEX_ATTRIBS; ++a_idx)
+		glDisableVertexAttribArray(a_idx);
+
+	VertexBuffer_use(batch->verts);
+
 	for (unsigned a_idx = 0; a_idx < attrib_ct; ++a_idx)
 		{
 		const Attrib* a = format->attribs + a_idx;
 
 		const GLvoid* pointer = (const GLubyte*)0 + a->offset;
 
-		const unsigned loc = glGetAttribLocation(batch->program, a->name);
+		const GLint loc = glGetAttribLocation(batch->program, a->name);
+
+#if TRUST_NO_ONE
+		assert(loc != -1);
+#endif
 
 		glEnableVertexAttribArray(loc);
 
@@ -74,6 +102,60 @@ static void Batch_update_program_bindings(Batch* batch)
 	batch->program_dirty = false;
 	}
 
+static void Batch_use_program(Batch* batch)
+	{
+	if (!batch->program_in_use)
+		{
+		glUseProgram(batch->program);
+		batch->program_in_use = true;
+		}
+	}
+
+static void Batch_done_using_program(Batch* batch)
+	{
+	if (batch->program_in_use)
+		{
+		glUseProgram(0);
+		batch->program_in_use = false;
+		}
+	}
+
+void Batch_Uniform1b(Batch* batch, const char* name, bool value)
+	{
+	int loc = glGetUniformLocation(batch->program, name);
+
+#if TRUST_NO_ONE
+	assert(loc != -1);
+#endif
+
+	Batch_use_program(batch);
+	glUniform1i(loc, value ? GL_TRUE : GL_FALSE);
+	}
+
+void Batch_Uniform3fv(Batch* batch, const char* name, const float data[3])
+	{
+	int loc = glGetUniformLocation(batch->program, name);
+
+#if TRUST_NO_ONE
+	assert(loc != -1);
+#endif
+
+	Batch_use_program(batch);
+	glUniform3fv(loc, 1, data);
+	}
+
+void Batch_Uniform4fv(Batch* batch, const char* name, const float data[4])
+	{
+	int loc = glGetUniformLocation(batch->program, name);
+
+#if TRUST_NO_ONE
+	assert(loc != -1);
+#endif
+
+	Batch_use_program(batch);
+	glUniform4fv(loc, 1, data);
+	}
+
 static void Batch_prime(Batch* batch)
 	{
 	glGenVertexArrays(1, &batch->vao_id);
@@ -91,6 +173,7 @@ void Batch_draw(Batch* batch)
 	{
 #if TRUST_NO_ONE
 	assert(batch->phase == READY_TO_DRAW);
+	assert(glIsProgram(batch->program));
 #endif
 
 	if (batch->vao_id)
@@ -101,7 +184,9 @@ void Batch_draw(Batch* batch)
 	if (batch->program_dirty)
 		Batch_update_program_bindings(batch);
 
-	glUseProgram(batch->program);
+	Batch_use_program(batch);
+
+	gpuBindMatrices(batch->program);
 
 	if (batch->elem)
 		{
@@ -119,6 +204,6 @@ void Batch_draw(Batch* batch)
 	else
 		glDrawArrays(batch->prim_type, 0, batch->verts->vertex_ct);
 
-	glUseProgram(0);
+	Batch_done_using_program(batch);
 	glBindVertexArray(0);
 	}
diff --git a/source/blender/gpu/gawain/batch.h b/source/blender/gpu/gawain/batch.h
index 8b132aa..c0f0e93 100644
--- a/source/blender/gpu/gawain/batch.h
+++ b/source/blender/gpu/gawain/batch.h
@@ -31,6 +31,7 @@ typedef struct {
 	GLuint vao_id; // remembers all geometry state (vertex attrib bindings & element buffer)
 	BatchPhase phase;
 	bool program_dirty;
+	bool program_in_use;
 
 	// state
 	GLuint program;
@@ -38,13 +39,19 @@ typedef struct {
 
 Batch* Batch_create(GLenum prim_type, VertexBuffer*, ElementList*);
 
-// TODO: void Batch_discard(Batch*);
-// must first decide how sharing of vertex buffers & index buffers should work
+void Batch_discard(Batch*); // verts & elem are not discarded
+void Batch_discard_all(Batch*); // including verts & elem
 
 void Batch_set_program(Batch*, GLuint program);
 // Entire batch draws with one shader program, but can be redrawn later with another program.
 // Vertex shader's inputs must be compatible with the batch's vertex format.
 
+void Batch_Uniform1b(Batch*, const char* name, bool value);
+// void Batch_Uniform1f(Batch*, float value);
+// void Batch_Uniform4f(Batch*, float x, float y, float z, float w);
+void Batch_Uniform3fv(Batch*, const char* name, const float data[3]);
+void Batch_Uniform4fv(Batch*, const char* name, const float data[4]);
+
 void Batch_draw(Batch*);
 
 
diff --git a/source/blender/gpu/gawain/element.c b/source/blender/gpu/gawain/element.c
index 953042b..699b416 100644
--- a/source/blender/gpu/gawain/element.c
+++ b/source/blender/gpu/gawain/element.c
@@ -204,7 +204,14 @@ static void squeeze_indices_short(const unsigned values[], ElementList* elem)
 
 #endif // TRACK_INDEX_RANGE
 
-void ElementList_build(ElementListBuilder* builder, ElementList* elem)
+ElementList* ElementList_build(ElementListBuilder* builder)
+	{
+	ElementList* elem = calloc(1, sizeof(ElementList));
+	ElementList_build_in_place(builder, elem);
+	return elem;
+	}
+
+void ElementList_build_in_place(ElementListBuilder* builder, ElementList* elem)
 	{
 #if TRUST_NO_ONE
 	assert(builder->data != NULL);
@@ -260,3 +267,8 @@ void ElementList_build(ElementListBuilder* builder, ElementList* elem)
 	builder->data = NULL;
 	// other fields are safe to leave
 	}
+
+void ElementList_discard(ElementList* elem)
+	{
+	// TODO: clean up
+	}
diff --git a/source/blender/gpu/gawain/element.h b/source/blender/gpu/gawain/element.h
index 9ba2ed2..6a07b70 100644
--- a/source/blender/gpu/gawain/element.h
+++ b/source/blender/gpu/gawain/element.h
@@ -52,4 +52,7 @@ void add_point_vertex(ElementListBuilder*, unsigned v);
 void add_line_vertices(ElementListBuilder*, unsigned v1, unsigned v2);
 void add_triangle_vertices(ElementListBuilder*, unsigned v1, unsigned v2, unsigned v3);
 
-void ElementList_build(ElementListBuilder*, ElementList*);
+ElementList* ElementList_build(ElementListBuilder*);
+void ElementList_build_in_place(ElementListBuilder*, ElementList*);
+
+void ElementList_discard(ElementList*);
diff --git a/source/blender/gpu/gawain/vertex_buffer.c b/source/blender/gpu/gawain/vertex_buffer.c
index 93d0fac..403df3c 100644
--- a/source/blender/gpu/gawain/vertex_buffer.c
+++ b/source/blender/gpu/gawain/vertex_buffer.c
@@ -47,6 +47,11 @@ void VertexBuffer_init_with_format(VertexBuffer* verts, const VertexFormat* form
 		VertexFormat_pack(&verts->format);
 	}
 
+void VertexBuffer_discard(VertexBuffer* verts)
+	{
+	// TODO: clean up
+	}
+
 unsigned VertexBuffer_size(const VertexBuffer* verts)
 	{
 	return vertex_buffer_size(&verts->format, verts->vertex_ct);
diff --git a/source/blender/gpu/gawain/vertex_buffer.h b/source/blender/gpu/gawain/vertex_buffer.h
index 7128ec4..6a72cfe 100644
--- a/source/blender/gpu/gawain/vertex_buffer.h
+++ b/source/blender/gpu/gawain/vertex_buffer.h
@@ -32,6 +32,8 @@ typedef struct {
 VertexBuffer* VertexBuffer_create(void);
 VertexBuffer* VertexBuffer_create_with_format(const VertexFormat*);
 
+void VertexBuffer_discard(VertexBuffer*);
+
 void VertexBuffer_init(VertexBuffer*);
 void VertexBuffer_init_with_format(VertexBuffer*, const VertexFormat*);




More information about the Bf-blender-cvs mailing list