'use strict';

/**
 * enums
 */
const enums = {
  // buffer usage
  USAGE_STATIC: 35044,  // gl.STATIC_DRAW
  USAGE_DYNAMIC: 35048, // gl.DYNAMIC_DRAW
  USAGE_STREAM: 35040,  // gl.STREAM_DRAW

  // index buffer format
  INDEX_FMT_UINT8: 5121,  // gl.UNSIGNED_BYTE
  INDEX_FMT_UINT16: 5123, // gl.UNSIGNED_SHORT
  INDEX_FMT_UINT32: 5125, // gl.UNSIGNED_INT (OES_element_index_uint)

  // vertex attribute semantic
  ATTR_POSITION: 'a_position',
  ATTR_NORMAL: 'a_normal',
  ATTR_TANGENT: 'a_tangent',
  ATTR_BITANGENT: 'a_bitangent',
  ATTR_WEIGHTS: 'a_weights',
  ATTR_JOINTS: 'a_joints',
  ATTR_COLOR: 'a_color',
  ATTR_COLOR0: 'a_color0',
  ATTR_COLOR1: 'a_color1',
  ATTR_UV: 'a_uv',
  ATTR_UV0: 'a_uv0',
  ATTR_UV1: 'a_uv1',
  ATTR_UV2: 'a_uv2',
  ATTR_UV3: 'a_uv3',
  ATTR_UV4: 'a_uv4',
  ATTR_UV5: 'a_uv5',
  ATTR_UV6: 'a_uv6',
  ATTR_UV7: 'a_uv7',

  // vertex attribute type
  ATTR_TYPE_INT8: 5120,    // gl.BYTE
  ATTR_TYPE_UINT8: 5121,   // gl.UNSIGNED_BYTE
  ATTR_TYPE_INT16: 5122,   // gl.SHORT
  ATTR_TYPE_UINT16: 5123,  // gl.UNSIGNED_SHORT
  ATTR_TYPE_INT32: 5124,   // gl.INT
  ATTR_TYPE_UINT32: 5125,  // gl.UNSIGNED_INT
  ATTR_TYPE_FLOAT32: 5126, // gl.FLOAT

  // texture filter
  FILTER_NEAREST: 0,
  FILTER_LINEAR: 1,

  // texture wrap mode
  WRAP_REPEAT: 10497, // gl.REPEAT
  WRAP_CLAMP: 33071,  // gl.CLAMP_TO_EDGE
  WRAP_MIRROR: 33648, // gl.MIRRORED_REPEAT

  // texture format
  // compress formats
  TEXTURE_FMT_RGB_DXT1: 0,
  TEXTURE_FMT_RGBA_DXT1: 1,
  TEXTURE_FMT_RGBA_DXT3: 2,
  TEXTURE_FMT_RGBA_DXT5: 3,
  TEXTURE_FMT_RGB_ETC1: 4,
  TEXTURE_FMT_RGB_PVRTC_2BPPV1: 5,
  TEXTURE_FMT_RGBA_PVRTC_2BPPV1: 6,
  TEXTURE_FMT_RGB_PVRTC_4BPPV1: 7,
  TEXTURE_FMT_RGBA_PVRTC_4BPPV1: 8,

  // normal formats
  TEXTURE_FMT_A8: 9,
  TEXTURE_FMT_L8: 10,
  TEXTURE_FMT_L8_A8: 11,
  TEXTURE_FMT_R5_G6_B5: 12,
  TEXTURE_FMT_R5_G5_B5_A1: 13,
  TEXTURE_FMT_R4_G4_B4_A4: 14,
  TEXTURE_FMT_RGB8: 15,
  TEXTURE_FMT_RGBA8: 16,
  TEXTURE_FMT_RGB16F: 17,
  TEXTURE_FMT_RGBA16F: 18,
  TEXTURE_FMT_RGB32F: 19,
  TEXTURE_FMT_RGBA32F: 20,
  TEXTURE_FMT_R32F: 21,
  TEXTURE_FMT_111110F: 22,
  TEXTURE_FMT_SRGB: 23,
  TEXTURE_FMT_SRGBA: 24,

  // depth formats
  TEXTURE_FMT_D16: 25,
  TEXTURE_FMT_D32: 26,
  TEXTURE_FMT_D24S8: 27,

  // etc2 format
  TEXTURE_FMT_RGB_ETC2: 28,
  TEXTURE_FMT_RGBA_ETC2: 29,

  // astc format (Adaptive Scalable Texture Compression)
  TEXTURE_FMT_RGBA_ASTC_4X4: 30,
  TEXTURE_FMT_RGBA_ASTC_5X4: 31,
  TEXTURE_FMT_RGBA_ASTC_5X5: 32,
  TEXTURE_FMT_RGBA_ASTC_6X5: 33,
  TEXTURE_FMT_RGBA_ASTC_6X6: 34,
  TEXTURE_FMT_RGBA_ASTC_8X5: 35,
  TEXTURE_FMT_RGBA_ASTC_8X6: 36,
  TEXTURE_FMT_RGBA_ASTC_8X8: 37,
  TEXTURE_FMT_RGBA_ASTC_10X5: 38,
  TEXTURE_FMT_RGBA_ASTC_10X6: 39,
  TEXTURE_FMT_RGBA_ASTC_10X8: 40,
  TEXTURE_FMT_RGBA_ASTC_10X10: 41,
  TEXTURE_FMT_RGBA_ASTC_12X10: 42,
  TEXTURE_FMT_RGBA_ASTC_12X12: 43,

  // astc format (Adaptive Scalable Texture Compression) SRGB
  TEXTURE_FMT_SRGBA_ASTC_4X4: 44,
  TEXTURE_FMT_SRGBA_ASTC_5X4: 45,
  TEXTURE_FMT_SRGBA_ASTC_5X5: 46,
  TEXTURE_FMT_SRGBA_ASTC_6X5: 47,
  TEXTURE_FMT_SRGBA_ASTC_6X6: 48,
  TEXTURE_FMT_SRGBA_ASTC_8X5: 49,
  TEXTURE_FMT_SRGBA_ASTC_8X6: 50,
  TEXTURE_FMT_SRGBA_ASTC_8X8: 51,
  TEXTURE_FMT_SRGBA_ASTC_10X5: 52,
  TEXTURE_FMT_SRGBA_ASTC_10X6: 53,
  TEXTURE_FMT_SRGBA_ASTC_10X8: 54,
  TEXTURE_FMT_SRGBA_ASTC_10X10: 55,
  TEXTURE_FMT_SRGBA_ASTC_12X10: 56,
  TEXTURE_FMT_SRGBA_ASTC_12X12: 57,

  // depth and stencil function
  DS_FUNC_NEVER: 512,    // gl.NEVER
  DS_FUNC_LESS: 513,     // gl.LESS
  DS_FUNC_EQUAL: 514,    // gl.EQUAL
  DS_FUNC_LEQUAL: 515,   // gl.LEQUAL
  DS_FUNC_GREATER: 516,  // gl.GREATER
  DS_FUNC_NOTEQUAL: 517, // gl.NOTEQUAL
  DS_FUNC_GEQUAL: 518,   // gl.GEQUAL
  DS_FUNC_ALWAYS: 519,   // gl.ALWAYS

  // render-buffer format
  RB_FMT_RGBA4: 32854,    // gl.RGBA4
  RB_FMT_RGB5_A1: 32855,  // gl.RGB5_A1
  RB_FMT_RGB565: 36194,   // gl.RGB565
  RB_FMT_D16: 33189,      // gl.DEPTH_COMPONENT16
  RB_FMT_S8: 36168,       // gl.STENCIL_INDEX8
  RB_FMT_D24S8: 34041,    // gl.DEPTH_STENCIL

  // blend-equation
  BLEND_FUNC_ADD: 32774,              // gl.FUNC_ADD
  BLEND_FUNC_SUBTRACT: 32778,         // gl.FUNC_SUBTRACT
  BLEND_FUNC_REVERSE_SUBTRACT: 32779, // gl.FUNC_REVERSE_SUBTRACT

  // blend
  BLEND_ZERO: 0,                          // gl.ZERO
  BLEND_ONE: 1,                           // gl.ONE
  BLEND_SRC_COLOR: 768,                   // gl.SRC_COLOR
  BLEND_ONE_MINUS_SRC_COLOR: 769,         // gl.ONE_MINUS_SRC_COLOR
  BLEND_DST_COLOR: 774,                   // gl.DST_COLOR
  BLEND_ONE_MINUS_DST_COLOR: 775,         // gl.ONE_MINUS_DST_COLOR
  BLEND_SRC_ALPHA: 770,                   // gl.SRC_ALPHA
  BLEND_ONE_MINUS_SRC_ALPHA: 771,         // gl.ONE_MINUS_SRC_ALPHA
  BLEND_DST_ALPHA: 772,                   // gl.DST_ALPHA
  BLEND_ONE_MINUS_DST_ALPHA: 773,         // gl.ONE_MINUS_DST_ALPHA
  BLEND_CONSTANT_COLOR: 32769,            // gl.CONSTANT_COLOR
  BLEND_ONE_MINUS_CONSTANT_COLOR: 32770,  // gl.ONE_MINUS_CONSTANT_COLOR
  BLEND_CONSTANT_ALPHA: 32771,            // gl.CONSTANT_ALPHA
  BLEND_ONE_MINUS_CONSTANT_ALPHA: 32772,  // gl.ONE_MINUS_CONSTANT_ALPHA
  BLEND_SRC_ALPHA_SATURATE: 776,          // gl.SRC_ALPHA_SATURATE

  // stencil operation
  STENCIL_DISABLE: 0,             // disable stencil
  STENCIL_ENABLE: 1,              // enable stencil
  STENCIL_INHERIT: 2,             // inherit stencil states

  STENCIL_OP_KEEP: 7680,          // gl.KEEP
  STENCIL_OP_ZERO: 0,             // gl.ZERO
  STENCIL_OP_REPLACE: 7681,       // gl.REPLACE
  STENCIL_OP_INCR: 7682,          // gl.INCR
  STENCIL_OP_INCR_WRAP: 34055,    // gl.INCR_WRAP
  STENCIL_OP_DECR: 7683,          // gl.DECR
  STENCIL_OP_DECR_WRAP: 34056,    // gl.DECR_WRAP
  STENCIL_OP_INVERT: 5386,        // gl.INVERT

  // cull
  CULL_NONE: 0,
  CULL_FRONT: 1028,
  CULL_BACK: 1029,
  CULL_FRONT_AND_BACK: 1032,

  // primitive type
  PT_POINTS: 0,         // gl.POINTS
  PT_LINES: 1,          // gl.LINES
  PT_LINE_LOOP: 2,      // gl.LINE_LOOP
  PT_LINE_STRIP: 3,     // gl.LINE_STRIP
  PT_TRIANGLES: 4,      // gl.TRIANGLES
  PT_TRIANGLE_STRIP: 5, // gl.TRIANGLE_STRIP
  PT_TRIANGLE_FAN: 6,   // gl.TRIANGLE_FAN
};

let RenderQueue = {
    OPAQUE: 0,
    TRANSPARENT: 1,
    OVERLAY: 2
};

/**
 * JS Implementation of MurmurHash2
 * 
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/murmurhash-js
 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
 * @see http://sites.google.com/site/murmurhash/
 * 
 * @param {string} str ASCII only
 * @param {number} seed Positive integer only
 * @return {number} 32-bit positive integer hash
 */

function murmurhash2_32_gc(str, seed) {
  var
    l = str.length,
    h = seed ^ l,
    i = 0,
    k;
  
  while (l >= 4) {
  	k = 
  	  ((str.charCodeAt(i) & 0xff)) |
  	  ((str.charCodeAt(++i) & 0xff) << 8) |
  	  ((str.charCodeAt(++i) & 0xff) << 16) |
  	  ((str.charCodeAt(++i) & 0xff) << 24);
    
    k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));
    k ^= k >>> 24;
    k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));

	h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;

    l -= 4;
    ++i;
  }
  
  switch (l) {
  case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16;
  case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8;
  case 1: h ^= (str.charCodeAt(i) & 0xff);
          h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
  }

  h ^= h >>> 13;
  h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));
  h ^= h >>> 15;

  return h >>> 0;
}

// Extensions
var WebGLEXT;
(function (WebGLEXT) {
    WebGLEXT[WebGLEXT["COMPRESSED_RGB_S3TC_DXT1_EXT"] = 33776] = "COMPRESSED_RGB_S3TC_DXT1_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_RGBA_S3TC_DXT1_EXT"] = 33777] = "COMPRESSED_RGBA_S3TC_DXT1_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_RGBA_S3TC_DXT3_EXT"] = 33778] = "COMPRESSED_RGBA_S3TC_DXT3_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_RGBA_S3TC_DXT5_EXT"] = 33779] = "COMPRESSED_RGBA_S3TC_DXT5_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_SRGB_S3TC_DXT1_EXT"] = 35916] = "COMPRESSED_SRGB_S3TC_DXT1_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT"] = 35917] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT"] = 35918] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT"] = 35919] = "COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT";
    WebGLEXT[WebGLEXT["COMPRESSED_RGB_PVRTC_4BPPV1_IMG"] = 35840] = "COMPRESSED_RGB_PVRTC_4BPPV1_IMG";
    WebGLEXT[WebGLEXT["COMPRESSED_RGB_PVRTC_2BPPV1_IMG"] = 35841] = "COMPRESSED_RGB_PVRTC_2BPPV1_IMG";
    WebGLEXT[WebGLEXT["COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"] = 35842] = "COMPRESSED_RGBA_PVRTC_4BPPV1_IMG";
    WebGLEXT[WebGLEXT["COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"] = 35843] = "COMPRESSED_RGBA_PVRTC_2BPPV1_IMG";
    WebGLEXT[WebGLEXT["COMPRESSED_RGB_ETC1_WEBGL"] = 36196] = "COMPRESSED_RGB_ETC1_WEBGL";
})(WebGLEXT || (WebGLEXT = {}));
var GFXObjectType;
(function (GFXObjectType) {
    GFXObjectType[GFXObjectType["UNKNOWN"] = 0] = "UNKNOWN";
    GFXObjectType[GFXObjectType["BUFFER"] = 1] = "BUFFER";
    GFXObjectType[GFXObjectType["TEXTURE"] = 2] = "TEXTURE";
    GFXObjectType[GFXObjectType["TEXTURE_VIEW"] = 3] = "TEXTURE_VIEW";
    GFXObjectType[GFXObjectType["RENDER_PASS"] = 4] = "RENDER_PASS";
    GFXObjectType[GFXObjectType["FRAMEBUFFER"] = 5] = "FRAMEBUFFER";
    GFXObjectType[GFXObjectType["SAMPLER"] = 6] = "SAMPLER";
    GFXObjectType[GFXObjectType["SHADER"] = 7] = "SHADER";
    GFXObjectType[GFXObjectType["PIPELINE_LAYOUT"] = 8] = "PIPELINE_LAYOUT";
    GFXObjectType[GFXObjectType["PIPELINE_STATE"] = 9] = "PIPELINE_STATE";
    GFXObjectType[GFXObjectType["BINDING_LAYOUT"] = 10] = "BINDING_LAYOUT";
    GFXObjectType[GFXObjectType["INPUT_ASSEMBLER"] = 11] = "INPUT_ASSEMBLER";
    GFXObjectType[GFXObjectType["COMMAND_ALLOCATOR"] = 12] = "COMMAND_ALLOCATOR";
    GFXObjectType[GFXObjectType["COMMAND_BUFFER"] = 13] = "COMMAND_BUFFER";
    GFXObjectType[GFXObjectType["QUEUE"] = 14] = "QUEUE";
    GFXObjectType[GFXObjectType["WINDOW"] = 15] = "WINDOW";
})(GFXObjectType || (GFXObjectType = {}));
var GFXStatus;
(function (GFXStatus) {
    GFXStatus[GFXStatus["UNREADY"] = 0] = "UNREADY";
    GFXStatus[GFXStatus["FAILED"] = 1] = "FAILED";
    GFXStatus[GFXStatus["SUCCESS"] = 2] = "SUCCESS";
})(GFXStatus || (GFXStatus = {}));
var GFXObject = /** @class */ (function () {
    function GFXObject(gfxType) {
        this._gfxType = GFXObjectType.UNKNOWN;
        this._status = GFXStatus.UNREADY;
        this._gfxType = gfxType;
    }
    Object.defineProperty(GFXObject.prototype, "gfxType", {
        get: function () {
            return this._gfxType;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(GFXObject.prototype, "status", {
        get: function () {
            return this._status;
        },
        enumerable: true,
        configurable: true
    });
    return GFXObject;
}());
var GFXAttributeName;
(function (GFXAttributeName) {
    GFXAttributeName["ATTR_POSITION"] = "a_position";
    GFXAttributeName["ATTR_NORMAL"] = "a_normal";
    GFXAttributeName["ATTR_TANGENT"] = "a_tangent";
    GFXAttributeName["ATTR_BITANGENT"] = "a_bitangent";
    GFXAttributeName["ATTR_WEIGHTS"] = "a_weights";
    GFXAttributeName["ATTR_JOINTS"] = "a_joints";
    GFXAttributeName["ATTR_COLOR"] = "a_color";
    GFXAttributeName["ATTR_COLOR1"] = "a_color1";
    GFXAttributeName["ATTR_COLOR2"] = "a_color2";
    GFXAttributeName["ATTR_TEX_COORD"] = "a_texCoord";
    GFXAttributeName["ATTR_TEX_COORD1"] = "a_texCoord1";
    GFXAttributeName["ATTR_TEX_COORD2"] = "a_texCoord2";
    GFXAttributeName["ATTR_TEX_COORD3"] = "a_texCoord3";
    GFXAttributeName["ATTR_TEX_COORD4"] = "a_texCoord4";
    GFXAttributeName["ATTR_TEX_COORD5"] = "a_texCoord5";
    GFXAttributeName["ATTR_TEX_COORD6"] = "a_texCoord6";
    GFXAttributeName["ATTR_TEX_COORD7"] = "a_texCoord7";
    GFXAttributeName["ATTR_TEX_COORD8"] = "a_texCoord8";
})(GFXAttributeName || (GFXAttributeName = {}));
var GFXType;
(function (GFXType) {
    GFXType[GFXType["UNKNOWN"] = 0] = "UNKNOWN";
    GFXType[GFXType["BOOL"] = 1] = "BOOL";
    GFXType[GFXType["BOOL2"] = 2] = "BOOL2";
    GFXType[GFXType["BOOL3"] = 3] = "BOOL3";
    GFXType[GFXType["BOOL4"] = 4] = "BOOL4";
    GFXType[GFXType["INT"] = 5] = "INT";
    GFXType[GFXType["INT2"] = 6] = "INT2";
    GFXType[GFXType["INT3"] = 7] = "INT3";
    GFXType[GFXType["INT4"] = 8] = "INT4";
    GFXType[GFXType["UINT"] = 9] = "UINT";
    GFXType[GFXType["UINT2"] = 10] = "UINT2";
    GFXType[GFXType["UINT3"] = 11] = "UINT3";
    GFXType[GFXType["UINT4"] = 12] = "UINT4";
    GFXType[GFXType["FLOAT"] = 13] = "FLOAT";
    GFXType[GFXType["FLOAT2"] = 14] = "FLOAT2";
    GFXType[GFXType["FLOAT3"] = 15] = "FLOAT3";
    GFXType[GFXType["FLOAT4"] = 16] = "FLOAT4";
    GFXType[GFXType["COLOR4"] = 17] = "COLOR4";
    GFXType[GFXType["MAT2"] = 18] = "MAT2";
    GFXType[GFXType["MAT2X3"] = 19] = "MAT2X3";
    GFXType[GFXType["MAT2X4"] = 20] = "MAT2X4";
    GFXType[GFXType["MAT3X2"] = 21] = "MAT3X2";
    GFXType[GFXType["MAT3"] = 22] = "MAT3";
    GFXType[GFXType["MAT3X4"] = 23] = "MAT3X4";
    GFXType[GFXType["MAT4X2"] = 24] = "MAT4X2";
    GFXType[GFXType["MAT4X3"] = 25] = "MAT4X3";
    GFXType[GFXType["MAT4"] = 26] = "MAT4";
    GFXType[GFXType["SAMPLER1D"] = 27] = "SAMPLER1D";
    GFXType[GFXType["SAMPLER1D_ARRAY"] = 28] = "SAMPLER1D_ARRAY";
    GFXType[GFXType["SAMPLER2D"] = 29] = "SAMPLER2D";
    GFXType[GFXType["SAMPLER2D_ARRAY"] = 30] = "SAMPLER2D_ARRAY";
    GFXType[GFXType["SAMPLER3D"] = 31] = "SAMPLER3D";
    GFXType[GFXType["SAMPLER_CUBE"] = 32] = "SAMPLER_CUBE";
    GFXType[GFXType["COUNT"] = 33] = "COUNT";
})(GFXType || (GFXType = {}));
var GFXFormat;
(function (GFXFormat) {
    GFXFormat[GFXFormat["UNKNOWN"] = 0] = "UNKNOWN";
    GFXFormat[GFXFormat["A8"] = 1] = "A8";
    GFXFormat[GFXFormat["L8"] = 2] = "L8";
    GFXFormat[GFXFormat["LA8"] = 3] = "LA8";
    GFXFormat[GFXFormat["R8"] = 4] = "R8";
    GFXFormat[GFXFormat["R8SN"] = 5] = "R8SN";
    GFXFormat[GFXFormat["R8UI"] = 6] = "R8UI";
    GFXFormat[GFXFormat["R8I"] = 7] = "R8I";
    GFXFormat[GFXFormat["R16F"] = 8] = "R16F";
    GFXFormat[GFXFormat["R16UI"] = 9] = "R16UI";
    GFXFormat[GFXFormat["R16I"] = 10] = "R16I";
    GFXFormat[GFXFormat["R32F"] = 11] = "R32F";
    GFXFormat[GFXFormat["R32UI"] = 12] = "R32UI";
    GFXFormat[GFXFormat["R32I"] = 13] = "R32I";
    GFXFormat[GFXFormat["RG8"] = 14] = "RG8";
    GFXFormat[GFXFormat["RG8SN"] = 15] = "RG8SN";
    GFXFormat[GFXFormat["RG8UI"] = 16] = "RG8UI";
    GFXFormat[GFXFormat["RG8I"] = 17] = "RG8I";
    GFXFormat[GFXFormat["RG16F"] = 18] = "RG16F";
    GFXFormat[GFXFormat["RG16UI"] = 19] = "RG16UI";
    GFXFormat[GFXFormat["RG16I"] = 20] = "RG16I";
    GFXFormat[GFXFormat["RG32F"] = 21] = "RG32F";
    GFXFormat[GFXFormat["RG32UI"] = 22] = "RG32UI";
    GFXFormat[GFXFormat["RG32I"] = 23] = "RG32I";
    GFXFormat[GFXFormat["RGB8"] = 24] = "RGB8";
    GFXFormat[GFXFormat["SRGB8"] = 25] = "SRGB8";
    GFXFormat[GFXFormat["RGB8SN"] = 26] = "RGB8SN";
    GFXFormat[GFXFormat["RGB8UI"] = 27] = "RGB8UI";
    GFXFormat[GFXFormat["RGB8I"] = 28] = "RGB8I";
    GFXFormat[GFXFormat["RGB16F"] = 29] = "RGB16F";
    GFXFormat[GFXFormat["RGB16UI"] = 30] = "RGB16UI";
    GFXFormat[GFXFormat["RGB16I"] = 31] = "RGB16I";
    GFXFormat[GFXFormat["RGB32F"] = 32] = "RGB32F";
    GFXFormat[GFXFormat["RGB32UI"] = 33] = "RGB32UI";
    GFXFormat[GFXFormat["RGB32I"] = 34] = "RGB32I";
    GFXFormat[GFXFormat["RGBA8"] = 35] = "RGBA8";
    GFXFormat[GFXFormat["SRGB8_A8"] = 36] = "SRGB8_A8";
    GFXFormat[GFXFormat["RGBA8SN"] = 37] = "RGBA8SN";
    GFXFormat[GFXFormat["RGBA8UI"] = 38] = "RGBA8UI";
    GFXFormat[GFXFormat["RGBA8I"] = 39] = "RGBA8I";
    GFXFormat[GFXFormat["RGBA16F"] = 40] = "RGBA16F";
    GFXFormat[GFXFormat["RGBA16UI"] = 41] = "RGBA16UI";
    GFXFormat[GFXFormat["RGBA16I"] = 42] = "RGBA16I";
    GFXFormat[GFXFormat["RGBA32F"] = 43] = "RGBA32F";
    GFXFormat[GFXFormat["RGBA32UI"] = 44] = "RGBA32UI";
    GFXFormat[GFXFormat["RGBA32I"] = 45] = "RGBA32I";
    // Special Format
    GFXFormat[GFXFormat["R5G6B5"] = 46] = "R5G6B5";
    GFXFormat[GFXFormat["R11G11B10F"] = 47] = "R11G11B10F";
    GFXFormat[GFXFormat["RGB5A1"] = 48] = "RGB5A1";
    GFXFormat[GFXFormat["RGBA4"] = 49] = "RGBA4";
    GFXFormat[GFXFormat["RGB10A2"] = 50] = "RGB10A2";
    GFXFormat[GFXFormat["RGB10A2UI"] = 51] = "RGB10A2UI";
    GFXFormat[GFXFormat["RGB9E5"] = 52] = "RGB9E5";
    // Depth-Stencil Format
    GFXFormat[GFXFormat["D16"] = 53] = "D16";
    GFXFormat[GFXFormat["D16S8"] = 54] = "D16S8";
    GFXFormat[GFXFormat["D24"] = 55] = "D24";
    GFXFormat[GFXFormat["D24S8"] = 56] = "D24S8";
    GFXFormat[GFXFormat["D32F"] = 57] = "D32F";
    GFXFormat[GFXFormat["D32F_S8"] = 58] = "D32F_S8";
    // Compressed Format
    // Block Compression Format, DDS (DirectDraw Surface)
    // DXT1: 3 channels (5:6:5), 1/8 origianl size, with 0 or 1 bit of alpha
    GFXFormat[GFXFormat["BC1"] = 59] = "BC1";
    GFXFormat[GFXFormat["BC1_ALPHA"] = 60] = "BC1_ALPHA";
    GFXFormat[GFXFormat["BC1_SRGB"] = 61] = "BC1_SRGB";
    GFXFormat[GFXFormat["BC1_SRGB_ALPHA"] = 62] = "BC1_SRGB_ALPHA";
    // DXT3: 4 channels (5:6:5), 1/4 origianl size, with 4 bits of alpha
    GFXFormat[GFXFormat["BC2"] = 63] = "BC2";
    GFXFormat[GFXFormat["BC2_SRGB"] = 64] = "BC2_SRGB";
    // DXT5: 4 channels (5:6:5), 1/4 origianl size, with 8 bits of alpha
    GFXFormat[GFXFormat["BC3"] = 65] = "BC3";
    GFXFormat[GFXFormat["BC3_SRGB"] = 66] = "BC3_SRGB";
    // 1 channel (8), 1/4 origianl size
    GFXFormat[GFXFormat["BC4"] = 67] = "BC4";
    GFXFormat[GFXFormat["BC4_SNORM"] = 68] = "BC4_SNORM";
    // 2 channels (8:8), 1/2 origianl size
    GFXFormat[GFXFormat["BC5"] = 69] = "BC5";
    GFXFormat[GFXFormat["BC5_SNORM"] = 70] = "BC5_SNORM";
    // 3 channels (16:16:16), half-floating point, 1/6 origianl size
    // UF16: unsigned float, 5 exponent bits + 11 mantissa bits
    // SF16: signed float, 1 signed bit + 5 exponent bits + 10 mantissa bits
    GFXFormat[GFXFormat["BC6H_UF16"] = 71] = "BC6H_UF16";
    GFXFormat[GFXFormat["BC6H_SF16"] = 72] = "BC6H_SF16";
    // 4 channels (4~7 bits per channel) with 0 to 8 bits of alpha, 1/3 original size
    GFXFormat[GFXFormat["BC7"] = 73] = "BC7";
    GFXFormat[GFXFormat["BC7_SRGB"] = 74] = "BC7_SRGB";
    // Ericsson Texture Compression Format
    GFXFormat[GFXFormat["ETC_RGB8"] = 75] = "ETC_RGB8";
    GFXFormat[GFXFormat["ETC2_RGB8"] = 76] = "ETC2_RGB8";
    GFXFormat[GFXFormat["ETC2_SRGB8"] = 77] = "ETC2_SRGB8";
    GFXFormat[GFXFormat["ETC2_RGB8_A1"] = 78] = "ETC2_RGB8_A1";
    GFXFormat[GFXFormat["ETC2_SRGB8_A1"] = 79] = "ETC2_SRGB8_A1";
    GFXFormat[GFXFormat["ETC2_RGBA8"] = 80] = "ETC2_RGBA8";
    GFXFormat[GFXFormat["ETC2_SRGB8_A8"] = 81] = "ETC2_SRGB8_A8";
    GFXFormat[GFXFormat["EAC_R11"] = 82] = "EAC_R11";
    GFXFormat[GFXFormat["EAC_R11SN"] = 83] = "EAC_R11SN";
    GFXFormat[GFXFormat["EAC_RG11"] = 84] = "EAC_RG11";
    GFXFormat[GFXFormat["EAC_RG11SN"] = 85] = "EAC_RG11SN";
    // PVRTC (PowerVR)
    GFXFormat[GFXFormat["PVRTC_RGB2"] = 86] = "PVRTC_RGB2";
    GFXFormat[GFXFormat["PVRTC_RGBA2"] = 87] = "PVRTC_RGBA2";
    GFXFormat[GFXFormat["PVRTC_RGB4"] = 88] = "PVRTC_RGB4";
    GFXFormat[GFXFormat["PVRTC_RGBA4"] = 89] = "PVRTC_RGBA4";
    GFXFormat[GFXFormat["PVRTC2_2BPP"] = 90] = "PVRTC2_2BPP";
    GFXFormat[GFXFormat["PVRTC2_4BPP"] = 91] = "PVRTC2_4BPP";

    // ASTC (Adaptive Scalable Texture Compression)
    GFXFormat[GFXFormat["ASTC_RGBA_4x4"] = 92] = "ASTC_RGBA_4x4";
    GFXFormat[GFXFormat["ASTC_RGBA_5x4"] = 92] = "ASTC_RGBA_5x4";
    GFXFormat[GFXFormat["ASTC_RGBA_5x5"] = 92] = "ASTC_RGBA_5x5";
    GFXFormat[GFXFormat["ASTC_RGBA_6x5"] = 92] = "ASTC_RGBA_6x5";
    GFXFormat[GFXFormat["ASTC_RGBA_6x6"] = 92] = "ASTC_RGBA_6x6";
    GFXFormat[GFXFormat["ASTC_RGBA_8x5"] = 92] = "ASTC_RGBA_8x5";
    GFXFormat[GFXFormat["ASTC_RGBA_8x6"] = 92] = "ASTC_RGBA_8x6";
    GFXFormat[GFXFormat["ASTC_RGBA_8x8"] = 92] = "ASTC_RGBA_8x8";
    GFXFormat[GFXFormat["ASTC_RGBA_10x5"] = 92] = "ASTC_RGBA_10x5";
    GFXFormat[GFXFormat["ASTC_RGBA_10x6"] = 92] = "ASTC_RGBA_10x6";
    GFXFormat[GFXFormat["ASTC_RGBA_10x8"] = 92] = "ASTC_RGBA_10x8";
    GFXFormat[GFXFormat["ASTC_RGBA_10x10"] = 92] = "ASTC_RGBA_10x10";
    GFXFormat[GFXFormat["ASTC_RGBA_12x10"] = 92] = "ASTC_RGBA_12x10";
    GFXFormat[GFXFormat["ASTC_RGBA_12x12"] = 92] = "ASTC_RGBA_12x12";

    // ASTC (Adaptive Scalable Texture Compression) SRGB
    GFXFormat[GFXFormat["ASTC_SRGBA_4x4"] = 92] = "ASTC_SRGBA_4x4";
    GFXFormat[GFXFormat["ASTC_SRGBA_5x4"] = 92] = "ASTC_SRGBA_5x4";
    GFXFormat[GFXFormat["ASTC_SRGBA_5x5"] = 92] = "ASTC_SRGBA_5x5";
    GFXFormat[GFXFormat["ASTC_SRGBA_6x5"] = 92] = "ASTC_SRGBA_6x5";
    GFXFormat[GFXFormat["ASTC_SRGBA_6x6"] = 92] = "ASTC_SRGBA_6x6";
    GFXFormat[GFXFormat["ASTC_SRGBA_8x5"] = 92] = "ASTC_SRGBA_8x5";
    GFXFormat[GFXFormat["ASTC_SRGBA_8x6"] = 92] = "ASTC_SRGBA_8x6";
    GFXFormat[GFXFormat["ASTC_SRGBA_8x8"] = 92] = "ASTC_SRGBA_8x8";
    GFXFormat[GFXFormat["ASTC_SRGBA_10x5"] = 92] = "ASTC_SRGBA_10x5";
    GFXFormat[GFXFormat["ASTC_SRGBA_10x6"] = 92] = "ASTC_SRGBA_10x6";
    GFXFormat[GFXFormat["ASTC_SRGBA_10x8"] = 92] = "ASTC_SRGBA_10x8";
    GFXFormat[GFXFormat["ASTC_SRGBA_10x10"] = 92] = "ASTC_SRGBA_10x10";
    GFXFormat[GFXFormat["ASTC_SRGBA_12x10"] = 92] = "ASTC_SRGBA_12x10";
    GFXFormat[GFXFormat["ASTC_SRGBA_12x12"] = 92] = "ASTC_SRGBA_12x12";
})(GFXFormat || (GFXFormat = {}));
var GFXBufferUsageBit;
(function (GFXBufferUsageBit) {
    GFXBufferUsageBit[GFXBufferUsageBit["NONE"] = 0] = "NONE";
    GFXBufferUsageBit[GFXBufferUsageBit["TRANSFER_SRC"] = 1] = "TRANSFER_SRC";
    GFXBufferUsageBit[GFXBufferUsageBit["TRANSFER_DST"] = 2] = "TRANSFER_DST";
    GFXBufferUsageBit[GFXBufferUsageBit["INDEX"] = 4] = "INDEX";
    GFXBufferUsageBit[GFXBufferUsageBit["VERTEX"] = 8] = "VERTEX";
    GFXBufferUsageBit[GFXBufferUsageBit["UNIFORM"] = 16] = "UNIFORM";
    GFXBufferUsageBit[GFXBufferUsageBit["STORAGE"] = 32] = "STORAGE";
    GFXBufferUsageBit[GFXBufferUsageBit["INDIRECT"] = 64] = "INDIRECT";
})(GFXBufferUsageBit || (GFXBufferUsageBit = {}));
var GFXMemoryUsageBit;
(function (GFXMemoryUsageBit) {
    GFXMemoryUsageBit[GFXMemoryUsageBit["NONE"] = 0] = "NONE";
    GFXMemoryUsageBit[GFXMemoryUsageBit["DEVICE"] = 1] = "DEVICE";
    GFXMemoryUsageBit[GFXMemoryUsageBit["HOST"] = 2] = "HOST";
})(GFXMemoryUsageBit || (GFXMemoryUsageBit = {}));
var GFXBufferAccessBit;
(function (GFXBufferAccessBit) {
    GFXBufferAccessBit[GFXBufferAccessBit["NONE"] = 0] = "NONE";
    GFXBufferAccessBit[GFXBufferAccessBit["READ"] = 1] = "READ";
    GFXBufferAccessBit[GFXBufferAccessBit["WRITE"] = 2] = "WRITE";
})(GFXBufferAccessBit || (GFXBufferAccessBit = {}));
var GFXPrimitiveMode;
(function (GFXPrimitiveMode) {
    GFXPrimitiveMode[GFXPrimitiveMode["POINT_LIST"] = 0] = "POINT_LIST";
    GFXPrimitiveMode[GFXPrimitiveMode["LINE_LIST"] = 1] = "LINE_LIST";
    GFXPrimitiveMode[GFXPrimitiveMode["LINE_STRIP"] = 2] = "LINE_STRIP";
    GFXPrimitiveMode[GFXPrimitiveMode["LINE_LOOP"] = 3] = "LINE_LOOP";
    GFXPrimitiveMode[GFXPrimitiveMode["LINE_LIST_ADJACENCY"] = 4] = "LINE_LIST_ADJACENCY";
    GFXPrimitiveMode[GFXPrimitiveMode["LINE_STRIP_ADJACENCY"] = 5] = "LINE_STRIP_ADJACENCY";
    GFXPrimitiveMode[GFXPrimitiveMode["ISO_LINE_LIST"] = 6] = "ISO_LINE_LIST";
    // raycast detectable:
    GFXPrimitiveMode[GFXPrimitiveMode["TRIANGLE_LIST"] = 7] = "TRIANGLE_LIST";
    GFXPrimitiveMode[GFXPrimitiveMode["TRIANGLE_STRIP"] = 8] = "TRIANGLE_STRIP";
    GFXPrimitiveMode[GFXPrimitiveMode["TRIANGLE_FAN"] = 9] = "TRIANGLE_FAN";
    GFXPrimitiveMode[GFXPrimitiveMode["TRIANGLE_LIST_ADJACENCY"] = 10] = "TRIANGLE_LIST_ADJACENCY";
    GFXPrimitiveMode[GFXPrimitiveMode["TRIANGLE_STRIP_ADJACENCY"] = 11] = "TRIANGLE_STRIP_ADJACENCY";
    GFXPrimitiveMode[GFXPrimitiveMode["TRIANGLE_PATCH_ADJACENCY"] = 12] = "TRIANGLE_PATCH_ADJACENCY";
    GFXPrimitiveMode[GFXPrimitiveMode["QUAD_PATCH_LIST"] = 13] = "QUAD_PATCH_LIST";
})(GFXPrimitiveMode || (GFXPrimitiveMode = {}));
var GFXPolygonMode;
(function (GFXPolygonMode) {
    GFXPolygonMode[GFXPolygonMode["FILL"] = 0] = "FILL";
    GFXPolygonMode[GFXPolygonMode["POINT"] = 1] = "POINT";
    GFXPolygonMode[GFXPolygonMode["LINE"] = 2] = "LINE";
})(GFXPolygonMode || (GFXPolygonMode = {}));
var GFXShadeModel;
(function (GFXShadeModel) {
    GFXShadeModel[GFXShadeModel["GOURAND"] = 0] = "GOURAND";
    GFXShadeModel[GFXShadeModel["FLAT"] = 1] = "FLAT";
})(GFXShadeModel || (GFXShadeModel = {}));
var GFXCullMode;
(function (GFXCullMode) {
    GFXCullMode[GFXCullMode["NONE"] = 0] = "NONE";
    GFXCullMode[GFXCullMode["FRONT"] = 1] = "FRONT";
    GFXCullMode[GFXCullMode["BACK"] = 2] = "BACK";
})(GFXCullMode || (GFXCullMode = {}));
var GFXComparisonFunc;
(function (GFXComparisonFunc) {
    GFXComparisonFunc[GFXComparisonFunc["NEVER"] = 0] = "NEVER";
    GFXComparisonFunc[GFXComparisonFunc["LESS"] = 1] = "LESS";
    GFXComparisonFunc[GFXComparisonFunc["EQUAL"] = 2] = "EQUAL";
    GFXComparisonFunc[GFXComparisonFunc["LESS_EQUAL"] = 3] = "LESS_EQUAL";
    GFXComparisonFunc[GFXComparisonFunc["GREATER"] = 4] = "GREATER";
    GFXComparisonFunc[GFXComparisonFunc["NOT_EQUAL"] = 5] = "NOT_EQUAL";
    GFXComparisonFunc[GFXComparisonFunc["GREATER_EQUAL"] = 6] = "GREATER_EQUAL";
    GFXComparisonFunc[GFXComparisonFunc["ALWAYS"] = 7] = "ALWAYS";
})(GFXComparisonFunc || (GFXComparisonFunc = {}));
var GFXStencilOp;
(function (GFXStencilOp) {
    GFXStencilOp[GFXStencilOp["ZERO"] = 0] = "ZERO";
    GFXStencilOp[GFXStencilOp["KEEP"] = 1] = "KEEP";
    GFXStencilOp[GFXStencilOp["REPLACE"] = 2] = "REPLACE";
    GFXStencilOp[GFXStencilOp["INCR"] = 3] = "INCR";
    GFXStencilOp[GFXStencilOp["DECR"] = 4] = "DECR";
    GFXStencilOp[GFXStencilOp["INVERT"] = 5] = "INVERT";
    GFXStencilOp[GFXStencilOp["INCR_WRAP"] = 6] = "INCR_WRAP";
    GFXStencilOp[GFXStencilOp["DECR_WRAP"] = 7] = "DECR_WRAP";
})(GFXStencilOp || (GFXStencilOp = {}));
var GFXBlendOp;
(function (GFXBlendOp) {
    GFXBlendOp[GFXBlendOp["ADD"] = 0] = "ADD";
    GFXBlendOp[GFXBlendOp["SUB"] = 1] = "SUB";
    GFXBlendOp[GFXBlendOp["REV_SUB"] = 2] = "REV_SUB";
    GFXBlendOp[GFXBlendOp["MIN"] = 3] = "MIN";
    GFXBlendOp[GFXBlendOp["MAX"] = 4] = "MAX";
})(GFXBlendOp || (GFXBlendOp = {}));
var GFXBlendFactor;
(function (GFXBlendFactor) {
    GFXBlendFactor[GFXBlendFactor["ZERO"] = 0] = "ZERO";
    GFXBlendFactor[GFXBlendFactor["ONE"] = 1] = "ONE";
    GFXBlendFactor[GFXBlendFactor["SRC_ALPHA"] = 2] = "SRC_ALPHA";
    GFXBlendFactor[GFXBlendFactor["DST_ALPHA"] = 3] = "DST_ALPHA";
    GFXBlendFactor[GFXBlendFactor["ONE_MINUS_SRC_ALPHA"] = 4] = "ONE_MINUS_SRC_ALPHA";
    GFXBlendFactor[GFXBlendFactor["ONE_MINUS_DST_ALPHA"] = 5] = "ONE_MINUS_DST_ALPHA";
    GFXBlendFactor[GFXBlendFactor["SRC_COLOR"] = 6] = "SRC_COLOR";
    GFXBlendFactor[GFXBlendFactor["DST_COLOR"] = 7] = "DST_COLOR";
    GFXBlendFactor[GFXBlendFactor["ONE_MINUS_SRC_COLOR"] = 8] = "ONE_MINUS_SRC_COLOR";
    GFXBlendFactor[GFXBlendFactor["ONE_MINUS_DST_COLOR"] = 9] = "ONE_MINUS_DST_COLOR";
    GFXBlendFactor[GFXBlendFactor["SRC_ALPHA_SATURATE"] = 10] = "SRC_ALPHA_SATURATE";
    GFXBlendFactor[GFXBlendFactor["CONSTANT_COLOR"] = 11] = "CONSTANT_COLOR";
    GFXBlendFactor[GFXBlendFactor["ONE_MINUS_CONSTANT_COLOR"] = 12] = "ONE_MINUS_CONSTANT_COLOR";
    GFXBlendFactor[GFXBlendFactor["CONSTANT_ALPHA"] = 13] = "CONSTANT_ALPHA";
    GFXBlendFactor[GFXBlendFactor["ONE_MINUS_CONSTANT_ALPHA"] = 14] = "ONE_MINUS_CONSTANT_ALPHA";
})(GFXBlendFactor || (GFXBlendFactor = {}));
var GFXColorMask;
(function (GFXColorMask) {
    GFXColorMask[GFXColorMask["NONE"] = 0] = "NONE";
    GFXColorMask[GFXColorMask["R"] = 1] = "R";
    GFXColorMask[GFXColorMask["G"] = 2] = "G";
    GFXColorMask[GFXColorMask["B"] = 4] = "B";
    GFXColorMask[GFXColorMask["A"] = 8] = "A";
    GFXColorMask[GFXColorMask["ALL"] = 15] = "ALL";
})(GFXColorMask || (GFXColorMask = {}));
var GFXFilter;
(function (GFXFilter) {
    GFXFilter[GFXFilter["NONE"] = 0] = "NONE";
    GFXFilter[GFXFilter["POINT"] = 1] = "POINT";
    GFXFilter[GFXFilter["LINEAR"] = 2] = "LINEAR";
    GFXFilter[GFXFilter["ANISOTROPIC"] = 3] = "ANISOTROPIC";
})(GFXFilter || (GFXFilter = {}));
var GFXAddress;
(function (GFXAddress) {
    GFXAddress[GFXAddress["WRAP"] = 0] = "WRAP";
    GFXAddress[GFXAddress["MIRROR"] = 1] = "MIRROR";
    GFXAddress[GFXAddress["CLAMP"] = 2] = "CLAMP";
    GFXAddress[GFXAddress["BORDER"] = 3] = "BORDER";
})(GFXAddress || (GFXAddress = {}));
var GFXTextureType;
(function (GFXTextureType) {
    GFXTextureType[GFXTextureType["TEX1D"] = 0] = "TEX1D";
    GFXTextureType[GFXTextureType["TEX2D"] = 1] = "TEX2D";
    GFXTextureType[GFXTextureType["TEX3D"] = 2] = "TEX3D";
})(GFXTextureType || (GFXTextureType = {}));
var GFXTextureUsageBit;
(function (GFXTextureUsageBit) {
    GFXTextureUsageBit[GFXTextureUsageBit["NONE"] = 0] = "NONE";
    GFXTextureUsageBit[GFXTextureUsageBit["TRANSFER_SRC"] = 1] = "TRANSFER_SRC";
    GFXTextureUsageBit[GFXTextureUsageBit["TRANSFER_DST"] = 2] = "TRANSFER_DST";
    GFXTextureUsageBit[GFXTextureUsageBit["SAMPLED"] = 4] = "SAMPLED";
    GFXTextureUsageBit[GFXTextureUsageBit["STORAGE"] = 8] = "STORAGE";
    GFXTextureUsageBit[GFXTextureUsageBit["COLOR_ATTACHMENT"] = 16] = "COLOR_ATTACHMENT";
    GFXTextureUsageBit[GFXTextureUsageBit["DEPTH_STENCIL_ATTACHMENT"] = 32] = "DEPTH_STENCIL_ATTACHMENT";
    GFXTextureUsageBit[GFXTextureUsageBit["TRANSIENT_ATTACHMENT"] = 64] = "TRANSIENT_ATTACHMENT";
    GFXTextureUsageBit[GFXTextureUsageBit["INPUT_ATTACHMENT"] = 128] = "INPUT_ATTACHMENT";
})(GFXTextureUsageBit || (GFXTextureUsageBit = {}));
var GFXSampleCount;
(function (GFXSampleCount) {
    GFXSampleCount[GFXSampleCount["X1"] = 0] = "X1";
    GFXSampleCount[GFXSampleCount["X2"] = 1] = "X2";
    GFXSampleCount[GFXSampleCount["X4"] = 2] = "X4";
    GFXSampleCount[GFXSampleCount["X8"] = 3] = "X8";
    GFXSampleCount[GFXSampleCount["X16"] = 4] = "X16";
    GFXSampleCount[GFXSampleCount["X32"] = 5] = "X32";
    GFXSampleCount[GFXSampleCount["X64"] = 6] = "X64";
})(GFXSampleCount || (GFXSampleCount = {}));
var GFXTextureFlagBit;
(function (GFXTextureFlagBit) {
    GFXTextureFlagBit[GFXTextureFlagBit["NONE"] = 0] = "NONE";
    GFXTextureFlagBit[GFXTextureFlagBit["GEN_MIPMAP"] = 1] = "GEN_MIPMAP";
    GFXTextureFlagBit[GFXTextureFlagBit["CUBEMAP"] = 2] = "CUBEMAP";
    GFXTextureFlagBit[GFXTextureFlagBit["BAKUP_BUFFER"] = 4] = "BAKUP_BUFFER";
})(GFXTextureFlagBit || (GFXTextureFlagBit = {}));
var GFXTextureViewType;
(function (GFXTextureViewType) {
    GFXTextureViewType[GFXTextureViewType["TV1D"] = 0] = "TV1D";
    GFXTextureViewType[GFXTextureViewType["TV2D"] = 1] = "TV2D";
    GFXTextureViewType[GFXTextureViewType["TV3D"] = 2] = "TV3D";
    GFXTextureViewType[GFXTextureViewType["CUBE"] = 3] = "CUBE";
    GFXTextureViewType[GFXTextureViewType["TV1D_ARRAY"] = 4] = "TV1D_ARRAY";
    GFXTextureViewType[GFXTextureViewType["TV2D_ARRAY"] = 5] = "TV2D_ARRAY";
})(GFXTextureViewType || (GFXTextureViewType = {}));
var GFXShaderType;
(function (GFXShaderType) {
    GFXShaderType[GFXShaderType["VERTEX"] = 0] = "VERTEX";
    GFXShaderType[GFXShaderType["HULL"] = 1] = "HULL";
    GFXShaderType[GFXShaderType["DOMAIN"] = 2] = "DOMAIN";
    GFXShaderType[GFXShaderType["GEOMETRY"] = 3] = "GEOMETRY";
    GFXShaderType[GFXShaderType["FRAGMENT"] = 4] = "FRAGMENT";
    GFXShaderType[GFXShaderType["COMPUTE"] = 5] = "COMPUTE";
    GFXShaderType[GFXShaderType["COUNT"] = 6] = "COUNT";
})(GFXShaderType || (GFXShaderType = {}));
var GFXBindingType;
(function (GFXBindingType) {
    GFXBindingType[GFXBindingType["UNKNOWN"] = 0] = "UNKNOWN";
    GFXBindingType[GFXBindingType["UNIFORM_BUFFER"] = 1] = "UNIFORM_BUFFER";
    GFXBindingType[GFXBindingType["SAMPLER"] = 2] = "SAMPLER";
    GFXBindingType[GFXBindingType["STORAGE_BUFFER"] = 3] = "STORAGE_BUFFER";
})(GFXBindingType || (GFXBindingType = {}));
var GFXCommandBufferType;
(function (GFXCommandBufferType) {
    GFXCommandBufferType[GFXCommandBufferType["PRIMARY"] = 0] = "PRIMARY";
    GFXCommandBufferType[GFXCommandBufferType["SECONDARY"] = 1] = "SECONDARY";
})(GFXCommandBufferType || (GFXCommandBufferType = {}));
// Enumeration all possible values of operations to be performed on initially Loading a Framebuffer Object.
var GFXLoadOp;
(function (GFXLoadOp) {
    GFXLoadOp[GFXLoadOp["LOAD"] = 0] = "LOAD";
    GFXLoadOp[GFXLoadOp["CLEAR"] = 1] = "CLEAR";
    GFXLoadOp[GFXLoadOp["DISCARD"] = 2] = "DISCARD";
})(GFXLoadOp || (GFXLoadOp = {}));
// Enumerates all possible values of operations to be performed when Storing to a Framebuffer Object.
var GFXStoreOp;
(function (GFXStoreOp) {
    GFXStoreOp[GFXStoreOp["STORE"] = 0] = "STORE";
    GFXStoreOp[GFXStoreOp["DISCARD"] = 1] = "DISCARD";
})(GFXStoreOp || (GFXStoreOp = {}));
var GFXTextureLayout;
(function (GFXTextureLayout) {
    GFXTextureLayout[GFXTextureLayout["UNDEFINED"] = 0] = "UNDEFINED";
    GFXTextureLayout[GFXTextureLayout["GENERAL"] = 1] = "GENERAL";
    GFXTextureLayout[GFXTextureLayout["COLOR_ATTACHMENT_OPTIMAL"] = 2] = "COLOR_ATTACHMENT_OPTIMAL";
    GFXTextureLayout[GFXTextureLayout["DEPTH_STENCIL_ATTACHMENT_OPTIMAL"] = 3] = "DEPTH_STENCIL_ATTACHMENT_OPTIMAL";
    GFXTextureLayout[GFXTextureLayout["DEPTH_STENCIL_READONLY_OPTIMAL"] = 4] = "DEPTH_STENCIL_READONLY_OPTIMAL";
    GFXTextureLayout[GFXTextureLayout["SHADER_READONLY_OPTIMAL"] = 5] = "SHADER_READONLY_OPTIMAL";
    GFXTextureLayout[GFXTextureLayout["TRANSFER_SRC_OPTIMAL"] = 6] = "TRANSFER_SRC_OPTIMAL";
    GFXTextureLayout[GFXTextureLayout["TRANSFER_DST_OPTIMAL"] = 7] = "TRANSFER_DST_OPTIMAL";
    GFXTextureLayout[GFXTextureLayout["PREINITIALIZED"] = 8] = "PREINITIALIZED";
    GFXTextureLayout[GFXTextureLayout["PRESENT_SRC"] = 9] = "PRESENT_SRC";
})(GFXTextureLayout || (GFXTextureLayout = {}));
var GFXPipelineBindPoint;
(function (GFXPipelineBindPoint) {
    GFXPipelineBindPoint[GFXPipelineBindPoint["GRAPHICS"] = 0] = "GRAPHICS";
    GFXPipelineBindPoint[GFXPipelineBindPoint["COMPUTE"] = 1] = "COMPUTE";
    GFXPipelineBindPoint[GFXPipelineBindPoint["RAY_TRACING"] = 2] = "RAY_TRACING";
})(GFXPipelineBindPoint || (GFXPipelineBindPoint = {}));
var GFXDynamicState;
(function (GFXDynamicState) {
    GFXDynamicState[GFXDynamicState["VIEWPORT"] = 0] = "VIEWPORT";
    GFXDynamicState[GFXDynamicState["SCISSOR"] = 1] = "SCISSOR";
    GFXDynamicState[GFXDynamicState["LINE_WIDTH"] = 2] = "LINE_WIDTH";
    GFXDynamicState[GFXDynamicState["DEPTH_BIAS"] = 3] = "DEPTH_BIAS";
    GFXDynamicState[GFXDynamicState["BLEND_CONSTANTS"] = 4] = "BLEND_CONSTANTS";
    GFXDynamicState[GFXDynamicState["DEPTH_BOUNDS"] = 5] = "DEPTH_BOUNDS";
    GFXDynamicState[GFXDynamicState["STENCIL_WRITE_MASK"] = 6] = "STENCIL_WRITE_MASK";
    GFXDynamicState[GFXDynamicState["STENCIL_COMPARE_MASK"] = 7] = "STENCIL_COMPARE_MASK";
})(GFXDynamicState || (GFXDynamicState = {}));
var GFXStencilFace;
(function (GFXStencilFace) {
    GFXStencilFace[GFXStencilFace["FRONT"] = 0] = "FRONT";
    GFXStencilFace[GFXStencilFace["BACK"] = 1] = "BACK";
    GFXStencilFace[GFXStencilFace["ALL"] = 2] = "ALL";
})(GFXStencilFace || (GFXStencilFace = {}));
var GFXQueueType;
(function (GFXQueueType) {
    GFXQueueType[GFXQueueType["GRAPHICS"] = 0] = "GRAPHICS";
    GFXQueueType[GFXQueueType["COMPUTE"] = 1] = "COMPUTE";
    GFXQueueType[GFXQueueType["TRANSFER"] = 2] = "TRANSFER";
})(GFXQueueType || (GFXQueueType = {}));
var GFXClearFlag;
(function (GFXClearFlag) {
    GFXClearFlag[GFXClearFlag["NONE"] = 0] = "NONE";
    GFXClearFlag[GFXClearFlag["COLOR"] = 1] = "COLOR";
    GFXClearFlag[GFXClearFlag["DEPTH"] = 2] = "DEPTH";
    GFXClearFlag[GFXClearFlag["STENCIL"] = 4] = "STENCIL";
    GFXClearFlag[GFXClearFlag["DEPTH_STENCIL"] = 6] = "DEPTH_STENCIL";
    GFXClearFlag[GFXClearFlag["ALL"] = 7] = "ALL";
})(GFXClearFlag || (GFXClearFlag = {}));
function GFXGetTypeSize(type) {
    switch (type) {
        case GFXType.BOOL:
        case GFXType.INT:
        case GFXType.UINT:
        case GFXType.FLOAT: return 4;
        case GFXType.BOOL2:
        case GFXType.INT2:
        case GFXType.UINT2:
        case GFXType.FLOAT2: return 8;
        case GFXType.BOOL3:
        case GFXType.INT3:
        case GFXType.UINT3:
        case GFXType.FLOAT3: return 12;
        case GFXType.BOOL4:
        case GFXType.INT4:
        case GFXType.UINT4:
        case GFXType.FLOAT4:
        case GFXType.MAT2: return 16;
        case GFXType.MAT2X3: return 24;
        case GFXType.MAT2X4: return 32;
        case GFXType.MAT3X2: return 24;
        case GFXType.MAT3: return 36;
        case GFXType.MAT3X4: return 48;
        case GFXType.MAT4X2: return 32;
        case GFXType.MAT4X2: return 32;
        case GFXType.MAT4: return 64;
        case GFXType.SAMPLER1D:
        case GFXType.SAMPLER1D_ARRAY:
        case GFXType.SAMPLER2D:
        case GFXType.SAMPLER2D_ARRAY:
        case GFXType.SAMPLER3D:
        case GFXType.SAMPLER_CUBE: return 4;
        default: {
            return 0;
        }
    }
}

// import { GFXBuffer } from '../gfx/buffer';
var RenderPassStage;
(function (RenderPassStage) {
    RenderPassStage[RenderPassStage["DEFAULT"] = 100] = "DEFAULT";
})(RenderPassStage || (RenderPassStage = {}));
var RenderPriority;
(function (RenderPriority) {
    RenderPriority[RenderPriority["MIN"] = 0] = "MIN";
    RenderPriority[RenderPriority["MAX"] = 255] = "MAX";
    RenderPriority[RenderPriority["DEFAULT"] = 128] = "DEFAULT";
})(RenderPriority || (RenderPriority = {}));
var MAX_BINDING_SUPPORTED = 24; // from WebGL 2 spec
var UniformBinding;
(function (UniformBinding) {
    // UBOs
    UniformBinding[UniformBinding["UBO_GLOBAL"] = MAX_BINDING_SUPPORTED - 1] = "UBO_GLOBAL";
    UniformBinding[UniformBinding["UBO_SHADOW"] = MAX_BINDING_SUPPORTED - 2] = "UBO_SHADOW";
    UniformBinding[UniformBinding["UBO_LOCAL"] = MAX_BINDING_SUPPORTED - 3] = "UBO_LOCAL";
    UniformBinding[UniformBinding["UBO_FORWARD_LIGHTS"] = MAX_BINDING_SUPPORTED - 4] = "UBO_FORWARD_LIGHTS";
    UniformBinding[UniformBinding["UBO_SKINNING"] = MAX_BINDING_SUPPORTED - 5] = "UBO_SKINNING";
    UniformBinding[UniformBinding["UBO_SKINNING_TEXTURE"] = MAX_BINDING_SUPPORTED - 6] = "UBO_SKINNING_TEXTURE";
    UniformBinding[UniformBinding["UBO_UI"] = MAX_BINDING_SUPPORTED - 7] = "UBO_UI";
    // samplers
    UniformBinding[UniformBinding["SAMPLER_JOINTS"] = MAX_BINDING_SUPPORTED + 1] = "SAMPLER_JOINTS";
    UniformBinding[UniformBinding["SAMPLER_ENVIRONMENT"] = MAX_BINDING_SUPPORTED + 2] = "SAMPLER_ENVIRONMENT";
    // rooms left for custom bindings
    // effect importer prepares bindings according to this
    UniformBinding[UniformBinding["CUSTUM_UBO_BINDING_END_POINT"] = MAX_BINDING_SUPPORTED - 7] = "CUSTUM_UBO_BINDING_END_POINT";
    UniformBinding[UniformBinding["CUSTOM_SAMPLER_BINDING_START_POINT"] = MAX_BINDING_SUPPORTED + 6] = "CUSTOM_SAMPLER_BINDING_START_POINT";
})(UniformBinding || (UniformBinding = {}));
// export class UBOGlobal {
//     public static TIME_OFFSET: number = 0;
//     public static SCREEN_SIZE_OFFSET: number = UBOGlobal.TIME_OFFSET + 4;
//     public static SCREEN_SCALE_OFFSET: number = UBOGlobal.SCREEN_SIZE_OFFSET + 4;
//     public static NATIVE_SIZE_OFFSET: number = UBOGlobal.SCREEN_SCALE_OFFSET + 4;
//     public static MAT_VIEW_OFFSET: number = UBOGlobal.NATIVE_SIZE_OFFSET + 4;
//     public static MAT_VIEW_INV_OFFSET: number = UBOGlobal.MAT_VIEW_OFFSET + 16;
//     public static MAT_PROJ_OFFSET: number = UBOGlobal.MAT_VIEW_INV_OFFSET + 16;
//     public static MAT_PROJ_INV_OFFSET: number = UBOGlobal.MAT_PROJ_OFFSET + 16;
//     public static MAT_VIEW_PROJ_OFFSET: number = UBOGlobal.MAT_PROJ_INV_OFFSET + 16;
//     public static MAT_VIEW_PROJ_INV_OFFSET: number = UBOGlobal.MAT_VIEW_PROJ_OFFSET + 16;
//     public static CAMERA_POS_OFFSET: number = UBOGlobal.MAT_VIEW_PROJ_INV_OFFSET + 16;
//     public static EXPOSURE_OFFSET: number = UBOGlobal.CAMERA_POS_OFFSET + 4;
//     public static MAIN_LIT_DIR_OFFSET: number = UBOGlobal.EXPOSURE_OFFSET + 4;
//     public static MAIN_LIT_COLOR_OFFSET: number = UBOGlobal.MAIN_LIT_DIR_OFFSET + 4;
//     public static AMBIENT_SKY_OFFSET: number = UBOGlobal.MAIN_LIT_COLOR_OFFSET + 4;
//     public static AMBIENT_GROUND_OFFSET: number = UBOGlobal.AMBIENT_SKY_OFFSET + 4;
//     public static COUNT: number = UBOGlobal.AMBIENT_GROUND_OFFSET + 4;
//     public static SIZE: number = UBOGlobal.COUNT * 4;
//     public static BLOCK: GFXUniformBlock = {
//         binding: UniformBinding.UBO_GLOBAL, name: 'CCGlobal', members: [
//             { name: 'cc_time', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_screenSize', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_screenScale', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_nativeSize', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_matView', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_matViewInv', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_matProj', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_matProjInv', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_matViewProj', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_matViewProjInv', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_cameraPos', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_exposure', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_mainLitDir', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_mainLitColor', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_ambientSky', type: GFXType.FLOAT4, count: 1 },
//             { name: 'cc_ambientGround', type: GFXType.FLOAT4, count: 1 },
//         ],
//     };
//     public view: Float32Array = new Float32Array(UBOGlobal.COUNT);
// }
// export class UBOShadow {
//     public static MAT_LIGHT_PLANE_PROJ_OFFSET: number = 0;
//     public static SHADOW_COLOR_OFFSET: number = UBOShadow.MAT_LIGHT_PLANE_PROJ_OFFSET + 16;
//     public static COUNT: number = UBOShadow.SHADOW_COLOR_OFFSET + 4;
//     public static SIZE: number = UBOShadow.COUNT * 4;
//     public static BLOCK: GFXUniformBlock = {
//         binding: UniformBinding.UBO_SHADOW, name: 'CCShadow', members: [
//             { name: 'cc_matLightPlaneProj', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_shadowColor', type: GFXType.FLOAT4, count: 1 },
//         ],
//     };
//     public view: Float32Array = new Float32Array(UBOShadow.COUNT);
// }
// export const localBindingsDesc: Map<string, IInternalBindingDesc> = new Map<string, IInternalBindingDesc>();
// export class UBOLocal {
//     public static MAT_WORLD_OFFSET: number = 0;
//     public static MAT_WORLD_IT_OFFSET: number = UBOLocal.MAT_WORLD_OFFSET + 16;
//     public static COUNT: number = UBOLocal.MAT_WORLD_IT_OFFSET + 16;
//     public static SIZE: number = UBOLocal.COUNT * 4;
//     public static BLOCK: GFXUniformBlock = {
//         binding: UniformBinding.UBO_LOCAL, name: 'CCLocal', members: [
//             { name: 'cc_matWorld', type: GFXType.MAT4, count: 1 },
//             { name: 'cc_matWorldIT', type: GFXType.MAT4, count: 1 },
//         ],
//     };
//     public view: Float32Array = new Float32Array(UBOLocal.COUNT);
// }
// localBindingsDesc.set(UBOLocal.BLOCK.name, {
//     type: GFXBindingType.UNIFORM_BUFFER,
//     blockInfo: UBOLocal.BLOCK,
// });
// export class UBOForwardLight {
//     public static MAX_SPHERE_LIGHTS = 2;
//     public static MAX_SPOT_LIGHTS = 2;
//     public static SPHERE_LIGHT_POS_OFFSET: number = 0;
//     public static SPHERE_LIGHT_SIZE_RANGE_OFFSET: number = UBOForwardLight.SPHERE_LIGHT_POS_OFFSET + UBOForwardLight.MAX_SPHERE_LIGHTS * 4;
//     public static SPHERE_LIGHT_COLOR_OFFSET: number = UBOForwardLight.SPHERE_LIGHT_SIZE_RANGE_OFFSET + UBOForwardLight.MAX_SPHERE_LIGHTS * 4;
//     public static SPOT_LIGHT_POS_OFFSET: number = UBOForwardLight.SPHERE_LIGHT_COLOR_OFFSET + UBOForwardLight.MAX_SPOT_LIGHTS * 4;
//     public static SPOT_LIGHT_SIZE_RANGE_ANGLE_OFFSET: number = UBOForwardLight.SPOT_LIGHT_POS_OFFSET + UBOForwardLight.MAX_SPOT_LIGHTS * 4;
//     public static SPOT_LIGHT_DIR_OFFSET: number = UBOForwardLight.SPOT_LIGHT_SIZE_RANGE_ANGLE_OFFSET + UBOForwardLight.MAX_SPOT_LIGHTS * 4;
//     public static SPOT_LIGHT_COLOR_OFFSET: number = UBOForwardLight.SPOT_LIGHT_DIR_OFFSET + UBOForwardLight.MAX_SPOT_LIGHTS * 4;
//     public static COUNT: number = UBOForwardLight.SPOT_LIGHT_COLOR_OFFSET + UBOForwardLight.MAX_SPOT_LIGHTS * 4;
//     public static SIZE: number = UBOForwardLight.COUNT * 4;
//     public static BLOCK: GFXUniformBlock = {
//         binding: UniformBinding.UBO_FORWARD_LIGHTS, name: 'CCForwardLight', members: [
//             { name: 'cc_sphereLitPos', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPHERE_LIGHTS },
//             { name: 'cc_sphereLitSizeRange', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPHERE_LIGHTS },
//             { name: 'cc_sphereLitColor', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPHERE_LIGHTS },
//             { name: 'cc_spotLitPos', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPOT_LIGHTS },
//             { name: 'cc_spotLitSizeRangeAngle', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPOT_LIGHTS },
//             { name: 'cc_spotLitDir', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPOT_LIGHTS },
//             { name: 'cc_spotLitColor', type: GFXType.FLOAT4, count: UBOForwardLight.MAX_SPOT_LIGHTS },
//         ],
//     };
//     public view: Float32Array = new Float32Array(UBOForwardLight.COUNT);
// }
// localBindingsDesc.set(UBOForwardLight.BLOCK.name, {
//     type: GFXBindingType.UNIFORM_BUFFER,
//     blockInfo: UBOForwardLight.BLOCK,
// });
// export class UBOSkinning {
//     public static MAT_JOINT_OFFSET: number = 0;
//     public static JOINTS_TEXTURE_SIZE_OFFSET: number = UBOSkinning.MAT_JOINT_OFFSET + 128 * 16;
//     public static COUNT: number = UBOSkinning.JOINTS_TEXTURE_SIZE_OFFSET + 4;
//     public static SIZE: number = UBOSkinning.COUNT * 4;
//     public static BLOCK: GFXUniformBlock = {
//         binding: UniformBinding.UBO_SKINNING, name: 'CCSkinning', members: [
//             { name: 'cc_matJoint', type: GFXType.MAT4, count: 128 },
//             { name: 'cc_jointsTextureSize', type: GFXType.FLOAT4, count: 1 },
//         ],
//     };
// }
// localBindingsDesc.set(UBOSkinning.BLOCK.name, {
//     type: GFXBindingType.UNIFORM_BUFFER,
//     blockInfo: UBOSkinning.BLOCK,
// });
// export const UNIFORM_JOINTS_TEXTURE: GFXUniformSampler = {
//     binding: UniformBinding.SAMPLER_JOINTS, name: 'cc_jointsTexture', type: GFXType.SAMPLER2D, count: 1,
// };
// localBindingsDesc.set(UNIFORM_JOINTS_TEXTURE.name, {
//     type: GFXBindingType.SAMPLER,
//     samplerInfo: UNIFORM_JOINTS_TEXTURE,
// });
// export interface IInternalBindingDesc {
//     type: GFXBindingType;
//     blockInfo?: GFXUniformBlock;
//     samplerInfo?: GFXUniformSampler;
// }
// export interface IInternalBindingInst extends IInternalBindingDesc {
//     buffer?: GFXBuffer;
//     sampler?: GFXSampler;
//     textureView?: GFXTextureView;
// }

// this file is used for offline effect building.
var _a, _b;
var SamplerInfoIndex;
(function (SamplerInfoIndex) {
    SamplerInfoIndex[SamplerInfoIndex["minFilter"] = 0] = "minFilter";
    SamplerInfoIndex[SamplerInfoIndex["magFilter"] = 1] = "magFilter";
    SamplerInfoIndex[SamplerInfoIndex["mipFilter"] = 2] = "mipFilter";
    SamplerInfoIndex[SamplerInfoIndex["addressU"] = 3] = "addressU";
    SamplerInfoIndex[SamplerInfoIndex["addressV"] = 4] = "addressV";
    SamplerInfoIndex[SamplerInfoIndex["addressW"] = 5] = "addressW";
    SamplerInfoIndex[SamplerInfoIndex["maxAnisotropy"] = 6] = "maxAnisotropy";
    SamplerInfoIndex[SamplerInfoIndex["cmpFunc"] = 7] = "cmpFunc";
    SamplerInfoIndex[SamplerInfoIndex["minLOD"] = 8] = "minLOD";
    SamplerInfoIndex[SamplerInfoIndex["maxLOD"] = 9] = "maxLOD";
    SamplerInfoIndex[SamplerInfoIndex["mipLODBias"] = 10] = "mipLODBias";
    SamplerInfoIndex[SamplerInfoIndex["borderColor"] = 11] = "borderColor";
    SamplerInfoIndex[SamplerInfoIndex["total"] = 15] = "total";
})(SamplerInfoIndex || (SamplerInfoIndex = {}));
var typeMap = {};
typeMap[typeMap['bool'] = GFXType.BOOL] = 'bool';
typeMap[typeMap['int'] = GFXType.INT] = 'int';
typeMap[typeMap['ivec2'] = GFXType.INT2] = 'ivec2invTypeParams';
typeMap[typeMap['ivec3'] = GFXType.INT3] = 'ivec3';
typeMap[typeMap['ivec4'] = GFXType.INT4] = 'ivec4';
typeMap[typeMap['float'] = GFXType.FLOAT] = 'float';
typeMap[typeMap['vec2'] = GFXType.FLOAT2] = 'vec2';
typeMap[typeMap['vec3'] = GFXType.FLOAT3] = 'vec3';
typeMap[typeMap['vec4'] = GFXType.FLOAT4] = 'vec4';
typeMap[typeMap['mat2'] = GFXType.MAT2] = 'mat2';
typeMap[typeMap['mat3'] = GFXType.MAT3] = 'mat3';
typeMap[typeMap['mat4'] = GFXType.MAT4] = 'mat4';
typeMap[typeMap['sampler2D'] = GFXType.SAMPLER2D] = 'sampler2D';
typeMap[typeMap['samplerCube'] = GFXType.SAMPLER_CUBE] = 'samplerCube';
var sizeMap = (_a = {},
    _a[GFXType.BOOL] = 4,
    _a[GFXType.INT] = 4,
    _a[GFXType.INT2] = 8,
    _a[GFXType.INT3] = 12,
    _a[GFXType.INT4] = 16,
    _a[GFXType.FLOAT] = 4,
    _a[GFXType.FLOAT2] = 8,
    _a[GFXType.FLOAT3] = 12,
    _a[GFXType.FLOAT4] = 16,
    _a[GFXType.MAT2] = 16,
    _a[GFXType.MAT3] = 36,
    _a[GFXType.MAT4] = 64,
    _a[GFXType.SAMPLER2D] = 4,
    _a[GFXType.SAMPLER_CUBE] = 4,
    _a);
var formatMap = (_b = {},
    _b[GFXType.BOOL] = GFXFormat.R32I,
    _b[GFXType.INT] = GFXFormat.R32I,
    _b[GFXType.INT2] = GFXFormat.RG32I,
    _b[GFXType.INT3] = GFXFormat.RGB32I,
    _b[GFXType.INT4] = GFXFormat.RGBA32I,
    _b[GFXType.FLOAT] = GFXFormat.R32F,
    _b[GFXType.FLOAT2] = GFXFormat.RG32F,
    _b[GFXType.FLOAT3] = GFXFormat.RGB32F,
    _b[GFXType.FLOAT4] = GFXFormat.RGBA32F,
    _b);
// const passParams = {
//   // color mask
//   NONE: gfx.GFXColorMask.NONE,
//   R: gfx.GFXColorMask.R,
//   G: gfx.GFXColorMask.G,
//   B: gfx.GFXColorMask.B,
//   A: gfx.GFXColorMask.A,
//   RG: gfx.GFXColorMask.R | gfx.GFXColorMask.G,
//   RB: gfx.GFXColorMask.R | gfx.GFXColorMask.B,
//   RA: gfx.GFXColorMask.R | gfx.GFXColorMask.A,
//   GB: gfx.GFXColorMask.G | gfx.GFXColorMask.B,
//   GA: gfx.GFXColorMask.G | gfx.GFXColorMask.A,
//   BA: gfx.GFXColorMask.B | gfx.GFXColorMask.A,
//   RGB: gfx.GFXColorMask.R | gfx.GFXColorMask.G | gfx.GFXColorMask.B,
//   RGA: gfx.GFXColorMask.R | gfx.GFXColorMask.G | gfx.GFXColorMask.A,
//   RBA: gfx.GFXColorMask.R | gfx.GFXColorMask.B | gfx.GFXColorMask.A,
//   GBA: gfx.GFXColorMask.G | gfx.GFXColorMask.B | gfx.GFXColorMask.A,
//   ALL: gfx.GFXColorMask.ALL,
//   // blend operation
//   ADD: gfx.GFXBlendOp.ADD,
//   SUB: gfx.GFXBlendOp.SUB,
//   REV_SUB: gfx.GFXBlendOp.REV_SUB,
//   MIN: gfx.GFXBlendOp.MIN,
//   MAX: gfx.GFXBlendOp.MAX,
//   // blend factor
//   ZERO: gfx.GFXBlendFactor.ZERO,
//   ONE: gfx.GFXBlendFactor.ONE,
//   SRC_ALPHA: gfx.GFXBlendFactor.SRC_ALPHA,
//   DST_ALPHA: gfx.GFXBlendFactor.DST_ALPHA,
//   ONE_MINUS_SRC_ALPHA: gfx.GFXBlendFactor.ONE_MINUS_SRC_ALPHA,
//   ONE_MINUS_DST_ALPHA: gfx.GFXBlendFactor.ONE_MINUS_DST_ALPHA,
//   SRC_COLOR: gfx.GFXBlendFactor.SRC_COLOR,
//   DST_COLOR: gfx.GFXBlendFactor.DST_COLOR,
//   ONE_MINUS_SRC_COLOR: gfx.GFXBlendFactor.ONE_MINUS_SRC_COLOR,
//   ONE_MINUS_DST_COLOR: gfx.GFXBlendFactor.ONE_MINUS_DST_COLOR,
//   SRC_ALPHA_SATURATE: gfx.GFXBlendFactor.SRC_ALPHA_SATURATE,
//   CONSTANT_COLOR: gfx.GFXBlendFactor.CONSTANT_COLOR,
//   ONE_MINUS_CONSTANT_COLOR: gfx.GFXBlendFactor.ONE_MINUS_CONSTANT_COLOR,
//   CONSTANT_ALPHA: gfx.GFXBlendFactor.CONSTANT_ALPHA,
//   ONE_MINUS_CONSTANT_ALPHA: gfx.GFXBlendFactor.ONE_MINUS_CONSTANT_ALPHA,
//   // stencil operation
//   // ZERO: GFXStencilOp.ZERO, // duplicate, safely removed because enum value is(and always will be) the same
//   KEEP: gfx.GFXStencilOp.KEEP,
//   REPLACE: gfx.GFXStencilOp.REPLACE,
//   INCR: gfx.GFXStencilOp.INCR,
//   DECR: gfx.GFXStencilOp.DECR,
//   INVERT: gfx.GFXStencilOp.INVERT,
//   INCR_WRAP: gfx.GFXStencilOp.INCR_WRAP,
//   DECR_WRAP: gfx.GFXStencilOp.DECR_WRAP,
//     // comparison function
//   NEVER: gfx.GFXComparisonFunc.NEVER,
//   LESS: gfx.GFXComparisonFunc.LESS,
//   EQUAL: gfx.GFXComparisonFunc.EQUAL,
//   LESS_EQUAL: gfx.GFXComparisonFunc.LESS_EQUAL,
//   GREATER: gfx.GFXComparisonFunc.GREATER,
//   NOT_EQUAL: gfx.GFXComparisonFunc.NOT_EQUAL,
//   GREATER_EQUAL: gfx.GFXComparisonFunc.GREATER_EQUAL,
//   ALWAYS: gfx.GFXComparisonFunc.ALWAYS,
//   // cull mode
//   // NONE: GFXCullMode.NONE, // duplicate, safely removed because enum value is(and always will be) the same
//   FRONT: gfx.GFXCullMode.FRONT,
//   BACK: gfx.GFXCullMode.BACK,
//   // shade mode
//   GOURAND: gfx.GFXShadeModel.GOURAND,
//   FLAT: gfx.GFXShadeModel.FLAT,
//   // polygon mode
//   FILL: gfx.GFXPolygonMode.FILL,
//   LINE: gfx.GFXPolygonMode.LINE,
//   POINT: gfx.GFXPolygonMode.POINT,
//   // primitive mode
//   POINT_LIST: gfx.GFXPrimitiveMode.POINT_LIST,
//   LINE_LIST: gfx.GFXPrimitiveMode.LINE_LIST,
//   LINE_STRIP: gfx.GFXPrimitiveMode.LINE_STRIP,
//   LINE_LOOP: gfx.GFXPrimitiveMode.LINE_LOOP,
//   TRIANGLE_LIST: gfx.GFXPrimitiveMode.TRIANGLE_LIST,
//   TRIANGLE_STRIP: gfx.GFXPrimitiveMode.TRIANGLE_STRIP,
//   TRIANGLE_FAN: gfx.GFXPrimitiveMode.TRIANGLE_FAN,
//   LINE_LIST_ADJACENCY: gfx.GFXPrimitiveMode.LINE_LIST_ADJACENCY,
//   LINE_STRIP_ADJACENCY: gfx.GFXPrimitiveMode.LINE_STRIP_ADJACENCY,
//   TRIANGLE_LIST_ADJACENCY: gfx.GFXPrimitiveMode.TRIANGLE_LIST_ADJACENCY,
//   TRIANGLE_STRIP_ADJACENCY: gfx.GFXPrimitiveMode.TRIANGLE_STRIP_ADJACENCY,
//   TRIANGLE_PATCH_ADJACENCY: gfx.GFXPrimitiveMode.TRIANGLE_PATCH_ADJACENCY,
//   QUAD_PATCH_LIST: gfx.GFXPrimitiveMode.QUAD_PATCH_LIST,
//   ISO_LINE_LIST: gfx.GFXPrimitiveMode.ISO_LINE_LIST,
//   // POINT: gfx.GFXFilter.POINT, // duplicate, safely removed because enum value is(and always will be) the same
//   LINEAR: gfx.GFXFilter.LINEAR,
//   ANISOTROPIC: gfx.GFXFilter.ANISOTROPIC,
//   WRAP: gfx.GFXAddress.WRAP,
//   MIRROR: gfx.GFXAddress.MIRROR,
//   CLAMP: gfx.GFXAddress.CLAMP,
//   BORDER: gfx.GFXAddress.BORDER,
//   VIEWPORT: gfx.GFXDynamicState.VIEWPORT,
//   SCISSOR: gfx.GFXDynamicState.SCISSOR,
//   LINE_WIDTH: gfx.GFXDynamicState.LINE_WIDTH,
//   DEPTH_BIAS: gfx.GFXDynamicState.DEPTH_BIAS,
//   BLEND_CONSTANTS: gfx.GFXDynamicState.BLEND_CONSTANTS,
//   DEPTH_BOUNDS: gfx.GFXDynamicState.DEPTH_BOUNDS,
//   STENCIL_WRITE_MASK: gfx.GFXDynamicState.STENCIL_WRITE_MASK,
//   STENCIL_COMPARE_MASK: gfx.GFXDynamicState.STENCIL_COMPARE_MASK,
//   TRUE: true,
//   FALSE: false
// };
var passParams = {
    BACK: enums.CULL_BACK,
    FRONT: enums.CULL_FRONT,
    NONE: enums.CULL_NONE,
    ADD: enums.BLEND_FUNC_ADD,
    SUB: enums.BLEND_FUNC_SUBTRACT,
    REV_SUB: enums.BLEND_FUNC_REVERSE_SUBTRACT,
    ZERO: enums.BLEND_ZERO,
    ONE: enums.BLEND_ONE,
    SRC_COLOR: enums.BLEND_SRC_COLOR,
    ONE_MINUS_SRC_COLOR: enums.BLEND_ONE_MINUS_SRC_COLOR,
    DST_COLOR: enums.BLEND_DST_COLOR,
    ONE_MINUS_DST_COLOR: enums.BLEND_ONE_MINUS_DST_COLOR,
    SRC_ALPHA: enums.BLEND_SRC_ALPHA,
    ONE_MINUS_SRC_ALPHA: enums.BLEND_ONE_MINUS_SRC_ALPHA,
    DST_ALPHA: enums.BLEND_DST_ALPHA,
    ONE_MINUS_DST_ALPHA: enums.BLEND_ONE_MINUS_DST_ALPHA,
    CONSTANT_COLOR: enums.BLEND_CONSTANT_COLOR,
    ONE_MINUS_CONSTANT_COLOR: enums.BLEND_ONE_MINUS_CONSTANT_COLOR,
    CONSTANT_ALPHA: enums.BLEND_CONSTANT_ALPHA,
    ONE_MINUS_CONSTANT_ALPHA: enums.BLEND_ONE_MINUS_CONSTANT_ALPHA,
    SRC_ALPHA_SATURATE: enums.BLEND_SRC_ALPHA_SATURATE,
    NEVER: enums.DS_FUNC_NEVER,
    LESS: enums.DS_FUNC_LESS,
    EQUAL: enums.DS_FUNC_EQUAL,
    LEQUAL: enums.DS_FUNC_LEQUAL,
    GREATER: enums.DS_FUNC_GREATER,
    NOTEQUAL: enums.DS_FUNC_NOTEQUAL,
    GEQUAL: enums.DS_FUNC_GEQUAL,
    ALWAYS: enums.DS_FUNC_ALWAYS,
    KEEP: enums.STENCIL_OP_KEEP,
    REPLACE: enums.STENCIL_OP_REPLACE,
    INCR: enums.STENCIL_OP_INCR,
    INCR_WRAP: enums.STENCIL_OP_INCR_WRAP,
    DECR: enums.STENCIL_OP_DECR,
    DECR_WRAP: enums.STENCIL_OP_DECR_WRAP,
    INVERT: enums.STENCIL_OP_INVERT
};
Object.assign(passParams, RenderPassStage);
// for structural type checking
// an 'any' key will check against all elements defined in that object
// a key start with '$' means its essential, and can't be undefined
var effectStructure = {
    $techniques: [
        {
            $passes: [
                {
                    depthStencilState: {},
                    rasterizerState: {},
                    blendState: { targets: [{}] },
                    properties: { any: { sampler: {}, inspector: {} } }
                }
            ]
        }
    ]
};
var mappings = {
    murmurhash2_32_gc: murmurhash2_32_gc,
    SamplerInfoIndex: SamplerInfoIndex,
    effectStructure: effectStructure,
    typeMap: typeMap,
    sizeMap: sizeMap,
    formatMap: formatMap,
    passParams: passParams,
    RenderQueue: RenderQueue,
    RenderPriority: RenderPriority,
    GFXGetTypeSize: GFXGetTypeSize,
    UniformBinding: UniformBinding
};

module.exports = mappings;