Avoid glTexParameter calls if not neccessary by storing last texture state in the Image object
This commit is contained in:
parent
2fb87f9682
commit
1e8b5ef338
@ -1799,11 +1799,17 @@ public class GLRenderer implements Renderer {
|
||||
}
|
||||
|
||||
// filter things
|
||||
int minFilter = convertMinFilter(tex.getMinFilter(), haveMips);
|
||||
int magFilter = convertMagFilter(tex.getMagFilter());
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, minFilter);
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, magFilter);
|
||||
|
||||
if (image.getLastTextureState().magFilter != tex.getMagFilter()) {
|
||||
int magFilter = convertMagFilter(tex.getMagFilter());
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_MAG_FILTER, magFilter);
|
||||
image.getLastTextureState().magFilter = tex.getMagFilter();
|
||||
}
|
||||
if (image.getLastTextureState().minFilter != tex.getMinFilter()) {
|
||||
int minFilter = convertMinFilter(tex.getMinFilter(), haveMips);
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_MIN_FILTER, minFilter);
|
||||
image.getLastTextureState().minFilter = tex.getMinFilter();
|
||||
}
|
||||
|
||||
if (tex.getAnisotropicFilter() > 1) {
|
||||
if (caps.contains(Caps.TextureFilterAnisotropic)) {
|
||||
gl.glTexParameterf(target,
|
||||
@ -1820,16 +1826,21 @@ public class GLRenderer implements Renderer {
|
||||
switch (tex.getType()) {
|
||||
case ThreeDimensional:
|
||||
case CubeMap: // cubemaps use 3D coords
|
||||
if (gl2 != null) {
|
||||
if (gl2 != null && image.getLastTextureState().rWrap != tex.getWrap(WrapAxis.R)) {
|
||||
gl2.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_R, convertWrapMode(tex.getWrap(WrapAxis.R)));
|
||||
image.getLastTextureState().rWrap = tex.getWrap(WrapAxis.R);
|
||||
}
|
||||
//There is no break statement on purpose here
|
||||
case TwoDimensional:
|
||||
case TwoDimensionalArray:
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T)));
|
||||
// fall down here is intentional..
|
||||
// case OneDimensional:
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S)));
|
||||
if (image.getLastTextureState().tWrap != tex.getWrap(WrapAxis.T)) {
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_T, convertWrapMode(tex.getWrap(WrapAxis.T)));
|
||||
image.getLastTextureState().tWrap = tex.getWrap(WrapAxis.T);
|
||||
}
|
||||
if (image.getLastTextureState().sWrap != tex.getWrap(WrapAxis.S)) {
|
||||
gl.glTexParameteri(target, GL.GL_TEXTURE_WRAP_S, convertWrapMode(tex.getWrap(WrapAxis.S)));
|
||||
image.getLastTextureState().sWrap = tex.getWrap(WrapAxis.S);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new UnsupportedOperationException("Unknown texture type: " + tex.getType());
|
||||
|
@ -40,6 +40,7 @@ import com.jme3.math.FastMath;
|
||||
import com.jme3.renderer.Caps;
|
||||
import com.jme3.renderer.Renderer;
|
||||
import com.jme3.texture.image.ColorSpace;
|
||||
import com.jme3.texture.image.LastTextureState;
|
||||
import com.jme3.util.BufferUtils;
|
||||
import com.jme3.util.NativeObject;
|
||||
import java.io.IOException;
|
||||
@ -374,7 +375,19 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ {
|
||||
// attributes relating to GL object
|
||||
protected boolean mipsWereGenerated = false;
|
||||
protected boolean needGeneratedMips = false;
|
||||
protected final LastTextureState lastTextureState = new LastTextureState();
|
||||
|
||||
/**
|
||||
* Internal use only.
|
||||
* The renderer stores the texture state set from the last texture
|
||||
* so it doesn't have to change it unless necessary.
|
||||
*
|
||||
* @return The image parameter state.
|
||||
*/
|
||||
public LastTextureState getLastTextureState() {
|
||||
return lastTextureState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal use only.
|
||||
* The renderer marks which images have generated mipmaps in VRAM
|
||||
@ -429,6 +442,7 @@ public class Image extends NativeObject implements Savable /*, Cloneable*/ {
|
||||
public void resetObject() {
|
||||
this.id = -1;
|
||||
this.mipsWereGenerated = false;
|
||||
this.lastTextureState.reset();
|
||||
setUpdateNeeded();
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (c) 2009-2015 jMonkeyEngine
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
package com.jme3.texture.image;
|
||||
|
||||
import com.jme3.renderer.Renderer;
|
||||
import com.jme3.texture.Texture;
|
||||
|
||||
/**
|
||||
* Stores / caches texture state parameters so they don't have to be set
|
||||
* each time by the {@link Renderer}.
|
||||
*
|
||||
* @author Kirill Vainer
|
||||
*/
|
||||
public final class LastTextureState {
|
||||
|
||||
public Texture.WrapMode sWrap, tWrap, rWrap;
|
||||
public Texture.MagFilter magFilter;
|
||||
public Texture.MinFilter minFilter;
|
||||
|
||||
public LastTextureState() {
|
||||
// All parameters initialized to null (meaning unset).
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
sWrap = null;
|
||||
tWrap = null;
|
||||
rWrap = null;
|
||||
magFilter = null;
|
||||
minFilter = null;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user