diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java | 402 |
1 files changed, 402 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java new file mode 100644 index 000000000..04ce676c2 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLState.java @@ -0,0 +1,402 @@ +/* + * 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.state; + +import com.android.ide.eclipse.gltrace.GLEnum; +import com.android.ide.eclipse.gltrace.state.DisplayRadix; + +import java.util.Collections; + +public class GLState { + /** # of texture units modeled in the GL State. */ + public static final int TEXTURE_UNIT_COUNT = 32; + + /** # of vertex attributes */ + private static final int MAX_VERTEX_ATTRIBS = 16; + + private static GLState sGLState = new GLState(); + + private IGLProperty createBufferBindings() { + IGLProperty array, eArray, vArray; + + array = new GLIntegerProperty(GLStateType.ARRAY_BUFFER_BINDING, 0); + eArray = new GLIntegerProperty(GLStateType.ELEMENT_ARRAY_BUFFER_BINDING, 0); + + vArray = new GLIntegerProperty( + GLStateType.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_PER_INDEX, 0); + IGLProperty vArray8 = new GLListProperty(GLStateType.VERTEX_ATTRIB_ARRAY_BUFFER_BINDINGS, + vArray, MAX_VERTEX_ATTRIBS); + + return new GLCompositeProperty( + GLStateType.BUFFER_BINDINGS, + array, + eArray, + vArray8); + } + + private IGLProperty createVertexAttribArrays() { + IGLProperty enabled, size, stride, type, normalized, pointer; + + enabled = new GLBooleanProperty(GLStateType.VERTEX_ATTRIB_ARRAY_ENABLED, false); + size = new GLIntegerProperty(GLStateType.VERTEX_ATTRIB_ARRAY_SIZE, 4); + stride = new GLIntegerProperty(GLStateType.VERTEX_ATTRIB_ARRAY_STRIDE, 0); + type = new GLEnumProperty(GLStateType.VERTEX_ATTRIB_ARRAY_TYPE, GLEnum.GL_FLOAT); + normalized = new GLBooleanProperty(GLStateType.VERTEX_ATTRIB_ARRAY_NORMALIZED, false); + pointer = new GLLongProperty(GLStateType.VERTEX_ATTRIB_ARRAY_POINTER, 0L, + DisplayRadix.HEX); + + IGLProperty perVertexAttribArrayState = new GLCompositeProperty( + GLStateType.VERTEX_ATTRIB_ARRAY_COMPOSITE, + enabled, + size, + stride, + type, + normalized, + pointer); + + return new GLListProperty( + GLStateType.VERTEX_ATTRIB_ARRAY, + perVertexAttribArrayState, + MAX_VERTEX_ATTRIBS); + } + + private IGLProperty createGenericVertexAttributeState() { + IGLProperty v0 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V0, + Float.valueOf(0)); + IGLProperty v1 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V1, + Float.valueOf(0)); + IGLProperty v2 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V2, + Float.valueOf(0)); + IGLProperty v3 = new GLFloatProperty(GLStateType.GENERIC_VERTEX_ATTRIB_V3, + Float.valueOf(0)); + + IGLProperty perGenericVertexAttribState = new GLCompositeProperty( + GLStateType.GENERIC_VERTEX_ATTRIBUTE_DATA_COMPOSITE, + v0, v1, v2, v3); + + return new GLListProperty( + GLStateType.GENERIC_VERTEX_ATTRIBUTES, + perGenericVertexAttribState, + MAX_VERTEX_ATTRIBS); + } + + private IGLProperty createVboState() { + IGLProperty size = new GLIntegerProperty(GLStateType.BUFFER_SIZE, Integer.valueOf(0)); + IGLProperty usage = new GLEnumProperty(GLStateType.BUFFER_USAGE, GLEnum.GL_STATIC_DRAW); + IGLProperty data = new GLObjectProperty(GLStateType.BUFFER_DATA, new byte[0]); + IGLProperty type = new GLEnumProperty(GLStateType.BUFFER_TYPE, GLEnum.GL_ARRAY_BUFFER); + + IGLProperty perVboState = new GLCompositeProperty(GLStateType.VBO_COMPOSITE, + size, usage, data, type); + + return new GLSparseArrayProperty(GLStateType.VBO, perVboState); + } + + private IGLProperty createVertexArrayData() { + IGLProperty vertexAttribArrays = createVertexAttribArrays(); + IGLProperty bufferBindings = createBufferBindings(); + IGLProperty genericAttribs = createGenericVertexAttributeState(); + IGLProperty vboState = createVboState(); + + return new GLCompositeProperty(GLStateType.VERTEX_ARRAY_DATA, + genericAttribs, + vertexAttribArrays, + bufferBindings, + vboState); + } + + private IGLProperty createTransformationState() { + IGLProperty viewPortX = new GLIntegerProperty(GLStateType.VIEWPORT_X, 0); + IGLProperty viewPortY = new GLIntegerProperty(GLStateType.VIEWPORT_Y, 0); + IGLProperty viewPortW = new GLIntegerProperty(GLStateType.VIEWPORT_WIDTH, 0); + IGLProperty viewPortH = new GLIntegerProperty(GLStateType.VIEWPORT_HEIGHT, 0); + IGLProperty viewPort = new GLCompositeProperty(GLStateType.VIEWPORT, + viewPortX, viewPortY, viewPortW, viewPortH); + + IGLProperty clampNear = new GLFloatProperty(GLStateType.DEPTH_RANGE_NEAR, + Float.valueOf(0.0f)); + IGLProperty clampFar = new GLFloatProperty(GLStateType.DEPTH_RANGE_FAR, + Float.valueOf(1.0f)); + IGLProperty depthRange = new GLCompositeProperty(GLStateType.DEPTH_RANGE, + clampNear, + clampFar); + + IGLProperty transformationState = new GLCompositeProperty(GLStateType.TRANSFORMATION_STATE, + viewPort, + depthRange); + return transformationState; + } + + private IGLProperty createRasterizationState() { + IGLProperty lineWidth = new GLFloatProperty(GLStateType.LINE_WIDTH, Float.valueOf(1.0f)); + IGLProperty cullFace = new GLBooleanProperty(GLStateType.CULL_FACE, Boolean.FALSE); + IGLProperty cullFaceMode = new GLEnumProperty(GLStateType.CULL_FACE_MODE, GLEnum.GL_BACK); + IGLProperty frontFace = new GLEnumProperty(GLStateType.FRONT_FACE, GLEnum.GL_CCW); + IGLProperty polyOffsetFactor = new GLFloatProperty(GLStateType.POLYGON_OFFSET_FACTOR, + Float.valueOf(0f)); + IGLProperty polyOffsetUnits = new GLFloatProperty(GLStateType.POLYGON_OFFSET_UNITS, + Float.valueOf(0f)); + IGLProperty polyOffsetFill = new GLBooleanProperty(GLStateType.POLYGON_OFFSET_FILL, + Boolean.FALSE); + + return new GLCompositeProperty(GLStateType.RASTERIZATION_STATE, + lineWidth, + cullFace, + cullFaceMode, + frontFace, + polyOffsetFactor, + polyOffsetUnits, + polyOffsetFill); + } + + private IGLProperty createPixelOperationsState() { + IGLProperty scissorTest = new GLBooleanProperty(GLStateType.SCISSOR_TEST, Boolean.FALSE); + IGLProperty scissorBoxX = new GLIntegerProperty(GLStateType.SCISSOR_BOX_X, 0); + IGLProperty scissorBoxY = new GLIntegerProperty(GLStateType.SCISSOR_BOX_Y, 0); + IGLProperty scissorBoxW = new GLIntegerProperty(GLStateType.SCISSOR_BOX_WIDTH, 0); + IGLProperty scissorBoxH = new GLIntegerProperty(GLStateType.SCISSOR_BOX_HEIGHT, 0); + IGLProperty scissorBox = new GLCompositeProperty(GLStateType.SCISSOR_BOX, + scissorBoxX, scissorBoxY, scissorBoxW, scissorBoxH); + + IGLProperty stencilTest = new GLBooleanProperty(GLStateType.STENCIL_TEST, Boolean.FALSE); + IGLProperty stencilFunc = new GLEnumProperty(GLStateType.STENCIL_FUNC, GLEnum.GL_ALWAYS); + IGLProperty stencilMask = new GLIntegerProperty(GLStateType.STENCIL_VALUE_MASK, + Integer.valueOf(0xffffffff), DisplayRadix.HEX); + IGLProperty stencilRef = new GLIntegerProperty(GLStateType.STENCIL_REF, + Integer.valueOf(0)); + IGLProperty stencilFail = new GLEnumProperty(GLStateType.STENCIL_FAIL, GLEnum.GL_KEEP); + IGLProperty stencilPassDepthFail = new GLEnumProperty(GLStateType.STENCIL_PASS_DEPTH_FAIL, + GLEnum.GL_KEEP); + IGLProperty stencilPassDepthPass = new GLEnumProperty(GLStateType.STENCIL_PASS_DEPTH_PASS, + GLEnum.GL_KEEP); + IGLProperty stencilBackFunc = new GLEnumProperty(GLStateType.STENCIL_BACK_FUNC, + GLEnum.GL_ALWAYS); + IGLProperty stencilBackValueMask = new GLIntegerProperty( + GLStateType.STENCIL_BACK_VALUE_MASK, Integer.valueOf(0xffffffff), DisplayRadix.HEX); + IGLProperty stencilBackRef = new GLIntegerProperty(GLStateType.STENCIL_BACK_REF, 0); + IGLProperty stencilBackFail = new GLEnumProperty(GLStateType.STENCIL_BACK_FAIL, + GLEnum.GL_KEEP); + IGLProperty stencilBackPassDepthFail = new GLEnumProperty( + GLStateType.STENCIL_BACK_PASS_DEPTH_FAIL, GLEnum.GL_KEEP); + IGLProperty stencilBackPassDepthPass = new GLEnumProperty( + GLStateType.STENCIL_BACK_PASS_DEPTH_PASS, GLEnum.GL_KEEP); + IGLProperty stencil = new GLCompositeProperty(GLStateType.STENCIL, + stencilTest, stencilFunc, + stencilMask, stencilRef, stencilFail, + stencilPassDepthFail, stencilPassDepthPass, + stencilBackFunc, stencilBackValueMask, + stencilBackRef, stencilBackFail, + stencilBackPassDepthFail, stencilBackPassDepthPass); + + IGLProperty depthTest = new GLBooleanProperty(GLStateType.DEPTH_TEST, Boolean.FALSE); + IGLProperty depthFunc = new GLEnumProperty(GLStateType.DEPTH_FUNC, GLEnum.GL_LESS); + + IGLProperty blendEnabled = new GLBooleanProperty(GLStateType.BLEND_ENABLED, Boolean.FALSE); + // FIXME: BLEND_SRC_RGB should be set to GL_ONE, but GL_LINES is already 0x1. + IGLProperty blendSrcRgb = new GLEnumProperty(GLStateType.BLEND_SRC_RGB, GLEnum.GL_LINES); + IGLProperty blendSrcAlpha = new GLEnumProperty(GLStateType.BLEND_SRC_ALPHA, + GLEnum.GL_LINES); + IGLProperty blendDstRgb = new GLEnumProperty(GLStateType.BLEND_DST_RGB, GLEnum.GL_NONE); + IGLProperty blendDstAlpha = new GLEnumProperty(GLStateType.BLEND_DST_ALPHA, + GLEnum.GL_NONE); + IGLProperty blendEquationRgb = new GLEnumProperty(GLStateType.BLEND_EQUATION_RGB, + GLEnum.GL_FUNC_ADD); + IGLProperty blendEquationAlpha = new GLEnumProperty(GLStateType.BLEND_EQUATION_ALPHA, + GLEnum.GL_FUNC_ADD); + IGLProperty blend = new GLCompositeProperty(GLStateType.BLEND, + blendEnabled, blendSrcRgb, blendSrcAlpha, blendDstRgb, blendDstAlpha, + blendEquationRgb, blendEquationAlpha); + + IGLProperty dither = new GLBooleanProperty(GLStateType.DITHER, Boolean.TRUE); + + return new GLCompositeProperty(GLStateType.PIXEL_OPERATIONS, + scissorTest, scissorBox, stencil, + depthTest, depthFunc, blend, dither); + } + + private IGLProperty createPixelPackState() { + IGLProperty packAlignment = new GLIntegerProperty(GLStateType.PACK_ALIGNMENT, + Integer.valueOf(4)); + IGLProperty unpackAlignment = new GLIntegerProperty(GLStateType.UNPACK_ALIGNMENT, + Integer.valueOf(4)); + IGLProperty pixelPack = new GLCompositeProperty(GLStateType.PIXEL_PACKING, + packAlignment, unpackAlignment); + return pixelPack; + } + + private IGLProperty createFramebufferState() { + IGLProperty binding = new GLIntegerProperty(GLStateType.FRAMEBUFFER_BINDING, 0); + GLCompositeProperty framebufferState = new GLCompositeProperty( + GLStateType.FRAMEBUFFER_STATE, + binding); + return framebufferState; + } + + private IGLProperty createTextureState() { + IGLProperty activeTexture = new GLIntegerProperty(GLStateType.ACTIVE_TEXTURE_UNIT, + Integer.valueOf(0)); + + IGLProperty binding2D = new GLIntegerProperty(GLStateType.TEXTURE_BINDING_2D, + Integer.valueOf(0)); + IGLProperty bindingCubeMap = new GLIntegerProperty(GLStateType.TEXTURE_BINDING_CUBE_MAP, + Integer.valueOf(0)); + IGLProperty bindingExternal = new GLIntegerProperty(GLStateType.TEXTURE_BINDING_EXTERNAL, + Integer.valueOf(0)); + IGLProperty perTextureUnitState = new GLCompositeProperty( + GLStateType.PER_TEXTURE_UNIT_STATE, binding2D, bindingCubeMap, bindingExternal); + IGLProperty textureUnitState = new GLListProperty(GLStateType.TEXTURE_UNITS, + perTextureUnitState, TEXTURE_UNIT_COUNT); + + IGLProperty swizzleR = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_R, GLEnum.GL_RED); + IGLProperty swizzleG = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_G, GLEnum.GL_GREEN); + IGLProperty swizzleB = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_B, GLEnum.GL_BLUE); + IGLProperty swizzleA = new GLEnumProperty(GLStateType.TEXTURE_SWIZZLE_A, GLEnum.GL_ALPHA); + IGLProperty minFilter = new GLEnumProperty(GLStateType.TEXTURE_MIN_FILTER, + GLEnum.GL_NEAREST); + IGLProperty magFilter = new GLEnumProperty(GLStateType.TEXTURE_MAG_FILTER, + GLEnum.GL_NEAREST); + IGLProperty wrapS = new GLEnumProperty(GLStateType.TEXTURE_WRAP_S, GLEnum.GL_REPEAT); + IGLProperty wrapT = new GLEnumProperty(GLStateType.TEXTURE_WRAP_T, GLEnum.GL_REPEAT); + IGLProperty wrapR = new GLEnumProperty(GLStateType.TEXTURE_WRAP_R, GLEnum.GL_REPEAT); + IGLProperty minLod = new GLFloatProperty(GLStateType.TEXTURE_MIN_LOD, Float.valueOf(-1000)); + IGLProperty maxLod = new GLFloatProperty(GLStateType.TEXTURE_MAX_LOD, Float.valueOf(1000)); + IGLProperty baseLevel = new GLIntegerProperty(GLStateType.TEXTURE_BASE_LEVEL, 0); + IGLProperty maxLevel = new GLIntegerProperty(GLStateType.TEXTURE_MAX_LEVEL, 1000); + IGLProperty cmpMode = new GLEnumProperty(GLStateType.TEXTURE_COMPARE_MODE, GLEnum.GL_NONE); + IGLProperty cmpFunc = new GLEnumProperty(GLStateType.TEXTURE_COMPARE_FUNC, + GLEnum.GL_LEQUAL); + IGLProperty immutableFormat = new GLBooleanProperty(GLStateType.TEXTURE_IMMUTABLE_FORMAT, + Boolean.FALSE); + IGLProperty immutableLevels = new GLIntegerProperty(GLStateType.TEXTURE_IMMUTABLE_LEVELS, + 0); + + IGLProperty width = new GLIntegerProperty(GLStateType.TEXTURE_WIDTH, Integer.valueOf(-1)); + IGLProperty height = new GLIntegerProperty(GLStateType.TEXTURE_HEIGHT, + Integer.valueOf(-1)); + IGLProperty format = new GLEnumProperty(GLStateType.TEXTURE_FORMAT, + GLEnum.GL_INVALID_VALUE); + IGLProperty imageType = new GLEnumProperty(GLStateType.TEXTURE_IMAGE_TYPE, + GLEnum.GL_UNSIGNED_BYTE); + IGLProperty image = new GLStringProperty(GLStateType.TEXTURE_IMAGE, null); + + IGLProperty perTextureLevelState = new GLCompositeProperty( + GLStateType.PER_TEXTURE_LEVEL_STATE, + width, height, format, imageType, image); + IGLProperty mipmapState = new GLSparseArrayProperty(GLStateType.TEXTURE_MIPMAPS, + perTextureLevelState, true); + + IGLProperty textureDefaultState = new GLCompositeProperty(GLStateType.PER_TEXTURE_STATE, + swizzleR, swizzleG, swizzleB, swizzleA, + minFilter, magFilter, + wrapS, wrapT, wrapR, + minLod, maxLod, + baseLevel, maxLevel, + cmpMode, cmpFunc, + immutableFormat, immutableLevels, + mipmapState); + GLSparseArrayProperty textures = new GLSparseArrayProperty(GLStateType.TEXTURES, + textureDefaultState); + textures.add(0); + + return new GLCompositeProperty(GLStateType.TEXTURE_STATE, + activeTexture, + textureUnitState, + textures); + } + + private IGLProperty createProgramState() { + IGLProperty currentProgram = new GLIntegerProperty(GLStateType.CURRENT_PROGRAM, + Integer.valueOf(0)); + + IGLProperty attachedShaderId = new GLIntegerProperty(GLStateType.ATTACHED_SHADER_ID, + Integer.valueOf(0)); + IGLProperty attachedShaders = new GLSparseArrayProperty(GLStateType.ATTACHED_SHADERS, + attachedShaderId); + + IGLProperty attributeName = new GLStringProperty(GLStateType.ATTRIBUTE_NAME, ""); + IGLProperty attributeType = new GLEnumProperty(GLStateType.ATTRIBUTE_TYPE, + GLEnum.GL_FLOAT_MAT4); + IGLProperty attributeSize = new GLIntegerProperty(GLStateType.ATTRIBUTE_SIZE, + Integer.valueOf(1)); + IGLProperty attributeValue = new GLObjectProperty(GLStateType.ATTRIBUTE_VALUE, + Collections.emptyList()); + IGLProperty perAttributeProperty = new GLCompositeProperty(GLStateType.PER_ATTRIBUTE_STATE, + attributeName, attributeType, attributeSize, attributeValue); + IGLProperty attributes = new GLSparseArrayProperty(GLStateType.ACTIVE_ATTRIBUTES, + perAttributeProperty); + + IGLProperty uniformName = new GLStringProperty(GLStateType.UNIFORM_NAME, ""); + IGLProperty uniformType = new GLEnumProperty(GLStateType.UNIFORM_TYPE, + GLEnum.GL_FLOAT_MAT4); + IGLProperty uniformSize = new GLIntegerProperty(GLStateType.UNIFORM_SIZE, + Integer.valueOf(1)); + IGLProperty uniformValue = new GLObjectProperty(GLStateType.UNIFORM_VALUE, + Collections.emptyList()); + IGLProperty perUniformProperty = new GLCompositeProperty(GLStateType.PER_UNIFORM_STATE, + uniformName, uniformType, uniformSize, uniformValue); + IGLProperty uniforms = new GLSparseArrayProperty(GLStateType.ACTIVE_UNIFORMS, + perUniformProperty); + + IGLProperty perProgramState = new GLCompositeProperty(GLStateType.PER_PROGRAM_STATE, + attachedShaders, attributes, uniforms); + + IGLProperty programs = new GLSparseArrayProperty(GLStateType.PROGRAMS, perProgramState); + + return new GLCompositeProperty(GLStateType.PROGRAM_STATE, + currentProgram, programs); + } + + private IGLProperty createShaderState() { + IGLProperty shaderType = new GLEnumProperty(GLStateType.SHADER_TYPE, + GLEnum.GL_VERTEX_SHADER); + IGLProperty shaderSource = new GLStringProperty(GLStateType.SHADER_SOURCE, + ""); //$NON-NLS-1$ + IGLProperty perShaderState = new GLCompositeProperty(GLStateType.PER_SHADER_STATE, + shaderType, shaderSource); + return new GLSparseArrayProperty(GLStateType.SHADERS, perShaderState); + } + + public static IGLProperty createDefaultES2State() { + GLCompositeProperty glState = new GLCompositeProperty(GLStateType.GL_STATE_ES2, + sGLState.createVertexArrayData(), + sGLState.createFramebufferState(), + sGLState.createTransformationState(), + sGLState.createRasterizationState(), + sGLState.createPixelOperationsState(), + sGLState.createPixelPackState(), + sGLState.createTextureState(), + sGLState.createProgramState(), + sGLState.createShaderState()); + return glState; + } + + public static IGLProperty createDefaultES1State() { + GLCompositeProperty glState = new GLCompositeProperty(GLStateType.GL_STATE_ES1, + sGLState.createVertexArrayData(), + sGLState.createFramebufferState(), + sGLState.createTransformationState(), + sGLState.createRasterizationState(), + sGLState.createPixelOperationsState(), + sGLState.createPixelPackState(), + sGLState.createTextureState()); + return glState; + } + + public static IGLProperty createDefaultState() { + return new GLListProperty(GLStateType.GL_STATE, null, 0); + } +} |