Merge pull request #3628 from JakubValtar/remove-fixed-func

Fix OS X shader issues
This commit is contained in:
Ben Fry
2015-08-16 07:51:29 -04:00
5 changed files with 104 additions and 66 deletions
+41 -14
View File
@@ -1065,8 +1065,10 @@ public abstract class PGL {
PGL ppgl = primaryPGL ? this : pg.getPrimaryPGL();
if (!ppgl.loadedTex2DShader || ppgl.tex2DShaderContext != ppgl.glContext) {
String vertSource = PApplet.join(texVertShaderSource, "\n");
String fragSource = PApplet.join(tex2DFragShaderSource, "\n");
String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion());
String vertSource = PApplet.join(preprocVertSrc, "\n");
String[] preprocFragSrc = preprocessFragmentSource(tex2DFragShaderSource, getGLSLVersion());
String fragSource = PApplet.join(preprocFragSrc, "\n");
ppgl.tex2DVertShader = createShader(VERTEX_SHADER, vertSource);
ppgl.tex2DFragShader = createShader(FRAGMENT_SHADER, fragSource);
if (0 < ppgl.tex2DVertShader && 0 < ppgl.tex2DFragShader) {
@@ -1195,8 +1197,10 @@ public abstract class PGL {
PGL ppgl = primaryPGL ? this : pg.getPrimaryPGL();
if (!ppgl.loadedTexRectShader || ppgl.texRectShaderContext != ppgl.glContext) {
String vertSource = PApplet.join(texVertShaderSource, "\n");
String fragSource = PApplet.join(texRectFragShaderSource, "\n");
String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion());
String vertSource = PApplet.join(preprocVertSrc, "\n");
String[] preprocFragSrc = preprocessFragmentSource(texRectFragShaderSource, getGLSLVersion());
String fragSource = PApplet.join(preprocFragSrc, "\n");
ppgl.texRectVertShader = createShader(VERTEX_SHADER, vertSource);
ppgl.texRectFragShader = createShader(FRAGMENT_SHADER, fragSource);
if (0 < ppgl.texRectVertShader && 0 < ppgl.texRectFragShader) {
@@ -1616,6 +1620,11 @@ public abstract class PGL {
}
protected int getGLSLVersion() {
return 120;
}
protected String[] loadVertexShader(String filename) {
return pg.parent.loadStrings(filename);
}
@@ -1668,7 +1677,16 @@ public abstract class PGL {
protected static String[] preprocessFragmentSource(String[] fragSrc0,
int version) {
if (version >= 130) {
String[] fragSrc;
if (version < 130) {
String[] search = { };
String[] replace = { };
int offset = 1;
fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset);
fragSrc[0] = "#version " + version;
} else {
// We need to replace 'texture' uniform by 'texMap' uniform and
// 'textureXXX()' functions by 'texture()' functions. Order of these
// replacements is important to prevent collisions between these two.
@@ -1684,19 +1702,28 @@ public abstract class PGL {
"texture", "texture", "texture", "texture",
"fragColor"
};
int offset = 2;
String[] fragSrc = preprocessShaderSource(fragSrc0, search, replace, 2);
fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset);
fragSrc[0] = "#version " + version;
fragSrc[1] = "out vec4 fragColor;";
return fragSrc;
}
return fragSrc0;
return fragSrc;
}
protected static String[] preprocessVertexSource(String[] vertSrc0,
int version) {
if (version >= 130) {
String[] vertSrc;
if (version < 130) {
String[] search = { };
String[] replace = { };
int offset = 1;
vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset);
vertSrc[0] = "#version " + version;
} else {
// We need to replace 'texture' uniform by 'texMap' uniform and
// 'textureXXX()' functions by 'texture()' functions. Order of these
// replacements is important to prevent collisions between these two.
@@ -1710,13 +1737,13 @@ public abstract class PGL {
"texMap",
"texture", "texture", "texture", "texture"
};
int offset = 1;
String[] vertSrc = preprocessShaderSource(vertSrc0, search, replace, 1);
vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset);
vertSrc[0] = "#version " + version;
return vertSrc;
}
return vertSrc0;
return vertSrc;
}
protected static String[] preprocessShaderSource(String[] src0,
+19 -19
View File
@@ -7197,25 +7197,25 @@ public class PGraphicsOpenGL extends PGraphics {
shader.setType(type);
shader.setFragmentShader(fragFilename);
if (type == PShader.POINT) {
String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL);
shader.setVertexShader(vertSource);
} else if (type == PShader.LINE) {
String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL);
shader.setVertexShader(vertSource);
} else if (type == PShader.TEXLIGHT) {
String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL);
shader.setVertexShader(vertSource);
} else if (type == PShader.LIGHT) {
String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL);
shader.setVertexShader(vertSource);
} else if (type == PShader.TEXTURE) {
String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL);
shader.setVertexShader(vertSource);
} else if (type == PShader.COLOR) {
String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL);
shader.setVertexShader(vertSource);
} else {
String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120);
String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL);
shader.setVertexShader(vertSource);
}
return shader;
@@ -7309,8 +7309,8 @@ public class PGraphicsOpenGL extends PGraphics {
if (tex) {
if (useDefault || !polyShader.checkPolyType(PShader.TEXLIGHT)) {
if (ppg.defTexlightShader == null) {
String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120);
String[] fragSource = pgl.loadFragmentShader(defTexlightShaderFragURL, 120);
String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL);
String[] fragSource = pgl.loadFragmentShader(defTexlightShaderFragURL);
ppg.defTexlightShader = new PShader(parent, vertSource, fragSource);
}
shader = ppg.defTexlightShader;
@@ -7320,8 +7320,8 @@ public class PGraphicsOpenGL extends PGraphics {
} else {
if (useDefault || !polyShader.checkPolyType(PShader.LIGHT)) {
if (ppg.defLightShader == null) {
String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120);
String[] fragSource = pgl.loadFragmentShader(defLightShaderFragURL, 120);
String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL);
String[] fragSource = pgl.loadFragmentShader(defLightShaderFragURL);
ppg.defLightShader = new PShader(parent, vertSource, fragSource);
}
shader = ppg.defLightShader;
@@ -7338,8 +7338,8 @@ public class PGraphicsOpenGL extends PGraphics {
if (tex) {
if (useDefault || !polyShader.checkPolyType(PShader.TEXTURE)) {
if (ppg.defTextureShader == null) {
String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120);
String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL, 120);
String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL);
String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL);
ppg.defTextureShader = new PShader(parent, vertSource, fragSource);
}
shader = ppg.defTextureShader;
@@ -7349,8 +7349,8 @@ public class PGraphicsOpenGL extends PGraphics {
} else {
if (useDefault || !polyShader.checkPolyType(PShader.COLOR)) {
if (ppg.defColorShader == null) {
String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL, 120);
String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL, 120);
String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL);
String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL);
ppg.defColorShader = new PShader(parent, vertSource, fragSource);
}
shader = ppg.defColorShader;
@@ -7373,8 +7373,8 @@ public class PGraphicsOpenGL extends PGraphics {
PGraphicsOpenGL ppg = getPrimaryPG();
if (lineShader == null) {
if (ppg.defLineShader == null) {
String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL, 120);
String[] fragSource = pgl.loadFragmentShader(defLineShaderFragURL, 120);
String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL);
String[] fragSource = pgl.loadFragmentShader(defLineShaderFragURL);
ppg.defLineShader = new PShader(parent, vertSource, fragSource);
}
shader = ppg.defLineShader;
@@ -7393,8 +7393,8 @@ public class PGraphicsOpenGL extends PGraphics {
PGraphicsOpenGL ppg = getPrimaryPG();
if (pointShader == null) {
if (ppg.defPointShader == null) {
String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL, 120);
String[] fragSource = pgl.loadFragmentShader(defPointShaderFragURL, 120);
String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL);
String[] fragSource = pgl.loadFragmentShader(defPointShaderFragURL);
ppg.defPointShader = new PShader(parent, vertSource, fragSource);
}
shader = ppg.defPointShader;
+40 -25
View File
@@ -37,6 +37,7 @@ import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import com.jogamp.common.util.VersionNumber;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GL2ES1;
@@ -1237,38 +1238,56 @@ public class PJOGL extends PGL {
return ((Font) font).deriveFont(size);
}
@Override
protected int getGLSLVersion() {
VersionNumber vn = context.getGLSLVersionNumber();
return vn.getMajor() * 100 + vn.getMinor();
}
@Override
protected String[] loadVertexShader(String filename, int version) {
if (PApplet.platform == PConstants.MACOSX) {
String[] fragSrc0 = pg.parent.loadStrings(filename);
return preprocessFragmentSource(fragSrc0, 130);
} else {
return pg.parent.loadStrings(filename);
}
protected String[] loadVertexShader(String filename) {
return loadVertexShader(filename, getGLSLVersion());
}
@Override
protected String[] loadFragmentShader(String filename) {
return loadFragmentShader(filename, getGLSLVersion());
}
@Override
protected String[] loadVertexShader(URL url) {
return loadVertexShader(url, getGLSLVersion());
}
@Override
protected String[] loadFragmentShader(URL url) {
return loadFragmentShader(url, getGLSLVersion());
}
@Override
protected String[] loadFragmentShader(String filename, int version) {
if (PApplet.platform == PConstants.MACOSX) {
String[] vertSrc0 = pg.parent.loadStrings(filename);
return preprocessVertexSource(vertSrc0, 130);
} else {
return pg.parent.loadStrings(filename);
}
String[] fragSrc0 = pg.parent.loadStrings(filename);
return preprocessFragmentSource(fragSrc0, version);
}
@Override
protected String[] loadVertexShader(String filename, int version) {
String[] vertSrc0 = pg.parent.loadStrings(filename);
return preprocessVertexSource(vertSrc0, version);
}
@Override
protected String[] loadFragmentShader(URL url, int version) {
try {
if (PApplet.platform == PConstants.MACOSX) {
String[] fragSrc0 = PApplet.loadStrings(url.openStream());
return preprocessFragmentSource(fragSrc0, 130);
} else {
return PApplet.loadStrings(url.openStream());
}
String[] fragSrc0 = PApplet.loadStrings(url.openStream());
return preprocessFragmentSource(fragSrc0, version);
} catch (IOException e) {
PGraphics.showException("Cannot load fragment shader " + url.getFile());
}
@@ -1279,12 +1298,8 @@ public class PJOGL extends PGL {
@Override
protected String[] loadVertexShader(URL url, int version) {
try {
if (PApplet.platform == PConstants.MACOSX) {
String[] vertSrc0 = PApplet.loadStrings(url.openStream());
return preprocessVertexSource(vertSrc0, 130);
} else {
return PApplet.loadStrings(url.openStream());
}
String[] vertSrc0 = PApplet.loadStrings(url.openStream());
return preprocessVertexSource(vertSrc0, version);
} catch (IOException e) {
PGraphics.showException("Cannot load vertex shader " + url.getFile());
}
+3 -3
View File
@@ -325,7 +325,7 @@ public class PShader implements PConstants {
public void setVertexShader(String vertFilename) {
this.vertexFilename = vertFilename;
vertexShaderSource = pgl.loadFragmentShader(vertFilename);
vertexShaderSource = pgl.loadVertexShader(vertFilename);
}
@@ -342,13 +342,13 @@ public class PShader implements PConstants {
public void setFragmentShader(String fragFilename) {
this.fragmentFilename = fragFilename;
fragmentShaderSource = pgl.loadVertexShader(fragFilename);
fragmentShaderSource = pgl.loadFragmentShader(fragFilename);
}
public void setFragmentShader(URL fragURL) {
this.fragmentURL = fragURL;
fragmentShaderSource = pgl.loadVertexShader(fragURL);
fragmentShaderSource = pgl.loadFragmentShader(fragURL);
}
public void setFragmentShader(String[] fragSource) {
+1 -5
View File
@@ -195,11 +195,7 @@ public class PSurfaceJOGL implements PSurface {
if (profile == null) {
if (PJOGL.profile == 2) {
try {
if (PApplet.platform == PConstants.MACOSX) {
profile = GLProfile.getMaxProgrammableCore(true);
} else {
profile = GLProfile.getGL2ES2();
}
profile = GLProfile.getGL2ES2();
} catch (GLException ex) {
profile = GLProfile.getMaxProgrammable(true);
}