From 766c4e5a44965a45974660e10ff2dd4b479e3f4e Mon Sep 17 00:00:00 2001 From: David Li Date: Tue, 22 Mar 2011 13:23:14 -0700 Subject: [PATCH] GLES2Dbg: use 256KB chunks for lzf compression Data format is u32 totalDecompressedSize, then repeat: u32 chunkDecompressedSize, u32 chunkCompressedSize, chunk data. If chunkCompressedSize == 0, then chunk is not compressed. Also start fixing integer sizes on server. On client, set endianness to match server. Change-Id: I70c8203037ad7165968ca0d02d0da5f7cc14b7e0 Signed-off-by: David Li --- .../android/glesv2debugger/MessageData.java | 14 +++---- .../glesv2debugger/MessageProcessor.java | 41 +++++++++++++++---- .../android/glesv2debugger/SampleView.java | 6 ++- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/MessageData.java b/tools/glesv2debugger/src/com/android/glesv2debugger/MessageData.java index be3e6dc81..df5cbed2e 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/MessageData.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/MessageData.java @@ -69,8 +69,7 @@ public class MessageData { if (!msg.hasData()) break; imageData = MessageProcessor.ReceiveImage(msg.getArg3(), msg - .getArg4(), msg.getArg6(), msg.getArg7(), msg.getData() - .toByteArray()); + .getArg4(), msg.getArg6(), msg.getArg7(), msg.getData()); if (null == imageData) break; image = new Image(device, imageData); @@ -78,8 +77,7 @@ public class MessageData { case glTexSubImage2D: assert msg.hasData(); imageData = MessageProcessor.ReceiveImage(msg.getArg4(), msg - .getArg5(), msg.getArg6(), msg.getArg7(), msg.getData() - .toByteArray()); + .getArg5(), msg.getArg6(), msg.getArg7(), msg.getData()); if (null == imageData) break; image = new Image(device, imageData); @@ -88,8 +86,7 @@ public class MessageData { assert msg.getDataType() == DataType.ReferencedImage; MessageProcessor.ref = context.readPixelRef; imageData = MessageProcessor.ReceiveImage(msg.getArg5(), msg.getArg6(), - msg.getPixelFormat(), msg.getPixelType(), msg.getData() - .toByteArray()); + msg.getPixelFormat(), msg.getPixelType(), msg.getData()); MessageProcessor.ref = null; image = new Image(device, imageData); imageData = imageData.scaledTo(imageData.width, -imageData.height); @@ -98,8 +95,7 @@ public class MessageData { assert msg.getDataType() == DataType.ReferencedImage; MessageProcessor.ref = context.readPixelRef; imageData = MessageProcessor.ReceiveImage(msg.getArg6(), msg.getArg7(), - msg.getPixelFormat(), msg.getPixelType(), msg.getData() - .toByteArray()); + msg.getPixelFormat(), msg.getPixelType(), msg.getData()); MessageProcessor.ref = null; imageData = imageData.scaledTo(imageData.width, -imageData.height); image = new Image(device, imageData); @@ -110,7 +106,7 @@ public class MessageData { if (msg.getDataType() == DataType.ReferencedImage) MessageProcessor.ref = context.readPixelRef; imageData = MessageProcessor.ReceiveImage(msg.getArg2(), msg.getArg3(), - msg.getArg4(), msg.getArg5(), msg.getData().toByteArray()); + msg.getArg4(), msg.getArg5(), msg.getData()); context.readPixelRef = MessageProcessor.ref; MessageProcessor.ref = null; imageData = imageData.scaledTo(imageData.width, -imageData.height); diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/MessageProcessor.java b/tools/glesv2debugger/src/com/android/glesv2debugger/MessageProcessor.java index 41eb401d3..0fe7f2271 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/MessageProcessor.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/MessageProcessor.java @@ -32,8 +32,36 @@ public class MessageProcessor { public static byte[] ref; // inout; used for glReadPixels + public static byte[] LZFDecompressChunks(final ByteString data) { + ByteBuffer in = data.asReadOnlyByteBuffer(); + in.order(SampleView.targetByteOrder); + ByteBuffer out = ByteBuffer.allocate(in.getInt()); + byte[] inChunk = new byte[0]; + byte[] outChunk = new byte[0]; + while (in.remaining() > 0) { + int decompressed = in.getInt(); + int compressed = in.getInt(); + if (decompressed > outChunk.length) + outChunk = new byte[decompressed]; + if (compressed == 0) { + in.get(outChunk, 0, decompressed); + out.put(outChunk, 0, decompressed); + } else { + if (compressed > inChunk.length) + inChunk = new byte[compressed]; + in.get(inChunk, 0, compressed); + int size = org.liblzf.CLZF + .lzf_decompress(inChunk, compressed, outChunk, outChunk.length); + assert size == decompressed; + out.put(outChunk, 0, size); + } + } + assert !out.hasRemaining(); + return out.array(); + } + public static ImageData ReceiveImage(int width, int height, int format, - int type, byte[] data) { + int type, final ByteString data) { assert width > 0 && height > 0; int bpp = 0; int redMask = 0, blueMask = 0, greenMask = 0; @@ -95,17 +123,16 @@ public class MessageProcessor { return null; } - byte[] pixels = new byte[width * height * (bpp / 8)]; - int decompressed = org.liblzf.CLZF.lzf_decompress(data, data.length, pixels, pixels.length); - assert decompressed == width * height * (bpp / 8); + byte[] pixels = LZFDecompressChunks(data); + assert pixels.length == width * height * (bpp / 8); PaletteData palette = new PaletteData(redMask, greenMask, blueMask); if (null != ref) { - if (ref.length < decompressed) + if (ref.length < pixels.length) ref = new byte[width * height * (bpp / 8)]; - for (int i = 0; i < decompressed; i++) + for (int i = 0; i < pixels.length; i++) ref[i] ^= pixels[i]; - for (int i = decompressed; i < ref.length; i++) + for (int i = pixels.length; i < ref.length; i++) ref[i] = 0; // clear unused ref to maintain consistency return new ImageData(width, height, bpp, palette, 1, ref); } else diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java b/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java index 6efc8f61d..c515339ab 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java @@ -67,6 +67,7 @@ import org.eclipse.ui.part.ViewPart; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.nio.ByteOrder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; @@ -88,6 +89,7 @@ import java.util.HashMap; */ public class SampleView extends ViewPart implements Runnable { + public static final ByteOrder targetByteOrder = ByteOrder.LITTLE_ENDIAN; boolean running = false; Thread thread; @@ -208,7 +210,9 @@ public class SampleView extends ViewPart implements Runnable { MessageParserEx messageParserEx = new MessageParserEx(); Message.Builder builder = Message.newBuilder(); messageParserEx.Parse(builder, "glUniform4fv(1,2,[0,1,2,3,4,5,6,7])"); - messageParserEx.Parse(builder, "void glShaderSource(shader=4, count=1, string=\"dksjafhskjahourehghskjg\", length=0x0)"); + messageParserEx + .Parse(builder, + "void glShaderSource(shader=4, count=1, string=\"dksjafhskjahourehghskjg\", length=0x0)"); } public void CreateView(Composite parent) {