JOGL v2.6.0-rc-20250706
JOGL, High-Performance Graphics Binding for Java™ (public API).
GLSLSimpleProgram.java
Go to the documentation of this file.
1/**
2 * Copyright 2010 JogAmp Community. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification, are
5 * permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
15 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * The views and conclusions contained in the software and documentation are those of the
25 * authors and should not be interpreted as representing official policies, either expressed
26 * or implied, of JogAmp Community.
27 */
28
29package com.jogamp.opengl.test.junit.util;
30
31import com.jogamp.opengl.util.glsl.ShaderUtil;
32import java.io.ByteArrayOutputStream;
33import java.io.PrintStream;
34import com.jogamp.opengl.GL;
35import com.jogamp.opengl.GL2ES2;
36import org.junit.Assert;
37
38public class GLSLSimpleProgram {
39 private int shaderProgram;
40 private int vertShader;
41 private int fragShader;
42 private boolean isValid;
43
44 private GLSLSimpleProgram(final int shaderProgram, final int vertShader, final int fragShader) {
45 this.shaderProgram = shaderProgram;
46 this.vertShader = vertShader;
47 this.fragShader = fragShader;
48 this.isValid = true;
49 }
50
51 public static GLSLSimpleProgram create(final GL2ES2 gl, final String vertShaderCode, final String fragShaderCode, final boolean link) {
52 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
53 final PrintStream pbaos = new PrintStream(baos);
54
55 final int vertShader = gl.glCreateShader(GL2ES2.GL_VERTEX_SHADER);
56 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
57
58 final int fragShader = gl.glCreateShader(GL2ES2.GL_FRAGMENT_SHADER);
59 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
60
61 final String[] vlines = new String[] { gl.getContext().getGLSLVersionString()+vertShaderCode };
62 final int[] vlengths = new int[] { vlines[0].length() };
63 gl.glShaderSource(vertShader, vlines.length, vlines, vlengths, 0);
64 gl.glCompileShader(vertShader);
65 if(!ShaderUtil.isShaderStatusValid(gl, vertShader, GL2ES2.GL_COMPILE_STATUS, pbaos)) {
66 System.out.println("getShader:postCompile vertShader: "+baos.toString());
67 Assert.assertTrue(false);
68 }
69 pbaos.flush(); baos.reset();
70 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
71
72
73 final String[] flines = new String[] { gl.getContext().getGLSLVersionString()+fragShaderCode };
74 final int[] flengths = new int[] { flines[0].length() };
75 gl.glShaderSource(fragShader, flines.length, flines, flengths, 0);
76 gl.glCompileShader(fragShader);
77 if(!ShaderUtil.isShaderStatusValid(gl, fragShader, GL2ES2.GL_COMPILE_STATUS, pbaos)) {
78 System.out.println("getShader:postCompile fragShader: "+baos.toString());
79 Assert.assertTrue(false);
80 }
81 pbaos.flush(); baos.reset();
82 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
83
84 final int shaderProgram = gl.glCreateProgram();
85 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
86 gl.glAttachShader(shaderProgram, vertShader);
87 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
88 gl.glAttachShader(shaderProgram, fragShader);
89 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
90
91 if(link) {
92 gl.glLinkProgram(shaderProgram);
93 if(!ShaderUtil.isProgramLinkStatusValid(gl, shaderProgram, pbaos)) {
94 System.out.println("Error (GLSL link error): "+baos.toString());
95 Assert.assertTrue(false);
96 }
97 }
98 Assert.assertEquals(GL.GL_NO_ERROR, gl.glGetError());
99 final GLSLSimpleProgram res = new GLSLSimpleProgram(shaderProgram, vertShader, fragShader);
100 return res;
101 }
102
103 public void release(final GL2ES2 gl) {
104 gl.glUseProgram(0);
105 gl.glDetachShader(shaderProgram, vertShader);
106 gl.glDeleteShader(vertShader);
107 gl.glDetachShader(shaderProgram, fragShader);
108 gl.glDeleteShader(fragShader);
109 gl.glDeleteProgram(shaderProgram);
110 isValid = false;
111 shaderProgram = 0;
112 vertShader = 0;
113 fragShader = 0;
114 }
115
116 public int getFragShader() {
117 return fragShader;
118 }
119
120 public int getShaderProgram() {
121 return shaderProgram;
122 }
123
124 public int getVertShader() {
125 return vertShader;
126 }
127
128 public boolean isValid() {
129 return isValid;
130 }
131}
final String getGLSLVersionString()
Returns the matching GLSL version number, queried by this context GL via GL2ES2#GL_SHADING_LANGUAGE_V...
Definition: GLContext.java:848
static GLSLSimpleProgram create(final GL2ES2 gl, final String vertShaderCode, final String fragShaderCode, final boolean link)
static boolean isShaderStatusValid(final GL _gl, final int shaderObj, final int name, final PrintStream verboseOut)
Definition: ShaderUtil.java:76
static boolean isProgramLinkStatusValid(final GL _gl, final int programObj, final PrintStream verboseOut)
static final int GL_VERTEX_SHADER
GL_ES_VERSION_2_0, GL_VERSION_2_0, GL_EXT_vertex_shader, GL_ARB_vertex_shader Alias for: GL_VERTEX_SH...
Definition: GL2ES2.java:39
void glCompileShader(int shader)
Entry point to C language function: void {@native glCompileShader}(GLuint shader) Part of GL_ES_VE...
void glDeleteShader(int shader)
Entry point to C language function: void {@native glDeleteShader}(GLuint shader) Part of GL_ES_VER...
void glDetachShader(int program, int shader)
Entry point to C language function: void {@native glDetachShader}(GLuint program,...
static final int GL_COMPILE_STATUS
GL_ES_VERSION_2_0, GL_VERSION_2_0 Define "GL_COMPILE_STATUS" with expression '0x8B81',...
Definition: GL2ES2.java:72
int glCreateProgram()
Entry point to C language function: GLuint {@native glCreateProgram}() Part of GL_ES_VERSION_2_0,...
void glUseProgram(int program)
Entry point to C language function: void {@native glUseProgram}(GLuint program) Part of GL_ES_VERS...
void glShaderSource(int shader, int count, String[] string, IntBuffer length)
Entry point to C language function: void {@native glShaderSource}(GLuint shader, GLsizei count,...
void glAttachShader(int program, int shader)
Entry point to C language function: void {@native glAttachShader}(GLuint program,...
void glDeleteProgram(int program)
Entry point to C language function: void {@native glDeleteProgram}(GLuint program) Part of GL_ES_V...
int glCreateShader(int type)
Entry point to C language function: GLuint {@native glCreateShader}(GLenum type) Part of GL_ES_VER...
void glLinkProgram(int program)
Entry point to C language function: void {@native glLinkProgram}(GLuint program) Part of GL_ES_VER...
static final int GL_FRAGMENT_SHADER
GL_ES_VERSION_2_0, GL_VERSION_2_0, GL_ATI_fragment_shader, GL_ARB_fragment_shader Alias for: GL_FRAGM...
Definition: GL2ES2.java:541
GLContext getContext()
Returns the GLContext associated which this GL object.
static final int GL_NO_ERROR
GL_ES_VERSION_2_0, GL_VERSION_1_1, GL_VERSION_1_0, GL_VERSION_ES_1_0 Define "GL_NO_ERROR" with expres...
Definition: GL.java:481
int glGetError()
Entry point to C language function: GLenum {@native glGetError}() Part of GL_ES_VERSION_2_0,...