From e827fd28abfacee5784b5a86548ebd668c84a070 Mon Sep 17 00:00:00 2001 From: xo Date: Mon, 13 Apr 2026 01:46:46 +0200 Subject: fix drawing on intel gpus --- src/render/gl.cpp | 34 ++++++++++++++++++++++++++++------ src/render/gl.h | 2 +- src/render/gl_batch.h | 2 +- src/util/string.h | 7 +++++++ 4 files changed, 37 insertions(+), 8 deletions(-) (limited to 'src') 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* 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 { return ret; } + __str substr( I32 start ) { + if( start < 0 ) + start = this->size + start; + + return __str( this->size - start, this->data + start ); + } + // can take negative input as offset from end __str substr( I32 start, I32 end ) { if( start < 0 ) -- cgit v1.2.3