GLRenderer: avoid useless glActiveTexture calls

experimental
Kirill Vainer 10 years ago
parent f80364a8c2
commit 8fdc0f9c90
  1. 59
      jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java
  2. 2
      jme3-core/src/main/java/com/jme3/texture/image/LastTextureState.java

@ -1432,7 +1432,7 @@ public class GLRenderer implements Renderer {
// NOTE: For depth textures, sets nearest/no-mips mode // NOTE: For depth textures, sets nearest/no-mips mode
// Required to fix "framebuffer unsupported" // Required to fix "framebuffer unsupported"
// for old NVIDIA drivers! // for old NVIDIA drivers!
setupTextureParams(tex); setupTextureParams(0, tex);
} }
glfbo.glFramebufferTexture2DEXT(GLFbo.GL_FRAMEBUFFER_EXT, glfbo.glFramebufferTexture2DEXT(GLFbo.GL_FRAMEBUFFER_EXT,
@ -1816,7 +1816,7 @@ public class GLRenderer implements Renderer {
} }
@SuppressWarnings("fallthrough") @SuppressWarnings("fallthrough")
private void setupTextureParams(Texture tex) { private void setupTextureParams(int unit, Texture tex) {
Image image = tex.getImage(); Image image = tex.getImage();
int target = convertTextureType(tex.getType(), image != null ? image.getMultiSamples() : 1, -1); int target = convertTextureType(tex.getType(), image != null ? image.getMultiSamples() : 1, -1);
@ -1829,20 +1829,23 @@ public class GLRenderer implements Renderer {
// filter things // filter things
if (image.getLastTextureState().magFilter != tex.getMagFilter()) { if (image.getLastTextureState().magFilter != tex.getMagFilter()) {
int magFilter = convertMagFilter(tex.getMagFilter()); int magFilter = convertMagFilter(tex.getMagFilter());
bindTextureAndUnit(target, image, unit);
gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, magFilter); gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, magFilter);
image.getLastTextureState().magFilter = tex.getMagFilter(); image.getLastTextureState().magFilter = tex.getMagFilter();
} }
if (image.getLastTextureState().minFilter != tex.getMinFilter()) { if (image.getLastTextureState().minFilter != tex.getMinFilter()) {
int minFilter = convertMinFilter(tex.getMinFilter(), haveMips); int minFilter = convertMinFilter(tex.getMinFilter(), haveMips);
bindTextureAndUnit(target, image, unit);
gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, minFilter); gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, minFilter);
image.getLastTextureState().minFilter = tex.getMinFilter(); image.getLastTextureState().minFilter = tex.getMinFilter();
} }
if (tex.getAnisotropicFilter() > 1) { if (caps.contains(Caps.TextureFilterAnisotropic)
if (caps.contains(Caps.TextureFilterAnisotropic)) { && image.getLastTextureState().anisoFilter != tex.getAnisotropicFilter()) {
gl.glTexParameterf(target, bindTextureAndUnit(target, image, unit);
GLExt.GL_TEXTURE_MAX_ANISOTROPY_EXT, gl.glTexParameterf(target,
tex.getAnisotropicFilter()); GLExt.GL_TEXTURE_MAX_ANISOTROPY_EXT,
} tex.getAnisotropicFilter());
image.getLastTextureState().anisoFilter = tex.getAnisotropicFilter();
} }
// repeat modes // repeat modes
@ -1850,6 +1853,7 @@ public class GLRenderer implements Renderer {
case ThreeDimensional: case ThreeDimensional:
case CubeMap: // cubemaps use 3D coords case CubeMap: // cubemaps use 3D coords
if (gl2 != null && image.getLastTextureState().rWrap != tex.getWrap(WrapAxis.R)) { if (gl2 != null && image.getLastTextureState().rWrap != tex.getWrap(WrapAxis.R)) {
bindTextureAndUnit(target, image, unit);
gl2.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R))); gl2.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R)));
image.getLastTextureState().rWrap = tex.getWrap(WrapAxis.R); image.getLastTextureState().rWrap = tex.getWrap(WrapAxis.R);
} }
@ -1857,10 +1861,12 @@ public class GLRenderer implements Renderer {
case TwoDimensional: case TwoDimensional:
case TwoDimensionalArray: case TwoDimensionalArray:
if (image.getLastTextureState().tWrap != tex.getWrap(WrapAxis.T)) { if (image.getLastTextureState().tWrap != tex.getWrap(WrapAxis.T)) {
bindTextureAndUnit(target, image, unit);
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T))); gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T)));
image.getLastTextureState().tWrap = tex.getWrap(WrapAxis.T); image.getLastTextureState().tWrap = tex.getWrap(WrapAxis.T);
} }
if (image.getLastTextureState().sWrap != tex.getWrap(WrapAxis.S)) { if (image.getLastTextureState().sWrap != tex.getWrap(WrapAxis.S)) {
bindTextureAndUnit(target, image, unit);
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S))); gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S)));
image.getLastTextureState().sWrap = tex.getWrap(WrapAxis.S); image.getLastTextureState().sWrap = tex.getWrap(WrapAxis.S);
} }
@ -1869,9 +1875,10 @@ public class GLRenderer implements Renderer {
throw new UnsupportedOperationException("Unknown texture type: " + tex.getType()); throw new UnsupportedOperationException("Unknown texture type: " + tex.getType());
} }
if(tex.isNeedCompareModeUpdate() && gl2 != null){ if (tex.isNeedCompareModeUpdate() && gl2 != null) {
// R to Texture compare mode // R to Texture compare mode
if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) { if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) {
bindTextureAndUnit(target, image, unit);
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_R_TO_TEXTURE); gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_R_TO_TEXTURE);
gl2.glTexParameteri(target, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY); gl2.glTexParameteri(target, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY);
if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) { if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) {
@ -1879,12 +1886,16 @@ public class GLRenderer implements Renderer {
} else { } else {
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL); gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL);
} }
}else{ } else {
bindTextureAndUnit(target, image, unit);
//restoring default value //restoring default value
gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL.GL_NONE); gl2.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL.GL_NONE);
} }
tex.compareModeUpdated(); tex.compareModeUpdated();
} }
// If at this point we didn't bind the texture, bind it now
bindTextureOnly(target, image, unit);
} }
/** /**
@ -1964,6 +1975,28 @@ public class GLRenderer implements Renderer {
} }
} }
/**
* Ensures that the texture is bound to the given unit,
* but does not care if the unit is active (for rendering).
*
* @param target The texture target, one of GL_TEXTURE_***
* @param img The image texture to bind
* @param unit At what unit to bind the texture.
*/
private void bindTextureOnly(int target, Image img, int unit) {
if (context.boundTextures[unit] != img) {
if (context.boundTextureUnit != unit) {
gl.glActiveTexture(GL.GL_TEXTURE0 + unit);
context.boundTextureUnit = unit;
}
gl.glBindTexture(target, img.getId());
context.boundTextures[unit] = img;
statistics.onTextureUse(img, true);
} else {
statistics.onTextureUse(img, false);
}
}
/** /**
* Uploads the given image to the GL driver. * Uploads the given image to the GL driver.
* *
@ -1985,7 +2018,7 @@ public class GLRenderer implements Renderer {
statistics.onNewTexture(); statistics.onNewTexture();
} }
// bind texture // bind texture
int target = convertTextureType(type, img.getMultiSamples(), -1); int target = convertTextureType(type, img.getMultiSamples(), -1);
bindTextureAndUnit(target, img, unit); bindTextureAndUnit(target, img, unit);
@ -2123,9 +2156,7 @@ public class GLRenderer implements Renderer {
int texId = image.getId(); int texId = image.getId();
assert texId != -1; assert texId != -1;
int target = convertTextureType(tex.getType(), image.getMultiSamples(), -1); setupTextureParams(unit, tex);
bindTextureAndUnit(target, image, unit);
setupTextureParams(tex);
} }
public void modifyTexture(Texture tex, Image pixels, int x, int y) { public void modifyTexture(Texture tex, Image pixels, int x, int y) {

@ -45,6 +45,7 @@ public final class LastTextureState {
public Texture.WrapMode sWrap, tWrap, rWrap; public Texture.WrapMode sWrap, tWrap, rWrap;
public Texture.MagFilter magFilter; public Texture.MagFilter magFilter;
public Texture.MinFilter minFilter; public Texture.MinFilter minFilter;
public int anisoFilter = 0;
public LastTextureState() { public LastTextureState() {
// All parameters initialized to null (meaning unset). // All parameters initialized to null (meaning unset).
@ -56,5 +57,6 @@ public final class LastTextureState {
rWrap = null; rWrap = null;
magFilter = null; magFilter = null;
minFilter = null; minFilter = null;
anisoFilter = 0;
} }
} }

Loading…
Cancel
Save