34package com.jogamp.opengl.util.glsl;
36import java.io.PrintStream;
40import com.jogamp.opengl.*;
42import com.jogamp.common.nio.Buffers;
43import com.jogamp.opengl.GLExtensions;
48 final int[] infoLogLength=
new int[1];
51 if(infoLogLength[0]==0) {
52 return "(no info log)";
54 final int[] charsWritten=
new int[1];
55 final byte[] infoLogBytes =
new byte[infoLogLength[0]];
58 return new String(infoLogBytes, 0, charsWritten[0]);
63 final int[] infoLogLength=
new int[1];
66 if(infoLogLength[0]==0) {
67 return "(no info log)";
69 final int[] charsWritten=
new int[1];
70 final byte[] infoLogBytes =
new byte[infoLogLength[0]];
73 return new String(infoLogBytes, 0, charsWritten[0]);
76 public static boolean isShaderStatusValid(
final GL _gl,
final int shaderObj,
final int name,
final PrintStream verboseOut) {
78 final int[] ires =
new int[1];
81 final boolean res = ires[0]==1;
82 if(!res &&
null!=verboseOut) {
83 verboseOut.println(
"Shader status invalid: "+
getShaderInfoLog(gl, shaderObj));
88 public static boolean isShaderStatusValid(
final GL _gl,
final IntBuffer shaders,
final int name,
final PrintStream verboseOut) {
90 for (
int i = shaders.position(); i < shaders.limit(); i++) {
98 final int[] ires =
new int[1];
107 if(
null!=verboseOut) {
108 verboseOut.println(
"Program name invalid: "+programObj);
113 if(
null!=verboseOut) {
114 verboseOut.println(
"Program link failed: "+programObj+
"\n\t"+
getProgramInfoLog(gl, programObj));
137 if(
null!=verboseOut) {
138 verboseOut.println(
"Program validation failed: "+programObj+
"\n\t"+
getProgramInfoLog(gl, programObj));
145 public static void createShader(
final GL _gl,
final int type,
final IntBuffer shaders) {
147 for (
int i = shaders.position(); i < shaders.limit(); i++) {
159 final ProfileInformation info = getProfileInformation(gl);
160 if(
null == info.shaderBinaryFormats) {
161 info.shaderBinaryFormats =
new HashSet<Integer>();
164 final int[] param =
new int[1];
167 final int numFormats = GL.GL_NO_ERROR == err ? param[0] : 0;
169 final int[] formats =
new int[numFormats];
171 for(
int i=0; i<numFormats; i++) {
172 info.shaderBinaryFormats.add(Integer.valueOf(formats[i]));
176 System.err.println(
"Caught exception on thread "+Thread.currentThread().getName());
177 gle.printStackTrace();
181 return info.shaderBinaryFormats;
187 final ProfileInformation info = getProfileInformation(gl);
188 if(
null==info.shaderCompilerAvailable) {
190 boolean queryOK =
false;
192 final byte[] param =
new byte[1];
195 boolean v = GL.GL_NO_ERROR == err && param[0]!=(byte)0x00;
203 info.shaderCompilerAvailable = Boolean.valueOf(v);
206 System.err.println(
"Caught exception on thread "+Thread.currentThread().getName());
207 gle.printStackTrace();
210 info.shaderCompilerAvailable = Boolean.valueOf(
true);
213 info.shaderCompilerAvailable =
new Boolean(
true);
218 return info.shaderCompilerAvailable.booleanValue();
228 public static void shaderSource(
final GL _gl,
final int shader,
final CharSequence[] source)
235 final int count = (
null!=source)?source.length:0;
240 final IntBuffer lengths = Buffers.newDirectIntBuffer(count);
241 for(
int i=0; i<count; i++) {
242 lengths.put(i, source[i].length());
244 if(source instanceof String[]) {
248 final String[] tmp =
new String[source.length];
249 for(
int i = source.length - 1; i>=0; i--) {
250 final CharSequence csq = source[i];
251 if(csq instanceof String) {
253 tmp[i] = (String) csq;
256 tmp[i] = source[i].toString();
263 public static void shaderSource(
final GL _gl,
final IntBuffer shaders,
final CharSequence[][] sources)
265 final int sourceNum = (
null!=sources)?sources.length:0;
266 final int shaderNum = (
null!=shaders)?shaders.remaining():0;
267 if(shaderNum<=0 || sourceNum<=0 || shaderNum!=sourceNum) {
268 throw new GLException(
"Invalid number of shaders and/or sources: shaders="+
269 shaderNum+
", sources="+sourceNum);
271 for(
int i=0; i<sourceNum; i++) {
272 shaderSource(_gl, shaders.get(shaders.position() + i), sources[i]);
276 public static void shaderBinary(
final GL _gl,
final IntBuffer shaders,
final int binFormat,
final java.nio.Buffer bin)
280 throw new GLException(
"No binary formats are supported");
283 final int shaderNum = shaders.remaining();
290 final int binLength = bin.remaining();
292 throw new GLException(
"Empty shader binary (remaining == 0)");
300 for (
int i = shaders.position(); i < shaders.limit(); i++) {
305 public static void attachShader(
final GL _gl,
final int program,
final IntBuffer shaders)
308 for (
int i = shaders.position(); i < shaders.limit(); i++) {
313 public static void detachShader(
final GL _gl,
final int program,
final IntBuffer shaders)
316 for (
int i = shaders.position(); i < shaders.limit(); i++) {
324 for (
int i = shaders.position(); i < shaders.limit(); i++) {
331 final int binFormat,
final java.nio.Buffer bin,
332 final PrintStream verboseOut)
337 verboseOut.println(
"createAndLoadShader: Pre GL Error: 0x"+Integer.toHexString(err));
343 throw new GLException(
"createAndLoadShader: CreateShader failed, GL Error: 0x"+Integer.toHexString(err));
350 verboseOut.println(
"createAndLoadShader: ShaderBinary failed, GL Error: 0x"+Integer.toHexString(err));
356 final CharSequence[][] sources,
357 final PrintStream verboseOut)
362 verboseOut.println(
"createAndCompileShader: Pre GL Error: 0x"+Integer.toHexString(err));
368 throw new GLException(
"createAndCompileShader: CreateShader failed, GL Error: 0x"+Integer.toHexString(err));
374 throw new GLException(
"createAndCompileShader: ShaderSource failed, GL Error: 0x"+Integer.toHexString(err));
380 verboseOut.println(
"createAndCompileShader: CompileShader failed, GL Error: 0x"+Integer.toHexString(err));
386 private static final String implObjectKey =
"com.jogamp.opengl.util.glsl.ShaderUtil" ;
388 private static class ProfileInformation {
389 Boolean shaderCompilerAvailable =
null;
390 Set<Integer> shaderBinaryFormats =
null;
393 private static ProfileInformation getProfileInformation(
final GL gl) {
396 ProfileInformation data = (ProfileInformation) context.
getAttachedObject(implObjectKey);
398 data =
new ProfileInformation();
Abstraction for an OpenGL rendering context.
final Object getAttachedObject(final String name)
Returns the attached user object for the given name to this GLContext.
final Object attachObject(final String name, final Object obj)
Sets the attached user object for the given name to this GLContext.
static final VersionNumber Version3_2
Version 3.2.
final void validateCurrent()
final VersionNumber getGLVersionNumber()
Returns this context OpenGL version.
abstract boolean isExtensionAvailable(String glExtensionName)
Returns true if the specified OpenGL extension can be successfully called using this GL context given...
A generic exception for OpenGL errors used throughout the binding as a substitute for RuntimeExceptio...
Class holding OpenGL extension strings, commonly used by JOGL's implementation.
static final String ARB_geometry_shader4
static boolean createAndLoadShader(final GL _gl, final IntBuffer shader, final int shaderType, final int binFormat, final java.nio.Buffer bin, final PrintStream verboseOut)
static boolean isShaderStatusValid(final GL _gl, final int shaderObj, final int name, final PrintStream verboseOut)
static String getShaderInfoLog(final GL _gl, final int shaderObj)
static void deleteShader(final GL _gl, final IntBuffer shaders)
static boolean isProgramExecStatusValid(final GL _gl, final int programObj, final PrintStream verboseOut)
Performs GL2ES2#glValidateProgram(int).
static boolean isGeometryShaderSupported(final GL _gl)
Returns true if GeometryShader is supported, i.e.
static boolean isProgramLinkStatusValid(final GL _gl, final int programObj, final PrintStream verboseOut)
static boolean isShaderCompilerAvailable(final GL _gl)
Returns true if a hader compiler is available, otherwise false.
static void attachShader(final GL _gl, final int program, final IntBuffer shaders)
static boolean isProgramStatusValid(final GL _gl, final int programObj, final int name)
static void compileShader(final GL _gl, final IntBuffer shaders)
static boolean isShaderStatusValid(final GL _gl, final IntBuffer shaders, final int name, final PrintStream verboseOut)
static String getProgramInfoLog(final GL _gl, final int programObj)
static Set< Integer > getShaderBinaryFormats(final GL _gl)
If supported, queries the natively supported shader binary formats using GL2ES2#GL_NUM_SHADER_BINARY_...
static void shaderSource(final GL _gl, final int shader, final CharSequence[] source)
static void createShader(final GL _gl, final int type, final IntBuffer shaders)
static void shaderBinary(final GL _gl, final IntBuffer shaders, final int binFormat, final java.nio.Buffer bin)
static void shaderSource(final GL _gl, final IntBuffer shaders, final CharSequence[][] sources)
static boolean createAndCompileShader(final GL _gl, final IntBuffer shader, final int shaderType, final CharSequence[][] sources, final PrintStream verboseOut)
static void detachShader(final GL _gl, final int program, final IntBuffer shaders)
void glGetProgramiv(int program, int pname, IntBuffer params)
Entry point to C language function: void {@native glGetProgramiv}(GLuint program,...
void glCompileShader(int shader)
Entry point to C language function: void {@native glCompileShader}(GLuint shader) Part of GL_ES_VE...
static final int GL_LINK_STATUS
GL_ES_VERSION_2_0, GL_VERSION_2_0 Define "GL_LINK_STATUS" with expression '0x8B82',...
void glDeleteShader(int shader)
Entry point to C language function: void {@native glDeleteShader}(GLuint shader) Part of GL_ES_VER...
void glValidateProgram(int program)
Entry point to C language function: void {@native glValidateProgram}(GLuint program) Part of GL_ES...
void glGetProgramInfoLog(int program, int bufSize, IntBuffer length, ByteBuffer infoLog)
Entry point to C language function: void {@native glGetProgramInfoLog}(GLuint program,...
void glDetachShader(int program, int shader)
Entry point to C language function: void {@native glDetachShader}(GLuint program,...
static final int GL_NUM_SHADER_BINARY_FORMATS
GL_ARB_ES2_compatibility, GL_ES_VERSION_2_0, GL_VERSION_4_1 Define "GL_NUM_SHADER_BINARY_FORMATS" wit...
void glShaderBinary(int n, IntBuffer shaders, int binaryformat, Buffer binary, int length)
Entry point to C language function: void {@native glShaderBinary}(GLint n, const GLuint * shaders,...
static final int GL_COMPILE_STATUS
GL_ES_VERSION_2_0, GL_VERSION_2_0 Define "GL_COMPILE_STATUS" with expression '0x8B81',...
static final int GL_VALIDATE_STATUS
GL_ES_VERSION_2_0, GL_VERSION_2_0 Define "GL_VALIDATE_STATUS" with expression '0x8B83',...
static final int GL_SHADER_BINARY_FORMATS
GL_ARB_ES2_compatibility, GL_ES_VERSION_2_0, GL_VERSION_4_1 Define "GL_SHADER_BINARY_FORMATS" with ex...
boolean glIsProgram(int program)
Entry point to C language function: GLboolean {@native glIsProgram}(GLuint program) Part of GL_ES_...
void glGetShaderiv(int shader, int pname, IntBuffer params)
Entry point to C language function: void {@native glGetShaderiv}(GLuint shader, GLenum pname,...
static final int GL_SHADER_COMPILER
GL_ARB_ES2_compatibility, GL_ES_VERSION_2_0, GL_VERSION_4_1 Define "GL_SHADER_COMPILER" with expressi...
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,...
int glCreateShader(int type)
Entry point to C language function: GLuint {@native glCreateShader}(GLenum type) Part of GL_ES_VER...
void glGetShaderInfoLog(int shader, int bufSize, IntBuffer length, ByteBuffer infoLog)
Entry point to C language function: void {@native glGetShaderInfoLog}(GLuint shader,...
static final int GL_INFO_LOG_LENGTH
GL_ES_VERSION_2_0, GL_VERSION_2_0 Define "GL_INFO_LOG_LENGTH" with expression '0x8B84',...
boolean isGLES2Compatible()
Indicates whether this GL object is compatible with the core OpenGL ES2 functionality.
GL2ES2 getGL2ES2()
Casts this object to the GL2ES2 interface.
boolean isGL2ES2()
Indicates whether this GL object conforms to a GL2ES2 compatible profile.
GLContext getContext()
Returns the GLContext associated which this GL object.
boolean isGLES2()
Indicates whether this GL object conforms to the OpenGL ES ≥ 2.0 profile.
void glGetIntegerv(int pname, IntBuffer data)
Entry point to C language function: void {@native glGetIntegerv}(GLenum pname, GLint * data) Part ...
void glGetBooleanv(int pname, ByteBuffer data)
Entry point to C language function: void {@native glGetBooleanv}(GLenum pname, GLboolean * data) P...
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...
int glGetError()
Entry point to C language function: GLenum {@native glGetError}() Part of GL_ES_VERSION_2_0,...