X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogram.cpp;h=d962751994d38fe1e7fd93550bb51a545eaec9f6;hb=ccd59643144950604f95339683bac0ca4e8366d1;hp=ffcc4a6c81bd3db1f3aa4c0315676dd1c5e6d1e2;hpb=ac11296dca7c7a594ff1b20bead87e1e161b4bef;p=libs%2Fgl.git diff --git a/source/program.cpp b/source/program.cpp index ffcc4a6c..d9627519 100644 --- a/source/program.cpp +++ b/source/program.cpp @@ -297,9 +297,12 @@ void Program::link() for(vector::iterator j=indices.begin(); j!=indices.end(); ++j) if(uniforms_by_index[*j]->size>1) indices2.push_back(*j); - glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_ARRAY_STRIDE, &values[0]); - for(unsigned j=0; jarray_stride = values[j]; + if(!indices2.empty()) + { + glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_ARRAY_STRIDE, &values[0]); + for(unsigned j=0; jarray_stride = values[j]; + } indices2.clear(); for(vector::iterator j=indices.begin(); j!=indices.end(); ++j) @@ -310,10 +313,14 @@ void Program::link() t==GL_FLOAT_MAT3x4 || t==GL_FLOAT_MAT4x2 || t==GL_FLOAT_MAT4x3) indices2.push_back(*j); } - glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_MATRIX_STRIDE, &values[0]); - for(unsigned j=0; jmatrix_stride = values[j]; + if(!indices2.empty()) + { + glGetActiveUniformsiv(id, indices2.size(), &indices2[0], GL_UNIFORM_MATRIX_STRIDE, &values[0]); + for(unsigned j=0; jmatrix_stride = values[j]; + } + sort(info.uniforms.begin(), info.uniforms.end(), uniform_location_compare); info.layout_hash = compute_layout_hash(info.uniforms); info.bind_point = info.layout_hash%BufferRange::get_n_uniform_buffer_bindings(); glUniformBlockBinding(id, i, info.bind_point); @@ -339,6 +346,11 @@ unsigned Program::compute_layout_hash(const vector &uniform return hash32(layout_descriptor); } +bool Program::uniform_location_compare(const UniformInfo *uni1, const UniformInfo *uni2) +{ + return uni1->locationlocation; +} + string Program::get_info_log() const { GLsizei len = 0;