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