diff options
author | Mike Erwin <significant.bit@gmail.com> | 2016-08-08 04:30:02 +0300 |
---|---|---|
committer | Mike Erwin <significant.bit@gmail.com> | 2016-08-08 04:30:02 +0300 |
commit | 8e99eec0260f58fdb86713c96582aa84f6252eac (patch) | |
tree | 3c5a072e71d36da4063afe7848e4cdfa0596dd65 | |
parent | 11ffbfb36a94d2a461219e338a6213300b69712d (diff) |
Gawain: immediate mode set uniforms for active program
Start simple with vec4 uniforms. Add more later.
-rw-r--r-- | source/blender/gpu/GPU_immediate.h | 6 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_immediate.c | 34 |
2 files changed, 40 insertions, 0 deletions
diff --git a/source/blender/gpu/GPU_immediate.h b/source/blender/gpu/GPU_immediate.h index c48abbb6388..1373faa236b 100644 --- a/source/blender/gpu/GPU_immediate.h +++ b/source/blender/gpu/GPU_immediate.h @@ -58,6 +58,9 @@ extern PER_THREAD VertexFormat immVertexFormat; // so we don't have to copy or p void immInit(void); void immDestroy(void); +void immBindProgram(GLuint program); +void immUnbindProgram(void); + void immBegin(GLenum primitive, unsigned vertex_ct); void immEnd(void); @@ -73,3 +76,6 @@ void immEndVertex(void); // and move on to the next vertex // provide 2D or 3D attribute value and end the current vertex, similar to glVertex: void immVertex2f(unsigned attrib_id, float x, float y); void immVertex3f(unsigned attrib_id, float x, float y, float z); + +// provide values that don't change for the entire draw call +void immUniform4f(const char* name, float x, float y, float z, float w); diff --git a/source/blender/gpu/intern/gpu_immediate.c b/source/blender/gpu/intern/gpu_immediate.c index 80e7877ade0..cea400a5f82 100644 --- a/source/blender/gpu/intern/gpu_immediate.c +++ b/source/blender/gpu/intern/gpu_immediate.c @@ -187,6 +187,8 @@ typedef struct { GLuint vbo_id; GLuint vao_id; + + GLuint bound_program; } Immediate; // size of internal buffer -- make this adjustable? @@ -237,6 +239,27 @@ void immDestroy() initialized = false; } +void immBindProgram(GLuint program) + { +#if TRUST_NO_ONE + assert(imm.bound_program == 0); +#endif + + glUseProgram(program); + bind_attrib_locations(&immVertexFormat, program); + imm.bound_program = program; + } + +void immUnbindProgram() + { +#if TRUST_NO_ONE + assert(imm.bound_program != 0); +#endif + + glUseProgram(0); + imm.bound_program = 0; + } + void immBegin(GLenum primitive, unsigned vertex_ct) { #if TRUST_NO_ONE @@ -531,3 +554,14 @@ void immVertex3f(unsigned attrib_id, float x, float y, float z) immAttrib3f(attrib_id, x, y, z); immEndVertex(); } + +void immUniform4f(const char* name, float x, float y, float z, float w) + { + int loc = glGetUniformLocation(imm.bound_program, name); + +#if TRUST_NO_ONE + assert(loc != -1); +#endif + + glUniform4f(loc, x, y, z, w); + } |