X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fprogram_backend.cpp;h=d78a5b4206505ee51c9b3ecce1a201579bfe18ee;hb=0757f7d3e514836ca85954708c41a1accac0574b;hp=3b1c4293326fd1edfe21e3aa7806e2dde4597df0;hpb=160e9eea29bd10034733d59507fa1bcca36be401;p=libs%2Fgl.git diff --git a/source/backends/opengl/program_backend.cpp b/source/backends/opengl/program_backend.cpp index 3b1c4293..d78a5b42 100644 --- a/source/backends/opengl/program_backend.cpp +++ b/source/backends/opengl/program_backend.cpp @@ -38,13 +38,11 @@ void uniform_matrix_wrapper(unsigned index, unsigned count, const void *data) namespace Msp { namespace GL { -OpenGLProgram::OpenGLProgram(): - linked(false) +OpenGLProgram::OpenGLProgram() { static Require _req(ARB_shader_objects); id = glCreateProgram(); - fill(stage_ids, stage_ids+MAX_STAGES, 0); } OpenGLProgram::~OpenGLProgram() @@ -71,11 +69,11 @@ unsigned OpenGLProgram::add_stage(Stage type) case VERTEX: { static Require _req(ARB_vertex_shader); gl_type = GL_VERTEX_SHADER; } break; case GEOMETRY: { static Require _req(ARB_geometry_shader4); gl_type = GL_GEOMETRY_SHADER; } break; case FRAGMENT: { static Require _req(ARB_fragment_shader); gl_type = GL_FRAGMENT_SHADER; } break; - default: throw invalid_argument("Program::add_stage"); + default: throw invalid_argument("OpenGLProgram::add_stage"); } if(stage_ids[type]) - throw invalid_operation("Program::add_stage"); + throw invalid_operation("OpenGLProgram::add_stage"); unsigned stage_id = glCreateShader(gl_type); stage_ids[type] = stage_id; @@ -103,7 +101,7 @@ void OpenGLProgram::add_glsl_stages(const GlslModule &mod, const map stages = compiler.get_stages(); if(stages.empty()) - throw invalid_argument("Program::add_glsl_stages"); + throw invalid_argument("OpenGLProgram::add_glsl_stages"); for(SL::Stage::Type st: stages) { @@ -113,7 +111,7 @@ void OpenGLProgram::add_glsl_stages(const GlslModule &mod, const map(this)->reflect_data; + rd.n_clip_distances = compiler.get_n_clip_distances(); } void OpenGLProgram::compile_glsl_stage(const GlslModule &mod, unsigned stage_id) @@ -176,14 +177,14 @@ void OpenGLProgram::add_spirv_stages(const SpirVModule &mod, const map &code = mod.get_code(); glShaderBinary(n_stages, used_stage_ids, GL_SHADER_BINARY_FORMAT_SPIR_V, &code[0], code.size()*4); @@ -210,7 +211,7 @@ void OpenGLProgram::add_spirv_stages(const SpirVModule &mod, const mapname.c_str(), spec_id_array.size(), &spec_id_array[0], &spec_value_array[0]); } -void OpenGLProgram::finalize(const Module &mod) +void OpenGLProgram::finalize(const Module &mod, TransientData &transient) { glLinkProgram(id); int status = 0; @@ -231,6 +232,13 @@ void OpenGLProgram::finalize(const Module &mod) if(!info_log.empty()) IO::print("Program link info log:\n%s", info_log); #endif + + if(mod.get_format()==Module::GLSL) + { + query_uniforms(); + query_attributes(); + apply_bindings(transient); + } } void OpenGLProgram::query_uniforms() @@ -311,6 +319,14 @@ void OpenGLProgram::query_uniforms() func = &uniform_wrapper; else if(u.type==INT_VEC4) func = &uniform_wrapper; + else if(u.type==UNSIGNED_INT) + func = &uniform_wrapper; + else if(u.type==UINT_VEC2) + func = &uniform_wrapper; + else if(u.type==UINT_VEC3) + func = &uniform_wrapper; + else if(u.type==UINT_VEC4) + func = &uniform_wrapper; else if(u.type==FLOAT_MAT2) func = &uniform_matrix_wrapper; else if(u.type==FLOAT_MAT3) @@ -336,11 +352,6 @@ void OpenGLProgram::query_uniforms() } default_block.sort_uniforms(); - if(!default_block.uniforms.empty()) - { - const ReflectData::UniformInfo &uni = *default_block.uniforms.back(); - default_block.data_size = uni.location*16+uni.array_size*get_type_size(uni.type); - } default_block.update_layout_hash(); rd.update_layout_hash(); } @@ -375,7 +386,7 @@ void OpenGLProgram::query_uniform_blocks(const vectorblock = &info; }