Esempio n. 1
0
  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;
  }
Esempio n. 2
0
  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;
  }
Esempio n. 3
0
  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;
    }
  }
Esempio n. 4
0
 int GLProgram::attribLocation(const QString& name)
 {
   /// @todo should this accept State* and bind if necessary?
   return glRun2(glGetAttribLocation(id(), name.toUtf8().data()));
 }