aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java228
1 files changed, 228 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java
new file mode 100644
index 000000000..56dc8e9ac
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTraceCollectorDialog.java
@@ -0,0 +1,228 @@
+/*
+ * 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;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ProgressBar;
+import org.eclipse.swt.widgets.Shell;
+
+import java.io.IOException;
+import java.text.DecimalFormat;
+
+/** Dialog displayed while the trace is being streamed from device to host. */
+public class GLTraceCollectorDialog extends TitleAreaDialog {
+ private static final String TITLE = "OpenGL ES Trace";
+ private static final String DEFAULT_MESSAGE = "Trace collection in progress.";
+ private static final DecimalFormat SIZE_FORMATTER = new DecimalFormat("#.##"); //$NON-NLS-1$
+
+ private TraceOptions mTraceOptions;
+ private final TraceFileWriter mTraceFileWriter;
+ private final TraceCommandWriter mTraceCommandWriter;
+
+ private Label mFramesCollectedLabel;
+ private Label mTraceFileSizeLabel;
+ private StatusRefreshTask mRefreshTask;
+
+ protected GLTraceCollectorDialog(Shell parentShell, TraceFileWriter traceFileWriter,
+ TraceCommandWriter traceCommandWriter, TraceOptions traceOptions) {
+ super(parentShell);
+ mTraceFileWriter = traceFileWriter;
+ mTraceCommandWriter = traceCommandWriter;
+ mTraceOptions = traceOptions;
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Composite c = new Composite(parent, SWT.NONE);
+ c.setLayout(new GridLayout(0, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalAlignment = GridData.CENTER;
+ c.setLayoutData(gd);
+
+ createButton(c, IDialogConstants.OK_ID, "Stop Tracing", true);
+ return c;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ parent.setLayout(new GridLayout());
+
+ setTitle(TITLE);
+ setMessage(DEFAULT_MESSAGE);
+
+ Group controlGroup = new Group(parent, SWT.BORDER);
+ controlGroup.setLayout(new GridLayout(2, false));
+ controlGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ controlGroup.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+ controlGroup.setText("Trace Options");
+
+ createLabel(controlGroup, "Collect Framebuffer contents on eglSwapBuffers()");
+ final Button eglSwapCheckBox = createButton(controlGroup,
+ mTraceOptions.collectFbOnEglSwap);
+
+ createLabel(controlGroup, "Collect Framebuffer contents on glDraw*()");
+ final Button glDrawCheckBox = createButton(controlGroup, mTraceOptions.collectFbOnGlDraw);
+
+ createLabel(controlGroup, "Collect texture data for glTexImage*()");
+ final Button glTexImageCheckBox = createButton(controlGroup,
+ mTraceOptions.collectTextureData);
+
+ SelectionListener l = new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ boolean eglSwap = eglSwapCheckBox.getSelection();
+ boolean glDraw = glDrawCheckBox.getSelection();
+ boolean glTexImage = glTexImageCheckBox.getSelection();
+
+ try {
+ mTraceCommandWriter.setTraceOptions(eglSwap, glDraw, glTexImage);
+ } catch (IOException e) {
+ eglSwapCheckBox.setEnabled(false);
+ glDrawCheckBox.setEnabled(false);
+ glTexImageCheckBox.setEnabled(false);
+
+ MessageDialog.openError(Display.getDefault().getActiveShell(),
+ "OpenGL ES Trace",
+ "Error while setting trace options: " + e.getMessage());
+ }
+
+ // update the text on the button
+ if (!(event.getSource() instanceof Button)) {
+ return;
+ }
+ Button sourceButton = (Button) event.getSource();
+ sourceButton.setText(getToggleActionText(sourceButton.getSelection()));
+ sourceButton.pack();
+ }
+ };
+
+ eglSwapCheckBox.addSelectionListener(l);
+ glDrawCheckBox.addSelectionListener(l);
+ glTexImageCheckBox.addSelectionListener(l);
+
+ Group statusGroup = new Group(parent, SWT.NONE);
+ statusGroup.setLayout(new GridLayout(2, false));
+ statusGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ statusGroup.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+ statusGroup.setText("Trace Status");
+
+ createLabel(statusGroup, "Frames Collected:");
+ mFramesCollectedLabel = createLabel(statusGroup, "");
+
+ createLabel(statusGroup, "Trace File Size:");
+ mTraceFileSizeLabel = createLabel(statusGroup, "");
+
+ ProgressBar pb = new ProgressBar(statusGroup, SWT.INDETERMINATE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 2;
+ pb.setLayoutData(gd);
+
+ mRefreshTask = new StatusRefreshTask();
+ new Thread(mRefreshTask, "Trace Status Refresh Thread").start();
+
+ return super.createDialogArea(parent);
+ }
+
+ private Button createButton(Composite controlComposite, boolean selection) {
+ Button b = new Button(controlComposite, SWT.TOGGLE);
+ b.setText(getToggleActionText(selection));
+ b.setSelection(selection);
+ return b;
+ }
+
+ /** Get text to show on toggle box given its current selection. */
+ private String getToggleActionText(boolean en) {
+ return en ? "Disable" : "Enable";
+ }
+
+ private Label createLabel(Composite parent, String text) {
+ Label l = new Label(parent, SWT.NONE);
+ l.setText(text);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalAlignment = SWT.LEFT;
+ gd.verticalAlignment = SWT.CENTER;
+ l.setLayoutData(gd);
+
+ return l;
+ }
+
+ @Override
+ protected void okPressed() {
+ mRefreshTask.cancel();
+ super.okPressed();
+ }
+
+ /** Periodically refresh the trace status. */
+ private class StatusRefreshTask implements Runnable {
+ private static final int REFRESH_INTERVAL = 1000;
+ private volatile boolean mIsCancelled = false;
+
+ @Override
+ public void run() {
+ if (mTraceFileWriter == null) {
+ return;
+ }
+
+ while (!mIsCancelled) {
+ final String frameCount = Integer.toString(mTraceFileWriter.getCurrentFrameCount());
+
+ double fileSize = mTraceFileWriter.getCurrentFileSize();
+ fileSize /= (1024 * 1024); // convert to size in MB
+ final String frameSize = SIZE_FORMATTER.format(fileSize) + " MB";
+
+ Display.getDefault().syncExec(new Runnable() {
+ @Override
+ public void run() {
+ if (mFramesCollectedLabel.isDisposed()) {
+ return;
+ }
+
+ mFramesCollectedLabel.setText(frameCount);
+ mTraceFileSizeLabel.setText(frameSize);
+
+ mFramesCollectedLabel.pack();
+ mTraceFileSizeLabel.pack();
+ }
+ });
+
+ try {
+ Thread.sleep(REFRESH_INTERVAL);
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+ }
+
+ public void cancel() {
+ mIsCancelled = true;
+ }
+ }
+}