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 <davidxli@google.com>
This commit is contained in:
David Li
2011-03-22 13:23:14 -07:00
parent 067eefee5a
commit 766c4e5a44
3 changed files with 44 additions and 17 deletions

View File

@@ -69,8 +69,7 @@ public class MessageData {
if (!msg.hasData()) if (!msg.hasData())
break; break;
imageData = MessageProcessor.ReceiveImage(msg.getArg3(), msg imageData = MessageProcessor.ReceiveImage(msg.getArg3(), msg
.getArg4(), msg.getArg6(), msg.getArg7(), msg.getData() .getArg4(), msg.getArg6(), msg.getArg7(), msg.getData());
.toByteArray());
if (null == imageData) if (null == imageData)
break; break;
image = new Image(device, imageData); image = new Image(device, imageData);
@@ -78,8 +77,7 @@ public class MessageData {
case glTexSubImage2D: case glTexSubImage2D:
assert msg.hasData(); assert msg.hasData();
imageData = MessageProcessor.ReceiveImage(msg.getArg4(), msg imageData = MessageProcessor.ReceiveImage(msg.getArg4(), msg
.getArg5(), msg.getArg6(), msg.getArg7(), msg.getData() .getArg5(), msg.getArg6(), msg.getArg7(), msg.getData());
.toByteArray());
if (null == imageData) if (null == imageData)
break; break;
image = new Image(device, imageData); image = new Image(device, imageData);
@@ -88,8 +86,7 @@ public class MessageData {
assert msg.getDataType() == DataType.ReferencedImage; assert msg.getDataType() == DataType.ReferencedImage;
MessageProcessor.ref = context.readPixelRef; MessageProcessor.ref = context.readPixelRef;
imageData = MessageProcessor.ReceiveImage(msg.getArg5(), msg.getArg6(), imageData = MessageProcessor.ReceiveImage(msg.getArg5(), msg.getArg6(),
msg.getPixelFormat(), msg.getPixelType(), msg.getData() msg.getPixelFormat(), msg.getPixelType(), msg.getData());
.toByteArray());
MessageProcessor.ref = null; MessageProcessor.ref = null;
image = new Image(device, imageData); image = new Image(device, imageData);
imageData = imageData.scaledTo(imageData.width, -imageData.height); imageData = imageData.scaledTo(imageData.width, -imageData.height);
@@ -98,8 +95,7 @@ public class MessageData {
assert msg.getDataType() == DataType.ReferencedImage; assert msg.getDataType() == DataType.ReferencedImage;
MessageProcessor.ref = context.readPixelRef; MessageProcessor.ref = context.readPixelRef;
imageData = MessageProcessor.ReceiveImage(msg.getArg6(), msg.getArg7(), imageData = MessageProcessor.ReceiveImage(msg.getArg6(), msg.getArg7(),
msg.getPixelFormat(), msg.getPixelType(), msg.getData() msg.getPixelFormat(), msg.getPixelType(), msg.getData());
.toByteArray());
MessageProcessor.ref = null; MessageProcessor.ref = null;
imageData = imageData.scaledTo(imageData.width, -imageData.height); imageData = imageData.scaledTo(imageData.width, -imageData.height);
image = new Image(device, imageData); image = new Image(device, imageData);
@@ -110,7 +106,7 @@ public class MessageData {
if (msg.getDataType() == DataType.ReferencedImage) if (msg.getDataType() == DataType.ReferencedImage)
MessageProcessor.ref = context.readPixelRef; MessageProcessor.ref = context.readPixelRef;
imageData = MessageProcessor.ReceiveImage(msg.getArg2(), msg.getArg3(), imageData = MessageProcessor.ReceiveImage(msg.getArg2(), msg.getArg3(),
msg.getArg4(), msg.getArg5(), msg.getData().toByteArray()); msg.getArg4(), msg.getArg5(), msg.getData());
context.readPixelRef = MessageProcessor.ref; context.readPixelRef = MessageProcessor.ref;
MessageProcessor.ref = null; MessageProcessor.ref = null;
imageData = imageData.scaledTo(imageData.width, -imageData.height); imageData = imageData.scaledTo(imageData.width, -imageData.height);

View File

@@ -32,8 +32,36 @@ public class MessageProcessor {
public static byte[] ref; // inout; used for glReadPixels 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, public static ImageData ReceiveImage(int width, int height, int format,
int type, byte[] data) { int type, final ByteString data) {
assert width > 0 && height > 0; assert width > 0 && height > 0;
int bpp = 0; int bpp = 0;
int redMask = 0, blueMask = 0, greenMask = 0; int redMask = 0, blueMask = 0, greenMask = 0;
@@ -95,17 +123,16 @@ public class MessageProcessor {
return null; return null;
} }
byte[] pixels = new byte[width * height * (bpp / 8)]; byte[] pixels = LZFDecompressChunks(data);
int decompressed = org.liblzf.CLZF.lzf_decompress(data, data.length, pixels, pixels.length); assert pixels.length == width * height * (bpp / 8);
assert decompressed == width * height * (bpp / 8);
PaletteData palette = new PaletteData(redMask, greenMask, blueMask); PaletteData palette = new PaletteData(redMask, greenMask, blueMask);
if (null != ref) { if (null != ref) {
if (ref.length < decompressed) if (ref.length < pixels.length)
ref = new byte[width * height * (bpp / 8)]; 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]; 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 ref[i] = 0; // clear unused ref to maintain consistency
return new ImageData(width, height, bpp, palette, 1, ref); return new ImageData(width, height, bpp, palette, 1, ref);
} else } else

View File

@@ -67,6 +67,7 @@ import org.eclipse.ui.part.ViewPart;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.nio.ByteOrder;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
@@ -88,6 +89,7 @@ import java.util.HashMap;
*/ */
public class SampleView extends ViewPart implements Runnable { public class SampleView extends ViewPart implements Runnable {
public static final ByteOrder targetByteOrder = ByteOrder.LITTLE_ENDIAN;
boolean running = false; boolean running = false;
Thread thread; Thread thread;
@@ -208,7 +210,9 @@ public class SampleView extends ViewPart implements Runnable {
MessageParserEx messageParserEx = new MessageParserEx(); MessageParserEx messageParserEx = new MessageParserEx();
Message.Builder builder = Message.newBuilder(); Message.Builder builder = Message.newBuilder();
messageParserEx.Parse(builder, "glUniform4fv(1,2,[0,1,2,3,4,5,6,7])"); 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) { public void CreateView(Composite parent) {