X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fprogram_backend.cpp;h=d78a5b4206505ee51c9b3ecce1a201579bfe18ee;hb=0757f7d3e514836ca85954708c41a1accac0574b;hp=b902db5f6a99043df53af71632230ff9eed263e1;hpb=f82ef715f0d7e1e7d0b93be4b7b89c8ce6bba40b;p=libs%2Fgl.git diff --git a/source/backends/opengl/program_backend.cpp b/source/backends/opengl/program_backend.cpp index b902db5f..d78a5b42 100644 --- a/source/backends/opengl/program_backend.cpp +++ b/source/backends/opengl/program_backend.cpp @@ -69,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; @@ -101,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) { @@ -111,7 +111,7 @@ void OpenGLProgram::add_glsl_stages(const GlslModule &mod, const map &code = mod.get_code(); glShaderBinary(n_stages, used_stage_ids, GL_SHADER_BINARY_FORMAT_SPIR_V, &code[0], code.size()*4); @@ -211,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; @@ -232,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() @@ -312,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) @@ -371,7 +386,7 @@ void OpenGLProgram::query_uniform_blocks(const vectorblock = &info; }