blob: 04ce676c28cdc41ebfad33795570369fe0d1b8a3 [file] [log] [blame]
/*
* 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);
}
}