commit
f64eb5ff09
@ -0,0 +1,573 @@ |
||||
/* |
||||
* 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.renderer.ios; |
||||
|
||||
import com.jme3.renderer.RendererException; |
||||
import com.jme3.renderer.opengl.GL; |
||||
import com.jme3.renderer.opengl.GLExt; |
||||
import java.nio.Buffer; |
||||
import java.nio.BufferOverflowException; |
||||
import java.nio.ByteBuffer; |
||||
import java.nio.FloatBuffer; |
||||
import java.nio.IntBuffer; |
||||
import java.nio.ShortBuffer; |
||||
|
||||
/** |
||||
* Implements OpenGL ES 2.0 for iOS. |
||||
* |
||||
* @author Kirill Vainer |
||||
*/ |
||||
public class IosGL implements GL, GLExt { |
||||
|
||||
private final int[] temp_array = new int[16]; |
||||
|
||||
private static int getLimitBytes(ByteBuffer buffer) { |
||||
checkLimit(buffer); |
||||
return buffer.limit(); |
||||
} |
||||
|
||||
private static int getLimitBytes(ShortBuffer buffer) { |
||||
checkLimit(buffer); |
||||
return buffer.limit() * 2; |
||||
} |
||||
|
||||
private static int getLimitBytes(IntBuffer buffer) { |
||||
checkLimit(buffer); |
||||
return buffer.limit() * 4; |
||||
} |
||||
|
||||
private static int getLimitBytes(FloatBuffer buffer) { |
||||
checkLimit(buffer); |
||||
return buffer.limit() * 4; |
||||
} |
||||
|
||||
private static int getLimitCount(Buffer buffer, int elementSize) { |
||||
checkLimit(buffer); |
||||
return buffer.limit() / elementSize; |
||||
} |
||||
|
||||
private int toArray(IntBuffer buffer) { |
||||
int remain = buffer.remaining(); |
||||
if (buffer.remaining() > 16) { |
||||
throw new ArrayIndexOutOfBoundsException(); |
||||
} |
||||
int pos = buffer.position(); |
||||
buffer.get(temp_array, 0, remain); |
||||
buffer.position(pos); |
||||
return remain; |
||||
} |
||||
|
||||
private void fromArray(int n, int[] array, IntBuffer buffer) { |
||||
if (buffer.remaining() < n) { |
||||
throw new BufferOverflowException(); |
||||
} |
||||
buffer.put(array, 0, n); |
||||
} |
||||
|
||||
private static void checkLimit(Buffer buffer) { |
||||
if (buffer == null) { |
||||
return; |
||||
} |
||||
if (buffer.limit() == 0) { |
||||
throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error"); |
||||
} |
||||
if (buffer.remaining() == 0) { |
||||
throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error"); |
||||
} |
||||
} |
||||
|
||||
public void glActiveTexture(int texture) { |
||||
JmeIosGLES.glActiveTexture(texture); |
||||
} |
||||
|
||||
public void glAttachShader(int program, int shader) { |
||||
JmeIosGLES.glAttachShader(program, shader); |
||||
} |
||||
|
||||
public void glBindBuffer(int target, int buffer) { |
||||
JmeIosGLES.glBindBuffer(target, buffer); |
||||
} |
||||
|
||||
public void glBindTexture(int target, int texture) { |
||||
JmeIosGLES.glBindTexture(target, texture); |
||||
} |
||||
|
||||
public void glBlendFunc(int sfactor, int dfactor) { |
||||
JmeIosGLES.glBlendFunc(sfactor, dfactor); |
||||
} |
||||
|
||||
public void glBufferData(int target, FloatBuffer data, int usage) { |
||||
JmeIosGLES.glBufferData(target, getLimitBytes(data), data, usage); |
||||
} |
||||
|
||||
public void glBufferData(int target, ShortBuffer data, int usage) { |
||||
JmeIosGLES.glBufferData(target, getLimitBytes(data), data, usage); |
||||
} |
||||
|
||||
public void glBufferData(int target, ByteBuffer data, int usage) { |
||||
JmeIosGLES.glBufferData(target, getLimitBytes(data), data, usage); |
||||
} |
||||
|
||||
public void glBufferData(int target, long data_size, int usage) { |
||||
JmeIosGLES.glBufferData(target, (int) data_size, null, usage); |
||||
} |
||||
|
||||
public void glBufferSubData(int target, long offset, FloatBuffer data) { |
||||
JmeIosGLES.glBufferSubData(target, (int) offset, getLimitBytes(data), data); |
||||
} |
||||
|
||||
public void glBufferSubData(int target, long offset, ShortBuffer data) { |
||||
JmeIosGLES.glBufferSubData(target, (int) offset, getLimitBytes(data), data); |
||||
} |
||||
|
||||
public void glBufferSubData(int target, long offset, ByteBuffer data) { |
||||
JmeIosGLES.glBufferSubData(target, (int) offset, getLimitBytes(data), data); |
||||
} |
||||
|
||||
public void glGetBufferSubData(int target, long offset, ByteBuffer data) { |
||||
throw new UnsupportedOperationException("OpenGL ES 2 does not support glGetBufferSubData"); |
||||
} |
||||
|
||||
public void glClear(int mask) { |
||||
JmeIosGLES.glClear(mask); |
||||
} |
||||
|
||||
public void glClearColor(float red, float green, float blue, float alpha) { |
||||
JmeIosGLES.glClearColor(red, green, blue, alpha); |
||||
} |
||||
|
||||
public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { |
||||
JmeIosGLES.glColorMask(red, green, blue, alpha); |
||||
} |
||||
|
||||
public void glCompileShader(int shader) { |
||||
JmeIosGLES.glCompileShader(shader); |
||||
} |
||||
|
||||
public void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ByteBuffer data) { |
||||
JmeIosGLES.glCompressedTexImage2D(target, level, internalformat, width, height, 0, getLimitBytes(data), data); |
||||
} |
||||
|
||||
public void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data) { |
||||
JmeIosGLES.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, getLimitBytes(data), data); |
||||
} |
||||
|
||||
public int glCreateProgram() { |
||||
return JmeIosGLES.glCreateProgram(); |
||||
} |
||||
|
||||
public int glCreateShader(int shaderType) { |
||||
return JmeIosGLES.glCreateShader(shaderType); |
||||
} |
||||
|
||||
public void glCullFace(int mode) { |
||||
JmeIosGLES.glCullFace(mode); |
||||
} |
||||
|
||||
public void glDeleteBuffers(IntBuffer buffers) { |
||||
checkLimit(buffers); |
||||
int n = toArray(buffers); |
||||
JmeIosGLES.glDeleteBuffers(n, temp_array, 0); |
||||
} |
||||
|
||||
public void glDeleteProgram(int program) { |
||||
JmeIosGLES.glDeleteProgram(program); |
||||
} |
||||
|
||||
public void glDeleteShader(int shader) { |
||||
JmeIosGLES.glDeleteShader(shader); |
||||
} |
||||
|
||||
public void glDeleteTextures(IntBuffer textures) { |
||||
checkLimit(textures); |
||||
int n = toArray(textures); |
||||
JmeIosGLES.glDeleteTextures(n, temp_array, 0); |
||||
} |
||||
|
||||
public void glDepthFunc(int func) { |
||||
JmeIosGLES.glDepthFunc(func); |
||||
} |
||||
|
||||
public void glDepthMask(boolean flag) { |
||||
JmeIosGLES.glDepthMask(flag); |
||||
} |
||||
|
||||
public void glDepthRange(double nearVal, double farVal) { |
||||
JmeIosGLES.glDepthRangef((float)nearVal, (float)farVal); |
||||
} |
||||
|
||||
public void glDetachShader(int program, int shader) { |
||||
JmeIosGLES.glDetachShader(program, shader); |
||||
} |
||||
|
||||
public void glDisable(int cap) { |
||||
JmeIosGLES.glDisable(cap); |
||||
} |
||||
|
||||
public void glDisableVertexAttribArray(int index) { |
||||
JmeIosGLES.glDisableVertexAttribArray(index); |
||||
} |
||||
|
||||
public void glDrawArrays(int mode, int first, int count) { |
||||
JmeIosGLES.glDrawArrays(mode, first, count); |
||||
} |
||||
|
||||
public void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices) { |
||||
JmeIosGLES.glDrawElementsIndex(mode, count, type, (int)indices); |
||||
} |
||||
|
||||
public void glEnable(int cap) { |
||||
JmeIosGLES.glEnable(cap); |
||||
} |
||||
|
||||
public void glEnableVertexAttribArray(int index) { |
||||
JmeIosGLES.glEnableVertexAttribArray(index); |
||||
} |
||||
|
||||
public void glGenBuffers(IntBuffer buffers) { |
||||
checkLimit(buffers); |
||||
JmeIosGLES.glGenBuffers(buffers.remaining(), temp_array, 0); |
||||
fromArray(buffers.remaining(), temp_array, buffers); |
||||
} |
||||
|
||||
public void glGenTextures(IntBuffer textures) { |
||||
checkLimit(textures); |
||||
JmeIosGLES.glGenTextures(textures.remaining(), temp_array, 0); |
||||
fromArray(textures.remaining(), temp_array, textures); |
||||
} |
||||
|
||||
public int glGetAttribLocation(int program, String name) { |
||||
return JmeIosGLES.glGetAttribLocation(program, name); |
||||
} |
||||
|
||||
public void glGetBoolean(int pname, ByteBuffer params) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glGetBoolean(pname, params);
|
||||
throw new UnsupportedOperationException("Today is not a good day for this"); |
||||
} |
||||
|
||||
public int glGetError() { |
||||
return JmeIosGLES.glGetError(); |
||||
} |
||||
|
||||
public void glGetInteger(int pname, IntBuffer params) { |
||||
checkLimit(params); |
||||
JmeIosGLES.glGetIntegerv(pname, temp_array, 0); |
||||
fromArray(params.remaining(), temp_array, params); |
||||
} |
||||
|
||||
public void glGetProgram(int program, int pname, IntBuffer params) { |
||||
checkLimit(params); |
||||
JmeIosGLES.glGetProgramiv(program, pname, temp_array, 0); |
||||
fromArray(params.remaining(), temp_array, params); |
||||
} |
||||
|
||||
public String glGetProgramInfoLog(int program, int maxLength) { |
||||
return JmeIosGLES.glGetProgramInfoLog(program); |
||||
} |
||||
|
||||
public void glGetShader(int shader, int pname, IntBuffer params) { |
||||
checkLimit(params); |
||||
JmeIosGLES.glGetShaderiv(shader, pname, temp_array, 0); |
||||
fromArray(params.remaining(), temp_array, params); |
||||
} |
||||
|
||||
public String glGetShaderInfoLog(int shader, int maxLength) { |
||||
return JmeIosGLES.glGetShaderInfoLog(shader); |
||||
} |
||||
|
||||
public String glGetString(int name) { |
||||
return JmeIosGLES.glGetString(name); |
||||
} |
||||
|
||||
public int glGetUniformLocation(int program, String name) { |
||||
return JmeIosGLES.glGetUniformLocation(program, name); |
||||
} |
||||
|
||||
public boolean glIsEnabled(int cap) { |
||||
// TODO: fix me!!!
|
||||
if (cap == GLExt.GL_MULTISAMPLE_ARB) { |
||||
return true; |
||||
} else { |
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
} |
||||
|
||||
public void glLineWidth(float width) { |
||||
JmeIosGLES.glLineWidth(width); |
||||
} |
||||
|
||||
public void glLinkProgram(int program) { |
||||
JmeIosGLES.glLinkProgram(program); |
||||
} |
||||
|
||||
public void glPixelStorei(int pname, int param) { |
||||
JmeIosGLES.glPixelStorei(pname, param); |
||||
} |
||||
|
||||
public void glPolygonOffset(float factor, float units) { |
||||
JmeIosGLES.glPolygonOffset(factor, units); |
||||
} |
||||
|
||||
public void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer data) { |
||||
JmeIosGLES.glReadPixels(x, y, width, height, format, type, data); |
||||
} |
||||
|
||||
public void glScissor(int x, int y, int width, int height) { |
||||
JmeIosGLES.glScissor(x, y, width, height); |
||||
} |
||||
|
||||
public void glShaderSource(int shader, String[] string, IntBuffer length) { |
||||
if (string.length != 1) { |
||||
throw new UnsupportedOperationException("Today is not a good day"); |
||||
} |
||||
JmeIosGLES.glShaderSource(shader, string[0]); |
||||
} |
||||
|
||||
public void glStencilFuncSeparate(int face, int func, int ref, int mask) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glStencilFuncSeparate(face, func, ref, mask);
|
||||
} |
||||
|
||||
public void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glStencilOpSeparate(face, sfail, dpfail, dppass);
|
||||
} |
||||
|
||||
public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, ByteBuffer data) { |
||||
JmeIosGLES.glTexImage2D(target, level, format, width, height, 0, format, type, data); |
||||
} |
||||
|
||||
public void glTexParameterf(int target, int pname, float param) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glTexParameterf(target, pname, param);
|
||||
} |
||||
|
||||
public void glTexParameteri(int target, int pname, int param) { |
||||
JmeIosGLES.glTexParameteri(target, pname, param); |
||||
} |
||||
|
||||
public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer data) { |
||||
JmeIosGLES.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data); |
||||
} |
||||
|
||||
public void glUniform1(int location, FloatBuffer value) { |
||||
JmeIosGLES.glUniform1fv(location, getLimitCount(value, 1), value); |
||||
} |
||||
|
||||
public void glUniform1(int location, IntBuffer value) { |
||||
JmeIosGLES.glUniform1iv(location, getLimitCount(value, 1), value); |
||||
} |
||||
|
||||
public void glUniform1f(int location, float v0) { |
||||
JmeIosGLES.glUniform1f(location, v0); |
||||
} |
||||
|
||||
public void glUniform1i(int location, int v0) { |
||||
JmeIosGLES.glUniform1i(location, v0); |
||||
} |
||||
|
||||
public void glUniform2(int location, IntBuffer value) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glUniform2iv(location, getLimitCount(value, 2), value);
|
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
|
||||
public void glUniform2(int location, FloatBuffer value) { |
||||
JmeIosGLES.glUniform2fv(location, getLimitCount(value, 2), value); |
||||
} |
||||
|
||||
public void glUniform2f(int location, float v0, float v1) { |
||||
JmeIosGLES.glUniform2f(location, v0, v1); |
||||
} |
||||
|
||||
public void glUniform3(int location, IntBuffer value) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glUniform3iv(location, getLimitCount(value, 3), value);
|
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
|
||||
public void glUniform3(int location, FloatBuffer value) { |
||||
JmeIosGLES.glUniform3fv(location, getLimitCount(value, 3), value); |
||||
} |
||||
|
||||
public void glUniform3f(int location, float v0, float v1, float v2) { |
||||
JmeIosGLES.glUniform3f(location, v0, v1, v2); |
||||
} |
||||
|
||||
public void glUniform4(int location, FloatBuffer value) { |
||||
JmeIosGLES.glUniform4fv(location, getLimitCount(value, 4), value); |
||||
} |
||||
|
||||
public void glUniform4(int location, IntBuffer value) { |
||||
// TODO: fix me!!!
|
||||
// JmeIosGLES.glUniform4iv(location, getLimitCount(value, 4), value);
|
||||
throw new UnsupportedOperationException(); |
||||
} |
||||
|
||||
public void glUniform4f(int location, float v0, float v1, float v2, float v3) { |
||||
JmeIosGLES.glUniform4f(location, v0, v1, v2, v3); |
||||
} |
||||
|
||||
public void glUniformMatrix3(int location, boolean transpose, FloatBuffer value) { |
||||
JmeIosGLES.glUniformMatrix3fv(location, getLimitCount(value, 3 * 3), transpose, value); |
||||
} |
||||
|
||||
public void glUniformMatrix4(int location, boolean transpose, FloatBuffer value) { |
||||
JmeIosGLES.glUniformMatrix4fv(location, getLimitCount(value, 4 * 4), transpose, value); |
||||
} |
||||
|
||||
public void glUseProgram(int program) { |
||||
JmeIosGLES.glUseProgram(program); |
||||
} |
||||
|
||||
public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) { |
||||
JmeIosGLES.glVertexAttribPointer2(index, size, type, normalized, stride, (int)pointer); |
||||
} |
||||
|
||||
public void glViewport(int x, int y, int width, int height) { |
||||
JmeIosGLES.glViewport(x, y, width, height); |
||||
} |
||||
|
||||
public void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { |
||||
throw new UnsupportedOperationException("FBO blit not available on iOS"); |
||||
} |
||||
|
||||
public void glBufferData(int target, IntBuffer data, int usage) { |
||||
JmeIosGLES.glBufferData(target, getLimitBytes(data), data, usage); |
||||
} |
||||
|
||||
public void glBufferSubData(int target, long offset, IntBuffer data) { |
||||
JmeIosGLES.glBufferSubData(target, (int)offset, getLimitBytes(data), data); |
||||
} |
||||
|
||||
public void glDrawArraysInstancedARB(int mode, int first, int count, int primcount) { |
||||
throw new UnsupportedOperationException("Instancing not available on iOS"); |
||||
} |
||||
|
||||
public void glDrawBuffers(IntBuffer bufs) { |
||||
throw new UnsupportedOperationException("MRT not available on iOS"); |
||||
} |
||||
|
||||
public void glDrawElementsInstancedARB(int mode, int indices_count, int type, long indices_buffer_offset, int primcount) { |
||||
throw new UnsupportedOperationException("Instancing not available on iOS"); |
||||
} |
||||
|
||||
public void glGetMultisample(int pname, int index, FloatBuffer val) { |
||||
throw new UnsupportedOperationException("Multisample renderbuffers not available on iOS"); |
||||
} |
||||
|
||||
public void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height) { |
||||
throw new UnsupportedOperationException("Multisample renderbuffers not available on iOS"); |
||||
} |
||||
|
||||
public void glTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedsamplelocations) { |
||||
throw new UnsupportedOperationException("Multisample textures not available on iOS"); |
||||
} |
||||
|
||||
public void glVertexAttribDivisorARB(int index, int divisor) { |
||||
throw new UnsupportedOperationException("Instancing not available on iOS"); |
||||
} |
||||
|
||||
public void glBindFramebufferEXT(int param1, int param2) { |
||||
JmeIosGLES.glBindFramebuffer(param1, param2); |
||||
} |
||||
|
||||
public void glBindRenderbufferEXT(int param1, int param2) { |
||||
JmeIosGLES.glBindRenderbuffer(param1, param2); |
||||
} |
||||
|
||||
public int glCheckFramebufferStatusEXT(int param1) { |
||||
return JmeIosGLES.glCheckFramebufferStatus(param1); |
||||
} |
||||
|
||||
public void glDeleteFramebuffersEXT(IntBuffer param1) { |
||||
checkLimit(param1); |
||||
int n = toArray(param1); |
||||
JmeIosGLES.glDeleteFramebuffers(n, temp_array, 0); |
||||
} |
||||
|
||||
public void glDeleteRenderbuffersEXT(IntBuffer param1) { |
||||
checkLimit(param1); |
||||
int n = toArray(param1); |
||||
JmeIosGLES.glDeleteRenderbuffers(n, temp_array, 0); |
||||
} |
||||
|
||||
public void glFramebufferRenderbufferEXT(int param1, int param2, int param3, int param4) { |
||||
JmeIosGLES.glFramebufferRenderbuffer(param1, param2, param3, param4); |
||||
} |
||||
|
||||
public void glFramebufferTexture2DEXT(int param1, int param2, int param3, int param4, int param5) { |
||||
JmeIosGLES.glFramebufferTexture2D(param1, param2, param3, param4, param5); |
||||
} |
||||
|
||||
public void glGenFramebuffersEXT(IntBuffer param1) { |
||||
checkLimit(param1); |
||||
JmeIosGLES.glGenFramebuffers(param1.remaining(), temp_array, 0); |
||||
fromArray(param1.remaining(), temp_array, param1); |
||||
} |
||||
|
||||
public void glGenRenderbuffersEXT(IntBuffer param1) { |
||||
checkLimit(param1); |
||||
JmeIosGLES.glGenRenderbuffers(param1.remaining(), temp_array, 0); |
||||
fromArray(param1.remaining(), temp_array, param1); |
||||
} |
||||
|
||||
public void glGenerateMipmapEXT(int param1) { |
||||
JmeIosGLES.glGenerateMipmap(param1); |
||||
} |
||||
|
||||
public void glRenderbufferStorageEXT(int param1, int param2, int param3, int param4) { |
||||
JmeIosGLES.glRenderbufferStorage(param1, param2, param3, param4); |
||||
} |
||||
|
||||
@Override |
||||
public void glReadPixels(int x, int y, int width, int height, int format, int type, long offset) { |
||||
// TODO: no offset???
|
||||
JmeIosGLES.glReadPixels(x, y, width, height, format, type, null); |
||||
} |
||||
|
||||
@Override |
||||
public int glClientWaitSync(Object sync, int flags, long timeout) { |
||||
throw new UnsupportedOperationException("OpenGL ES 2 does not support sync fences"); |
||||
} |
||||
|
||||
@Override |
||||
public void glDeleteSync(Object sync) { |
||||
throw new UnsupportedOperationException("OpenGL ES 2 does not support sync fences"); |
||||
} |
||||
|
||||
@Override |
||||
public Object glFenceSync(int condition, int flags) { |
||||
throw new UnsupportedOperationException("OpenGL ES 2 does not support sync fences"); |
||||
} |
||||
} |
Loading…
Reference in new issue