diff options
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.java | 228 |
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; + } + } +} |