diff --git a/src/openfl/_internal/stage3D/opengl/GLCubeTexture.hx b/src/openfl/_internal/stage3D/opengl/GLCubeTexture.hx index b27e9a55e2..cce273e5f2 100644 --- a/src/openfl/_internal/stage3D/opengl/GLCubeTexture.hx +++ b/src/openfl/_internal/stage3D/opengl/GLCubeTexture.hx @@ -34,16 +34,19 @@ class GLCubeTexture { var hasTexture = false; - reader.readTextures(function(side, level, gpuFormat, width, height, blockLength, bytes) { + reader.readTextures(function(side, level, gpuFormat, size, _, blockLength, bytes) { var format = GLTextureBase.__compressedTextureFormats.toTextureFormat(alpha, gpuFormat); if (format == 0) return; + if (size == 0) + return; + hasTexture = true; cubeTexture.__format = format; cubeTexture.__internalFormat = format; - gl.compressedTexImage2D(__sideToTarget(side), level, cubeTexture.__internalFormat, width, height, 0, bytes, 0, blockLength); + gl.compressedTexImage2D(__sideToTarget(side), level, cubeTexture.__internalFormat, size, size, 0, bytes, 0, blockLength); GLUtils.checkGLError(gl); cubeTexture.__uploadedSides |= 1 << side; @@ -72,6 +75,7 @@ class GLCubeTexture { return; var size = cubeTexture.__size >> miplevel; + if (size == 0) return; @@ -88,6 +92,9 @@ class GLCubeTexture { public static function uploadFromByteArray(cubeTexture:CubeTexture, renderSession:GLRenderSession, data:ByteArray, byteArrayOffset:UInt, side:UInt, miplevel:UInt = 0):Void { + if (data == null) + return; + #if js if (byteArrayOffset == 0) { uploadFromTypedArray(cubeTexture, renderSession, @:privateAccess (data : ByteArrayData).b, side, miplevel); @@ -100,12 +107,10 @@ class GLCubeTexture { public static function uploadFromTypedArray(cubeTexture:CubeTexture, renderSession:GLRenderSession, data:ArrayBufferView, side:UInt, miplevel:UInt = 0):Void { - if (data == null) - return; - var gl = renderSession.gl; var size = cubeTexture.__size >> miplevel; + if (size == 0) return; @@ -122,7 +127,7 @@ class GLCubeTexture { cubeTexture.__uploadedSides |= 1 << side; - // var memUsage = (__size * __size) * 4; + // var memUsage = (size * size) * 4; // __trackMemoryUsage (memUsage); } diff --git a/src/openfl/_internal/stage3D/opengl/GLIndexBuffer3D.hx b/src/openfl/_internal/stage3D/opengl/GLIndexBuffer3D.hx index e5a6d40f46..2603e28c2d 100644 --- a/src/openfl/_internal/stage3D/opengl/GLIndexBuffer3D.hx +++ b/src/openfl/_internal/stage3D/opengl/GLIndexBuffer3D.hx @@ -34,21 +34,22 @@ class GLIndexBuffer3D { gl.deleteBuffer(indexBuffer.__id); } - // __context.__statsDecrement(Context3D.Context3DTelemetry.COUNT_INDEX_BUFFER); - // __context.__statsSubtract(Context3D.Context3DTelemetry.MEM_INDEX_BUFFER, __memoryUsage); + // __context.__statsDecrement (Context3D.Context3DTelemetry.COUNT_INDEX_BUFFER); + // __context.__statsSubtract (Context3D.Context3DTelemetry.MEM_INDEX_BUFFER, __memoryUsage); // __memoryUsage = 0; } public static function uploadFromByteArray(indexBuffer:IndexBuffer3D, renderSession:GLRenderSession, data:ByteArray, byteArrayOffset:Int, startOffset:Int, count:Int):Void { + if (data == null) + return; + var offset = byteArrayOffset + startOffset * 2; - uploadFromTypedArray(indexBuffer, renderSession, new Int16Array(data.toArrayBuffer(), offset, count)); + uploadFromTypedArray(indexBuffer, renderSession, new Int16Array(data, offset, count)); } public static function uploadFromTypedArray(indexBuffer:IndexBuffer3D, renderSession:GLRenderSession, data:ArrayBufferView):Void { - if (data == null) - return; var gl = renderSession.gl; gl.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexBuffer.__id); @@ -66,15 +67,16 @@ class GLIndexBuffer3D { } public static function uploadFromVector(indexBuffer:IndexBuffer3D, renderSession:GLRenderSession, data:Vector, startOffset:Int, count:Int):Void { - // TODO: Optimize more - if (data == null) return; + var gl = renderSession.gl; + // TODO: Optimize more + var length = startOffset + count; - var existingInt16Array = indexBuffer.__tempInt16Array; + var existingInt16Array = indexBuffer.__tempInt16Array; if (indexBuffer.__tempInt16Array == null || indexBuffer.__tempInt16Array.length < count) { indexBuffer.__tempInt16Array = new Int16Array(count); diff --git a/src/openfl/_internal/stage3D/opengl/GLRectangleTexture.hx b/src/openfl/_internal/stage3D/opengl/GLRectangleTexture.hx index ea1faa80fa..b6ec09f4cc 100644 --- a/src/openfl/_internal/stage3D/opengl/GLRectangleTexture.hx +++ b/src/openfl/_internal/stage3D/opengl/GLRectangleTexture.hx @@ -16,8 +16,6 @@ import openfl.utils.ByteArray; @:access(openfl.display3D.Context3D) class GLRectangleTexture { public static function create(rectangleTexture:RectangleTexture, renderSession:GLRenderSession):Void { - var gl = renderSession.gl; - rectangleTexture.__textureTarget = GL.TEXTURE_2D; uploadFromTypedArray(rectangleTexture, renderSession, null); } @@ -26,15 +24,17 @@ class GLRectangleTexture { if (source == null) return; - var image = rectangleTexture.__getImage(source); - - if (image == null) - return; + var width = rectangleTexture.__width; + var height = rectangleTexture.__height; - GLTextureBase.uploadFromImage(renderSession.gl, rectangleTexture, image, 0, rectangleTexture.__width, rectangleTexture.__height); + var image = rectangleTexture.__getImage(source); + GLTextureBase.uploadFromImage(renderSession.gl, rectangleTexture, image, 0, width, height); } public static function uploadFromByteArray(rectangleTexture:RectangleTexture, renderSession:GLRenderSession, data:ByteArray, byteArrayOffset:UInt):Void { + if (data == null) + return; + #if js if (byteArrayOffset == 0) { uploadFromTypedArray(rectangleTexture, renderSession, @:privateAccess (data : ByteArrayData).b); @@ -46,25 +46,22 @@ class GLRectangleTexture { } public static function uploadFromTypedArray(rectangleTexture:RectangleTexture, renderSession:GLRenderSession, data:ArrayBufferView):Void { - // if (__format != Context3DTextureFormat.BGRA) { - // - // throw new IllegalOperationError (); - // - // } - var gl = renderSession.gl; + var width = rectangleTexture.__width; + var height = rectangleTexture.__height; + gl.bindTexture(rectangleTexture.__textureTarget, rectangleTexture.__textureData.glTexture); GLUtils.checkGLError(gl); - gl.texImage2D(rectangleTexture.__textureTarget, 0, rectangleTexture.__internalFormat, rectangleTexture.__width, rectangleTexture.__height, 0, - rectangleTexture.__format, GL.UNSIGNED_BYTE, data); + gl.texImage2D(rectangleTexture.__textureTarget, 0, rectangleTexture.__internalFormat, width, height, 0, rectangleTexture.__format, GL.UNSIGNED_BYTE, + data); GLUtils.checkGLError(gl); gl.bindTexture(rectangleTexture.__textureTarget, null); GLUtils.checkGLError(gl); - // var memUsage = (__width * __height) * 4; + // var memUsage = (width * height) * 4; // __trackMemoryUsage (memUsage); } diff --git a/src/openfl/_internal/stage3D/opengl/GLTexture.hx b/src/openfl/_internal/stage3D/opengl/GLTexture.hx index f56065e461..db78211644 100644 --- a/src/openfl/_internal/stage3D/opengl/GLTexture.hx +++ b/src/openfl/_internal/stage3D/opengl/GLTexture.hx @@ -17,18 +17,7 @@ import openfl.utils.ByteArray; @:access(openfl.display3D.Context3D) class GLTexture { public static function create(texture:Texture, renderSession:GLRenderSession):Void { - var gl = renderSession.gl; - texture.__textureTarget = GL.TEXTURE_2D; - - gl.bindTexture(texture.__textureTarget, texture.__textureData.glTexture); - GLUtils.checkGLError(gl); - - gl.texImage2D(texture.__textureTarget, 0, texture.__internalFormat, texture.__width, texture.__height, 0, texture.__format, GL.UNSIGNED_BYTE, null); - GLUtils.checkGLError(gl); - - gl.bindTexture(texture.__textureTarget, null); - uploadFromTypedArray(texture, renderSession, null); } @@ -43,11 +32,19 @@ class GLTexture { var hasTexture = false; - reader.readTextures(function(target, level, gpuFormat, width, height, blockLength, bytes) { + reader.readTextures(function(_, level, gpuFormat, width, height, blockLength, bytes) { var format = GLTextureBase.__compressedTextureFormats.toTextureFormat(alpha, gpuFormat); if (format == 0) return; + if (width == 0 && height == 0) + return; + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + hasTexture = true; texture.__format = format; texture.__internalFormat = format; @@ -96,6 +93,9 @@ class GLTexture { } public static function uploadFromByteArray(texture:Texture, renderSession:GLRenderSession, data:ByteArray, byteArrayOffset:UInt, miplevel:UInt = 0):Void { + if (data == null) + return; + #if js if (byteArrayOffset == 0) { uploadFromTypedArray(texture, renderSession, @:privateAccess (data : ByteArrayData).b, miplevel); @@ -107,9 +107,6 @@ class GLTexture { } public static function uploadFromTypedArray(texture:Texture, renderSession:GLRenderSession, data:ArrayBufferView, miplevel:UInt = 0):Void { - if (data == null) - return; - var gl = renderSession.gl; var width = texture.__width >> miplevel; diff --git a/src/openfl/_internal/stage3D/opengl/GLTextureBase.hx b/src/openfl/_internal/stage3D/opengl/GLTextureBase.hx index a5c11e3417..c0d11e498d 100644 --- a/src/openfl/_internal/stage3D/opengl/GLTextureBase.hx +++ b/src/openfl/_internal/stage3D/opengl/GLTextureBase.hx @@ -192,6 +192,9 @@ class GLTextureBase { } public static function uploadFromImage(gl:GL, texture:TextureBase, image:Image, miplevel:Int, width:Int, height:Int, uploadTarget:Int = -1) { + if (image == null) + return; + if (uploadTarget == -1) uploadTarget = texture.__textureTarget; gl.bindTexture(texture.__textureTarget, texture.__textureData.glTexture); diff --git a/src/openfl/_internal/stage3D/opengl/GLVertexBuffer3D.hx b/src/openfl/_internal/stage3D/opengl/GLVertexBuffer3D.hx index a9bb306089..401f7d4fcc 100644 --- a/src/openfl/_internal/stage3D/opengl/GLVertexBuffer3D.hx +++ b/src/openfl/_internal/stage3D/opengl/GLVertexBuffer3D.hx @@ -15,15 +15,15 @@ class GLVertexBuffer3D { public static function create(vertexBuffer:VertexBuffer3D, renderSession:GLRenderSession, bufferUsage:Context3DBufferUsage) { var gl = renderSession.gl; + vertexBuffer.__stride = vertexBuffer.__vertexSize * 4; + vertexBuffer.__id = gl.createBuffer(); GLUtils.checkGLError(gl); - vertexBuffer.__stride = vertexBuffer.__vertexSize * 4; - // __memoryUsage = 0; - vertexBuffer.__usage = (bufferUsage == Context3DBufferUsage.DYNAMIC_DRAW) ? GL.DYNAMIC_DRAW : GL.STATIC_DRAW; // __context.__statsIncrement (Context3D.Context3DTelemetry.COUNT_VERTEX_BUFFER); + // __memoryUsage = 0; } public static function dispose(vertexBuffer:VertexBuffer3D, renderSession:GLRenderSession):Void { @@ -41,6 +41,9 @@ class GLVertexBuffer3D { public static function uploadFromByteArray(vertexBuffer:VertexBuffer3D, renderSession:GLRenderSession, data:ByteArray, byteArrayOffset:Int, startVertex:Int, numVertices:Int):Void { + if (data == null) + return; + var offset = byteArrayOffset + startVertex * vertexBuffer.__stride; var length = numVertices * vertexBuffer.__vertexSize; @@ -48,8 +51,6 @@ class GLVertexBuffer3D { } public static function uploadFromTypedArray(vertexBuffer:VertexBuffer3D, renderSession:GLRenderSession, data:ArrayBufferView):Void { - if (data == null) - return; var gl = renderSession.gl; gl.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer.__id); @@ -70,6 +71,7 @@ class GLVertexBuffer3D { numVertices:Int):Void { if (data == null) return; + var gl = renderSession.gl; // TODO: Optimize more @@ -79,7 +81,6 @@ class GLVertexBuffer3D { var length = start + count; var existingFloat32Array = vertexBuffer.__tempFloat32Array; - if (vertexBuffer.__tempFloat32Array == null || vertexBuffer.__tempFloat32Array.length < count) { vertexBuffer.__tempFloat32Array = new Float32Array(count); diff --git a/src/openfl/display3D/IndexBuffer3D.hx b/src/openfl/display3D/IndexBuffer3D.hx index 0e0205532d..47b5c72350 100644 --- a/src/openfl/display3D/IndexBuffer3D.hx +++ b/src/openfl/display3D/IndexBuffer3D.hx @@ -3,12 +3,12 @@ package openfl.display3D; import lime.graphics.opengl.GLBuffer; import lime.utils.ArrayBufferView; import lime.utils.Int16Array; +import openfl.Vector; import openfl._internal.stage3D.opengl.GLIndexBuffer3D; import openfl.utils.ByteArray; -import openfl.Vector; @:access(openfl.display3D.Context3D) -final class IndexBuffer3D { +class IndexBuffer3D { private var __context:Context3D; private var __elementType:Int; private var __id:GLBuffer; diff --git a/src/openfl/display3D/VertexBuffer3D.hx b/src/openfl/display3D/VertexBuffer3D.hx index 7dd22f969a..3d66439205 100644 --- a/src/openfl/display3D/VertexBuffer3D.hx +++ b/src/openfl/display3D/VertexBuffer3D.hx @@ -10,11 +10,10 @@ import openfl.utils.ByteArray; @:access(openfl.display3D.Context3D) class VertexBuffer3D { private var __context:Context3D; - private var __data:Vector; + private var __stride:Int; private var __id:GLBuffer; private var __memoryUsage:Int; private var __numVertices:Int; - private var __stride:Int; private var __tempFloat32Array:Float32Array; private var __usage:Int; private var __vertexSize:Int; diff --git a/src/openfl/display3D/textures/RectangleTexture.hx b/src/openfl/display3D/textures/RectangleTexture.hx index c002ca8d7f..3ff5faf2ab 100644 --- a/src/openfl/display3D/textures/RectangleTexture.hx +++ b/src/openfl/display3D/textures/RectangleTexture.hx @@ -8,7 +8,7 @@ import openfl.utils.ByteArray; @:access(openfl.display3D.Context3D) final class RectangleTexture extends TextureBase { - private function new(context:Context3D, width:Int, height:Int, format:String, optimizeForRenderToTexture:Bool) { + private function new(context:Context3D, width:Int, height:Int, format:Context3DTextureFormat, optimizeForRenderToTexture:Bool) { super(context); __width = width;