diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java | 120 |
1 files changed, 120 insertions, 0 deletions
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 new file mode 100644 index 000000000..766764466 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLTrace.java @@ -0,0 +1,120 @@ +/* + * 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.model; + +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 org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.Collections; +import java.util.List; + +/** GLTrace is the in memory model of a OpenGL trace file. */ +public class GLTrace { + private static final TraceFileReader sTraceFileReader = new TraceFileReader(); + + /** Information regarding the trace file. */ + private final TraceFileInfo mTraceFileInfo; + + /** List of frames in the trace. */ + private final List<GLFrame> mGLFrames; + + /** List of GL Calls comprising the trace. */ + private final List<GLCall> mGLCalls; + + /** List of context ids used by the application. */ + private List<Integer> mContextIds; + + public GLTrace(TraceFileInfo traceFileInfo, List<GLFrame> glFrames, List<GLCall> glCalls, + List<Integer> contextIds) { + mTraceFileInfo = traceFileInfo; + mGLFrames = glFrames; + mGLCalls = glCalls; + mContextIds = contextIds; + } + + public List<GLFrame> getFrames() { + return mGLFrames; + } + + public GLFrame getFrame(int i) { + return mGLFrames.get(i); + } + + public List<GLCall> getGLCalls() { + return mGLCalls; + } + + public List<GLCall> getGLCallsForFrame(int frameIndex) { + if (frameIndex >= mGLFrames.size()) { + return Collections.emptyList(); + } + + GLFrame frame = mGLFrames.get(frameIndex); + return mGLCalls.subList(frame.getStartIndex(), frame.getEndIndex()); + } + + public Image getImage(GLCall c) { + if (!c.hasFb()) { + return null; + } + + if (isTraceFileModified()) { + return null; + } + + RandomAccessFile file; + try { + file = new RandomAccessFile(mTraceFileInfo.getPath(), "r"); //$NON-NLS-1$ + } catch (FileNotFoundException e1) { + return null; + } + + GLMessage m = null; + try { + m = sTraceFileReader.getMessageAtOffset(file, c.getOffsetInTraceFile()); + } catch (Exception e) { + return null; + } finally { + try { + file.close(); + } catch (IOException e) { + // ignore exception while closing file + } + } + + return ProtoBufUtils.getImage(Display.getCurrent(), m); + } + + private boolean isTraceFileModified() { + File f = new File(mTraceFileInfo.getPath()); + return f.length() != mTraceFileInfo.getSize() + || f.lastModified() != mTraceFileInfo.getLastModificationTime(); + } + + public List<Integer> getContexts() { + return mContextIds; + } +} |