Преглед изворни кода

* Add checks for maximum texture resolution in all renderers

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9980 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
Sha..rd пре 13 година
родитељ
комит
9e03dba566

+ 11 - 0
engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java

@@ -1494,6 +1494,17 @@ public class OGLESShaderRenderer implements Renderer {
             img.setMipmapsGenerated(true);
         }
 
+        if (target == GLES20.GL_TEXTURE_CUBE_MAP) {
+            // Check max texture size before upload
+            if (img.getWidth() > maxCubeTexSize || img.getHeight() > maxCubeTexSize) {
+                throw new RendererException("Cannot upload cubemap " + img + ". The maximum supported cubemap resolution is " + maxCubeTexSize);
+            }
+        } else {
+            if (img.getWidth() > maxTexSize || img.getHeight() > maxTexSize) {
+                throw new RendererException("Cannot upload texture " + img + ". The maximum supported texture resolution is " + maxTexSize);
+            }
+        }
+        
         if (target == GLES20.GL_TEXTURE_CUBE_MAP) {
             // Upload a cube map / sky box
             @SuppressWarnings("unchecked")

+ 7 - 0
engine/src/jogl/com/jme3/renderer/jogl/JoglGL1Renderer.java

@@ -41,6 +41,7 @@ import com.jme3.math.Vector3f;
 import com.jme3.renderer.Caps;
 import com.jme3.renderer.GL1Renderer;
 import com.jme3.renderer.RenderContext;
+import com.jme3.renderer.RendererException;
 import com.jme3.renderer.Statistics;
 import com.jme3.scene.Mesh;
 import com.jme3.scene.Mesh.Mode;
@@ -142,6 +143,8 @@ public class JoglGL1Renderer implements GL1Renderer {
         gl.glGetIntegerv(GL2.GL_MAX_LIGHTS, ib1);
         maxLights = ib1.get(0);
         
+        gl.glGetIntegerv(GL.GL_MAX_TEXTURE_SIZE, ib1);
+        maxTexSize = ib1.get(0);
     }
     
     public void invalidateState() {
@@ -805,6 +808,10 @@ public class JoglGL1Renderer implements GL1Renderer {
         } else {
         }
 
+        if (img.getWidth() > maxTexSize || img.getHeight() > maxTexSize) {
+            throw new RendererException("Cannot upload texture " + img + ". The maximum supported texture resolution is " + maxTexSize);
+        }
+        
         /*
         if (target == GL_TEXTURE_CUBE_MAP) {
         List<ByteBuffer> data = img.getData();

+ 12 - 1
engine/src/jogl/com/jme3/renderer/jogl/JoglRenderer.java

@@ -1903,7 +1903,18 @@ public class JoglRenderer implements Renderer {
                 throw new RendererException("Multisample textures not supported by graphics hardware");
             }
         }
-
+        
+        if (target == GL.GL_TEXTURE_CUBE_MAP) {
+            // Check max texture size before upload
+            if (img.getWidth() > maxCubeTexSize || img.getHeight() > maxCubeTexSize) {
+                throw new RendererException("Cannot upload cubemap " + img + ". The maximum supported cubemap resolution is " + maxCubeTexSize);
+            }
+        } else {
+            if (img.getWidth() > maxTexSize || img.getHeight() > maxTexSize) {
+                throw new RendererException("Cannot upload texture " + img + ". The maximum supported texture resolution is " + maxTexSize);
+            }
+        }
+        
         if (target == GL.GL_TEXTURE_CUBE_MAP) {
             List<ByteBuffer> data = img.getData();
             if (data.size() != 6) {

+ 6 - 1
engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglGL1Renderer.java

@@ -10,6 +10,7 @@ import com.jme3.math.Vector3f;
 import com.jme3.renderer.Caps;
 import com.jme3.renderer.GL1Renderer;
 import com.jme3.renderer.RenderContext;
+import com.jme3.renderer.RendererException;
 import com.jme3.renderer.Statistics;
 import com.jme3.scene.Mesh;
 import com.jme3.scene.Mesh.Mode;
@@ -111,7 +112,7 @@ public class LwjglGL1Renderer implements GL1Renderer {
         }
         
         maxLights = glGetInteger(GL_MAX_LIGHTS);
-        
+        maxTexSize = glGetInteger(GL_MAX_TEXTURE_SIZE);
     }
     
     public void invalidateState() {
@@ -761,6 +762,10 @@ public class LwjglGL1Renderer implements GL1Renderer {
         } else {
         }
 
+        if (img.getWidth() > maxTexSize || img.getHeight() > maxTexSize) {
+            throw new RendererException("Cannot upload texture " + img + ". The maximum supported texture resolution is " + maxTexSize);
+        }
+        
         /*
         if (target == GL_TEXTURE_CUBE_MAP) {
         List<ByteBuffer> data = img.getData();

+ 12 - 0
engine/src/lwjgl/com/jme3/renderer/lwjgl/LwjglRenderer.java

@@ -85,6 +85,7 @@ public class LwjglRenderer implements Renderer {
     private final StringBuilder stringBuf = new StringBuilder(250);
     private final IntBuffer intBuf1 = BufferUtils.createIntBuffer(1);
     private final IntBuffer intBuf16 = BufferUtils.createIntBuffer(16);
+    private final FloatBuffer floatBuf16 = BufferUtils.createFloatBuffer(16);
     private final RenderContext context = new RenderContext();
     private final NativeObjectManager objManager = new NativeObjectManager();
     private final EnumSet<Caps> caps = EnumSet.noneOf(Caps.class);
@@ -1851,6 +1852,17 @@ public class LwjglRenderer implements Renderer {
                 throw new RendererException("Multisample textures not supported by graphics hardware");
             }
         }
+        
+        if (target == GL_TEXTURE_CUBE_MAP) {
+            // Check max texture size before upload
+            if (img.getWidth() > maxCubeTexSize || img.getHeight() > maxCubeTexSize) {
+                throw new RendererException("Cannot upload cubemap " + img + ". The maximum supported cubemap resolution is " + maxCubeTexSize);
+            }
+        } else {
+            if (img.getWidth() > maxTexSize || img.getHeight() > maxTexSize) {
+                throw new RendererException("Cannot upload texture " + img + ". The maximum supported texture resolution is " + maxTexSize);
+            }
+        }
 
         if (target == GL_TEXTURE_CUBE_MAP) {
             List<ByteBuffer> data = img.getData();