| /* |
| * 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; |
| } |
| } |
| } |