diff --git a/tools/glesv2debugger/.classpath b/tools/glesv2debugger/.classpath index 799a9cd32..4ba3585ba 100755 --- a/tools/glesv2debugger/.classpath +++ b/tools/glesv2debugger/.classpath @@ -6,5 +6,6 @@ + diff --git a/tools/glesv2debugger/META-INF/MANIFEST.MF b/tools/glesv2debugger/META-INF/MANIFEST.MF index 53e5e4538..cf42bdbd8 100644 --- a/tools/glesv2debugger/META-INF/MANIFEST.MF +++ b/tools/glesv2debugger/META-INF/MANIFEST.MF @@ -5,7 +5,8 @@ Bundle-SymbolicName: GLESv2DebuggerClient; singleton:=true Bundle-Version: 1.0.0.qualifier Bundle-Activator: com.android.glesv2debugger.Activator Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime + org.eclipse.core.runtime, + org.junit Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ClassPath: lib/host-libprotobuf-java-2.3.0-lite.jar, diff --git a/tools/glesv2debugger/build.properties b/tools/glesv2debugger/build.properties index 5b94aea25..39d82d24a 100644 --- a/tools/glesv2debugger/build.properties +++ b/tools/glesv2debugger/build.properties @@ -1,4 +1,5 @@ -source.. = src/ +source.. = src/,\ + test/ output.. = bin/ bin.includes = plugin.xml,\ META-INF/,\ diff --git a/tools/glesv2debugger/generate_GLFunction_java.py b/tools/glesv2debugger/generate_GLFunction_java.py deleted file mode 100755 index da0569095..000000000 --- a/tools/glesv2debugger/generate_GLFunction_java.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# -# 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. -# - -if __name__ == "__main__": - externs = [] - lines = open("../../../frameworks/base/opengl/libs/GLES2_dbg/gl2_api_annotated.in").readlines() - output = open("src/com/android/glesv2debugger/GLFunction.java", "w") - i = 0 - output.write( -"""/* - ** 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. - */ - -// auto generated by generate_GLFunction_java.py" - -package com.android.glesv2debugger; - -public enum GLFunction { -""") - - index = 0 - for line in lines: - if line.find("API_ENTRY(") >= 0: # a function prototype - returnType = line[0: line.find(" API_ENTRY(")] - functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name - output.write(" %s(%d, DebuggerMessage.Message.Function.%s),\n" % (functionName, index, functionName)) - index += 1 - output.write(""" ; - - public final int index; - public final DebuggerMessage.Message.Function function; - - GLFunction(final int index, final DebuggerMessage.Message.Function function) { - this.index = index; - this.function = function; - } -}""") - - diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/BreakpointOption.java b/tools/glesv2debugger/src/com/android/glesv2debugger/BreakpointOption.java index 6e795eb9e..e8405f9c9 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/BreakpointOption.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/BreakpointOption.java @@ -37,12 +37,14 @@ import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import java.io.IOException; -import java.util.HashMap; -public class BreakpointOption extends ScrolledComposite implements SelectionListener { +public class BreakpointOption extends ScrolledComposite implements SelectionListener, + ProcessMessage { SampleView sampleView; - HashMap buttonsBreak = new HashMap(); + Button[] buttonsBreak = new Button[Function.values().length]; + /** cache of buttonsBreak[Function.getNumber()].getSelection */ + boolean[] breakpoints = new boolean[Function.values().length]; BreakpointOption(SampleView sampleView, Composite parent) { super(parent, SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL); @@ -62,7 +64,8 @@ public class BreakpointOption extends ScrolledComposite implements SelectionList btn.addSelectionListener(this); btn.setText("Break"); btn.setSelection(false); - buttonsBreak.put(Function.values()[i], btn); + breakpoints[Function.values()[i].getNumber()] = btn.getSelection(); + buttonsBreak[Function.values()[i].getNumber()] = btn; } Point size = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT); @@ -74,9 +77,9 @@ public class BreakpointOption extends ScrolledComposite implements SelectionList this.layout(); } - void setBreakpoint(Function function, boolean enabled) { + void setBreakpoint(final int contextId, final Function function, final boolean enabled) { Message.Builder builder = Message.newBuilder(); - builder.setContextId(0); // FIXME: proper context id + builder.setContextId(contextId); builder.setType(Type.Response); builder.setExpectResponse(false); builder.setFunction(Function.SETPROP); @@ -84,13 +87,17 @@ public class BreakpointOption extends ScrolledComposite implements SelectionList builder.setArg0(function.getNumber()); builder.setArg1(enabled ? 1 : 0); sampleView.messageQueue.addCommand(builder.build()); + breakpoints[function.getNumber()] = enabled; } @Override public void widgetSelected(SelectionEvent e) { Button btn = (Button) e.widget; Group group = (Group) btn.getParent(); - setBreakpoint(Function.valueOf(group.getText()), btn.getSelection()); + int contextId = 0; + if (sampleView.current != null) + contextId = sampleView.current.contextId; + setBreakpoint(contextId, Function.valueOf(group.getText()), btn.getSelection()); } @Override @@ -100,6 +107,8 @@ public class BreakpointOption extends ScrolledComposite implements SelectionList private Function lastFunction = Function.NEG; public boolean processMessage(final MessageQueue queue, final Message msg) throws IOException { + if (!breakpoints[msg.getFunction().getNumber()]) + return false; // use DefaultProcessMessage just to register the GL call // but do not send response final int contextId = msg.getContextId(); @@ -158,9 +167,9 @@ public class BreakpointOption extends ScrolledComposite implements SelectionList builder.setFunction(Function.CONTINUE); else if (s.startsWith("r")) { - Button btn = buttonsBreak.get(msg.getFunction()); + Button btn = buttonsBreak[msg.getFunction().getNumber()]; btn.setSelection(false); - setBreakpoint(msg.getFunction(), false); + setBreakpoint(msg.getContextId(), msg.getFunction(), false); builder.setExpectResponse(false); } else diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/CodeGen.java b/tools/glesv2debugger/src/com/android/glesv2debugger/CodeGen.java index fb7c30351..28f3a54d8 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/CodeGen.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/CodeGen.java @@ -1131,8 +1131,7 @@ public class CodeGen implements IRunnableWithProgress { private IProgressMonitor progress; @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, - InterruptedException { + public void run(IProgressMonitor monitor) { progress.beginTask("CodeGenFrames", count + 2); Context ctx = dbgCtx.getFrame(0).startContext.clone(); codeGenSetup(ctx); diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/GLFunction.java b/tools/glesv2debugger/src/com/android/glesv2debugger/GLFunction.java deleted file mode 100644 index 081f1b2bc..000000000 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/GLFunction.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - ** 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. - */ - -// auto generated by generate_GLFunction_java.py" - -package com.android.glesv2debugger; - -public enum GLFunction { - glActiveTexture(0, DebuggerMessage.Message.Function.glActiveTexture), - glAttachShader(1, DebuggerMessage.Message.Function.glAttachShader), - glBindAttribLocation(2, DebuggerMessage.Message.Function.glBindAttribLocation), - glBindBuffer(3, DebuggerMessage.Message.Function.glBindBuffer), - glBindFramebuffer(4, DebuggerMessage.Message.Function.glBindFramebuffer), - glBindRenderbuffer(5, DebuggerMessage.Message.Function.glBindRenderbuffer), - glBindTexture(6, DebuggerMessage.Message.Function.glBindTexture), - glBlendColor(7, DebuggerMessage.Message.Function.glBlendColor), - glBlendEquation(8, DebuggerMessage.Message.Function.glBlendEquation), - glBlendEquationSeparate(9, DebuggerMessage.Message.Function.glBlendEquationSeparate), - glBlendFunc(10, DebuggerMessage.Message.Function.glBlendFunc), - glBlendFuncSeparate(11, DebuggerMessage.Message.Function.glBlendFuncSeparate), - glBufferData(12, DebuggerMessage.Message.Function.glBufferData), - glBufferSubData(13, DebuggerMessage.Message.Function.glBufferSubData), - glCheckFramebufferStatus(14, DebuggerMessage.Message.Function.glCheckFramebufferStatus), - glClear(15, DebuggerMessage.Message.Function.glClear), - glClearColor(16, DebuggerMessage.Message.Function.glClearColor), - glClearDepthf(17, DebuggerMessage.Message.Function.glClearDepthf), - glClearStencil(18, DebuggerMessage.Message.Function.glClearStencil), - glColorMask(19, DebuggerMessage.Message.Function.glColorMask), - glCompileShader(20, DebuggerMessage.Message.Function.glCompileShader), - glCompressedTexImage2D(21, DebuggerMessage.Message.Function.glCompressedTexImage2D), - glCompressedTexSubImage2D(22, DebuggerMessage.Message.Function.glCompressedTexSubImage2D), - glCopyTexImage2D(23, DebuggerMessage.Message.Function.glCopyTexImage2D), - glCopyTexSubImage2D(24, DebuggerMessage.Message.Function.glCopyTexSubImage2D), - glCreateProgram(25, DebuggerMessage.Message.Function.glCreateProgram), - glCreateShader(26, DebuggerMessage.Message.Function.glCreateShader), - glCullFace(27, DebuggerMessage.Message.Function.glCullFace), - glDeleteBuffers(28, DebuggerMessage.Message.Function.glDeleteBuffers), - glDeleteFramebuffers(29, DebuggerMessage.Message.Function.glDeleteFramebuffers), - glDeleteProgram(30, DebuggerMessage.Message.Function.glDeleteProgram), - glDeleteRenderbuffers(31, DebuggerMessage.Message.Function.glDeleteRenderbuffers), - glDeleteShader(32, DebuggerMessage.Message.Function.glDeleteShader), - glDeleteTextures(33, DebuggerMessage.Message.Function.glDeleteTextures), - glDepthFunc(34, DebuggerMessage.Message.Function.glDepthFunc), - glDepthMask(35, DebuggerMessage.Message.Function.glDepthMask), - glDepthRangef(36, DebuggerMessage.Message.Function.glDepthRangef), - glDetachShader(37, DebuggerMessage.Message.Function.glDetachShader), - glDisable(38, DebuggerMessage.Message.Function.glDisable), - glDisableVertexAttribArray(39, DebuggerMessage.Message.Function.glDisableVertexAttribArray), - glDrawArrays(40, DebuggerMessage.Message.Function.glDrawArrays), - glDrawElements(41, DebuggerMessage.Message.Function.glDrawElements), - glEnable(42, DebuggerMessage.Message.Function.glEnable), - glEnableVertexAttribArray(43, DebuggerMessage.Message.Function.glEnableVertexAttribArray), - glFinish(44, DebuggerMessage.Message.Function.glFinish), - glFlush(45, DebuggerMessage.Message.Function.glFlush), - glFramebufferRenderbuffer(46, DebuggerMessage.Message.Function.glFramebufferRenderbuffer), - glFramebufferTexture2D(47, DebuggerMessage.Message.Function.glFramebufferTexture2D), - glFrontFace(48, DebuggerMessage.Message.Function.glFrontFace), - glGenBuffers(49, DebuggerMessage.Message.Function.glGenBuffers), - glGenerateMipmap(50, DebuggerMessage.Message.Function.glGenerateMipmap), - glGenFramebuffers(51, DebuggerMessage.Message.Function.glGenFramebuffers), - glGenRenderbuffers(52, DebuggerMessage.Message.Function.glGenRenderbuffers), - glGenTextures(53, DebuggerMessage.Message.Function.glGenTextures), - glGetActiveAttrib(54, DebuggerMessage.Message.Function.glGetActiveAttrib), - glGetActiveUniform(55, DebuggerMessage.Message.Function.glGetActiveUniform), - glGetAttachedShaders(56, DebuggerMessage.Message.Function.glGetAttachedShaders), - glGetAttribLocation(57, DebuggerMessage.Message.Function.glGetAttribLocation), - glGetBooleanv(58, DebuggerMessage.Message.Function.glGetBooleanv), - glGetBufferParameteriv(59, DebuggerMessage.Message.Function.glGetBufferParameteriv), - glGetError(60, DebuggerMessage.Message.Function.glGetError), - glGetFloatv(61, DebuggerMessage.Message.Function.glGetFloatv), - glGetFramebufferAttachmentParameteriv(62, DebuggerMessage.Message.Function.glGetFramebufferAttachmentParameteriv), - glGetIntegerv(63, DebuggerMessage.Message.Function.glGetIntegerv), - glGetProgramiv(64, DebuggerMessage.Message.Function.glGetProgramiv), - glGetProgramInfoLog(65, DebuggerMessage.Message.Function.glGetProgramInfoLog), - glGetRenderbufferParameteriv(66, DebuggerMessage.Message.Function.glGetRenderbufferParameteriv), - glGetShaderiv(67, DebuggerMessage.Message.Function.glGetShaderiv), - glGetShaderInfoLog(68, DebuggerMessage.Message.Function.glGetShaderInfoLog), - glGetShaderPrecisionFormat(69, DebuggerMessage.Message.Function.glGetShaderPrecisionFormat), - glGetShaderSource(70, DebuggerMessage.Message.Function.glGetShaderSource), - glGetString(71, DebuggerMessage.Message.Function.glGetString), - glGetTexParameterfv(72, DebuggerMessage.Message.Function.glGetTexParameterfv), - glGetTexParameteriv(73, DebuggerMessage.Message.Function.glGetTexParameteriv), - glGetUniformfv(74, DebuggerMessage.Message.Function.glGetUniformfv), - glGetUniformiv(75, DebuggerMessage.Message.Function.glGetUniformiv), - glGetUniformLocation(76, DebuggerMessage.Message.Function.glGetUniformLocation), - glGetVertexAttribfv(77, DebuggerMessage.Message.Function.glGetVertexAttribfv), - glGetVertexAttribiv(78, DebuggerMessage.Message.Function.glGetVertexAttribiv), - glGetVertexAttribPointerv(79, DebuggerMessage.Message.Function.glGetVertexAttribPointerv), - glHint(80, DebuggerMessage.Message.Function.glHint), - glIsBuffer(81, DebuggerMessage.Message.Function.glIsBuffer), - glIsEnabled(82, DebuggerMessage.Message.Function.glIsEnabled), - glIsFramebuffer(83, DebuggerMessage.Message.Function.glIsFramebuffer), - glIsProgram(84, DebuggerMessage.Message.Function.glIsProgram), - glIsRenderbuffer(85, DebuggerMessage.Message.Function.glIsRenderbuffer), - glIsShader(86, DebuggerMessage.Message.Function.glIsShader), - glIsTexture(87, DebuggerMessage.Message.Function.glIsTexture), - glLineWidth(88, DebuggerMessage.Message.Function.glLineWidth), - glLinkProgram(89, DebuggerMessage.Message.Function.glLinkProgram), - glPixelStorei(90, DebuggerMessage.Message.Function.glPixelStorei), - glPolygonOffset(91, DebuggerMessage.Message.Function.glPolygonOffset), - glReadPixels(92, DebuggerMessage.Message.Function.glReadPixels), - glReleaseShaderCompiler(93, DebuggerMessage.Message.Function.glReleaseShaderCompiler), - glRenderbufferStorage(94, DebuggerMessage.Message.Function.glRenderbufferStorage), - glSampleCoverage(95, DebuggerMessage.Message.Function.glSampleCoverage), - glScissor(96, DebuggerMessage.Message.Function.glScissor), - glShaderBinary(97, DebuggerMessage.Message.Function.glShaderBinary), - glShaderSource(98, DebuggerMessage.Message.Function.glShaderSource), - glStencilFunc(99, DebuggerMessage.Message.Function.glStencilFunc), - glStencilFuncSeparate(100, DebuggerMessage.Message.Function.glStencilFuncSeparate), - glStencilMask(101, DebuggerMessage.Message.Function.glStencilMask), - glStencilMaskSeparate(102, DebuggerMessage.Message.Function.glStencilMaskSeparate), - glStencilOp(103, DebuggerMessage.Message.Function.glStencilOp), - glStencilOpSeparate(104, DebuggerMessage.Message.Function.glStencilOpSeparate), - glTexImage2D(105, DebuggerMessage.Message.Function.glTexImage2D), - glTexParameterf(106, DebuggerMessage.Message.Function.glTexParameterf), - glTexParameterfv(107, DebuggerMessage.Message.Function.glTexParameterfv), - glTexParameteri(108, DebuggerMessage.Message.Function.glTexParameteri), - glTexParameteriv(109, DebuggerMessage.Message.Function.glTexParameteriv), - glTexSubImage2D(110, DebuggerMessage.Message.Function.glTexSubImage2D), - glUniform1f(111, DebuggerMessage.Message.Function.glUniform1f), - glUniform1fv(112, DebuggerMessage.Message.Function.glUniform1fv), - glUniform1i(113, DebuggerMessage.Message.Function.glUniform1i), - glUniform1iv(114, DebuggerMessage.Message.Function.glUniform1iv), - glUniform2f(115, DebuggerMessage.Message.Function.glUniform2f), - glUniform2fv(116, DebuggerMessage.Message.Function.glUniform2fv), - glUniform2i(117, DebuggerMessage.Message.Function.glUniform2i), - glUniform2iv(118, DebuggerMessage.Message.Function.glUniform2iv), - glUniform3f(119, DebuggerMessage.Message.Function.glUniform3f), - glUniform3fv(120, DebuggerMessage.Message.Function.glUniform3fv), - glUniform3i(121, DebuggerMessage.Message.Function.glUniform3i), - glUniform3iv(122, DebuggerMessage.Message.Function.glUniform3iv), - glUniform4f(123, DebuggerMessage.Message.Function.glUniform4f), - glUniform4fv(124, DebuggerMessage.Message.Function.glUniform4fv), - glUniform4i(125, DebuggerMessage.Message.Function.glUniform4i), - glUniform4iv(126, DebuggerMessage.Message.Function.glUniform4iv), - glUniformMatrix2fv(127, DebuggerMessage.Message.Function.glUniformMatrix2fv), - glUniformMatrix3fv(128, DebuggerMessage.Message.Function.glUniformMatrix3fv), - glUniformMatrix4fv(129, DebuggerMessage.Message.Function.glUniformMatrix4fv), - glUseProgram(130, DebuggerMessage.Message.Function.glUseProgram), - glValidateProgram(131, DebuggerMessage.Message.Function.glValidateProgram), - glVertexAttrib1f(132, DebuggerMessage.Message.Function.glVertexAttrib1f), - glVertexAttrib1fv(133, DebuggerMessage.Message.Function.glVertexAttrib1fv), - glVertexAttrib2f(134, DebuggerMessage.Message.Function.glVertexAttrib2f), - glVertexAttrib2fv(135, DebuggerMessage.Message.Function.glVertexAttrib2fv), - glVertexAttrib3f(136, DebuggerMessage.Message.Function.glVertexAttrib3f), - glVertexAttrib3fv(137, DebuggerMessage.Message.Function.glVertexAttrib3fv), - glVertexAttrib4f(138, DebuggerMessage.Message.Function.glVertexAttrib4f), - glVertexAttrib4fv(139, DebuggerMessage.Message.Function.glVertexAttrib4fv), - glVertexAttribPointer(140, DebuggerMessage.Message.Function.glVertexAttribPointer), - glViewport(141, DebuggerMessage.Message.Function.glViewport), - ; - - public final int index; - public final DebuggerMessage.Message.Function function; - - GLFunction(final int index, final DebuggerMessage.Message.Function function) { - this.index = index; - this.function = function; - } -} \ No newline at end of file diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/MessageQueue.java b/tools/glesv2debugger/src/com/android/glesv2debugger/MessageQueue.java index e6a036f0d..302f3f768 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/MessageQueue.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/MessageQueue.java @@ -30,18 +30,25 @@ import java.net.Socket; import java.nio.ByteOrder; import java.util.ArrayList; +abstract interface ProcessMessage { + abstract boolean processMessage(final MessageQueue queue, final Message msg) + throws IOException; +} + public class MessageQueue implements Runnable { private boolean running = false; private ByteOrder byteOrder; private FileInputStream file; // if null, create and use socket - private Thread thread = null; + Thread thread = null; + private final ProcessMessage[] processes; private ArrayList complete = new ArrayList(); // synchronized private ArrayList commands = new ArrayList(); // synchronized private SampleView sampleView; - public MessageQueue(SampleView sampleView) { + public MessageQueue(SampleView sampleView, final ProcessMessage[] processes) { this.sampleView = sampleView; + this.processes = processes; } public void start(final ByteOrder byteOrder, final FileInputStream file) { @@ -182,15 +189,15 @@ public class MessageQueue implements Runnable { partials.remove(contextId); assert msg != null; assert msg.getType() == Type.BeforeCall; - synchronized (complete) { - complete.add(msg); - } + if (msg != null) + synchronized (complete) { + complete.add(msg); + } } // can be used by other message processor as default processor void defaultProcessMessage(final Message msg, boolean expectResponse, - boolean sendResponse) - throws IOException { + boolean sendResponse) throws IOException { final int contextId = msg.getContextId(); if (msg.getType() == Type.BeforeCall) { if (sendResponse) { @@ -296,13 +303,11 @@ public class MessageQueue implements Runnable { private void processMessage(final DataOutputStream dos, final Message msg) throws IOException { if (msg.getExpectResponse()) { - assert file == null; // file cannot be interactive mode - if (sampleView.shaderEditor.processMessage(this, msg)) - return; - else if (sampleView.breakpointOption.processMessage(this, msg)) - return; - else - defaultProcessMessage(msg, msg.getExpectResponse(), msg.getExpectResponse()); + assert dos != null; // readonly source cannot expectResponse + for (ProcessMessage process : processes) + if (process.processMessage(this, msg)) + return; + defaultProcessMessage(msg, msg.getExpectResponse(), msg.getExpectResponse()); } else defaultProcessMessage(msg, msg.getExpectResponse(), msg.getExpectResponse()); } diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java b/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java index 99ef40b4d..0579f63f1 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/SampleView.java @@ -93,12 +93,10 @@ public class SampleView extends ViewPart implements Runnable, SelectionListener boolean running = false; Thread thread; - MessageQueue messageQueue = new MessageQueue(this); + MessageQueue messageQueue; SparseArray debugContexts = new SparseArray(); - /** - * The ID of the view as specified by the extension. - */ + /** The ID of the view as specified by the extension. */ public static final String ID = "glesv2debuggerclient.views.SampleView"; TabFolder tabFolder; @@ -391,6 +389,10 @@ public class SampleView extends ViewPart implements Runnable, SelectionListener hookContextMenu(); hookSelectionChanged(); contributeToActionBars(); + + messageQueue = new MessageQueue(this, new ProcessMessage[] { + breakpointOption, shaderEditor + }); } private void hookContextMenu() { diff --git a/tools/glesv2debugger/src/com/android/glesv2debugger/ShaderEditor.java b/tools/glesv2debugger/src/com/android/glesv2debugger/ShaderEditor.java index 72a6f9b7d..cdd55c2f9 100644 --- a/tools/glesv2debugger/src/com/android/glesv2debugger/ShaderEditor.java +++ b/tools/glesv2debugger/src/com/android/glesv2debugger/ShaderEditor.java @@ -46,7 +46,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; -public class ShaderEditor extends Composite implements SelectionListener, ExtendedModifyListener { +public class ShaderEditor extends Composite implements SelectionListener, ExtendedModifyListener, + ProcessMessage { SampleView sampleView; ToolBar toolbar; @@ -173,6 +174,7 @@ public class ShaderEditor extends Composite implements SelectionListener, Extend styledText.setLineBackground(ln - 1, 1, new Color(Display.getCurrent(), 255, 230, 230)); } + file.delete(); if (infolog.length() > 0) { if (!MessageDialog.openConfirm(getShell(), "Shader Syntax Error, Continue?", infolog)) diff --git a/tools/glesv2debugger/test/com/android/glesv2debugger/MessageQueueTest.java b/tools/glesv2debugger/test/com/android/glesv2debugger/MessageQueueTest.java new file mode 100644 index 000000000..5f8e93d87 --- /dev/null +++ b/tools/glesv2debugger/test/com/android/glesv2debugger/MessageQueueTest.java @@ -0,0 +1,183 @@ +/* + ** 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 static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import com.android.glesv2debugger.DebuggerMessage.Message; +import com.android.glesv2debugger.DebuggerMessage.Message.Function; +import com.android.glesv2debugger.DebuggerMessage.Message.Type; + +import org.junit.Before; +import org.junit.Test; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteOrder; + +public class MessageQueueTest { + private MessageQueue queue; + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + queue = new MessageQueue(null, new ProcessMessage[0]); + } + + /** + * Test method for + * {@link com.android.glesv2debugger.MessageQueue#defaultProcessMessage(com.android.glesv2debugger.DebuggerMessage.Message, boolean, boolean)} + * . + * + * @throws IOException + */ + @Test + public void testDefaultProcessMessage() throws IOException { + final int contextId = 8784; + assertNull(queue.getPartialMessage(contextId)); + Message.Builder builder = Message.newBuilder(); + builder.setContextId(contextId); + builder.setExpectResponse(false); + builder.setFunction(Function.glFinish); + builder.setType(Type.BeforeCall); + Message msg = builder.build(); + queue.defaultProcessMessage(msg, false, false); + assertNotNull(queue.getPartialMessage(contextId)); + + builder = msg.toBuilder(); + builder.setType(Type.AfterCall); + builder.setTime(5); + msg = builder.build(); + queue.defaultProcessMessage(msg, false, false); + assertNull(queue.getPartialMessage(contextId)); + Message complete = queue.removeCompleteMessage(contextId); + assertNotNull(complete); + assertEquals(contextId, complete.getContextId()); + assertEquals(msg.getFunction(), complete.getFunction()); + assertEquals(msg.getTime(), complete.getTime(), 0); + assertEquals(Type.CompleteCall, complete.getType()); + + // an already complete message should just be added to complete queue + queue.defaultProcessMessage(complete, false, false); + assertNull(queue.getPartialMessage(contextId)); + complete = queue.removeCompleteMessage(contextId); + assertNotNull(complete); + assertEquals(contextId, complete.getContextId()); + assertEquals(msg.getFunction(), complete.getFunction()); + assertEquals(msg.getTime(), complete.getTime(), 0); + assertEquals(Type.CompleteCall, complete.getType()); + } + + @Test + public void testCompletePartialMessage() throws IOException { + final int contextId = 8784; + assertNull(queue.getPartialMessage(contextId)); + Message.Builder builder = Message.newBuilder(); + builder.setContextId(contextId); + builder.setExpectResponse(false); + builder.setFunction(Function.glFinish); + builder.setType(Type.BeforeCall); + Message msg = builder.build(); + queue.defaultProcessMessage(msg, false, false); + assertNotNull(queue.getPartialMessage(contextId)); + queue.completePartialMessage(contextId); + + final Message complete = queue.removeCompleteMessage(contextId); + assertNotNull(complete); + assertEquals(contextId, complete.getContextId()); + assertEquals(msg.getFunction(), complete.getFunction()); + assertEquals(msg.getTime(), complete.getTime(), 0); + assertEquals(Type.BeforeCall, complete.getType()); + } + + /** Write two messages from two contexts to file and test handling them */ + @Test + public void testRunWithFile() throws FileNotFoundException, IOException, InterruptedException { + final File filePath = File.createTempFile("test", ".gles2dbg"); + DataOutputStream file = new DataOutputStream(new FileOutputStream(filePath)); + Message.Builder builder = Message.newBuilder(); + final int contextId0 = 521643, contextId1 = 87634; + assertNull(queue.removeCompleteMessage(contextId0)); + assertNull(queue.removeCompleteMessage(contextId1)); + + builder.setContextId(contextId0).setExpectResponse(false).setType(Type.BeforeCall); + builder.setFunction(Function.glClear).setArg0(contextId0); + Message msg0 = builder.build(); + byte[] data = msg0.toByteArray(); + file.writeInt(data.length); + file.write(data); + + builder = Message.newBuilder(); + builder.setContextId(contextId1).setExpectResponse(false).setType(Type.BeforeCall); + builder.setFunction(Function.glDisable).setArg0(contextId1); + Message msg1 = builder.build(); + data = msg1.toByteArray(); + file.writeInt(data.length); + file.write(data); + + builder = Message.newBuilder(); + msg0 = builder.setContextId(msg0.getContextId()).setExpectResponse(false) + .setType(Type.AfterCall).setFunction(msg0.getFunction()).setTime(2).build(); + data = msg0.toByteArray(); + file.writeInt(data.length); + file.write(data); + + builder = Message.newBuilder(); + msg1 = builder.setContextId(msg1.getContextId()).setExpectResponse(false) + .setType(Type.AfterCall).setFunction(msg1.getFunction()).setTime(465).build(); + data = msg1.toByteArray(); + file.writeInt(data.length); + file.write(data); + + file.close(); + + FileInputStream fis = new FileInputStream(filePath); + // Java VM uses big endian, so the file was written in big endian + queue.start(ByteOrder.BIG_ENDIAN, fis); + queue.thread.join(); + + Message complete0 = queue.removeCompleteMessage(msg0.getContextId()); + assertNotNull(complete0); + assertNull(queue.removeCompleteMessage(contextId0)); + assertEquals(contextId0, complete0.getContextId()); + assertEquals(false, complete0.getExpectResponse()); + assertEquals(Type.CompleteCall, complete0.getType()); + assertEquals(msg0.getFunction(), complete0.getFunction()); + assertEquals(contextId0, complete0.getArg0()); + assertEquals(msg0.getTime(), complete0.getTime(), 0); + + Message complete1 = queue.removeCompleteMessage(msg1.getContextId()); + assertNotNull(complete1); + assertNull(queue.removeCompleteMessage(contextId1)); + assertEquals(contextId1, complete1.getContextId()); + assertEquals(false, complete1.getExpectResponse()); + assertEquals(Type.CompleteCall, complete1.getType()); + assertEquals(msg1.getFunction(), complete1.getFunction()); + assertEquals(contextId1, complete1.getArg0()); + assertEquals(msg1.getTime(), complete1.getTime(), 0); + + filePath.delete(); + } +}