summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/gl.cpp34
-rw-r--r--src/render/gl.h2
-rw-r--r--src/render/gl_batch.h2
3 files changed, 30 insertions, 8 deletions
diff --git a/src/render/gl.cpp b/src/render/gl.cpp
index 9aef44c..44d5079 100644
--- a/src/render/gl.cpp
+++ b/src/render/gl.cpp
@@ -289,13 +289,13 @@ STAT gl_shader_compile( GL_DATA* gl, GL_SHADER_DEF* shader ) {
I32 res;
shader->id = glCreateShader( (GLenum)shader->type );
- glShaderSource( shader->id, 1, &shader->code, 0 );
+ glShaderSource( shader->id, 1, &shader->code.data, 0 );
glCompileShader( shader->id );
glGetShaderiv( shader->id, GL_COMPILE_STATUS, &res );
if( !res ) {
glGetShaderInfoLog( shader->id, 8192, 0, log_buf );
- dlog( "gl_shader_compile() : error compiling shader %s. log: \n%s\n%s", shader->name, log_buf, shader->code );
+ dlog( "gl_shader_compile() : error compiling shader %s. log: \n%s\n%s", shader->name, log_buf, shader->code.data );
glDeleteShader( shader->id );
return STAT_ERR;
@@ -305,13 +305,11 @@ STAT gl_shader_compile( GL_DATA* gl, GL_SHADER_DEF* shader ) {
return STAT_OK;
}
-void gl_shader_destroy( GL_DATA* gl, GL_SHADER_DEF* shader ) {
- if( shader->code )
- free( (void*)shader->code );
-}
+void gl_shader_destroy( GL_DATA* gl, GL_SHADER_DEF* shader ) {}
GL_SHADER_PROGRAM* gl_program_create( GL_DATA* gl, const char* name, U32 size ) {
GL_SHADER_PROGRAM* program = (GL_SHADER_PROGRAM*)malloc( size );
+ memset( program, 0, size );
char shader_string[256];
char* shader_code;
@@ -344,11 +342,35 @@ GL_SHADER_PROGRAM* gl_program_create( GL_DATA* gl, const char* name, U32 size )
return program;
}
+void gl_program_insert_sample_gate( GL_DATA* gl, GL_SHADER_DEF* shader ) {
+ I32 sample_start = shader->code.idx_of( "extern batch_sample(" );
+ if( sample_start == -1 )
+ return;
+
+ I32 sample_end = shader->code.idx_of( ");", sample_start );
+ if( sample_end == -1 )
+ return;
+
+ STR start = shader->code.substr( 0, sample_start );
+ STR end = shader->code.substr( sample_end + 2 );
+
+ STR func = "vec4 batch_sample( vec2 in_tex ) {\n";
+ func += " vec4 tex_color = vec4( 1.0, 1.0, 1.0, 1.0 );\n";
+ for( U32 i = 0; i < gl->shader_texture_limit; ++i )
+ func.fmt( " if( g_sampler == %du ) tex_color = texture2D( g_samplers[%d], in_tex );\n", i, i );
+ func += " return tex_color;";
+ func += "}\n";
+
+ shader->code = start + func + end;
+}
+
STAT gl_program_compile( GL_DATA* gl, GL_SHADER_PROGRAM* program ) {
static char* log_buf = 0;
if( !log_buf )
log_buf = (char*)malloc( 8192 );
+ gl_program_insert_sample_gate( gl, &program->fsh );
+
program->id = glCreateProgram();
if( !OK( gl_shader_compile( gl, &program->fsh ) )
|| !OK( gl_shader_compile( gl, &program->vsh ) ) )
diff --git a/src/render/gl.h b/src/render/gl.h
index b673d47..a95994d 100644
--- a/src/render/gl.h
+++ b/src/render/gl.h
@@ -20,7 +20,7 @@ struct VERTEX {
struct GL_SHADER_DEF {
const char* name;
- const char* code;
+ STR code;
I32 type;
U32 id;
U8 compiled;
diff --git a/src/render/gl_batch.h b/src/render/gl_batch.h
index 31ed0ea..ed74d74 100644
--- a/src/render/gl_batch.h
+++ b/src/render/gl_batch.h
@@ -120,8 +120,8 @@ inline void gl_batch_draw( GL_BATCH<VERTEX>* batch ) {
GL_DYNAMIC_DRAW
);
- glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDrawArrays( call->primitive, 0, call->vertices.size );
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
} );
gl_set_viewport( batch->gl, vp_start, vp_dim );