aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateContentProvider.java (renamed from eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateContentProvider.java)4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateLabelProvider.java (renamed from eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateLabelProvider.java)4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java221
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java84
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java9
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLPropertyAccessor.java15
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java12
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateTransform.java18
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateView.java173
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java87
14 files changed, 362 insertions, 279 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
index 6c1e134..798175b 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
@@ -25,9 +25,9 @@
</view>
<view
category="com.android.ide.eclipse.gltrace"
- class="com.android.ide.eclipse.gltrace.views.GLStateView"
+ class="com.android.ide.eclipse.gltrace.views.StateView"
icon="icons/opengl.png"
- id="com.android.ide.eclipse.gltrace.views.GLState"
+ id="com.android.ide.eclipse.gltrace.views.State"
name="GL State"
restorable="true">
</view>
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
index fee40a1..6f4ee7e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
@@ -17,7 +17,7 @@
package com.android.ide.eclipse.gltrace;
import com.android.ide.eclipse.gltrace.views.GLFramebufferView;
-import com.android.ide.eclipse.gltrace.views.GLStateView;
+import com.android.ide.eclipse.gltrace.views.StateView;
import org.eclipse.ui.IFolderLayout;
import org.eclipse.ui.IPageLayout;
@@ -32,7 +32,7 @@ public class GLTracePerspective implements IPerspectiveFactory {
// Add the OpenGL state view to the right of the editor
IFolderLayout right = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.7f,
layout.getEditorArea());
- right.addView(GLStateView.ID);
+ right.addView(StateView.ID);
// Add the OpenGL Framebuffer view below the state view
IFolderLayout rightBottom = layout.createFolder(FB_FOLDER_ID, IPageLayout.BOTTOM, 0.6f,
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
index 476e334..96eb3a9 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/GLFunctionTraceViewer.java
@@ -534,4 +534,8 @@ public class GLFunctionTraceViewer extends EditorPart implements ISelectionProvi
public GLTrace getTrace() {
return mTrace;
}
+
+ public StateViewPage getStateViewPage() {
+ return new StateViewPage(mTrace);
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateContentProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateContentProvider.java
index e0aac50..f24c799 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateContentProvider.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateContentProvider.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.ide.eclipse.gltrace.views;
+package com.android.ide.eclipse.gltrace.editors;
import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
import com.android.ide.eclipse.gltrace.state.GLListProperty;
@@ -23,7 +23,7 @@ import com.android.ide.eclipse.gltrace.state.IGLProperty;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
-public class GLStateContentProvider implements ITreeContentProvider {
+public class StateContentProvider implements ITreeContentProvider {
@Override
public void dispose() {
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateLabelProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateLabelProvider.java
index e13daa7..611ecaf 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateLabelProvider.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateLabelProvider.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.ide.eclipse.gltrace.views;
+package com.android.ide.eclipse.gltrace.editors;
import com.android.ide.eclipse.gltrace.state.GLListProperty;
import com.android.ide.eclipse.gltrace.state.IGLProperty;
@@ -23,7 +23,7 @@ import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
-public class GLStateLabelProvider extends LabelProvider implements ITableLabelProvider {
+public class StateLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
new file mode 100644
index 0000000..2478288
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 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.ide.eclipse.gltrace.editors;
+
+import com.android.ide.eclipse.gltrace.model.GLCall;
+import com.android.ide.eclipse.gltrace.model.GLTrace;
+import com.android.ide.eclipse.gltrace.state.GLState;
+import com.android.ide.eclipse.gltrace.state.GLStateTransform;
+import com.android.ide.eclipse.gltrace.state.IGLProperty;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A tree view of the OpenGL state. It listens to the current GLCall that is selected
+ * in the Function Trace view, and updates its view to reflect the state as of the selected call.
+ */
+public class StateViewPage extends Page implements ISelectionListener {
+ public static final String ID = "com.android.ide.eclipse.gltrace.views.GLState"; //$NON-NLS-1$
+ private TreeViewer mTreeViewer;
+
+ private final List<GLCall> mGLCalls;
+
+ /** OpenGL State as of call {@link #mCurrentStateIndex}. */
+ private final IGLProperty mState;
+ private int mCurrentStateIndex;
+
+ private String[] TREE_PROPERTIES = { "Name", "Value" };
+
+ public StateViewPage(GLTrace trace) {
+ mGLCalls = trace.getGLCalls();
+
+ mState = GLState.createDefaultState(trace.getContexts().size());
+ mCurrentStateIndex = 0;
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ final Tree tree = new Tree(parent, SWT.VIRTUAL | SWT.H_SCROLL | SWT.V_SCROLL);
+ tree.setHeaderVisible(true);
+ tree.setLinesVisible(true);
+ tree.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ TreeColumn col1 = new TreeColumn(tree, SWT.LEFT);
+ col1.setText(TREE_PROPERTIES[0]);
+ col1.setWidth(200);
+
+ TreeColumn col2 = new TreeColumn(tree, SWT.LEFT);
+ col2.setText(TREE_PROPERTIES[1]);
+ col2.setWidth(200);
+
+ mTreeViewer = new TreeViewer(tree);
+ mTreeViewer.setContentProvider(new StateContentProvider());
+ mTreeViewer.setLabelProvider(new StateLabelProvider());
+ mTreeViewer.setInput(mState);
+ mTreeViewer.refresh();
+ }
+
+ @Override
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ pageSite.getPage().addSelectionListener(this);
+ }
+
+ @Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (!(part instanceof GLFunctionTraceViewer)) {
+ return;
+ }
+
+ if (!(selection instanceof IStructuredSelection)) {
+ return;
+ }
+
+ GLCall selectedCall = null;
+
+ IStructuredSelection ssel = (IStructuredSelection) selection;
+ if (ssel.toList().size() > 0) {
+ Object data = ssel.toList().get(0);
+ if (data instanceof GLCall) {
+ selectedCall = (GLCall) data;
+ }
+ }
+
+ if (selectedCall == null) {
+ return;
+ }
+
+ if (selectedCall.getIndex() != mCurrentStateIndex) {
+ final Set<IGLProperty> changedProperties = updateState(mCurrentStateIndex,
+ selectedCall.getIndex());
+ mCurrentStateIndex = selectedCall.getIndex();
+
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ mTreeViewer.update(changedProperties.toArray(), TREE_PROPERTIES);
+ }
+ });
+ }
+ }
+
+ @Override
+ public Control getControl() {
+ if (mTreeViewer == null) {
+ return null;
+ }
+
+ return mTreeViewer.getControl();
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ /**
+ * Update GL state from GL call at fromIndex to the call at toIndex.
+ * If fromIndex < toIndex, the GL state will be updated by applying all the transformations
+ * corresponding to calls from (fromIndex + 1) to toIndex (inclusive).
+ * If fromIndex > toIndex, the GL state will be updated by reverting all the calls from
+ * fromIndex (inclusive) to (toIndex + 1).
+ * @return GL state properties that changed as a result of this update.
+ */
+ private Set<IGLProperty> updateState(int fromIndex, int toIndex) {
+ assert fromIndex >= 0 && fromIndex < mGLCalls.size();
+ assert toIndex >= 0 && toIndex < mGLCalls.size();
+
+ if (fromIndex < toIndex) {
+ return applyTransformations(fromIndex, toIndex);
+ } else if (fromIndex > toIndex) {
+ return revertTransformations(fromIndex, toIndex);
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+ private Set<IGLProperty> applyTransformations(int fromIndex, int toIndex) {
+ int setSizeHint = 3 * (toIndex - fromIndex) + 10;
+ Set<IGLProperty> changedProperties = new HashSet<IGLProperty>(setSizeHint);
+
+ for (int i = fromIndex + 1; i <= toIndex; i++) {
+ for (GLStateTransform f : mGLCalls.get(i).getStateTransformations()) {
+ f.apply(mState);
+
+ IGLProperty changedProperty = f.getChangedProperty(mState);
+ if (changedProperty != null) {
+ changedProperties.addAll(getHierarchy(changedProperty));
+ }
+ }
+ }
+
+ return changedProperties;
+ }
+
+ private Set<IGLProperty> revertTransformations(int fromIndex, int toIndex) {
+ int setSizeHint = 3 * (fromIndex - toIndex) + 10;
+ Set<IGLProperty> changedProperties = new HashSet<IGLProperty>(setSizeHint);
+
+ for (int i = fromIndex; i > toIndex; i--) {
+ for (GLStateTransform f : mGLCalls.get(i).getStateTransformations()) {
+ f.revert(mState);
+
+ IGLProperty changedProperty = f.getChangedProperty(mState);
+ if (changedProperty != null) {
+ changedProperties.addAll(getHierarchy(changedProperty));
+ }
+ }
+ }
+
+ return changedProperties;
+ }
+
+ /**
+ * Obtain the list of properties starting from the provided property up to
+ * the root of GL state.
+ */
+ private List<IGLProperty> getHierarchy(IGLProperty changedProperty) {
+ List<IGLProperty> changedProperties = new ArrayList<IGLProperty>(5);
+ changedProperties.add(changedProperty);
+
+ // add the entire parent chain until we reach the root
+ IGLProperty prop = changedProperty;
+ while ((prop = prop.getParent()) != null) {
+ changedProperties.add(prop);
+ }
+
+ return changedProperties;
+ }
+}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java
index 57256e9..dd675fe 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java
@@ -20,9 +20,6 @@ import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
import com.android.ide.eclipse.gltrace.ProtoBufUtils;
import com.android.ide.eclipse.gltrace.TraceFileInfo;
import com.android.ide.eclipse.gltrace.TraceFileReader;
-import com.android.ide.eclipse.gltrace.state.GLState;
-import com.android.ide.eclipse.gltrace.state.GLStateTransform;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
@@ -32,9 +29,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
/** GLTrace is the in memory model of a OpenGL trace file. */
public class GLTrace {
@@ -52,19 +47,12 @@ public class GLTrace {
/** List of context ids used by the application. */
private List<Integer> mContextIds;
- /** OpenGL State as of call {@link #mCurrentStateIndex}. */
- private IGLProperty mState;
- private int mCurrentStateIndex;
-
public GLTrace(TraceFileInfo traceFileInfo, List<GLFrame> glFrames, List<GLCall> glCalls,
List<Integer> contextIds) {
mTraceFileInfo = traceFileInfo;
mGLFrames = glFrames;
mGLCalls = glCalls;
mContextIds = contextIds;
-
- mState = GLState.createDefaultState();
- mCurrentStateIndex = -1;
}
public List<GLFrame> getFrames() {
@@ -90,78 +78,6 @@ public class GLTrace {
return mGLCalls.subList(start, end);
}
- public IGLProperty getStateAt(GLCall call) {
- if (call == null) {
- return null;
- }
-
- int callIndex = call.getIndex();
- if (callIndex == mCurrentStateIndex) {
- return mState;
- }
-
- if (callIndex > mCurrentStateIndex) {
- // if the state is needed for a future GLCall, then apply the transformations
- // for all the GLCall's upto and including the required GLCall
- for (int i = mCurrentStateIndex + 1; i <= callIndex; i++) {
- for (GLStateTransform f : mGLCalls.get(i).getStateTransformations()) {
- f.apply(mState);
- }
- }
-
- mCurrentStateIndex = callIndex;
- return mState;
- }
-
- // if the state is needed for a call that is before the current index,
- // then revert the transformations until we reach the required call
- for (int i = mCurrentStateIndex; i > callIndex; i--) {
- for (GLStateTransform f : mGLCalls.get(i).getStateTransformations()) {
- f.revert(mState);
- }
- }
-
- mCurrentStateIndex = callIndex;
- return mState;
- }
-
- /**
- * Gets the set of properties in the provided OpenGL state that are affected by
- * changing state from one GL call to another.
- */
- public Set<IGLProperty> getChangedProperties(GLCall from, GLCall to, IGLProperty state) {
- int fromIndex = from == null ? 0 : from.getIndex();
- int toIndex = to == null ? 0 : to.getIndex();
-
- if (fromIndex == -1 || toIndex == -1) {
- return null;
- }
-
- int setSizeHint = 3 * Math.abs(fromIndex - toIndex) + 10;
- Set<IGLProperty> changedProperties = new HashSet<IGLProperty>(setSizeHint);
-
- for (int i = Math.min(fromIndex, toIndex); i <= Math.max(fromIndex, toIndex); i++) {
- for (GLStateTransform f : mGLCalls.get(i).getStateTransformations()) {
- IGLProperty changedProperty = f.getChangedProperty(state);
- if (changedProperty == null) {
- continue;
- }
-
- // add the property that is affected
- changedProperties.add(changedProperty);
-
- // also add its entire parent chain until we reach the root
- IGLProperty parent = changedProperty.getParent();
- while (parent != null) {
- changedProperties.add(parent);
- parent = parent.getParent();
- }
- }
- }
-
- return changedProperties;
- }
-
public Image getImage(GLCall c) {
if (!c.hasFb()) {
return null;
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java
index 6c5455a..b4b1898 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLListProperty.java
@@ -26,6 +26,7 @@ public class GLListProperty implements IGLProperty {
private final List<IGLProperty> mList;
private final GLStateType mType;
private IGLProperty mParent;
+ private IGLProperty mTemplate;
/**
* Construct a list of properties of given size from the provided template.
@@ -34,6 +35,7 @@ public class GLListProperty implements IGLProperty {
*/
public GLListProperty(GLStateType type, IGLProperty template, int size) {
mType = type;
+ mTemplate = template;
mList = new ArrayList<IGLProperty>(size);
for (int i = 0; i < size; i++) {
@@ -62,10 +64,17 @@ public class GLListProperty implements IGLProperty {
}
public void set(int index, IGLProperty property) {
+ ensureCapacity(index + 1);
mList.set(index, property);
property.setParent(this);
}
+ private void ensureCapacity(int capactiy) {
+ for (int i = mList.size(); i < capactiy; i++) {
+ mList.add(mTemplate);
+ }
+ }
+
@Override
public GLListProperty clone() {
List<IGLProperty> props = new ArrayList<IGLProperty>(
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLPropertyAccessor.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLPropertyAccessor.java
index fb0c84c..afc7230 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLPropertyAccessor.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLPropertyAccessor.java
@@ -24,13 +24,17 @@ import java.util.List;
* OpenGL State hierarchy.
*/
public class GLPropertyAccessor {
- private List<GLPropertyExtractor> mExtractors;
+ private final int mContextId;
+ private final List<GLPropertyExtractor> mExtractors;
- private GLPropertyAccessor(List<GLPropertyExtractor> extractors) {
+ private GLPropertyAccessor(int contextId, List<GLPropertyExtractor> extractors) {
+ mContextId = contextId;
mExtractors = extractors;
}
- public IGLProperty getProperty(IGLProperty root) {
+ public IGLProperty getProperty(IGLProperty state) {
+ IGLProperty root = ((GLListProperty) state).get(mContextId);
+
for (GLPropertyExtractor e : mExtractors) {
IGLProperty successor = e.getProperty(root);
if (successor == null) {
@@ -44,12 +48,13 @@ public class GLPropertyAccessor {
/**
* Factory method used to construct a {@link GLPropertyAccessor}.
+ * @param contextId id of affected context
* @param accessors list of accessor's to be used to navigate the property hierarchy. The
* accessors are either Integers or {@link GLStateType} objects. Integers
* are assumed to be indexes in a {@link GLListProperty}, and the
* GLStateType enum objects are used to query {@link GLCompositeProperty}'s.
*/
- public static GLPropertyAccessor makeAccessor(Object...accessors) {
+ public static GLPropertyAccessor makeAccessor(int contextId, Object...accessors) {
List<GLPropertyExtractor> extractors = new ArrayList<GLPropertyExtractor>();
for (Object accessor : accessors) {
@@ -63,7 +68,7 @@ public class GLPropertyAccessor {
}
}
- return new GLPropertyAccessor(extractors);
+ return new GLPropertyAccessor(contextId, extractors);
}
private interface GLPropertyExtractor {
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java
index 0724e69..38ee7c7 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java
@@ -83,12 +83,18 @@ public class GLState {
return framebufferState;
}
- /** Construct the default OpenGL State hierarchy. */
- public static IGLProperty createDefaultState() {
+ public static IGLProperty createDefaultES2State() {
// TODO: Currently, this only models a tiny subset of the OpenGL state.
- GLCompositeProperty glState = new GLCompositeProperty(GLStateType.GL_STATE,
+ GLCompositeProperty glState = new GLCompositeProperty(GLStateType.GL_STATE_ES2,
sGLState.createVertexArrayData(),
sGLState.createFramebufferState());
return glState;
}
+
+ /** Construct the default OpenGL State hierarchy. */
+ public static IGLProperty createDefaultState(int numContexts) {
+ return new GLListProperty(GLStateType.GL_STATE,
+ createDefaultES2State(),
+ numContexts);
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateTransform.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateTransform.java
index 5ee8da6..93a44b6 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateTransform.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateTransform.java
@@ -95,31 +95,36 @@ public class GLStateTransform {
List<GLStateTransform> transforms = new ArrayList<GLStateTransform>();
transforms.add(new GLStateTransform(
- GLPropertyAccessor.makeAccessor(GLStateType.VERTEX_ARRAY_DATA,
+ GLPropertyAccessor.makeAccessor(msg.getContextId(),
+ GLStateType.VERTEX_ARRAY_DATA,
GLStateType.VERTEX_ATTRIB_ARRAY,
Integer.valueOf(index),
GLStateType.VERTEX_ATTRIB_ARRAY_SIZE),
Integer.valueOf(size)));
transforms.add(new GLStateTransform(
- GLPropertyAccessor.makeAccessor(GLStateType.VERTEX_ARRAY_DATA,
+ GLPropertyAccessor.makeAccessor(msg.getContextId(),
+ GLStateType.VERTEX_ARRAY_DATA,
GLStateType.VERTEX_ATTRIB_ARRAY,
Integer.valueOf(index),
GLStateType.VERTEX_ATTRIB_ARRAY_TYPE),
GLEnum.valueOf(type)));
transforms.add(new GLStateTransform(
- GLPropertyAccessor.makeAccessor(GLStateType.VERTEX_ARRAY_DATA,
+ GLPropertyAccessor.makeAccessor(msg.getContextId(),
+ GLStateType.VERTEX_ARRAY_DATA,
GLStateType.VERTEX_ATTRIB_ARRAY,
Integer.valueOf(index),
GLStateType.VERTEX_ATTRIB_ARRAY_NORMALIZED),
Boolean.valueOf(normalized)));
transforms.add(new GLStateTransform(
- GLPropertyAccessor.makeAccessor(GLStateType.VERTEX_ARRAY_DATA,
+ GLPropertyAccessor.makeAccessor(msg.getContextId(),
+ GLStateType.VERTEX_ARRAY_DATA,
GLStateType.VERTEX_ATTRIB_ARRAY,
Integer.valueOf(index),
GLStateType.VERTEX_ATTRIB_ARRAY_STRIDE),
Integer.valueOf(stride)));
transforms.add(new GLStateTransform(
- GLPropertyAccessor.makeAccessor(GLStateType.VERTEX_ARRAY_DATA,
+ GLPropertyAccessor.makeAccessor(msg.getContextId(),
+ GLStateType.VERTEX_ARRAY_DATA,
GLStateType.VERTEX_ATTRIB_ARRAY,
Integer.valueOf(index),
GLStateType.VERTEX_ATTRIB_ARRAY_POINTER),
@@ -131,7 +136,8 @@ public class GLStateTransform {
// void glBindFramebuffer(GLenum target, GLuint framebuffer);
int fb = msg.getArgs(1).getIntValue(0);
return Collections.singletonList(new GLStateTransform(
- GLPropertyAccessor.makeAccessor(GLStateType.FRAMEBUFFER_STATE,
+ GLPropertyAccessor.makeAccessor(msg.getContextId(),
+ GLStateType.FRAMEBUFFER_STATE,
GLStateType.FRAMEBUFFER_BINDING),
fb));
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java
index a4eb59d..f6d34d8 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStateType.java
@@ -21,6 +21,8 @@ public enum GLStateType {
// Note: the indentation reflects the state hierarchy.
GL_STATE("OpenGL State Variables"),
+ GL_STATE_ES1("OpenGL ES 1.1 State"),
+ GL_STATE_ES2("OpenGL ES 2.0 State"),
VERTEX_ARRAY_DATA("Vertex Array Data"),
VERTEX_ATTRIB_ARRAY("Vertex Attrib Array Properties"),
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateView.java
deleted file mode 100644
index 1275dae..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLStateView.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 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.ide.eclipse.gltrace.views;
-
-import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
-import com.android.ide.eclipse.gltrace.model.GLCall;
-import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.state.IGLProperty;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISelectionService;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.ViewPart;
-
-import java.util.Set;
-
-/**
- * A tree view of the OpenGL state. It listens to the current GLCall that is selected
- * in the Function Trace view, and updates its view to reflect the state as of the selected call.
- */
-public class GLStateView extends ViewPart implements ISelectionListener {
- public static final String ID = "com.android.ide.eclipse.gltrace.views.GLState"; //$NON-NLS-1$
- private TreeViewer mTreeViewer;
-
- private IGLProperty mState;
- private GLCall mCurrentGLCall;
-
- private Set<IGLProperty> mChangedProperties;
- private boolean mStateChanged;
-
- private String []TREE_PROPERTIES = { "Name", "Value" };
-
- public GLStateView() {
- mState = null;
- mCurrentGLCall = null;
- }
-
- @Override
- public void createPartControl(Composite parent) {
- Composite c = new Composite(parent, SWT.NONE);
- c.setLayout(new GridLayout(1, false));
- GridData gd = new GridData(GridData.FILL_BOTH);
- c.setLayoutData(gd);
-
- createStateTreeViewer(c);
-
- ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService();
- selectionService.addPostSelectionListener(this);
- }
-
- private void createStateTreeViewer(Composite parent) {
- final Tree tree = new Tree(parent, SWT.VIRTUAL);
- tree.setHeaderVisible(true);
- tree.setLinesVisible(true);
- tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-
- TreeColumn col1 = new TreeColumn(tree, SWT.LEFT);
- col1.setText(TREE_PROPERTIES[0]);
- col1.setWidth(200);
-
- TreeColumn col2 = new TreeColumn(tree, SWT.LEFT);
- col2.setText(TREE_PROPERTIES[1]);
- col2.setWidth(200);
-
- mTreeViewer = new TreeViewer(tree);
- mTreeViewer.setContentProvider(new GLStateContentProvider());
- mTreeViewer.setLabelProvider(new GLStateLabelProvider());
- }
-
- @Override
- public void dispose() {
- ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService();
- selectionService.removePostSelectionListener(this);
- super.dispose();
- }
-
- @Override
- public void setFocus() {
- }
-
- @Override
- public void selectionChanged(IWorkbenchPart part, ISelection selection) {
- if (!(part instanceof GLFunctionTraceViewer)) {
- return;
- }
-
- if (!(selection instanceof IStructuredSelection)) {
- return;
- }
-
- GLFunctionTraceViewer traceViewer = (GLFunctionTraceViewer) part;
- GLCall selectedCall = null;
-
- IStructuredSelection ssel = (IStructuredSelection) selection;
- if (ssel.toList().size() > 0) {
- Object data = ssel.toList().get(0);
- if (data instanceof GLCall) {
- selectedCall = (GLCall) data;
- }
- }
-
- GLTrace trace = traceViewer.getTrace();
- if (trace == null) {
- return;
- }
-
- if (selectedCall != mCurrentGLCall) {
- IGLProperty nextState = trace.getStateAt(selectedCall);
- if (nextState != mState) {
- mState = nextState;
- mStateChanged = true;
- } else {
- mStateChanged = false;
- }
-
- mChangedProperties = trace.getChangedProperties(mCurrentGLCall, selectedCall,
- mState);
-
- refreshUI();
- mCurrentGLCall = selectedCall;
- }
- }
-
- private void refreshUI() {
- Display.getDefault().syncExec(new Runnable() {
- @Override
- public void run() {
- if (mTreeViewer == null) {
- return;
- }
-
- if (mStateChanged) {
- // if the state has changed, provide the new input and refresh the entire tree
- mTreeViewer.setInput(mState);
- mTreeViewer.refresh();
- } else {
- if (mChangedProperties == null) {
- // refresh the entire tree if we cannot figure out exactly which properties
- // have changed
- mTreeViewer.refresh();
- } else {
- // only refresh the nodes that have changed
- mTreeViewer.update(mChangedProperties.toArray(), TREE_PROPERTIES);
- }
- }
- }
- });
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
new file mode 100644
index 0000000..cd7669d
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2012 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.ide.eclipse.gltrace.views;
+
+import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
+import com.android.ide.eclipse.gltrace.editors.StateViewPage;
+
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.part.MessagePage;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.PageBookView;
+
+/**
+ * The StateView shows the GL state for the current active {@link GLFunctionTraceViewer}.
+ * It behaves like the Eclipse Outline View: Each active editor provides the GL state content
+ * to show via a {@link StateViewPage}. This class simply acts as a stack view showing the
+ * state corresponding to whichever editor is active.
+ */
+public class StateView extends PageBookView {
+ public static final String ID = "com.android.ide.eclipse.gltrace.views.State"; //$NON-NLS-1$
+
+ @Override
+ protected IPage createDefaultPage(PageBook book) {
+ MessagePage page = new MessagePage();
+ initPage(page);
+ page.createControl(book);
+ page.setMessage("Open (or select) a GL Trace file to view the GL State.");
+ return page;
+ }
+
+ @Override
+ protected PageRec doCreatePage(IWorkbenchPart part) {
+ if (!(part instanceof GLFunctionTraceViewer)) {
+ return null;
+ }
+
+ GLFunctionTraceViewer viewer = (GLFunctionTraceViewer) part;
+ StateViewPage page = viewer.getStateViewPage();
+ initPage(page);
+ page.createControl(getPageBook());
+
+ return new PageRec(part, page);
+ }
+
+ @Override
+ protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
+ StateViewPage v = (StateViewPage) pageRecord.page;
+ v.dispose();
+ pageRecord.dispose();
+ }
+
+ @Override
+ protected IWorkbenchPart getBootstrapPart() {
+ IWorkbenchPage page = getSite().getPage();
+ if (page != null) {
+ return page.getActiveEditor();
+ }
+
+ return null;
+ }
+
+ @Override
+ protected boolean isImportant(IWorkbenchPart part) {
+ return part instanceof GLFunctionTraceViewer;
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPart part) {
+ partActivated(part);
+ }
+}