private void PlatformConstruct(int width, int height, bool mipmap, SurfaceFormat format, SurfaceType type, bool shared) { this.glTarget = TextureTarget.Texture2D; format.GetGLFormat(GraphicsDevice, out glInternalFormat, out glFormat, out glType); Threading.BlockOnUIThread(() => { GenerateGLTextureIfRequired(); int w = width; int h = height; int level = 0; while (true) { if (glFormat == (PixelFormat)GLPixelFormat.CompressedTextureFormats) { int imageSize = 0; // PVRTC has explicit calculations for imageSize // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt if (format == SurfaceFormat.RgbPvrtc2Bpp || format == SurfaceFormat.RgbaPvrtc2Bpp) { imageSize = (Math.Max(w, 16) * Math.Max(h, 8) * 2 + 7) / 8; } else if (format == SurfaceFormat.RgbPvrtc4Bpp || format == SurfaceFormat.RgbaPvrtc4Bpp) { imageSize = (Math.Max(w, 8) * Math.Max(h, 8) * 4 + 7) / 8; } else { int blockSize = format.GetSize(); int blockWidth, blockHeight; format.GetBlockSize(out blockWidth, out blockHeight); int wBlocks = (w + (blockWidth - 1)) / blockWidth; int hBlocks = (h + (blockHeight - 1)) / blockHeight; imageSize = wBlocks * hBlocks * blockSize; } GL.CompressedTexImage2D(TextureTarget.Texture2D, level, glInternalFormat, w, h, 0, imageSize, IntPtr.Zero); GraphicsExtensions.CheckGLError(); } else { GL.TexImage2D(TextureTarget.Texture2D, level, glInternalFormat, w, h, 0, glFormat, glType, IntPtr.Zero); GraphicsExtensions.CheckGLError(); } if ((w == 1 && h == 1) || !mipmap) { break; } if (w > 1) { w = w / 2; } if (h > 1) { h = h / 2; } ++level; } }); }
private void PlatformConstruct(int width, int height, bool mipmap, SurfaceFormat format, SurfaceType type, bool shared) { this.glTarget = gl.TEXTURE_2D; format.GetGLFormat(GraphicsDevice, out glInternalFormat, out glFormat, out glType); GenerateGLTextureIfRequired(); int w = width; int h = height; int level = 0; while (true) { if (glFormat == gl.COMPRESSED_TEXTURE_FORMATS) { int imageSize = 0; // PVRTC has explicit calculations for imageSize // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt if (format == SurfaceFormat.RgbPvrtc2Bpp || format == SurfaceFormat.RgbaPvrtc2Bpp) { imageSize = (Math.Max(w, 16) * Math.Max(h, 8) * 2 + 7) / 8; } else if (format == SurfaceFormat.RgbPvrtc4Bpp || format == SurfaceFormat.RgbaPvrtc4Bpp) { imageSize = (Math.Max(w, 8) * Math.Max(h, 8) * 4 + 7) / 8; } else { int blockSize = format.GetSize(); int blockWidth, blockHeight; format.GetBlockSize(out blockWidth, out blockHeight); int wBlocks = (w + (blockWidth - 1)) / blockWidth; int hBlocks = (h + (blockHeight - 1)) / blockHeight; imageSize = wBlocks * hBlocks * blockSize; } } gl.texImage2D(gl.TEXTURE_2D, level, glInternalFormat, glFormat, glType, (new ImageData(w, h).As <ImageBitmap>())); GraphicsExtensions.CheckGLError(); if ((w == 1 && h == 1) || !mipmap) { break; } if (w > 1) { w = w / 2; } if (h > 1) { h = h / 2; } ++level; } }