| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995 |
- // Copyright 2014 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- //go:build ignore
- // The gendebug program takes gl.go and generates a version of it
- // where each function includes tracing code that writes its arguments
- // to the standard log.
- package main
- import (
- "bytes"
- "flag"
- "fmt"
- "go/ast"
- "go/format"
- "go/parser"
- "go/printer"
- "go/token"
- "io/ioutil"
- "log"
- "os"
- "strconv"
- )
- var enumWhitelist = []string{
- "POINTS",
- "LINES",
- "LINE_LOOP",
- "LINE_STRIP",
- "TRIANGLES",
- "TRIANGLE_STRIP",
- "TRIANGLE_FAN",
- "SRC_COLOR",
- "ONE_MINUS_SRC_COLOR",
- "SRC_ALPHA",
- "ONE_MINUS_SRC_ALPHA",
- "DST_ALPHA",
- "ONE_MINUS_DST_ALPHA",
- "DST_COLOR",
- "ONE_MINUS_DST_COLOR",
- "SRC_ALPHA_SATURATE",
- "FUNC_ADD",
- "BLEND_EQUATION",
- "BLEND_EQUATION_RGB",
- "BLEND_EQUATION_ALPHA",
- "FUNC_SUBTRACT",
- "FUNC_REVERSE_SUBTRACT",
- "BLEND_DST_RGB",
- "BLEND_SRC_RGB",
- "BLEND_DST_ALPHA",
- "BLEND_SRC_ALPHA",
- "CONSTANT_COLOR",
- "ONE_MINUS_CONSTANT_COLOR",
- "CONSTANT_ALPHA",
- "ONE_MINUS_CONSTANT_ALPHA",
- "BLEND_COLOR",
- "ARRAY_BUFFER",
- "ELEMENT_ARRAY_BUFFER",
- "ARRAY_BUFFER_BINDING",
- "ELEMENT_ARRAY_BUFFER_BINDING",
- "STREAM_DRAW",
- "STATIC_DRAW",
- "DYNAMIC_DRAW",
- "BUFFER_SIZE",
- "BUFFER_USAGE",
- "CURRENT_VERTEX_ATTRIB",
- "FRONT",
- "BACK",
- "FRONT_AND_BACK",
- "TEXTURE_2D",
- "CULL_FACE",
- "BLEND",
- "DITHER",
- "STENCIL_TEST",
- "DEPTH_TEST",
- "SCISSOR_TEST",
- "POLYGON_OFFSET_FILL",
- "SAMPLE_ALPHA_TO_COVERAGE",
- "SAMPLE_COVERAGE",
- "INVALID_ENUM",
- "INVALID_VALUE",
- "INVALID_OPERATION",
- "OUT_OF_MEMORY",
- "CW",
- "CCW",
- "LINE_WIDTH",
- "ALIASED_POINT_SIZE_RANGE",
- "ALIASED_LINE_WIDTH_RANGE",
- "CULL_FACE_MODE",
- "FRONT_FACE",
- "DEPTH_RANGE",
- "DEPTH_WRITEMASK",
- "DEPTH_CLEAR_VALUE",
- "DEPTH_FUNC",
- "STENCIL_CLEAR_VALUE",
- "STENCIL_FUNC",
- "STENCIL_FAIL",
- "STENCIL_PASS_DEPTH_FAIL",
- "STENCIL_PASS_DEPTH_PASS",
- "STENCIL_REF",
- "STENCIL_VALUE_MASK",
- "STENCIL_WRITEMASK",
- "STENCIL_BACK_FUNC",
- "STENCIL_BACK_FAIL",
- "STENCIL_BACK_PASS_DEPTH_FAIL",
- "STENCIL_BACK_PASS_DEPTH_PASS",
- "STENCIL_BACK_REF",
- "STENCIL_BACK_VALUE_MASK",
- "STENCIL_BACK_WRITEMASK",
- "VIEWPORT",
- "SCISSOR_BOX",
- "COLOR_CLEAR_VALUE",
- "COLOR_WRITEMASK",
- "UNPACK_ALIGNMENT",
- "PACK_ALIGNMENT",
- "MAX_TEXTURE_SIZE",
- "MAX_VIEWPORT_DIMS",
- "SUBPIXEL_BITS",
- "RED_BITS",
- "GREEN_BITS",
- "BLUE_BITS",
- "ALPHA_BITS",
- "DEPTH_BITS",
- "STENCIL_BITS",
- "POLYGON_OFFSET_UNITS",
- "POLYGON_OFFSET_FACTOR",
- "TEXTURE_BINDING_2D",
- "SAMPLE_BUFFERS",
- "SAMPLES",
- "SAMPLE_COVERAGE_VALUE",
- "SAMPLE_COVERAGE_INVERT",
- "NUM_COMPRESSED_TEXTURE_FORMATS",
- "COMPRESSED_TEXTURE_FORMATS",
- "DONT_CARE",
- "FASTEST",
- "NICEST",
- "GENERATE_MIPMAP_HINT",
- "BYTE",
- "UNSIGNED_BYTE",
- "SHORT",
- "UNSIGNED_SHORT",
- "INT",
- "UNSIGNED_INT",
- "FLOAT",
- "FIXED",
- "DEPTH_COMPONENT",
- "ALPHA",
- "RGB",
- "RGBA",
- "LUMINANCE",
- "LUMINANCE_ALPHA",
- "UNSIGNED_SHORT_4_4_4_4",
- "UNSIGNED_SHORT_5_5_5_1",
- "UNSIGNED_SHORT_5_6_5",
- "MAX_VERTEX_ATTRIBS",
- "MAX_VERTEX_UNIFORM_VECTORS",
- "MAX_VARYING_VECTORS",
- "MAX_COMBINED_TEXTURE_IMAGE_UNITS",
- "MAX_VERTEX_TEXTURE_IMAGE_UNITS",
- "MAX_TEXTURE_IMAGE_UNITS",
- "MAX_FRAGMENT_UNIFORM_VECTORS",
- "SHADER_TYPE",
- "DELETE_STATUS",
- "LINK_STATUS",
- "VALIDATE_STATUS",
- "ATTACHED_SHADERS",
- "ACTIVE_UNIFORMS",
- "ACTIVE_UNIFORM_MAX_LENGTH",
- "ACTIVE_ATTRIBUTES",
- "ACTIVE_ATTRIBUTE_MAX_LENGTH",
- "SHADING_LANGUAGE_VERSION",
- "CURRENT_PROGRAM",
- "NEVER",
- "LESS",
- "EQUAL",
- "LEQUAL",
- "GREATER",
- "NOTEQUAL",
- "GEQUAL",
- "ALWAYS",
- "KEEP",
- "REPLACE",
- "INCR",
- "DECR",
- "INVERT",
- "INCR_WRAP",
- "DECR_WRAP",
- "VENDOR",
- "RENDERER",
- "VERSION",
- "EXTENSIONS",
- "NEAREST",
- "LINEAR",
- "NEAREST_MIPMAP_NEAREST",
- "LINEAR_MIPMAP_NEAREST",
- "NEAREST_MIPMAP_LINEAR",
- "LINEAR_MIPMAP_LINEAR",
- "TEXTURE_MAG_FILTER",
- "TEXTURE_MIN_FILTER",
- "TEXTURE_WRAP_S",
- "TEXTURE_WRAP_T",
- "TEXTURE",
- "TEXTURE_CUBE_MAP",
- "TEXTURE_BINDING_CUBE_MAP",
- "TEXTURE_CUBE_MAP_POSITIVE_X",
- "TEXTURE_CUBE_MAP_NEGATIVE_X",
- "TEXTURE_CUBE_MAP_POSITIVE_Y",
- "TEXTURE_CUBE_MAP_NEGATIVE_Y",
- "TEXTURE_CUBE_MAP_POSITIVE_Z",
- "TEXTURE_CUBE_MAP_NEGATIVE_Z",
- "MAX_CUBE_MAP_TEXTURE_SIZE",
- "TEXTURE0",
- "TEXTURE1",
- "TEXTURE2",
- "TEXTURE3",
- "TEXTURE4",
- "TEXTURE5",
- "TEXTURE6",
- "TEXTURE7",
- "TEXTURE8",
- "TEXTURE9",
- "TEXTURE10",
- "TEXTURE11",
- "TEXTURE12",
- "TEXTURE13",
- "TEXTURE14",
- "TEXTURE15",
- "TEXTURE16",
- "TEXTURE17",
- "TEXTURE18",
- "TEXTURE19",
- "TEXTURE20",
- "TEXTURE21",
- "TEXTURE22",
- "TEXTURE23",
- "TEXTURE24",
- "TEXTURE25",
- "TEXTURE26",
- "TEXTURE27",
- "TEXTURE28",
- "TEXTURE29",
- "TEXTURE30",
- "TEXTURE31",
- "ACTIVE_TEXTURE",
- "REPEAT",
- "CLAMP_TO_EDGE",
- "MIRRORED_REPEAT",
- "VERTEX_ATTRIB_ARRAY_ENABLED",
- "VERTEX_ATTRIB_ARRAY_SIZE",
- "VERTEX_ATTRIB_ARRAY_STRIDE",
- "VERTEX_ATTRIB_ARRAY_TYPE",
- "VERTEX_ATTRIB_ARRAY_NORMALIZED",
- "VERTEX_ATTRIB_ARRAY_POINTER",
- "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
- "IMPLEMENTATION_COLOR_READ_TYPE",
- "IMPLEMENTATION_COLOR_READ_FORMAT",
- "COMPILE_STATUS",
- "INFO_LOG_LENGTH",
- "SHADER_SOURCE_LENGTH",
- "SHADER_COMPILER",
- "SHADER_BINARY_FORMATS",
- "NUM_SHADER_BINARY_FORMATS",
- "LOW_FLOAT",
- "MEDIUM_FLOAT",
- "HIGH_FLOAT",
- "LOW_INT",
- "MEDIUM_INT",
- "HIGH_INT",
- "FRAMEBUFFER",
- "RENDERBUFFER",
- "RGBA4",
- "RGB5_A1",
- "RGB565",
- "DEPTH_COMPONENT16",
- "STENCIL_INDEX8",
- "RENDERBUFFER_WIDTH",
- "RENDERBUFFER_HEIGHT",
- "RENDERBUFFER_INTERNAL_FORMAT",
- "RENDERBUFFER_RED_SIZE",
- "RENDERBUFFER_GREEN_SIZE",
- "RENDERBUFFER_BLUE_SIZE",
- "RENDERBUFFER_ALPHA_SIZE",
- "RENDERBUFFER_DEPTH_SIZE",
- "RENDERBUFFER_STENCIL_SIZE",
- "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
- "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
- "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
- "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
- "COLOR_ATTACHMENT0",
- "DEPTH_ATTACHMENT",
- "STENCIL_ATTACHMENT",
- "FRAMEBUFFER_COMPLETE",
- "FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
- "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
- "FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
- "FRAMEBUFFER_UNSUPPORTED",
- "FRAMEBUFFER_BINDING",
- "RENDERBUFFER_BINDING",
- "MAX_RENDERBUFFER_SIZE",
- "INVALID_FRAMEBUFFER_OPERATION",
- "DEPTH_BUFFER_BIT",
- "STENCIL_BUFFER_BIT",
- "COLOR_BUFFER_BIT",
- "FLOAT_VEC2",
- "FLOAT_VEC3",
- "FLOAT_VEC4",
- "INT_VEC2",
- "INT_VEC3",
- "INT_VEC4",
- "BOOL",
- "BOOL_VEC2",
- "BOOL_VEC3",
- "BOOL_VEC4",
- "FLOAT_MAT2",
- "FLOAT_MAT3",
- "FLOAT_MAT4",
- "SAMPLER_2D",
- "SAMPLER_CUBE",
- "FRAGMENT_SHADER",
- "VERTEX_SHADER",
- "FALSE",
- "TRUE",
- "ZERO",
- "ONE",
- "NO_ERROR",
- "NONE",
- "ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
- "ACTIVE_UNIFORM_BLOCKS",
- "ALREADY_SIGNALED",
- "ANY_SAMPLES_PASSED",
- "ANY_SAMPLES_PASSED_CONSERVATIVE",
- "BLUE",
- "BUFFER_ACCESS_FLAGS",
- "BUFFER_MAP_LENGTH",
- "BUFFER_MAP_OFFSET",
- "BUFFER_MAPPED",
- "BUFFER_MAP_POINTER",
- "COLOR",
- "COLOR_ATTACHMENT10",
- "COLOR_ATTACHMENT1",
- "COLOR_ATTACHMENT11",
- "COLOR_ATTACHMENT12",
- "COLOR_ATTACHMENT13",
- "COLOR_ATTACHMENT14",
- "COLOR_ATTACHMENT15",
- "COLOR_ATTACHMENT2",
- "COLOR_ATTACHMENT3",
- "COLOR_ATTACHMENT4",
- "COLOR_ATTACHMENT5",
- "COLOR_ATTACHMENT6",
- "COLOR_ATTACHMENT7",
- "COLOR_ATTACHMENT8",
- "COLOR_ATTACHMENT9",
- "COMPARE_REF_TO_TEXTURE",
- "COMPRESSED_R11_EAC",
- "COMPRESSED_RG11_EAC",
- "COMPRESSED_RGB8_ETC2",
- "COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
- "COMPRESSED_RGBA8_ETC2_EAC",
- "COMPRESSED_SIGNED_R11_EAC",
- "COMPRESSED_SIGNED_RG11_EAC",
- "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
- "COMPRESSED_SRGB8_ETC2",
- "COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
- "CONDITION_SATISFIED",
- "COPY_READ_BUFFER",
- "COPY_READ_BUFFER_BINDING",
- "COPY_WRITE_BUFFER",
- "COPY_WRITE_BUFFER_BINDING",
- "CURRENT_QUERY",
- "DEPTH",
- "DEPTH24_STENCIL8",
- "DEPTH32F_STENCIL8",
- "DEPTH_COMPONENT24",
- "DEPTH_COMPONENT32F",
- "DEPTH_STENCIL",
- "DEPTH_STENCIL_ATTACHMENT",
- "DRAW_BUFFER0",
- "DRAW_BUFFER10",
- "DRAW_BUFFER1",
- "DRAW_BUFFER11",
- "DRAW_BUFFER12",
- "DRAW_BUFFER13",
- "DRAW_BUFFER14",
- "DRAW_BUFFER15",
- "DRAW_BUFFER2",
- "DRAW_BUFFER3",
- "DRAW_BUFFER4",
- "DRAW_BUFFER5",
- "DRAW_BUFFER6",
- "DRAW_BUFFER7",
- "DRAW_BUFFER8",
- "DRAW_BUFFER9",
- "DRAW_FRAMEBUFFER",
- "DRAW_FRAMEBUFFER_BINDING",
- "DYNAMIC_COPY",
- "DYNAMIC_READ",
- "FLOAT_32_UNSIGNED_INT_24_8_REV",
- "FLOAT_MAT2x3",
- "FLOAT_MAT2x4",
- "FLOAT_MAT3x2",
- "FLOAT_MAT3x4",
- "FLOAT_MAT4x2",
- "FLOAT_MAT4x3",
- "FRAGMENT_SHADER_DERIVATIVE_HINT",
- "FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
- "FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
- "FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING",
- "FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE",
- "FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
- "FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
- "FRAMEBUFFER_ATTACHMENT_RED_SIZE",
- "FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
- "FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER",
- "FRAMEBUFFER_DEFAULT",
- "FRAMEBUFFER_INCOMPLETE_MULTISAMPLE",
- "FRAMEBUFFER_UNDEFINED",
- "GREEN",
- "HALF_FLOAT",
- "INT_2_10_10_10_REV",
- "INTERLEAVED_ATTRIBS",
- "INT_SAMPLER_2D",
- "INT_SAMPLER_2D_ARRAY",
- "INT_SAMPLER_3D",
- "INT_SAMPLER_CUBE",
- "INVALID_INDEX",
- "MAJOR_VERSION",
- "MAP_FLUSH_EXPLICIT_BIT",
- "MAP_INVALIDATE_BUFFER_BIT",
- "MAP_INVALIDATE_RANGE_BIT",
- "MAP_READ_BIT",
- "MAP_UNSYNCHRONIZED_BIT",
- "MAP_WRITE_BIT",
- "MAX",
- "MAX_3D_TEXTURE_SIZE",
- "MAX_ARRAY_TEXTURE_LAYERS",
- "MAX_COLOR_ATTACHMENTS",
- "MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
- "MAX_COMBINED_UNIFORM_BLOCKS",
- "MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
- "MAX_DRAW_BUFFERS",
- "MAX_ELEMENT_INDEX",
- "MAX_ELEMENTS_INDICES",
- "MAX_ELEMENTS_VERTICES",
- "MAX_FRAGMENT_INPUT_COMPONENTS",
- "MAX_FRAGMENT_UNIFORM_BLOCKS",
- "MAX_FRAGMENT_UNIFORM_COMPONENTS",
- "MAX_PROGRAM_TEXEL_OFFSET",
- "MAX_SAMPLES",
- "MAX_SERVER_WAIT_TIMEOUT",
- "MAX_TEXTURE_LOD_BIAS",
- "MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
- "MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
- "MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
- "MAX_UNIFORM_BLOCK_SIZE",
- "MAX_UNIFORM_BUFFER_BINDINGS",
- "MAX_VARYING_COMPONENTS",
- "MAX_VERTEX_OUTPUT_COMPONENTS",
- "MAX_VERTEX_UNIFORM_BLOCKS",
- "MAX_VERTEX_UNIFORM_COMPONENTS",
- "MIN",
- "MINOR_VERSION",
- "MIN_PROGRAM_TEXEL_OFFSET",
- "NUM_EXTENSIONS",
- "NUM_PROGRAM_BINARY_FORMATS",
- "NUM_SAMPLE_COUNTS",
- "OBJECT_TYPE",
- "PACK_ROW_LENGTH",
- "PACK_SKIP_PIXELS",
- "PACK_SKIP_ROWS",
- "PIXEL_PACK_BUFFER",
- "PIXEL_PACK_BUFFER_BINDING",
- "PIXEL_UNPACK_BUFFER",
- "PIXEL_UNPACK_BUFFER_BINDING",
- "PRIMITIVE_RESTART_FIXED_INDEX",
- "PROGRAM_BINARY_FORMATS",
- "PROGRAM_BINARY_LENGTH",
- "PROGRAM_BINARY_RETRIEVABLE_HINT",
- "QUERY_RESULT",
- "QUERY_RESULT_AVAILABLE",
- "R11F_G11F_B10F",
- "R16F",
- "R16I",
- "R16UI",
- "R32F",
- "R32I",
- "R32UI",
- "R8",
- "R8I",
- "R8_SNORM",
- "R8UI",
- "RASTERIZER_DISCARD",
- "READ_BUFFER",
- "READ_FRAMEBUFFER",
- "READ_FRAMEBUFFER_BINDING",
- "RED",
- "RED_INTEGER",
- "RENDERBUFFER_SAMPLES",
- "RG",
- "RG16F",
- "RG16I",
- "RG16UI",
- "RG32F",
- "RG32I",
- "RG32UI",
- "RG8",
- "RG8I",
- "RG8_SNORM",
- "RG8UI",
- "RGB10_A2",
- "RGB10_A2UI",
- "RGB16F",
- "RGB16I",
- "RGB16UI",
- "RGB32F",
- "RGB32I",
- "RGB32UI",
- "RGB8",
- "RGB8I",
- "RGB8_SNORM",
- "RGB8UI",
- "RGB9_E5",
- "RGBA16F",
- "RGBA16I",
- "RGBA16UI",
- "RGBA32F",
- "RGBA32I",
- "RGBA32UI",
- "RGBA8",
- "RGBA8I",
- "RGBA8_SNORM",
- "RGBA8UI",
- "RGBA_INTEGER",
- "RGB_INTEGER",
- "RG_INTEGER",
- "SAMPLER_2D_ARRAY",
- "SAMPLER_2D_ARRAY_SHADOW",
- "SAMPLER_2D_SHADOW",
- "SAMPLER_3D",
- "SAMPLER_BINDING",
- "SAMPLER_CUBE_SHADOW",
- "SEPARATE_ATTRIBS",
- "SIGNALED",
- "SIGNED_NORMALIZED",
- "SRGB",
- "SRGB8",
- "SRGB8_ALPHA8",
- "STATIC_COPY",
- "STATIC_READ",
- "STENCIL",
- "STREAM_COPY",
- "STREAM_READ",
- "SYNC_CONDITION",
- "SYNC_FENCE",
- "SYNC_FLAGS",
- "SYNC_FLUSH_COMMANDS_BIT",
- "SYNC_GPU_COMMANDS_COMPLETE",
- "SYNC_STATUS",
- "TEXTURE_2D_ARRAY",
- "TEXTURE_3D",
- "TEXTURE_BASE_LEVEL",
- "TEXTURE_BINDING_2D_ARRAY",
- "TEXTURE_BINDING_3D",
- "TEXTURE_COMPARE_FUNC",
- "TEXTURE_COMPARE_MODE",
- "TEXTURE_IMMUTABLE_FORMAT",
- "TEXTURE_IMMUTABLE_LEVELS",
- "TEXTURE_MAX_LEVEL",
- "TEXTURE_MAX_LOD",
- "TEXTURE_MIN_LOD",
- "TEXTURE_SWIZZLE_A",
- "TEXTURE_SWIZZLE_B",
- "TEXTURE_SWIZZLE_G",
- "TEXTURE_SWIZZLE_R",
- "TEXTURE_WRAP_R",
- "TIMEOUT_EXPIRED",
- "TRANSFORM_FEEDBACK",
- "TRANSFORM_FEEDBACK_ACTIVE",
- "TRANSFORM_FEEDBACK_BINDING",
- "TRANSFORM_FEEDBACK_BUFFER",
- "TRANSFORM_FEEDBACK_BUFFER_BINDING",
- "TRANSFORM_FEEDBACK_BUFFER_MODE",
- "TRANSFORM_FEEDBACK_BUFFER_SIZE",
- "TRANSFORM_FEEDBACK_BUFFER_START",
- "TRANSFORM_FEEDBACK_PAUSED",
- "TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
- "TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
- "TRANSFORM_FEEDBACK_VARYINGS",
- "UNIFORM_ARRAY_STRIDE",
- "UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
- "UNIFORM_BLOCK_ACTIVE_UNIFORMS",
- "UNIFORM_BLOCK_BINDING",
- "UNIFORM_BLOCK_DATA_SIZE",
- "UNIFORM_BLOCK_INDEX",
- "UNIFORM_BLOCK_NAME_LENGTH",
- "UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
- "UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
- "UNIFORM_BUFFER",
- "UNIFORM_BUFFER_BINDING",
- "UNIFORM_BUFFER_OFFSET_ALIGNMENT",
- "UNIFORM_BUFFER_SIZE",
- "UNIFORM_BUFFER_START",
- "UNIFORM_IS_ROW_MAJOR",
- "UNIFORM_MATRIX_STRIDE",
- "UNIFORM_NAME_LENGTH",
- "UNIFORM_OFFSET",
- "UNIFORM_SIZE",
- "UNIFORM_TYPE",
- "UNPACK_IMAGE_HEIGHT",
- "UNPACK_ROW_LENGTH",
- "UNPACK_SKIP_IMAGES",
- "UNPACK_SKIP_PIXELS",
- "UNPACK_SKIP_ROWS",
- "UNSIGNALED",
- "UNSIGNED_INT_10F_11F_11F_REV",
- "UNSIGNED_INT_2_10_10_10_REV",
- "UNSIGNED_INT_24_8",
- "UNSIGNED_INT_5_9_9_9_REV",
- "UNSIGNED_INT_SAMPLER_2D",
- "UNSIGNED_INT_SAMPLER_2D_ARRAY",
- "UNSIGNED_INT_SAMPLER_3D",
- "UNSIGNED_INT_SAMPLER_CUBE",
- "UNSIGNED_INT_VEC2",
- "UNSIGNED_INT_VEC3",
- "UNSIGNED_INT_VEC4",
- "UNSIGNED_NORMALIZED",
- "VERTEX_ARRAY_BINDING",
- "VERTEX_ATTRIB_ARRAY_DIVISOR",
- "VERTEX_ATTRIB_ARRAY_INTEGER",
- "WAIT_FAILED",
- }
- var outfile = flag.String("o", "", "result will be written to the file instead of stdout.")
- var fset = new(token.FileSet)
- func typeString(t ast.Expr) string {
- buf := new(bytes.Buffer)
- printer.Fprint(buf, fset, t)
- return buf.String()
- }
- func typePrinter(t string) string {
- switch t {
- case "[]float32", "[]byte":
- return "len(%d)"
- }
- return "%v"
- }
- func typePrinterArg(t, name string) string {
- switch t {
- case "[]float32", "[]byte":
- return "len(" + name + ")"
- }
- return name
- }
- func die(err error) {
- fmt.Fprintf(os.Stderr, err.Error())
- os.Exit(1)
- }
- func main() {
- flag.Parse()
- f, err := parser.ParseFile(fset, "consts.go", nil, parser.ParseComments)
- if err != nil {
- die(err)
- }
- entries := enum(f)
- f, err = parser.ParseFile(fset, "gl.go", nil, parser.ParseComments)
- if err != nil {
- die(err)
- }
- buf := new(bytes.Buffer)
- fmt.Fprint(buf, preamble)
- fmt.Fprintf(buf, "func (v Enum) String() string {\n")
- fmt.Fprintf(buf, "\tswitch v {\n")
- for _, e := range dedup(entries) {
- fmt.Fprintf(buf, "\tcase 0x%x: return %q\n", e.value, e.name)
- }
- fmt.Fprintf(buf, "\t%s\n", `default: return fmt.Sprintf("gl.Enum(0x%x)", uint32(v))`)
- fmt.Fprintf(buf, "\t}\n")
- fmt.Fprintf(buf, "}\n\n")
- for _, d := range f.Decls {
- // Before:
- // func (ctx *context) StencilMask(mask uint32) {
- // C.glStencilMask(C.GLuint(mask))
- // }
- //
- // After:
- // func (ctx *context) StencilMask(mask uint32) {
- // defer func() {
- // errstr := ctx.errDrain()
- // log.Printf("gl.StencilMask(%v) %v", mask, errstr)
- // }()
- // C.glStencilMask(C.GLuint(mask))
- // }
- fn, ok := d.(*ast.FuncDecl)
- if !ok {
- continue
- }
- if fn.Recv == nil || fn.Recv.List[0].Names[0].Name != "ctx" {
- continue
- }
- tname := "<unknown>"
- t := fn.Recv.List[0].Type
- if star, ok := t.(*ast.StarExpr); ok {
- tname = "*" + star.X.(*ast.Ident).Name
- } else if t, ok := t.(*ast.Ident); ok {
- tname = t.Name
- }
- var (
- params []string
- paramTypes []string
- results []string
- resultTypes []string
- )
- // Print function signature.
- fmt.Fprintf(buf, "func (ctx %s) %s(", tname, fn.Name.Name)
- for i, p := range fn.Type.Params.List {
- if i > 0 {
- fmt.Fprint(buf, ", ")
- }
- ty := typeString(p.Type)
- for i, n := range p.Names {
- if i > 0 {
- fmt.Fprint(buf, ", ")
- }
- fmt.Fprintf(buf, "%s ", n.Name)
- params = append(params, n.Name)
- paramTypes = append(paramTypes, ty)
- }
- fmt.Fprint(buf, ty)
- }
- fmt.Fprintf(buf, ") (")
- if fn.Type.Results != nil {
- for i, r := range fn.Type.Results.List {
- if i > 0 {
- fmt.Fprint(buf, ", ")
- }
- ty := typeString(r.Type)
- if len(r.Names) == 0 {
- name := fmt.Sprintf("r%d", i)
- fmt.Fprintf(buf, "%s ", name)
- results = append(results, name)
- resultTypes = append(resultTypes, ty)
- }
- for i, n := range r.Names {
- if i > 0 {
- fmt.Fprint(buf, ", ")
- }
- fmt.Fprintf(buf, "%s ", n.Name)
- results = append(results, n.Name)
- resultTypes = append(resultTypes, ty)
- }
- fmt.Fprint(buf, ty)
- }
- }
- fmt.Fprintf(buf, ") {\n")
- // gl.GetError is used by errDrain, which will be made part of
- // all functions. So do not apply it to gl.GetError to avoid
- // infinite recursion.
- skip := fn.Name.Name == "GetError"
- if !skip {
- // Insert a defer block for tracing.
- fmt.Fprintf(buf, "defer func() {\n")
- fmt.Fprintf(buf, "\terrstr := ctx.errDrain()\n")
- switch fn.Name.Name {
- case "GetUniformLocation", "GetAttribLocation":
- fmt.Fprintf(buf, "\tr0.name = name\n")
- }
- fmt.Fprintf(buf, "\tlog.Printf(\"gl.%s(", fn.Name.Name)
- for i, p := range paramTypes {
- if i > 0 {
- fmt.Fprint(buf, ", ")
- }
- fmt.Fprint(buf, typePrinter(p))
- }
- fmt.Fprintf(buf, ") ")
- if len(resultTypes) > 1 {
- fmt.Fprint(buf, "(")
- }
- for i, r := range resultTypes {
- if i > 0 {
- fmt.Fprint(buf, ", ")
- }
- fmt.Fprint(buf, typePrinter(r))
- }
- if len(resultTypes) > 1 {
- fmt.Fprint(buf, ") ")
- }
- fmt.Fprintf(buf, "%%v\"")
- for i, p := range paramTypes {
- fmt.Fprintf(buf, ", %s", typePrinterArg(p, params[i]))
- }
- for i, r := range resultTypes {
- fmt.Fprintf(buf, ", %s", typePrinterArg(r, results[i]))
- }
- fmt.Fprintf(buf, ", errstr)\n")
- fmt.Fprintf(buf, "}()\n")
- }
- // Print original body of function.
- for _, s := range fn.Body.List {
- if c := enqueueCall(s); c != nil {
- c.Fun.(*ast.SelectorExpr).Sel.Name = "enqueueDebug"
- setEnqueueBlocking(c)
- }
- printer.Fprint(buf, fset, s)
- fmt.Fprintf(buf, "\n")
- }
- fmt.Fprintf(buf, "}\n\n")
- }
- b, err := format.Source(buf.Bytes())
- if err != nil {
- os.Stdout.Write(buf.Bytes())
- die(err)
- }
- if *outfile == "" {
- os.Stdout.Write(b)
- return
- }
- if err := ioutil.WriteFile(*outfile, b, 0666); err != nil {
- die(err)
- }
- }
- func enqueueCall(stmt ast.Stmt) *ast.CallExpr {
- exprStmt, ok := stmt.(*ast.ExprStmt)
- if !ok {
- return nil
- }
- call, ok := exprStmt.X.(*ast.CallExpr)
- if !ok {
- return nil
- }
- fun, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return nil
- }
- if fun.Sel.Name != "enqueue" {
- return nil
- }
- return call
- }
- func setEnqueueBlocking(c *ast.CallExpr) {
- lit := c.Args[0].(*ast.CompositeLit)
- for _, elt := range lit.Elts {
- kv := elt.(*ast.KeyValueExpr)
- if kv.Key.(*ast.Ident).Name == "blocking" {
- kv.Value = &ast.Ident{Name: "true"}
- return
- }
- }
- lit.Elts = append(lit.Elts, &ast.KeyValueExpr{
- Key: &ast.Ident{
- NamePos: lit.Rbrace,
- Name: "blocking",
- },
- Value: &ast.Ident{Name: "true"},
- })
- }
- const preamble = `// Copyright 2014 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // Code generated from gl.go using go generate. DO NOT EDIT.
- // See doc.go for details.
- //go:build (darwin || linux || openbsd || windows) && gldebug
- package gl
- import (
- "fmt"
- "log"
- "math"
- "sync/atomic"
- "unsafe"
- )
- func (ctx *context) errDrain() string {
- var errs []Enum
- for {
- e := ctx.GetError()
- if e == 0 {
- break
- }
- errs = append(errs, e)
- }
- if len(errs) > 0 {
- return fmt.Sprintf(" error: %v", errs)
- }
- return ""
- }
- func (ctx *context) enqueueDebug(c call) uintptr {
- numCalls := atomic.AddInt32(&ctx.debug, 1)
- if numCalls > 1 {
- panic("concurrent calls made to the same GL context")
- }
- defer func() {
- if atomic.AddInt32(&ctx.debug, -1) > 0 {
- select {} // block so you see us in the panic
- }
- }()
- return ctx.enqueue(c)
- }
- `
- type entry struct {
- name string
- value uint64
- }
- func genWhitelistMap(whitelist []string) map[string]bool {
- m := make(map[string]bool)
- for _, v := range enumWhitelist {
- m[v] = true
- }
- return m
- }
- // enum builds a list of all GL constants that make up the gl.Enum type.
- func enum(f *ast.File) []entry {
- var entries []entry
- whitelist := genWhitelistMap(enumWhitelist)
- for _, d := range f.Decls {
- gendecl, ok := d.(*ast.GenDecl)
- if !ok {
- continue
- }
- if gendecl.Tok != token.CONST {
- continue
- }
- for _, s := range gendecl.Specs {
- v, ok := s.(*ast.ValueSpec)
- if !ok {
- continue
- }
- if len(v.Names) != 1 || len(v.Values) != 1 {
- continue
- }
- if _, ok := whitelist[v.Names[0].Name]; !ok {
- continue
- }
- val, err := strconv.ParseUint(v.Values[0].(*ast.BasicLit).Value, 0, 64)
- if err != nil {
- log.Fatalf("enum %s: %v", v.Names[0].Name, err)
- }
- entries = append(entries, entry{v.Names[0].Name, val})
- }
- }
- return entries
- }
- func dedup(entries []entry) []entry {
- // Find all duplicates. Use "%d" as the name of any value with duplicates.
- seen := make(map[uint64]int)
- for _, e := range entries {
- seen[e.value]++
- }
- var dedup []entry
- for _, e := range entries {
- switch seen[e.value] {
- case 0: // skip, already here
- case 1:
- dedup = append(dedup, e)
- default:
- // value is duplicated
- dedup = append(dedup, entry{fmt.Sprintf("%d", e.value), e.value})
- seen[e.value] = 0
- }
- }
- return dedup
- }
|