void ProgramGL::setUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { if (mFunctions->programUniformMatrix4fv != nullptr) { mFunctions->programUniformMatrix4fv(mProgramID, uniLoc(location), count, transpose, value); } else { mStateManager->useProgram(mProgramID); mFunctions->uniformMatrix4fv(uniLoc(location), count, transpose, value); } }
void ProgramGL::setUniform4uiv(GLint location, GLsizei count, const GLuint *v) { if (mFunctions->programUniform4uiv != nullptr) { mFunctions->programUniform4uiv(mProgramID, uniLoc(location), count, v); } else { mStateManager->useProgram(mProgramID); mFunctions->uniform4uiv(uniLoc(location), count, v); } }
void ProgramGL::setUniform1iv(GLint location, GLsizei count, const GLint *v) { mStateManager->useProgram(mProgramID); mFunctions->uniform1iv(uniLoc(location), count, v); const gl::VariableLocation &locationEntry = mState.getUniformLocations()[location]; size_t samplerIndex = mUniformIndexToSamplerIndex[locationEntry.index]; if (samplerIndex != GL_INVALID_INDEX) { std::vector<GLuint> &boundTextureUnits = mSamplerBindings[samplerIndex].boundTextureUnits; size_t copyCount = std::max<size_t>(count, boundTextureUnits.size() - locationEntry.element); std::copy(v, v + copyCount, boundTextureUnits.begin() + locationEntry.element); } }
void ProgramGL::markUnusedUniformLocations(std::vector<gl::VariableLocation> *uniformLocations, std::vector<gl::SamplerBinding> *samplerBindings) { GLint maxLocation = static_cast<GLint>(uniformLocations->size()); for (GLint location = 0; location < maxLocation; ++location) { if (uniLoc(location) == -1) { auto &locationRef = (*uniformLocations)[location]; if (mState.isSamplerUniformIndex(locationRef.index)) { GLuint samplerIndex = mState.getSamplerIndexFromUniformIndex(locationRef.index); (*samplerBindings)[samplerIndex].unreferenced = true; } locationRef.markUnused(); } } }
void ProgramGL::setUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { mStateManager->useProgram(mProgramID); mFunctions->uniformMatrix4x3fv(uniLoc(location), count, transpose, value); }
void ProgramGL::setUniform4uiv(GLint location, GLsizei count, const GLuint *v) { mStateManager->useProgram(mProgramID); mFunctions->uniform4uiv(uniLoc(location), count, v); }
void ProgramGL::getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const { mFunctions->getUniformuiv(mProgramID, uniLoc(location), params); }