]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/program_backend.cpp
Add unsigned integer types to Program reflection and ProgramData
[libs/gl.git] / source / backends / opengl / program_backend.cpp
index 3b1c4293326fd1edfe21e3aa7806e2dde4597df0..767811802ebf5c10eded6718324f7f1a106f4ab7 100644 (file)
@@ -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<string, int
 
        vector<SL::Stage::Type> 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<string, int
                case SL::Stage::VERTEX: stage_id = add_stage(VERTEX); break;
                case SL::Stage::GEOMETRY: stage_id = add_stage(GEOMETRY); break;
                case SL::Stage::FRAGMENT: stage_id = add_stage(FRAGMENT); break;
-               default: throw invalid_operation("Program::add_glsl_stages");
+               default: throw invalid_operation("OpenGLProgram::add_glsl_stages");
                }
 
                string stage_src = compiler.get_stage_glsl(st);
@@ -138,6 +136,9 @@ void OpenGLProgram::add_glsl_stages(const GlslModule &mod, const map<string, int
 
        transient.textures = compiler.get_texture_bindings();
        transient.blocks = compiler.get_uniform_block_bindings();
+
+       ReflectData &rd = static_cast<Program *>(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<string, i
                case SpirVModule::VERTEX: stage_id = add_stage(VERTEX); break;
                case SpirVModule::GEOMETRY: stage_id = add_stage(GEOMETRY); break;
                case SpirVModule::FRAGMENT: stage_id = add_stage(FRAGMENT); break;
-               default: throw invalid_operation("Program::add_spirv_stages");
+               default: throw invalid_operation("OpenGLProgram::add_spirv_stages");
                }
 
                used_stage_ids[n_stages++] = stage_id;
        }
 
        if(!n_stages)
-               throw invalid_argument("Program::add_spirv_stages");
+               throw invalid_argument("OpenGLProgram::add_spirv_stages");
 
        const vector<uint32_t> &code = mod.get_code();
        glShaderBinary(n_stages, used_stage_ids, GL_SHADER_BINARY_FORMAT_SPIR_V, &code[0], code.size()*4);
@@ -311,6 +312,14 @@ void OpenGLProgram::query_uniforms()
                                        func = &uniform_wrapper<int, glUniform3iv>;
                                else if(u.type==INT_VEC4)
                                        func = &uniform_wrapper<int, glUniform4iv>;
+                               else if(u.type==UNSIGNED_INT)
+                                       func = &uniform_wrapper<unsigned, glUniform1uiv>;
+                               else if(u.type==UINT_VEC2)
+                                       func = &uniform_wrapper<unsigned, glUniform2uiv>;
+                               else if(u.type==UINT_VEC3)
+                                       func = &uniform_wrapper<unsigned, glUniform3uiv>;
+                               else if(u.type==UINT_VEC4)
+                                       func = &uniform_wrapper<unsigned, glUniform4uiv>;
                                else if(u.type==FLOAT_MAT2)
                                        func = &uniform_matrix_wrapper<float, glUniformMatrix2fv>;
                                else if(u.type==FLOAT_MAT3)
@@ -336,11 +345,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 +379,7 @@ void OpenGLProgram::query_uniform_blocks(const vector<ReflectData::UniformInfo *
                for(int j: indices)
                {
                        if(!uniforms_by_index[j])
-                               throw logic_error("Program::link");
+                               throw logic_error("OpenGLProgram::query_uniform_blocks");
                        info.uniforms.push_back(uniforms_by_index[j]);
                        uniforms_by_index[j]->block = &info;
                }