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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user