bool QueryShader::compile(Shader::Type type, QString src) { if (!m_shader) { /// @todo handle different sets of shaders depending on the type m_shader = glRun2(glCreateShader(type)); if (!m_shader) { Log::error("QueryShader: could not create shader object"); return false; } } if (!m_prog) { m_prog = glRun2(glCreateProgram()); if (!m_prog) { Log::error("QueryShader: could not create program object"); return false; } } QByteArray bytes = src.toAscii(); const char* data = bytes.data(); GLint len = bytes.length(); glRun(glShaderSource(m_shader, 1, &data, &len)); glRun(glCompileShader(m_shader)); GLint ok = 0; glRun(glGetShaderiv(m_shader, GL_COMPILE_STATUS, &ok)); if (!ok) { glRun(glGetShaderiv(m_shader, GL_INFO_LOG_LENGTH, &len)); std::vector<GLchar> log(len); glRun(glGetShaderInfoLog(m_shader, len, &len, &log[0])); Log::error("Compile log: %s", &log[0]); return false; } if (!m_attached) glRun(glAttachShader(m_prog, m_shader)); m_attached = true; return true; }
bool GLProgram::isLinked() { glCheck("GLProgram::isLinked"); if (!m_prog) return false; /// for example i915_program_error: Exceeded max instructions etc can be /// checked with this if (!glRun2(glIsProgram(m_prog))) return false; GLint b = 0; glRun(glGetProgramiv(m_prog, GL_LINK_STATUS, &b)); return b; }
Shader::CompileStatus Shader::compile(ShaderErrorList& errors) { glCheck("Shader::compile"); if (m_needCompile) { m_needCompile = false; if (!m_shader) { m_shader = glRun2(glCreateShader(m_type)); if (!m_shader) { Log::error("Shader: could not create shader"); return ERRORS; } } QByteArray src_ = m_src.toUtf8(); #ifndef _WIN32 if (s_sandbox_compile && !SandboxCompiler::check(shared_from_this(), src_, errors)) { return ERRORS; } #endif const char* src = src_.data(); GLint len = src_.length(); glRun(glShaderSource(m_shader, 1, &src, &len)); glRun(glCompileShader(m_shader)); GLint ok = 0; glRun(glGetShaderiv(m_shader, GL_COMPILE_STATUS, &ok)); glRun(glGetShaderiv(m_shader, GL_INFO_LOG_LENGTH, &len)); int error_count = errors.size(); // len may include the zero byte if (len > 1 && !handleCompilerOutput(errors)) { Log::error("Failed to parse GLSL compiler output"); } error_count = errors.size() - error_count; return ok ? error_count ? WARNINGS : OK : ERRORS; } else { return NONE; } }
int GLProgram::attribLocation(const QString& name) { /// @todo should this accept State* and bind if necessary? return glRun2(glGetAttribLocation(id(), name.toUtf8().data())); }