1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ide.eclipse.gltrace.model;
18 
19 import com.android.ide.eclipse.gltrace.GLProtoBuf;
20 import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function;
21 import com.android.ide.eclipse.gltrace.state.transforms.IStateTransform;
22 import com.android.utils.SparseArray;
23 
24 import java.util.Collections;
25 import java.util.List;
26 
27 /**
28  * A GLCall is the in memory representation of a single {@link GLProtoBuf.GLMessage}.
29  *
30  * Some protocol buffer messages have a large amount of image data packed in them. Rather
31  * than storing all of that in memory, the GLCall stores a thumbnail image, and an offset
32  * into the trace file corresponding to original protocol buffer message. If full image data
33  * is required, the protocol buffer message can be recreated by reading the trace at the
34  * specified offset.
35  */
36 public class GLCall {
37     /** Marker name provided by a {@link Function#glPushGroupMarkerEXT} call. */
38     public static final int PROPERTY_MARKERNAME = 0;
39 
40     /** Size argument in a {@link Function#glVertexAttribPointerData} call. */
41     public static final int PROPERTY_VERTEX_ATTRIB_POINTER_SIZE = 1;
42 
43     /** Type argument in a {@link Function#glVertexAttribPointerData} call. */
44     public static final int PROPERTY_VERTEX_ATTRIB_POINTER_TYPE = 2;
45 
46     /** Data argument in a {@link Function#glVertexAttribPointerData} call. */
47     public static final int PROPERTY_VERTEX_ATTRIB_POINTER_DATA = 3;
48 
49     /** Index of this call in the trace. */
50     private int mIndex;
51 
52     /** Time on device when this call was invoked. */
53     private final long mStartTime;
54 
55     /** Offset of the protobuf message corresponding to this call in the trace file. */
56     private final long mTraceFileOffset;
57 
58     /** Flag indicating whether the original protobuf message included FB data. */
59     private final boolean mHasFb;
60 
61     /** Full string representation of this call. */
62     private final String mDisplayString;
63 
64     /** The actual GL Function called. */
65     private final Function mFunction;
66 
67     /** GL Context identifier corresponding to the context of this call. */
68     private final int mContextId;
69 
70     /** Duration of this call (MONOTONIC/wall clock time). */
71     private final int mWallDuration;
72 
73     /** Duration of this call (THREAD time). */
74     private final int mThreadDuration;
75 
76     /** List of state transformations performed by this call. */
77     private List<IStateTransform> mStateTransforms = Collections.emptyList();
78 
79     /** Error conditions while creating state transforms for this call. */
80     private String mStateTransformationCreationErrorMessage;
81 
82     /** List of properties associated to this call. */
83     private SparseArray<Object> mProperties;
84 
GLCall(int index, long startTime, long traceFileOffset, String displayString, Function function, boolean hasFb, int contextId, int wallTime, int threadTime)85     public GLCall(int index, long startTime, long traceFileOffset, String displayString,
86             Function function, boolean hasFb, int contextId,
87             int wallTime, int threadTime) {
88         mIndex = index;
89         mStartTime = startTime;
90         mTraceFileOffset = traceFileOffset;
91         mDisplayString = displayString;
92         mFunction = function;
93         mHasFb = hasFb;
94         mContextId = contextId;
95         mWallDuration = wallTime;
96         mThreadDuration = threadTime;
97     }
98 
getIndex()99     public int getIndex() {
100         return mIndex;
101     }
102 
setIndex(int i)103     public void setIndex(int i) {
104         mIndex = i;
105     }
106 
getOffsetInTraceFile()107     public long getOffsetInTraceFile() {
108         return mTraceFileOffset;
109     }
110 
getFunction()111     public Function getFunction() {
112         return mFunction;
113     }
114 
getContextId()115     public int getContextId() {
116         return mContextId;
117     }
118 
hasFb()119     public boolean hasFb() {
120         return mHasFb;
121     }
122 
getStartTime()123     public long getStartTime() {
124         return mStartTime;
125     }
126 
getWallDuration()127     public int getWallDuration() {
128         return mWallDuration;
129     }
130 
getThreadDuration()131     public int getThreadDuration() {
132         return mThreadDuration;
133     }
134 
setStateTransformations(List<IStateTransform> transforms)135     public void setStateTransformations(List<IStateTransform> transforms) {
136         mStateTransforms = transforms;
137     }
138 
setStateTransformationCreationError(String errorMessage)139     public void setStateTransformationCreationError(String errorMessage) {
140         mStateTransformationCreationErrorMessage = errorMessage;
141     }
142 
hasErrors()143     public boolean hasErrors() {
144         return mStateTransformationCreationErrorMessage != null;
145     }
146 
getError()147     public String getError() {
148         return mStateTransformationCreationErrorMessage;
149     }
150 
getStateTransformations()151     public List<IStateTransform> getStateTransformations() {
152         return mStateTransforms;
153     }
154 
155     @Override
toString()156     public String toString() {
157         return mDisplayString;
158     }
159 
160     /**
161      * Associate a certain value to the property name. Property names are defined
162      * as constants in {@link GLCall}.
163      */
addProperty(int propertyName, Object value)164     public void addProperty(int propertyName, Object value) {
165         if (mProperties == null) {
166             mProperties = new SparseArray<Object>(1);
167         }
168 
169         mProperties.put(propertyName, value);
170     }
171 
172     /**
173      * Obtain the value for the given property. Returns null if no such property
174      * is associated with this {@link GLCall}.
175      */
getProperty(int propertyName)176     public Object getProperty(int propertyName) {
177         if (mProperties == null) {
178             return null;
179         }
180 
181         return mProperties.get(propertyName);
182     }
183 }
184