private boolean initProgram(GL4 gl4) {

    boolean validated = true;

    try {

      if (validated) {

        String[] vertexSourceContent =
            new String[] {
              new Scanner(new File(SHADERS_ROOT + "/" + SHADERS_SOURCE + ".vert"))
                  .useDelimiter("\\A")
                  .next()
            };
        programName[Program.VERT.ordinal()] =
            gl4.glCreateShaderProgramv(GL_VERTEX_SHADER, 1, vertexSourceContent);
      }

      if (validated) {

        String[] fragmentSourceContent =
            new String[] {
              new Scanner(new File(SHADERS_ROOT + "/" + SHADERS_SOURCE + ".frag"))
                  .useDelimiter("\\A")
                  .next()
            };
        programName[Program.FRAG.ordinal()] =
            gl4.glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, fragmentSourceContent);
      }

      if (validated) {

        validated = validated && checkProgram(gl4, programName[Program.VERT.ordinal()]);
        validated = validated && checkProgram(gl4, programName[Program.FRAG.ordinal()]);
      }

      if (validated) {

        uniformMvp = gl4.glGetUniformLocation(programName[Program.VERT.ordinal()], "mvp");
        uniformDiffuse = gl4.glGetUniformLocation(programName[Program.FRAG.ordinal()], "diffuse");
      }

      if (validated) {

        gl4.glGenProgramPipelines(1, pipelineName, 0);
        gl4.glBindProgramPipeline(pipelineName[0]);
        gl4.glUseProgramStages(
            pipelineName[0], GL_VERTEX_SHADER_BIT, programName[Program.VERT.ordinal()]);
        gl4.glUseProgramStages(
            pipelineName[0], GL_FRAGMENT_SHADER_BIT, programName[Program.FRAG.ordinal()]);
      }

    } catch (FileNotFoundException ex) {
      Logger.getLogger(Gl_410_program_64.class.getName()).log(Level.SEVERE, null, ex);
    }

    return validated && checkError(gl4, "initProgram");
  }
  private boolean initProgram(GL4 gl4) {

    boolean validated = true;

    // Create program
    if (validated) {

      ShaderCode vertShaderCode =
          ShaderCode.create(
              gl4,
              GL_VERTEX_SHADER,
              this.getClass(),
              SHADERS_ROOT,
              null,
              SHADERS_SOURCE,
              "vert",
              null,
              true);
      ShaderCode fragShaderCode =
          ShaderCode.create(
              gl4,
              GL_FRAGMENT_SHADER,
              this.getClass(),
              SHADERS_ROOT,
              null,
              SHADERS_SOURCE,
              "frag",
              null,
              true);

      ShaderProgram shaderProgram = new ShaderProgram();
      shaderProgram.init(gl4);
      programName[Program.VERTEX] = shaderProgram.program();
      gl4.glProgramParameteri(programName[Program.VERTEX], GL_PROGRAM_SEPARABLE, GL_TRUE);
      shaderProgram.add(vertShaderCode);
      shaderProgram.link(gl4, System.out);

      shaderProgram = new ShaderProgram();
      shaderProgram.init(gl4);
      programName[Program.FRAGMENT] = shaderProgram.program();
      gl4.glProgramParameteri(programName[Program.FRAGMENT], GL_PROGRAM_SEPARABLE, GL_TRUE);
      shaderProgram.add(fragShaderCode);
      shaderProgram.link(gl4, System.out);
    }

    if (validated) {

      gl4.glGenProgramPipelines(1, pipelineName);
      gl4.glUseProgramStages(
          pipelineName.get(0), GL_VERTEX_SHADER_BIT, programName[Program.VERTEX]);
      gl4.glUseProgramStages(
          pipelineName.get(0), GL_FRAGMENT_SHADER_BIT, programName[Program.FRAGMENT]);
    }

    return validated & checkError(gl4, "initProgram");
  }