aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSiva Velusamy <vsiva@google.com>2011-09-06 13:59:38 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-09-06 13:59:38 -0700
commit775311dfc1115bae9333a86f715b9bed7c9299b0 (patch)
tree47dcc6410249721aa1750464ea9b783208b44fca
parent08b9b1fa7b8ef6fa45e13f751af5d01cf20e7fb5 (diff)
parentedcbc3cd3d921327e8579ccea21a8f0d7042a770 (diff)
downloadsdk-775311dfc1115bae9333a86f715b9bed7c9299b0.zip
sdk-775311dfc1115bae9333a86f715b9bed7c9299b0.tar.gz
sdk-775311dfc1115bae9333a86f715b9bed7c9299b0.tar.bz2
Merge "GLES2Dbg: added reference frame for glReadPixels"
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/Context.java88
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/DebuggerMessage.java164
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageData.java25
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageProcessor.java12
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageQueue.java77
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/SampleView.java14
6 files changed, 295 insertions, 85 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/Context.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/Context.java
new file mode 100644
index 0000000..3668a56
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/Context.java
@@ -0,0 +1,88 @@
+/*
+ ** Copyright 2011, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+package com.android.glesv2debugger;
+
+import com.android.glesv2debugger.DebuggerMessage.Message;
+
+public class Context {
+ public int contextId;
+ public GLServerVertex serverVertex = new GLServerVertex();
+ public byte [] readPixelRef = new byte [0];
+
+ public Message ProcessMessage(Message msg)
+ {
+ switch (msg.getFunction()) {
+ case glBindBuffer:
+ serverVertex.glBindBuffer(msg);
+ break;
+ case glBufferData:
+ serverVertex.glBufferData(msg);
+ break;
+ case glBufferSubData:
+ serverVertex.glBufferSubData(msg);
+ break;
+ case glDeleteBuffers:
+ serverVertex.glDeleteBuffers(msg);
+ break;
+ case glDrawArrays:
+ if (msg.hasArg7())
+ msg = serverVertex.glDrawArrays(msg);
+ break;
+ case glDrawElements:
+ if (msg.hasArg7())
+ msg = serverVertex.glDrawElements(msg);
+ break;
+ case glDisableVertexAttribArray:
+ serverVertex.glDisableVertexAttribArray(msg);
+ break;
+ case glEnableVertexAttribArray:
+ serverVertex.glEnableVertexAttribArray(msg);
+ break;
+ case glGenBuffers:
+ serverVertex.glGenBuffers(msg);
+ break;
+ case glVertexAttribPointer:
+ serverVertex.glVertexAttribPointer(msg);
+ break;
+ case glVertexAttrib1f:
+ serverVertex.glVertexAttrib1f(msg);
+ break;
+ case glVertexAttrib1fv:
+ serverVertex.glVertexAttrib1fv(msg);
+ break;
+ case glVertexAttrib2f:
+ serverVertex.glVertexAttrib2f(msg);
+ break;
+ case glVertexAttrib2fv:
+ serverVertex.glVertexAttrib2fv(msg);
+ break;
+ case glVertexAttrib3f:
+ serverVertex.glVertexAttrib3f(msg);
+ break;
+ case glVertexAttrib3fv:
+ serverVertex.glVertexAttrib3fv(msg);
+ break;
+ case glVertexAttrib4f:
+ serverVertex.glVertexAttrib4f(msg);
+ break;
+ case glVertexAttrib4fv:
+ serverVertex.glVertexAttrib4fv(msg);
+ break;
+ }
+ return msg;
+ }
+}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/DebuggerMessage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/DebuggerMessage.java
index ddc875a..8acf1e5 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/DebuggerMessage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/DebuggerMessage.java
@@ -483,6 +483,45 @@ public final class DebuggerMessage {
// @@protoc_insertion_point(enum_scope:com.android.glesv2debugger.Message.Type)
}
+ public enum DataType
+ implements com.google.protobuf.Internal.EnumLite {
+ ReferencedImage(0, 0),
+ NonreferencedImage(1, 1),
+ ;
+
+
+ public final int getNumber() { return value; }
+
+ public static DataType valueOf(int value) {
+ switch (value) {
+ case 0: return ReferencedImage;
+ case 1: return NonreferencedImage;
+ default: return null;
+ }
+ }
+
+ public static com.google.protobuf.Internal.EnumLiteMap<DataType>
+ internalGetValueMap() {
+ return internalValueMap;
+ }
+ private static com.google.protobuf.Internal.EnumLiteMap<DataType>
+ internalValueMap =
+ new com.google.protobuf.Internal.EnumLiteMap<DataType>() {
+ public DataType findValueByNumber(int number) {
+ return DataType.valueOf(number)
+ ; }
+ };
+
+ private final int index;
+ private final int value;
+ private DataType(int index, int value) {
+ this.index = index;
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:com.android.glesv2debugger.Message.DataType)
+ }
+
public enum Prop
implements com.google.protobuf.Internal.EnumLite {
Capture(0, 0),
@@ -627,6 +666,27 @@ public final class DebuggerMessage {
public boolean hasData() { return hasData; }
public com.google.protobuf.ByteString getData() { return data_; }
+ // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+ public static final int DATA_TYPE_FIELD_NUMBER = 23;
+ private boolean hasDataType;
+ private com.android.glesv2debugger.DebuggerMessage.Message.DataType dataType_;
+ public boolean hasDataType() { return hasDataType; }
+ public com.android.glesv2debugger.DebuggerMessage.Message.DataType getDataType() { return dataType_; }
+
+ // optional int32 pixel_format = 24;
+ public static final int PIXEL_FORMAT_FIELD_NUMBER = 24;
+ private boolean hasPixelFormat;
+ private int pixelFormat_ = 0;
+ public boolean hasPixelFormat() { return hasPixelFormat; }
+ public int getPixelFormat() { return pixelFormat_; }
+
+ // optional int32 pixel_type = 25;
+ public static final int PIXEL_TYPE_FIELD_NUMBER = 25;
+ private boolean hasPixelType;
+ private int pixelType_ = 0;
+ public boolean hasPixelType() { return hasPixelType; }
+ public int getPixelType() { return pixelType_; }
+
// optional float time = 11;
public static final int TIME_FIELD_NUMBER = 11;
private boolean hasTime;
@@ -651,6 +711,7 @@ public final class DebuggerMessage {
private void initFields() {
function_ = com.android.glesv2debugger.DebuggerMessage.Message.Function.NEG;
type_ = com.android.glesv2debugger.DebuggerMessage.Message.Type.BeforeCall;
+ dataType_ = com.android.glesv2debugger.DebuggerMessage.Message.DataType.ReferencedImage;
prop_ = com.android.glesv2debugger.DebuggerMessage.Message.Prop.Capture;
}
public final boolean isInitialized() {
@@ -718,6 +779,15 @@ public final class DebuggerMessage {
if (hasClock()) {
output.writeFloat(22, getClock());
}
+ if (hasDataType()) {
+ output.writeEnum(23, getDataType().getNumber());
+ }
+ if (hasPixelFormat()) {
+ output.writeInt32(24, getPixelFormat());
+ }
+ if (hasPixelType()) {
+ output.writeInt32(25, getPixelType());
+ }
}
private int memoizedSerializedSize = -1;
@@ -798,6 +868,18 @@ public final class DebuggerMessage {
size += com.google.protobuf.CodedOutputStream
.computeFloatSize(22, getClock());
}
+ if (hasDataType()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeEnumSize(23, getDataType().getNumber());
+ }
+ if (hasPixelFormat()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(24, getPixelFormat());
+ }
+ if (hasPixelType()) {
+ size += com.google.protobuf.CodedOutputStream
+ .computeInt32Size(25, getPixelType());
+ }
memoizedSerializedSize = size;
return size;
}
@@ -987,6 +1069,15 @@ public final class DebuggerMessage {
if (other.hasData()) {
setData(other.getData());
}
+ if (other.hasDataType()) {
+ setDataType(other.getDataType());
+ }
+ if (other.hasPixelFormat()) {
+ setPixelFormat(other.getPixelFormat());
+ }
+ if (other.hasPixelType()) {
+ setPixelType(other.getPixelType());
+ }
if (other.hasTime()) {
setTime(other.getTime());
}
@@ -1098,6 +1189,22 @@ public final class DebuggerMessage {
setClock(input.readFloat());
break;
}
+ case 184: {
+ int rawValue = input.readEnum();
+ com.android.glesv2debugger.DebuggerMessage.Message.DataType value = com.android.glesv2debugger.DebuggerMessage.Message.DataType.valueOf(rawValue);
+ if (value != null) {
+ setDataType(value);
+ }
+ break;
+ }
+ case 192: {
+ setPixelFormat(input.readInt32());
+ break;
+ }
+ case 200: {
+ setPixelType(input.readInt32());
+ break;
+ }
}
}
}
@@ -1382,6 +1489,63 @@ public final class DebuggerMessage {
return this;
}
+ // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+ public boolean hasDataType() {
+ return result.hasDataType();
+ }
+ public com.android.glesv2debugger.DebuggerMessage.Message.DataType getDataType() {
+ return result.getDataType();
+ }
+ public Builder setDataType(com.android.glesv2debugger.DebuggerMessage.Message.DataType value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ result.hasDataType = true;
+ result.dataType_ = value;
+ return this;
+ }
+ public Builder clearDataType() {
+ result.hasDataType = false;
+ result.dataType_ = com.android.glesv2debugger.DebuggerMessage.Message.DataType.ReferencedImage;
+ return this;
+ }
+
+ // optional int32 pixel_format = 24;
+ public boolean hasPixelFormat() {
+ return result.hasPixelFormat();
+ }
+ public int getPixelFormat() {
+ return result.getPixelFormat();
+ }
+ public Builder setPixelFormat(int value) {
+ result.hasPixelFormat = true;
+ result.pixelFormat_ = value;
+ return this;
+ }
+ public Builder clearPixelFormat() {
+ result.hasPixelFormat = false;
+ result.pixelFormat_ = 0;
+ return this;
+ }
+
+ // optional int32 pixel_type = 25;
+ public boolean hasPixelType() {
+ return result.hasPixelType();
+ }
+ public int getPixelType() {
+ return result.getPixelType();
+ }
+ public Builder setPixelType(int value) {
+ result.hasPixelType = true;
+ result.pixelType_ = value;
+ return this;
+ }
+ public Builder clearPixelType() {
+ result.hasPixelType = false;
+ result.pixelType_ = 0;
+ return this;
+ }
+
// optional float time = 11;
public boolean hasTime() {
return result.hasTime();
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageData.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageData.java
index bd032d0..d87403d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageData.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageData.java
@@ -17,11 +17,15 @@
package com.android.glesv2debugger;
import com.android.glesv2debugger.DebuggerMessage.Message;
+import com.android.glesv2debugger.DebuggerMessage.Message.DataType;
import com.android.glesv2debugger.DebuggerMessage.Message.Function;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.widgets.Display;
+
+import java.util.HashMap;
public class MessageData {
public final Message msg;
@@ -31,8 +35,8 @@ public class MessageData {
public float[] data;
public int maxAttrib; // used for formatting data
public GLEnum dataType; // could be float, int; mainly for formatting use
-
- public MessageData(final Device device, final Message msg) {
+
+ public MessageData(final Device device, final Message msg, final Context context) {
this.msg = msg;
image = null;
shader = null;
@@ -42,7 +46,7 @@ public class MessageData {
ImageData imageData = null;
if (function != Message.Function.ACK)
assert msg.hasTime();
- columns = new String [4];
+ columns = new String[4];
columns[0] = function.toString();
columns[1] = "";
if (msg.hasTime())
@@ -63,7 +67,8 @@ public class MessageData {
case glShaderSource:
shader = msg.getData().toStringUtf8();
int index = shader.indexOf('\n');
- columns[3] += " source: " + shader.substring(0, index >= 0 ? index : shader.length()) + "...";
+ columns[3] += " source: "
+ + shader.substring(0, index >= 0 ? index : shader.length()) + "...";
break;
case glTexImage2D:
if (!msg.hasData())
@@ -85,18 +90,26 @@ public class MessageData {
image = new Image(device, imageData);
break;
case glCopyTexImage2D:
- imageData = MessageProcessor.ReceiveImage(msg.getArg5(), msg.getArg6(), GLEnum.GL_RGBA.value, GLEnum.GL_UNSIGNED_BYTE.value, msg.getData().toByteArray());
+ imageData = MessageProcessor.ReceiveImage(msg.getArg5(), msg.getArg6(),
+ GLEnum.GL_RGBA.value, GLEnum.GL_UNSIGNED_BYTE.value, msg.getData()
+ .toByteArray());
image = new Image(device, imageData);
break;
case glCopyTexSubImage2D:
- imageData = MessageProcessor.ReceiveImage(msg.getArg6(), msg.getArg7(), GLEnum.GL_RGBA.value, GLEnum.GL_UNSIGNED_BYTE.value, msg.getData().toByteArray());
+ imageData = MessageProcessor.ReceiveImage(msg.getArg6(), msg.getArg7(),
+ GLEnum.GL_RGBA.value, GLEnum.GL_UNSIGNED_BYTE.value, msg.getData()
+ .toByteArray());
image = new Image(device, imageData);
break;
case glReadPixels:
if (!msg.hasData())
break;
+ if (msg.getDataType() == DataType.ReferencedImage)
+ MessageProcessor.ref = context.readPixelRef;
imageData = MessageProcessor.ReceiveImage(msg.getArg2(), msg.getArg3(),
msg.getArg4(), msg.getArg5(), msg.getData().toByteArray());
+ context.readPixelRef = MessageProcessor.ref;
+ MessageProcessor.ref = null;
imageData = imageData.scaledTo(imageData.width, -imageData.height);
image = new Image(device, imageData);
break;
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageProcessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageProcessor.java
index a8cdac1..c0ff91f 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageProcessor.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageProcessor.java
@@ -30,6 +30,8 @@ public class MessageProcessor {
MessageDialog.openError(null, "MessageProcessor", message);
}
+ public static byte [] ref; // inout; used for glReadPixels
+
public static ImageData ReceiveImage(int width, int height, int format,
int type, byte[] data) {
assert width > 0 && height > 0;
@@ -92,12 +94,20 @@ public class MessageProcessor {
showError("unsupported texture format: " + format);
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);
PaletteData palette = new PaletteData(redMask, greenMask, blueMask);
- return new ImageData(width, height, bpp, palette, 1, pixels);
+ if (null != ref) {
+ if (ref.length < decompressed)
+ ref = new byte [width * height * (bpp / 8)];
+ for (int i = 0; i < ref.length; i++)
+ ref[i] ^= pixels[i];
+ return new ImageData(width, height, bpp, palette, 1, ref);
+ } else
+ return new ImageData(width, height, bpp, palette, 1, pixels);
}
static public float[] ReceiveData(final GLEnum type, final ByteString data) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageQueue.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageQueue.java
index 4a5a750..f0b0325 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageQueue.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/MessageQueue.java
@@ -36,8 +36,6 @@ public class MessageQueue implements Runnable {
ArrayList<Message> commands = new ArrayList<Message>();
SampleView sampleView;
- HashMap<Integer, GLServerVertex> serversVertex = new HashMap<Integer, GLServerVertex>();
-
public MessageQueue(SampleView sampleView) {
this.sampleView = sampleView;
}
@@ -159,83 +157,10 @@ public class MessageQueue implements Runnable {
}
Message.Builder builder = msg.toBuilder();
- // builder.mergeFrom(next); seems to merge incorrectly
- if (next.hasRet())
- builder.setRet(next.getRet());
- if (next.hasTime())
- builder.setTime(next.getTime());
- if (next.hasData())
- builder.setData(next.getData());
- builder.setType(next.getType());
+ builder.mergeFrom(next);
msg = builder.build();
}
- GLServerVertex serverVertex = serversVertex.get(msg.getContextId());
- if (null == serverVertex) {
- serverVertex = new GLServerVertex();
- serversVertex.put(msg.getContextId(), serverVertex);
- }
-
- // forward message to synchronize state
- switch (msg.getFunction()) {
- case glBindBuffer:
- serverVertex.glBindBuffer(msg);
- break;
- case glBufferData:
- serverVertex.glBufferData(msg);
- break;
- case glBufferSubData:
- serverVertex.glBufferSubData(msg);
- break;
- case glDeleteBuffers:
- serverVertex.glDeleteBuffers(msg);
- break;
- case glDrawArrays:
- if (msg.hasArg7())
- msg = serverVertex.glDrawArrays(msg);
- break;
- case glDrawElements:
- if (msg.hasArg7())
- msg = serverVertex.glDrawElements(msg);
- break;
- case glDisableVertexAttribArray:
- serverVertex.glDisableVertexAttribArray(msg);
- break;
- case glEnableVertexAttribArray:
- serverVertex.glEnableVertexAttribArray(msg);
- break;
- case glGenBuffers:
- serverVertex.glGenBuffers(msg);
- break;
- case glVertexAttribPointer:
- serverVertex.glVertexAttribPointer(msg);
- break;
- case glVertexAttrib1f:
- serverVertex.glVertexAttrib1f(msg);
- break;
- case glVertexAttrib1fv:
- serverVertex.glVertexAttrib1fv(msg);
- break;
- case glVertexAttrib2f:
- serverVertex.glVertexAttrib2f(msg);
- break;
- case glVertexAttrib2fv:
- serverVertex.glVertexAttrib2fv(msg);
- break;
- case glVertexAttrib3f:
- serverVertex.glVertexAttrib3f(msg);
- break;
- case glVertexAttrib3fv:
- serverVertex.glVertexAttrib3fv(msg);
- break;
- case glVertexAttrib4f:
- serverVertex.glVertexAttrib4f(msg);
- break;
- case glVertexAttrib4fv:
- serverVertex.glVertexAttrib4fv(msg);
- break;
- }
-
synchronized (complete) {
complete.add(msg);
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/SampleView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/SampleView.java
index fe2e6e6..66bd989 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/SampleView.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/glesv2debugger/SampleView.java
@@ -73,6 +73,7 @@ import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.HashMap;
/**
* This sample class demonstrates how to plug-in a new workbench view. The view
@@ -112,6 +113,7 @@ public class SampleView extends ViewPart implements Runnable {
Point origin = new Point(0, 0); // for smooth scrolling canvas
String[] filters = null;
+ public HashMap<Integer, Context> contexts = new HashMap<Integer, Context>();
/*
* The content provider class is responsible for providing objects to the
@@ -678,7 +680,7 @@ public class SampleView extends ViewPart implements Runnable {
break;
Message msg = messageQueue.RemoveMessage(0);
- if (msgs.size() > 40) {
+ if (msgs.size() > 60 || null == msg) {
viewContentProvider.add(msgs);
msgs.clear();
}
@@ -690,8 +692,16 @@ public class SampleView extends ViewPart implements Runnable {
showError(e);
}
}
+
+ Context context = contexts.get(msg.getContextId());
+ if (null == context) {
+ context = new Context();
+ contexts.put(msg.getContextId(), context);
+ }
+ msg = context.ProcessMessage(msg);
+
final MessageData msgData = new MessageData(this.getViewSite()
- .getShell().getDisplay(), msg);
+ .getShell().getDisplay(), msg, context);
if (null != writer) {
writer.write(msgData.columns[0]);
for (int i = 0; i < 30 - msgData.columns[0].length(); i++)