summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxo <boneyaard@gmail.com>2026-04-13 01:46:46 +0200
committerxo <boneyaard@gmail.com>2026-04-13 01:46:46 +0200
commite827fd28abfacee5784b5a86548ebd668c84a070 (patch)
tree8c8aeaba9edbf5b8df8ebe42df0ca11f9ce772d1 /src
parent8099c2a11fb4010542973bf85359935da19e2192 (diff)
fix drawing on intel gpusHEADmaster
Diffstat (limited to 'src')
-rw-r--r--src/render/gl.cpp34
-rw-r--r--src/render/gl.h2
-rw-r--r--src/render/gl_batch.h2
-rw-r--r--src/util/string.h7
4 files changed, 37 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 );
diff --git a/src/util/string.h b/src/util/string.h
index 2725fd2..548007a 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -277,6 +277,13 @@ struct __str : public LIST<CT> {
return ret;
}
+ __str<CT> substr( I32 start ) {
+ if( start < 0 )
+ start = this->size + start;
+
+ return __str<CT>( this->size - start, this->data + start );
+ }
+
// can take negative input as offset from end
__str<CT> substr( I32 start, I32 end ) {
if( start < 0 )