diff options
author | Siva Velusamy <vsiva@google.com> | 2012-02-29 10:45:58 -0800 |
---|---|---|
committer | Siva Velusamy <vsiva@google.com> | 2012-02-29 14:42:54 -0800 |
commit | 52ecd2f08ee936df425e4c53f9bd8310061f3f57 (patch) | |
tree | c39d24120ad2f04fe0a4342e0d2d2fd5e8b6126f | |
parent | dd3f3c4fa0dc0bd5033f891ab005925343c146b7 (diff) | |
download | sdk-52ecd2f08ee936df425e4c53f9bd8310061f3f57.zip sdk-52ecd2f08ee936df425e4c53f9bd8310061f3f57.tar.gz sdk-52ecd2f08ee936df425e4c53f9bd8310061f3f57.tar.bz2 |
gltrace: Add support for glVertexAttribPointerData() calls.
This patch adds initial support for glVertexAttribPointerData() calls.
A detail provider for this call displays the vertex attributes that
were actually sent at the time of glVertexAttribPointer() call.
Change-Id: I79fe961ce1dcc15c4601ec213d09625986775ae5
8 files changed, 213 insertions, 94 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in b/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in index ffa1ab7..763254d 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/entries.in @@ -439,6 +439,7 @@ void, glVertexAttrib3fv, GLuint indx, const GLfloat* values void, glVertexAttrib4f, GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w void, glVertexAttrib4fv, GLuint indx, const GLfloat* values void, glVertexAttribPointer, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr +void, glVertexAttribPointerData, GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr, GLuint minIndex, GLuint maxIndex void, glVertexPointer, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer void, glViewport, GLint x, GLint y, GLsizei width, GLsizei height void, glWeightPointerOES, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java index 10ce07e..86018f8 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLProtoBuf.java @@ -511,7 +511,7 @@ public final class GLProtoBuf { eglGetSystemTimeFrequencyNV(481, 2044), eglGetSystemTimeNV(482, 2045), invalid(483, 3000), - frameBufferContents(484, 3001), + glVertexAttribPointerData(484, 3001), ; public static final Function glGetnUniformivEXT = glGetnUniformfvEXT; @@ -1004,7 +1004,7 @@ public final class GLProtoBuf { case 2044: return eglGetSystemTimeFrequencyNV; case 2045: return eglGetSystemTimeNV; case 3000: return invalid; - case 3001: return frameBufferContents; + case 3001: return glVertexAttribPointerData; default: return null; } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLUtils.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLUtils.java new file mode 100644 index 0000000..ae6f3a0 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLUtils.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2012 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 com.android.ide.eclipse.gldebugger.GLEnum; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; + +public class GLUtils { + public static String formatData(byte[] data, GLEnum format) { + switch (format) { + case GL_BYTE: + return formatBytes(data, false); + case GL_UNSIGNED_BYTE: + return formatBytes(data, true); + case GL_SHORT: + return formatShorts(data, false); + case GL_UNSIGNED_SHORT: + return formatShorts(data, true); + case GL_FIXED: + return formatInts(data); + case GL_FLOAT: + return formatFloats(data); + default: + return ""; //$NON-NLS-1$ + } + } + + private static String formatFloats(byte[] data) { + FloatBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer(); + + StringBuilder sb = new StringBuilder(bb.capacity() * 3); + + while (bb.remaining() > 0) { + sb.append(String.format("%.4f", bb.get())); + sb.append(','); + sb.append('\n'); + } + + return sb.toString(); + } + + private static String formatInts(byte[] data) { + IntBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer(); + + StringBuilder sb = new StringBuilder(bb.capacity() * 3); + + while (bb.remaining() > 0) { + sb.append(bb.get()); + sb.append(','); + sb.append('\n'); + } + + return sb.toString(); + } + + private static String formatShorts(byte[] data, boolean unsigned) { + ShortBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); + + StringBuilder sb = new StringBuilder(bb.capacity() * 3); + + while (bb.remaining() > 0) { + if (unsigned) { + sb.append(bb.get() & 0xffff); + } else { + sb.append(bb.get()); + } + sb.append(','); + sb.append('\n'); + } + + return sb.toString(); + } + + private static String formatBytes(byte[] data, boolean unsigned) { + ByteBuffer bb = ByteBuffer.wrap(data); + + StringBuilder sb = new StringBuilder(bb.capacity() * 3); + + while (bb.remaining() > 0) { + if (unsigned) { + sb.append(bb.get() & 0xff); + } else { + sb.append(bb.get()); + } + + sb.append(','); + sb.append('\n'); + } + + return sb.toString(); + } +} diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java index af0501b..083cba5 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/TraceFileParserTask.java @@ -16,6 +16,7 @@ package com.android.ide.eclipse.gltrace; +import com.android.ide.eclipse.gldebugger.GLEnum; import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage; import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function; import com.android.ide.eclipse.gltrace.format.GLAPISpec; @@ -124,6 +125,17 @@ public class TraceFileParserTask implements IRunnableWithProgress { c.addProperty(GLCall.PROPERTY_MARKERNAME, msg.getArgs(1).getCharValue(0).toStringUtf8()); break; + case glVertexAttribPointerData: + // void glVertexAttribPointerData(GLuint indx, GLint size, GLenum type, + // GLboolean normalized, GLsizei stride, const GLvoid* ptr, + // int minIndex, int maxIndex) + c.addProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_SIZE, + Integer.valueOf(msg.getArgs(1).getIntValue(0))); + c.addProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_TYPE, + GLEnum.valueOf(msg.getArgs(2).getIntValue(0))); + c.addProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_DATA, + msg.getArgs(5).getRawBytes(0).toByteArray()); + break; default: break; } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java index 5d11a84..d049c9e 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/model/GLCall.java @@ -38,6 +38,15 @@ public class GLCall { /** Marker name provided by a {@link Function#glPushGroupMarkerEXT} call. */ public static final int PROPERTY_MARKERNAME = 0; + /** Size argument in a {@link Function#glVertexAttribPointerData} call. */ + public static final int PROPERTY_VERTEX_ATTRIB_POINTER_SIZE = 1; + + /** Type argument in a {@link Function#glVertexAttribPointerData} call. */ + public static final int PROPERTY_VERTEX_ATTRIB_POINTER_TYPE = 2; + + /** Data argument in a {@link Function#glVertexAttribPointerData} call. */ + public static final int PROPERTY_VERTEX_ATTRIB_POINTER_DATA = 3; + /** Index of this call in the trace. */ private int mIndex; diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java index 8141feb..10e2c40 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java @@ -54,7 +54,8 @@ public class DetailsPage extends Page implements ISelectionListener { new ShaderUniformDetailsProvider(), new TextureImageDetailsProvider(), new VboDetailProvider(), - new GlDrawCallDetailProvider()); + new GlDrawCallDetailProvider(), + new VertexAttribPointerDataDetailProvider()); public DetailsPage(GLTrace trace) { mTrace = trace; diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java index 273ea20..d8a6bc9 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VboDetailProvider.java @@ -16,6 +16,8 @@ package com.android.ide.eclipse.gltrace.views.detail; +import com.android.ide.eclipse.gldebugger.GLEnum; +import com.android.ide.eclipse.gltrace.GLUtils; import com.android.ide.eclipse.gltrace.state.GLCompositeProperty; import com.android.ide.eclipse.gltrace.state.GLStateType; import com.android.ide.eclipse.gltrace.state.IGLProperty; @@ -32,10 +34,6 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.nio.ShortBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -156,7 +154,8 @@ public class VboDetailProvider implements IStateDetailProvider { private void updateContents() { if (mBufferData != null) { - mTextControl.setText(formatData(mBufferData)); + mTextControl.setText(GLUtils.formatData(mBufferData, + GLEnum.valueOf(mDisplayFormatCombo.getText()))); mTextControl.setEnabled(true); mDisplayFormatCombo.setEnabled(true); } else { @@ -166,92 +165,6 @@ public class VboDetailProvider implements IStateDetailProvider { } } - private String formatData(byte[] data) { - DisplayFormat format = DisplayFormat.valueOf(mDisplayFormatCombo.getText()); - - switch (format) { - case GL_BYTE: - return formatBytes(data, false); - case GL_UNSIGNED_BYTE: - return formatBytes(data, true); - case GL_SHORT: - return formatShorts(data, false); - case GL_UNSIGNED_SHORT: - return formatShorts(data, true); - case GL_FIXED: - return formatInts(data); - case GL_FLOAT: - return formatFloats(data); - default: - return ""; //$NON-NLS-1$ - } - } - - private String formatFloats(byte[] data) { - FloatBuffer bb = ByteBuffer.wrap(data).asFloatBuffer(); - - StringBuilder sb = new StringBuilder(bb.capacity() * 3); - - while (bb.remaining() > 0) { - sb.append(String.format("%.4f", bb.get())); - sb.append(','); - sb.append('\n'); - } - - return sb.toString(); - } - - private String formatInts(byte[] data) { - IntBuffer bb = ByteBuffer.wrap(data).asIntBuffer(); - - StringBuilder sb = new StringBuilder(bb.capacity() * 3); - - while (bb.remaining() > 0) { - sb.append(bb.get()); - sb.append(','); - sb.append('\n'); - } - - return sb.toString(); - } - - private String formatShorts(byte[] data, boolean unsigned) { - ShortBuffer bb = ByteBuffer.wrap(data).asShortBuffer(); - - StringBuilder sb = new StringBuilder(bb.capacity() * 3); - - while (bb.remaining() > 0) { - if (unsigned) { - sb.append(bb.get() & 0xffff); - } else { - sb.append(bb.get()); - } - sb.append(','); - sb.append('\n'); - } - - return sb.toString(); - } - - private String formatBytes(byte[] data, boolean unsigned) { - ByteBuffer bb = ByteBuffer.wrap(data); - - StringBuilder sb = new StringBuilder(bb.capacity() * 3); - - while (bb.remaining() > 0) { - if (unsigned) { - sb.append(bb.get() & 0xff); - } else { - sb.append(bb.get()); - } - - sb.append(','); - sb.append('\n'); - } - - return sb.toString(); - } - @Override public List<IContributionItem> getToolBarItems() { return Collections.emptyList(); diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VertexAttribPointerDataDetailProvider.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VertexAttribPointerDataDetailProvider.java new file mode 100644 index 0000000..83f412b --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/VertexAttribPointerDataDetailProvider.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2012 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.views.detail; + +import com.android.ide.eclipse.gldebugger.GLEnum; +import com.android.ide.eclipse.gltrace.GLUtils; +import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage.Function; +import com.android.ide.eclipse.gltrace.model.GLCall; +import com.android.ide.eclipse.gltrace.model.GLTrace; +import com.google.protobuf.ByteString; + +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Text; + +import java.util.Collections; +import java.util.List; + +public class VertexAttribPointerDataDetailProvider implements ICallDetailProvider { + private Text mText; + + @Override + public boolean isApplicable(GLCall call) { + return call.getFunction() == Function.glVertexAttribPointerData; + } + + @Override + public void createControl(Composite parent) { + mText = new Text(parent, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI + | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL); + } + + @Override + public void disposeControl() { + } + + @Override + public Control getControl() { + return mText; + } + + @Override + public void updateControl(GLTrace trace, GLCall call) { + // void glVertexAttribPointerData(GLuint indx, GLint size, GLenum type, GLboolean norm, + // GLsizei stride, const GLvoid* ptr, int minIndex, int maxIndex) + GLEnum type = (GLEnum) call.getProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_TYPE); + byte[] data = (byte[]) call.getProperty(GLCall.PROPERTY_VERTEX_ATTRIB_POINTER_DATA); + + mText.setText(GLUtils.formatData(data, type)); + } + + @Override + public List<IContributionItem> getToolBarItems() { + return Collections.emptyList(); + } +} |