github.com/cyrilou242/gomobile-java@v0.0.0-20220215185836-09daef25a210/gl/gendebug.go (about)

     1  // Copyright 2014 The Go Authors.  All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build ignore
     6  // +build ignore
     7  
     8  // The gendebug program takes gl.go and generates a version of it
     9  // where each function includes tracing code that writes its arguments
    10  // to the standard log.
    11  package main
    12  
    13  import (
    14  	"bytes"
    15  	"flag"
    16  	"fmt"
    17  	"go/ast"
    18  	"go/format"
    19  	"go/parser"
    20  	"go/printer"
    21  	"go/token"
    22  	"io/ioutil"
    23  	"log"
    24  	"os"
    25  	"strconv"
    26  )
    27  
    28  var enumWhitelist = []string{
    29  	"POINTS",
    30  	"LINES",
    31  	"LINE_LOOP",
    32  	"LINE_STRIP",
    33  	"TRIANGLES",
    34  	"TRIANGLE_STRIP",
    35  	"TRIANGLE_FAN",
    36  	"SRC_COLOR",
    37  	"ONE_MINUS_SRC_COLOR",
    38  	"SRC_ALPHA",
    39  	"ONE_MINUS_SRC_ALPHA",
    40  	"DST_ALPHA",
    41  	"ONE_MINUS_DST_ALPHA",
    42  	"DST_COLOR",
    43  	"ONE_MINUS_DST_COLOR",
    44  	"SRC_ALPHA_SATURATE",
    45  	"FUNC_ADD",
    46  	"BLEND_EQUATION",
    47  	"BLEND_EQUATION_RGB",
    48  	"BLEND_EQUATION_ALPHA",
    49  	"FUNC_SUBTRACT",
    50  	"FUNC_REVERSE_SUBTRACT",
    51  	"BLEND_DST_RGB",
    52  	"BLEND_SRC_RGB",
    53  	"BLEND_DST_ALPHA",
    54  	"BLEND_SRC_ALPHA",
    55  	"CONSTANT_COLOR",
    56  	"ONE_MINUS_CONSTANT_COLOR",
    57  	"CONSTANT_ALPHA",
    58  	"ONE_MINUS_CONSTANT_ALPHA",
    59  	"BLEND_COLOR",
    60  	"ARRAY_BUFFER",
    61  	"ELEMENT_ARRAY_BUFFER",
    62  	"ARRAY_BUFFER_BINDING",
    63  	"ELEMENT_ARRAY_BUFFER_BINDING",
    64  	"STREAM_DRAW",
    65  	"STATIC_DRAW",
    66  	"DYNAMIC_DRAW",
    67  	"BUFFER_SIZE",
    68  	"BUFFER_USAGE",
    69  	"CURRENT_VERTEX_ATTRIB",
    70  	"FRONT",
    71  	"BACK",
    72  	"FRONT_AND_BACK",
    73  	"TEXTURE_2D",
    74  	"CULL_FACE",
    75  	"BLEND",
    76  	"DITHER",
    77  	"STENCIL_TEST",
    78  	"DEPTH_TEST",
    79  	"SCISSOR_TEST",
    80  	"POLYGON_OFFSET_FILL",
    81  	"SAMPLE_ALPHA_TO_COVERAGE",
    82  	"SAMPLE_COVERAGE",
    83  	"INVALID_ENUM",
    84  	"INVALID_VALUE",
    85  	"INVALID_OPERATION",
    86  	"OUT_OF_MEMORY",
    87  	"CW",
    88  	"CCW",
    89  	"LINE_WIDTH",
    90  	"ALIASED_POINT_SIZE_RANGE",
    91  	"ALIASED_LINE_WIDTH_RANGE",
    92  	"CULL_FACE_MODE",
    93  	"FRONT_FACE",
    94  	"DEPTH_RANGE",
    95  	"DEPTH_WRITEMASK",
    96  	"DEPTH_CLEAR_VALUE",
    97  	"DEPTH_FUNC",
    98  	"STENCIL_CLEAR_VALUE",
    99  	"STENCIL_FUNC",
   100  	"STENCIL_FAIL",
   101  	"STENCIL_PASS_DEPTH_FAIL",
   102  	"STENCIL_PASS_DEPTH_PASS",
   103  	"STENCIL_REF",
   104  	"STENCIL_VALUE_MASK",
   105  	"STENCIL_WRITEMASK",
   106  	"STENCIL_BACK_FUNC",
   107  	"STENCIL_BACK_FAIL",
   108  	"STENCIL_BACK_PASS_DEPTH_FAIL",
   109  	"STENCIL_BACK_PASS_DEPTH_PASS",
   110  	"STENCIL_BACK_REF",
   111  	"STENCIL_BACK_VALUE_MASK",
   112  	"STENCIL_BACK_WRITEMASK",
   113  	"VIEWPORT",
   114  	"SCISSOR_BOX",
   115  	"COLOR_CLEAR_VALUE",
   116  	"COLOR_WRITEMASK",
   117  	"UNPACK_ALIGNMENT",
   118  	"PACK_ALIGNMENT",
   119  	"MAX_TEXTURE_SIZE",
   120  	"MAX_VIEWPORT_DIMS",
   121  	"SUBPIXEL_BITS",
   122  	"RED_BITS",
   123  	"GREEN_BITS",
   124  	"BLUE_BITS",
   125  	"ALPHA_BITS",
   126  	"DEPTH_BITS",
   127  	"STENCIL_BITS",
   128  	"POLYGON_OFFSET_UNITS",
   129  	"POLYGON_OFFSET_FACTOR",
   130  	"TEXTURE_BINDING_2D",
   131  	"SAMPLE_BUFFERS",
   132  	"SAMPLES",
   133  	"SAMPLE_COVERAGE_VALUE",
   134  	"SAMPLE_COVERAGE_INVERT",
   135  	"NUM_COMPRESSED_TEXTURE_FORMATS",
   136  	"COMPRESSED_TEXTURE_FORMATS",
   137  	"DONT_CARE",
   138  	"FASTEST",
   139  	"NICEST",
   140  	"GENERATE_MIPMAP_HINT",
   141  	"BYTE",
   142  	"UNSIGNED_BYTE",
   143  	"SHORT",
   144  	"UNSIGNED_SHORT",
   145  	"INT",
   146  	"UNSIGNED_INT",
   147  	"FLOAT",
   148  	"FIXED",
   149  	"DEPTH_COMPONENT",
   150  	"ALPHA",
   151  	"RGB",
   152  	"RGBA",
   153  	"LUMINANCE",
   154  	"LUMINANCE_ALPHA",
   155  	"UNSIGNED_SHORT_4_4_4_4",
   156  	"UNSIGNED_SHORT_5_5_5_1",
   157  	"UNSIGNED_SHORT_5_6_5",
   158  	"MAX_VERTEX_ATTRIBS",
   159  	"MAX_VERTEX_UNIFORM_VECTORS",
   160  	"MAX_VARYING_VECTORS",
   161  	"MAX_COMBINED_TEXTURE_IMAGE_UNITS",
   162  	"MAX_VERTEX_TEXTURE_IMAGE_UNITS",
   163  	"MAX_TEXTURE_IMAGE_UNITS",
   164  	"MAX_FRAGMENT_UNIFORM_VECTORS",
   165  	"SHADER_TYPE",
   166  	"DELETE_STATUS",
   167  	"LINK_STATUS",
   168  	"VALIDATE_STATUS",
   169  	"ATTACHED_SHADERS",
   170  	"ACTIVE_UNIFORMS",
   171  	"ACTIVE_UNIFORM_MAX_LENGTH",
   172  	"ACTIVE_ATTRIBUTES",
   173  	"ACTIVE_ATTRIBUTE_MAX_LENGTH",
   174  	"SHADING_LANGUAGE_VERSION",
   175  	"CURRENT_PROGRAM",
   176  	"NEVER",
   177  	"LESS",
   178  	"EQUAL",
   179  	"LEQUAL",
   180  	"GREATER",
   181  	"NOTEQUAL",
   182  	"GEQUAL",
   183  	"ALWAYS",
   184  	"KEEP",
   185  	"REPLACE",
   186  	"INCR",
   187  	"DECR",
   188  	"INVERT",
   189  	"INCR_WRAP",
   190  	"DECR_WRAP",
   191  	"VENDOR",
   192  	"RENDERER",
   193  	"VERSION",
   194  	"EXTENSIONS",
   195  	"NEAREST",
   196  	"LINEAR",
   197  	"NEAREST_MIPMAP_NEAREST",
   198  	"LINEAR_MIPMAP_NEAREST",
   199  	"NEAREST_MIPMAP_LINEAR",
   200  	"LINEAR_MIPMAP_LINEAR",
   201  	"TEXTURE_MAG_FILTER",
   202  	"TEXTURE_MIN_FILTER",
   203  	"TEXTURE_WRAP_S",
   204  	"TEXTURE_WRAP_T",
   205  	"TEXTURE",
   206  	"TEXTURE_CUBE_MAP",
   207  	"TEXTURE_BINDING_CUBE_MAP",
   208  	"TEXTURE_CUBE_MAP_POSITIVE_X",
   209  	"TEXTURE_CUBE_MAP_NEGATIVE_X",
   210  	"TEXTURE_CUBE_MAP_POSITIVE_Y",
   211  	"TEXTURE_CUBE_MAP_NEGATIVE_Y",
   212  	"TEXTURE_CUBE_MAP_POSITIVE_Z",
   213  	"TEXTURE_CUBE_MAP_NEGATIVE_Z",
   214  	"MAX_CUBE_MAP_TEXTURE_SIZE",
   215  	"TEXTURE0",
   216  	"TEXTURE1",
   217  	"TEXTURE2",
   218  	"TEXTURE3",
   219  	"TEXTURE4",
   220  	"TEXTURE5",
   221  	"TEXTURE6",
   222  	"TEXTURE7",
   223  	"TEXTURE8",
   224  	"TEXTURE9",
   225  	"TEXTURE10",
   226  	"TEXTURE11",
   227  	"TEXTURE12",
   228  	"TEXTURE13",
   229  	"TEXTURE14",
   230  	"TEXTURE15",
   231  	"TEXTURE16",
   232  	"TEXTURE17",
   233  	"TEXTURE18",
   234  	"TEXTURE19",
   235  	"TEXTURE20",
   236  	"TEXTURE21",
   237  	"TEXTURE22",
   238  	"TEXTURE23",
   239  	"TEXTURE24",
   240  	"TEXTURE25",
   241  	"TEXTURE26",
   242  	"TEXTURE27",
   243  	"TEXTURE28",
   244  	"TEXTURE29",
   245  	"TEXTURE30",
   246  	"TEXTURE31",
   247  	"ACTIVE_TEXTURE",
   248  	"REPEAT",
   249  	"CLAMP_TO_EDGE",
   250  	"MIRRORED_REPEAT",
   251  	"VERTEX_ATTRIB_ARRAY_ENABLED",
   252  	"VERTEX_ATTRIB_ARRAY_SIZE",
   253  	"VERTEX_ATTRIB_ARRAY_STRIDE",
   254  	"VERTEX_ATTRIB_ARRAY_TYPE",
   255  	"VERTEX_ATTRIB_ARRAY_NORMALIZED",
   256  	"VERTEX_ATTRIB_ARRAY_POINTER",
   257  	"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
   258  	"IMPLEMENTATION_COLOR_READ_TYPE",
   259  	"IMPLEMENTATION_COLOR_READ_FORMAT",
   260  	"COMPILE_STATUS",
   261  	"INFO_LOG_LENGTH",
   262  	"SHADER_SOURCE_LENGTH",
   263  	"SHADER_COMPILER",
   264  	"SHADER_BINARY_FORMATS",
   265  	"NUM_SHADER_BINARY_FORMATS",
   266  	"LOW_FLOAT",
   267  	"MEDIUM_FLOAT",
   268  	"HIGH_FLOAT",
   269  	"LOW_INT",
   270  	"MEDIUM_INT",
   271  	"HIGH_INT",
   272  	"FRAMEBUFFER",
   273  	"RENDERBUFFER",
   274  	"RGBA4",
   275  	"RGB5_A1",
   276  	"RGB565",
   277  	"DEPTH_COMPONENT16",
   278  	"STENCIL_INDEX8",
   279  	"RENDERBUFFER_WIDTH",
   280  	"RENDERBUFFER_HEIGHT",
   281  	"RENDERBUFFER_INTERNAL_FORMAT",
   282  	"RENDERBUFFER_RED_SIZE",
   283  	"RENDERBUFFER_GREEN_SIZE",
   284  	"RENDERBUFFER_BLUE_SIZE",
   285  	"RENDERBUFFER_ALPHA_SIZE",
   286  	"RENDERBUFFER_DEPTH_SIZE",
   287  	"RENDERBUFFER_STENCIL_SIZE",
   288  	"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
   289  	"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
   290  	"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
   291  	"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
   292  	"COLOR_ATTACHMENT0",
   293  	"DEPTH_ATTACHMENT",
   294  	"STENCIL_ATTACHMENT",
   295  	"FRAMEBUFFER_COMPLETE",
   296  	"FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
   297  	"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
   298  	"FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
   299  	"FRAMEBUFFER_UNSUPPORTED",
   300  	"FRAMEBUFFER_BINDING",
   301  	"RENDERBUFFER_BINDING",
   302  	"MAX_RENDERBUFFER_SIZE",
   303  	"INVALID_FRAMEBUFFER_OPERATION",
   304  	"DEPTH_BUFFER_BIT",
   305  	"STENCIL_BUFFER_BIT",
   306  	"COLOR_BUFFER_BIT",
   307  	"FLOAT_VEC2",
   308  	"FLOAT_VEC3",
   309  	"FLOAT_VEC4",
   310  	"INT_VEC2",
   311  	"INT_VEC3",
   312  	"INT_VEC4",
   313  	"BOOL",
   314  	"BOOL_VEC2",
   315  	"BOOL_VEC3",
   316  	"BOOL_VEC4",
   317  	"FLOAT_MAT2",
   318  	"FLOAT_MAT3",
   319  	"FLOAT_MAT4",
   320  	"SAMPLER_2D",
   321  	"SAMPLER_CUBE",
   322  	"FRAGMENT_SHADER",
   323  	"VERTEX_SHADER",
   324  	"FALSE",
   325  	"TRUE",
   326  	"ZERO",
   327  	"ONE",
   328  	"NO_ERROR",
   329  	"NONE",
   330  	"ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH",
   331  	"ACTIVE_UNIFORM_BLOCKS",
   332  	"ALREADY_SIGNALED",
   333  	"ANY_SAMPLES_PASSED",
   334  	"ANY_SAMPLES_PASSED_CONSERVATIVE",
   335  	"BLUE",
   336  	"BUFFER_ACCESS_FLAGS",
   337  	"BUFFER_MAP_LENGTH",
   338  	"BUFFER_MAP_OFFSET",
   339  	"BUFFER_MAPPED",
   340  	"BUFFER_MAP_POINTER",
   341  	"COLOR",
   342  	"COLOR_ATTACHMENT10",
   343  	"COLOR_ATTACHMENT1",
   344  	"COLOR_ATTACHMENT11",
   345  	"COLOR_ATTACHMENT12",
   346  	"COLOR_ATTACHMENT13",
   347  	"COLOR_ATTACHMENT14",
   348  	"COLOR_ATTACHMENT15",
   349  	"COLOR_ATTACHMENT2",
   350  	"COLOR_ATTACHMENT3",
   351  	"COLOR_ATTACHMENT4",
   352  	"COLOR_ATTACHMENT5",
   353  	"COLOR_ATTACHMENT6",
   354  	"COLOR_ATTACHMENT7",
   355  	"COLOR_ATTACHMENT8",
   356  	"COLOR_ATTACHMENT9",
   357  	"COMPARE_REF_TO_TEXTURE",
   358  	"COMPRESSED_R11_EAC",
   359  	"COMPRESSED_RG11_EAC",
   360  	"COMPRESSED_RGB8_ETC2",
   361  	"COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",
   362  	"COMPRESSED_RGBA8_ETC2_EAC",
   363  	"COMPRESSED_SIGNED_R11_EAC",
   364  	"COMPRESSED_SIGNED_RG11_EAC",
   365  	"COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",
   366  	"COMPRESSED_SRGB8_ETC2",
   367  	"COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",
   368  	"CONDITION_SATISFIED",
   369  	"COPY_READ_BUFFER",
   370  	"COPY_READ_BUFFER_BINDING",
   371  	"COPY_WRITE_BUFFER",
   372  	"COPY_WRITE_BUFFER_BINDING",
   373  	"CURRENT_QUERY",
   374  	"DEPTH",
   375  	"DEPTH24_STENCIL8",
   376  	"DEPTH32F_STENCIL8",
   377  	"DEPTH_COMPONENT24",
   378  	"DEPTH_COMPONENT32F",
   379  	"DEPTH_STENCIL",
   380  	"DEPTH_STENCIL_ATTACHMENT",
   381  	"DRAW_BUFFER0",
   382  	"DRAW_BUFFER10",
   383  	"DRAW_BUFFER1",
   384  	"DRAW_BUFFER11",
   385  	"DRAW_BUFFER12",
   386  	"DRAW_BUFFER13",
   387  	"DRAW_BUFFER14",
   388  	"DRAW_BUFFER15",
   389  	"DRAW_BUFFER2",
   390  	"DRAW_BUFFER3",
   391  	"DRAW_BUFFER4",
   392  	"DRAW_BUFFER5",
   393  	"DRAW_BUFFER6",
   394  	"DRAW_BUFFER7",
   395  	"DRAW_BUFFER8",
   396  	"DRAW_BUFFER9",
   397  	"DRAW_FRAMEBUFFER",
   398  	"DRAW_FRAMEBUFFER_BINDING",
   399  	"DYNAMIC_COPY",
   400  	"DYNAMIC_READ",
   401  	"FLOAT_32_UNSIGNED_INT_24_8_REV",
   402  	"FLOAT_MAT2x3",
   403  	"FLOAT_MAT2x4",
   404  	"FLOAT_MAT3x2",
   405  	"FLOAT_MAT3x4",
   406  	"FLOAT_MAT4x2",
   407  	"FLOAT_MAT4x3",
   408  	"FRAGMENT_SHADER_DERIVATIVE_HINT",
   409  	"FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE",
   410  	"FRAMEBUFFER_ATTACHMENT_BLUE_SIZE",
   411  	"FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING",
   412  	"FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE",
   413  	"FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE",
   414  	"FRAMEBUFFER_ATTACHMENT_GREEN_SIZE",
   415  	"FRAMEBUFFER_ATTACHMENT_RED_SIZE",
   416  	"FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE",
   417  	"FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER",
   418  	"FRAMEBUFFER_DEFAULT",
   419  	"FRAMEBUFFER_INCOMPLETE_MULTISAMPLE",
   420  	"FRAMEBUFFER_UNDEFINED",
   421  	"GREEN",
   422  	"HALF_FLOAT",
   423  	"INT_2_10_10_10_REV",
   424  	"INTERLEAVED_ATTRIBS",
   425  	"INT_SAMPLER_2D",
   426  	"INT_SAMPLER_2D_ARRAY",
   427  	"INT_SAMPLER_3D",
   428  	"INT_SAMPLER_CUBE",
   429  	"INVALID_INDEX",
   430  	"MAJOR_VERSION",
   431  	"MAP_FLUSH_EXPLICIT_BIT",
   432  	"MAP_INVALIDATE_BUFFER_BIT",
   433  	"MAP_INVALIDATE_RANGE_BIT",
   434  	"MAP_READ_BIT",
   435  	"MAP_UNSYNCHRONIZED_BIT",
   436  	"MAP_WRITE_BIT",
   437  	"MAX",
   438  	"MAX_3D_TEXTURE_SIZE",
   439  	"MAX_ARRAY_TEXTURE_LAYERS",
   440  	"MAX_COLOR_ATTACHMENTS",
   441  	"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS",
   442  	"MAX_COMBINED_UNIFORM_BLOCKS",
   443  	"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS",
   444  	"MAX_DRAW_BUFFERS",
   445  	"MAX_ELEMENT_INDEX",
   446  	"MAX_ELEMENTS_INDICES",
   447  	"MAX_ELEMENTS_VERTICES",
   448  	"MAX_FRAGMENT_INPUT_COMPONENTS",
   449  	"MAX_FRAGMENT_UNIFORM_BLOCKS",
   450  	"MAX_FRAGMENT_UNIFORM_COMPONENTS",
   451  	"MAX_PROGRAM_TEXEL_OFFSET",
   452  	"MAX_SAMPLES",
   453  	"MAX_SERVER_WAIT_TIMEOUT",
   454  	"MAX_TEXTURE_LOD_BIAS",
   455  	"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS",
   456  	"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS",
   457  	"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS",
   458  	"MAX_UNIFORM_BLOCK_SIZE",
   459  	"MAX_UNIFORM_BUFFER_BINDINGS",
   460  	"MAX_VARYING_COMPONENTS",
   461  	"MAX_VERTEX_OUTPUT_COMPONENTS",
   462  	"MAX_VERTEX_UNIFORM_BLOCKS",
   463  	"MAX_VERTEX_UNIFORM_COMPONENTS",
   464  	"MIN",
   465  	"MINOR_VERSION",
   466  	"MIN_PROGRAM_TEXEL_OFFSET",
   467  	"NUM_EXTENSIONS",
   468  	"NUM_PROGRAM_BINARY_FORMATS",
   469  	"NUM_SAMPLE_COUNTS",
   470  	"OBJECT_TYPE",
   471  	"PACK_ROW_LENGTH",
   472  	"PACK_SKIP_PIXELS",
   473  	"PACK_SKIP_ROWS",
   474  	"PIXEL_PACK_BUFFER",
   475  	"PIXEL_PACK_BUFFER_BINDING",
   476  	"PIXEL_UNPACK_BUFFER",
   477  	"PIXEL_UNPACK_BUFFER_BINDING",
   478  	"PRIMITIVE_RESTART_FIXED_INDEX",
   479  	"PROGRAM_BINARY_FORMATS",
   480  	"PROGRAM_BINARY_LENGTH",
   481  	"PROGRAM_BINARY_RETRIEVABLE_HINT",
   482  	"QUERY_RESULT",
   483  	"QUERY_RESULT_AVAILABLE",
   484  	"R11F_G11F_B10F",
   485  	"R16F",
   486  	"R16I",
   487  	"R16UI",
   488  	"R32F",
   489  	"R32I",
   490  	"R32UI",
   491  	"R8",
   492  	"R8I",
   493  	"R8_SNORM",
   494  	"R8UI",
   495  	"RASTERIZER_DISCARD",
   496  	"READ_BUFFER",
   497  	"READ_FRAMEBUFFER",
   498  	"READ_FRAMEBUFFER_BINDING",
   499  	"RED",
   500  	"RED_INTEGER",
   501  	"RENDERBUFFER_SAMPLES",
   502  	"RG",
   503  	"RG16F",
   504  	"RG16I",
   505  	"RG16UI",
   506  	"RG32F",
   507  	"RG32I",
   508  	"RG32UI",
   509  	"RG8",
   510  	"RG8I",
   511  	"RG8_SNORM",
   512  	"RG8UI",
   513  	"RGB10_A2",
   514  	"RGB10_A2UI",
   515  	"RGB16F",
   516  	"RGB16I",
   517  	"RGB16UI",
   518  	"RGB32F",
   519  	"RGB32I",
   520  	"RGB32UI",
   521  	"RGB8",
   522  	"RGB8I",
   523  	"RGB8_SNORM",
   524  	"RGB8UI",
   525  	"RGB9_E5",
   526  	"RGBA16F",
   527  	"RGBA16I",
   528  	"RGBA16UI",
   529  	"RGBA32F",
   530  	"RGBA32I",
   531  	"RGBA32UI",
   532  	"RGBA8",
   533  	"RGBA8I",
   534  	"RGBA8_SNORM",
   535  	"RGBA8UI",
   536  	"RGBA_INTEGER",
   537  	"RGB_INTEGER",
   538  	"RG_INTEGER",
   539  	"SAMPLER_2D_ARRAY",
   540  	"SAMPLER_2D_ARRAY_SHADOW",
   541  	"SAMPLER_2D_SHADOW",
   542  	"SAMPLER_3D",
   543  	"SAMPLER_BINDING",
   544  	"SAMPLER_CUBE_SHADOW",
   545  	"SEPARATE_ATTRIBS",
   546  	"SIGNALED",
   547  	"SIGNED_NORMALIZED",
   548  	"SRGB",
   549  	"SRGB8",
   550  	"SRGB8_ALPHA8",
   551  	"STATIC_COPY",
   552  	"STATIC_READ",
   553  	"STENCIL",
   554  	"STREAM_COPY",
   555  	"STREAM_READ",
   556  	"SYNC_CONDITION",
   557  	"SYNC_FENCE",
   558  	"SYNC_FLAGS",
   559  	"SYNC_FLUSH_COMMANDS_BIT",
   560  	"SYNC_GPU_COMMANDS_COMPLETE",
   561  	"SYNC_STATUS",
   562  	"TEXTURE_2D_ARRAY",
   563  	"TEXTURE_3D",
   564  	"TEXTURE_BASE_LEVEL",
   565  	"TEXTURE_BINDING_2D_ARRAY",
   566  	"TEXTURE_BINDING_3D",
   567  	"TEXTURE_COMPARE_FUNC",
   568  	"TEXTURE_COMPARE_MODE",
   569  	"TEXTURE_IMMUTABLE_FORMAT",
   570  	"TEXTURE_IMMUTABLE_LEVELS",
   571  	"TEXTURE_MAX_LEVEL",
   572  	"TEXTURE_MAX_LOD",
   573  	"TEXTURE_MIN_LOD",
   574  	"TEXTURE_SWIZZLE_A",
   575  	"TEXTURE_SWIZZLE_B",
   576  	"TEXTURE_SWIZZLE_G",
   577  	"TEXTURE_SWIZZLE_R",
   578  	"TEXTURE_WRAP_R",
   579  	"TIMEOUT_EXPIRED",
   580  	"TRANSFORM_FEEDBACK",
   581  	"TRANSFORM_FEEDBACK_ACTIVE",
   582  	"TRANSFORM_FEEDBACK_BINDING",
   583  	"TRANSFORM_FEEDBACK_BUFFER",
   584  	"TRANSFORM_FEEDBACK_BUFFER_BINDING",
   585  	"TRANSFORM_FEEDBACK_BUFFER_MODE",
   586  	"TRANSFORM_FEEDBACK_BUFFER_SIZE",
   587  	"TRANSFORM_FEEDBACK_BUFFER_START",
   588  	"TRANSFORM_FEEDBACK_PAUSED",
   589  	"TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN",
   590  	"TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH",
   591  	"TRANSFORM_FEEDBACK_VARYINGS",
   592  	"UNIFORM_ARRAY_STRIDE",
   593  	"UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES",
   594  	"UNIFORM_BLOCK_ACTIVE_UNIFORMS",
   595  	"UNIFORM_BLOCK_BINDING",
   596  	"UNIFORM_BLOCK_DATA_SIZE",
   597  	"UNIFORM_BLOCK_INDEX",
   598  	"UNIFORM_BLOCK_NAME_LENGTH",
   599  	"UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER",
   600  	"UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER",
   601  	"UNIFORM_BUFFER",
   602  	"UNIFORM_BUFFER_BINDING",
   603  	"UNIFORM_BUFFER_OFFSET_ALIGNMENT",
   604  	"UNIFORM_BUFFER_SIZE",
   605  	"UNIFORM_BUFFER_START",
   606  	"UNIFORM_IS_ROW_MAJOR",
   607  	"UNIFORM_MATRIX_STRIDE",
   608  	"UNIFORM_NAME_LENGTH",
   609  	"UNIFORM_OFFSET",
   610  	"UNIFORM_SIZE",
   611  	"UNIFORM_TYPE",
   612  	"UNPACK_IMAGE_HEIGHT",
   613  	"UNPACK_ROW_LENGTH",
   614  	"UNPACK_SKIP_IMAGES",
   615  	"UNPACK_SKIP_PIXELS",
   616  	"UNPACK_SKIP_ROWS",
   617  	"UNSIGNALED",
   618  	"UNSIGNED_INT_10F_11F_11F_REV",
   619  	"UNSIGNED_INT_2_10_10_10_REV",
   620  	"UNSIGNED_INT_24_8",
   621  	"UNSIGNED_INT_5_9_9_9_REV",
   622  	"UNSIGNED_INT_SAMPLER_2D",
   623  	"UNSIGNED_INT_SAMPLER_2D_ARRAY",
   624  	"UNSIGNED_INT_SAMPLER_3D",
   625  	"UNSIGNED_INT_SAMPLER_CUBE",
   626  	"UNSIGNED_INT_VEC2",
   627  	"UNSIGNED_INT_VEC3",
   628  	"UNSIGNED_INT_VEC4",
   629  	"UNSIGNED_NORMALIZED",
   630  	"VERTEX_ARRAY_BINDING",
   631  	"VERTEX_ATTRIB_ARRAY_DIVISOR",
   632  	"VERTEX_ATTRIB_ARRAY_INTEGER",
   633  	"WAIT_FAILED",
   634  }
   635  
   636  var outfile = flag.String("o", "", "result will be written to the file instead of stdout.")
   637  
   638  var fset = new(token.FileSet)
   639  
   640  func typeString(t ast.Expr) string {
   641  	buf := new(bytes.Buffer)
   642  	printer.Fprint(buf, fset, t)
   643  	return buf.String()
   644  }
   645  
   646  func typePrinter(t string) string {
   647  	switch t {
   648  	case "[]float32", "[]byte":
   649  		return "len(%d)"
   650  	}
   651  	return "%v"
   652  }
   653  
   654  func typePrinterArg(t, name string) string {
   655  	switch t {
   656  	case "[]float32", "[]byte":
   657  		return "len(" + name + ")"
   658  	}
   659  	return name
   660  }
   661  
   662  func die(err error) {
   663  	fmt.Fprintf(os.Stderr, err.Error())
   664  	os.Exit(1)
   665  }
   666  
   667  func main() {
   668  	flag.Parse()
   669  
   670  	f, err := parser.ParseFile(fset, "consts.go", nil, parser.ParseComments)
   671  	if err != nil {
   672  		die(err)
   673  	}
   674  	entries := enum(f)
   675  
   676  	f, err = parser.ParseFile(fset, "gl.go", nil, parser.ParseComments)
   677  	if err != nil {
   678  		die(err)
   679  	}
   680  
   681  	buf := new(bytes.Buffer)
   682  
   683  	fmt.Fprint(buf, preamble)
   684  
   685  	fmt.Fprintf(buf, "func (v Enum) String() string {\n")
   686  	fmt.Fprintf(buf, "\tswitch v {\n")
   687  	for _, e := range dedup(entries) {
   688  		fmt.Fprintf(buf, "\tcase 0x%x: return %q\n", e.value, e.name)
   689  	}
   690  	fmt.Fprintf(buf, "\t%s\n", `default: return fmt.Sprintf("gl.Enum(0x%x)", uint32(v))`)
   691  	fmt.Fprintf(buf, "\t}\n")
   692  	fmt.Fprintf(buf, "}\n\n")
   693  
   694  	for _, d := range f.Decls {
   695  		// Before:
   696  		// func (ctx *context) StencilMask(mask uint32) {
   697  		//	C.glStencilMask(C.GLuint(mask))
   698  		// }
   699  		//
   700  		// After:
   701  		// func (ctx *context) StencilMask(mask uint32) {
   702  		// 	defer func() {
   703  		// 		errstr := ctx.errDrain()
   704  		// 		log.Printf("gl.StencilMask(%v) %v", mask, errstr)
   705  		//	}()
   706  		//	C.glStencilMask(C.GLuint(mask))
   707  		// }
   708  		fn, ok := d.(*ast.FuncDecl)
   709  		if !ok {
   710  			continue
   711  		}
   712  		if fn.Recv == nil || fn.Recv.List[0].Names[0].Name != "ctx" {
   713  			continue
   714  		}
   715  		tname := "<unknown>"
   716  		t := fn.Recv.List[0].Type
   717  		if star, ok := t.(*ast.StarExpr); ok {
   718  			tname = "*" + star.X.(*ast.Ident).Name
   719  		} else if t, ok := t.(*ast.Ident); ok {
   720  			tname = t.Name
   721  		}
   722  
   723  		var (
   724  			params      []string
   725  			paramTypes  []string
   726  			results     []string
   727  			resultTypes []string
   728  		)
   729  
   730  		// Print function signature.
   731  		fmt.Fprintf(buf, "func (ctx %s) %s(", tname, fn.Name.Name)
   732  		for i, p := range fn.Type.Params.List {
   733  			if i > 0 {
   734  				fmt.Fprint(buf, ", ")
   735  			}
   736  			ty := typeString(p.Type)
   737  			for i, n := range p.Names {
   738  				if i > 0 {
   739  					fmt.Fprint(buf, ", ")
   740  				}
   741  				fmt.Fprintf(buf, "%s ", n.Name)
   742  				params = append(params, n.Name)
   743  				paramTypes = append(paramTypes, ty)
   744  			}
   745  			fmt.Fprint(buf, ty)
   746  		}
   747  		fmt.Fprintf(buf, ") (")
   748  		if fn.Type.Results != nil {
   749  			for i, r := range fn.Type.Results.List {
   750  				if i > 0 {
   751  					fmt.Fprint(buf, ", ")
   752  				}
   753  				ty := typeString(r.Type)
   754  				if len(r.Names) == 0 {
   755  					name := fmt.Sprintf("r%d", i)
   756  					fmt.Fprintf(buf, "%s ", name)
   757  					results = append(results, name)
   758  					resultTypes = append(resultTypes, ty)
   759  				}
   760  				for i, n := range r.Names {
   761  					if i > 0 {
   762  						fmt.Fprint(buf, ", ")
   763  					}
   764  					fmt.Fprintf(buf, "%s ", n.Name)
   765  					results = append(results, n.Name)
   766  					resultTypes = append(resultTypes, ty)
   767  				}
   768  				fmt.Fprint(buf, ty)
   769  			}
   770  		}
   771  		fmt.Fprintf(buf, ") {\n")
   772  
   773  		// gl.GetError is used by errDrain, which will be made part of
   774  		// all functions. So do not apply it to gl.GetError to avoid
   775  		// infinite recursion.
   776  		skip := fn.Name.Name == "GetError"
   777  
   778  		if !skip {
   779  			// Insert a defer block for tracing.
   780  			fmt.Fprintf(buf, "defer func() {\n")
   781  			fmt.Fprintf(buf, "\terrstr := ctx.errDrain()\n")
   782  			switch fn.Name.Name {
   783  			case "GetUniformLocation", "GetAttribLocation":
   784  				fmt.Fprintf(buf, "\tr0.name = name\n")
   785  			}
   786  			fmt.Fprintf(buf, "\tlog.Printf(\"gl.%s(", fn.Name.Name)
   787  			for i, p := range paramTypes {
   788  				if i > 0 {
   789  					fmt.Fprint(buf, ", ")
   790  				}
   791  				fmt.Fprint(buf, typePrinter(p))
   792  			}
   793  			fmt.Fprintf(buf, ") ")
   794  			if len(resultTypes) > 1 {
   795  				fmt.Fprint(buf, "(")
   796  			}
   797  			for i, r := range resultTypes {
   798  				if i > 0 {
   799  					fmt.Fprint(buf, ", ")
   800  				}
   801  				fmt.Fprint(buf, typePrinter(r))
   802  			}
   803  			if len(resultTypes) > 1 {
   804  				fmt.Fprint(buf, ") ")
   805  			}
   806  			fmt.Fprintf(buf, "%%v\"")
   807  			for i, p := range paramTypes {
   808  				fmt.Fprintf(buf, ", %s", typePrinterArg(p, params[i]))
   809  			}
   810  			for i, r := range resultTypes {
   811  				fmt.Fprintf(buf, ", %s", typePrinterArg(r, results[i]))
   812  			}
   813  			fmt.Fprintf(buf, ", errstr)\n")
   814  			fmt.Fprintf(buf, "}()\n")
   815  		}
   816  
   817  		// Print original body of function.
   818  		for _, s := range fn.Body.List {
   819  			if c := enqueueCall(s); c != nil {
   820  				c.Fun.(*ast.SelectorExpr).Sel.Name = "enqueueDebug"
   821  				setEnqueueBlocking(c)
   822  			}
   823  			printer.Fprint(buf, fset, s)
   824  			fmt.Fprintf(buf, "\n")
   825  		}
   826  		fmt.Fprintf(buf, "}\n\n")
   827  	}
   828  
   829  	b, err := format.Source(buf.Bytes())
   830  	if err != nil {
   831  		os.Stdout.Write(buf.Bytes())
   832  		die(err)
   833  	}
   834  
   835  	if *outfile == "" {
   836  		os.Stdout.Write(b)
   837  		return
   838  	}
   839  	if err := ioutil.WriteFile(*outfile, b, 0666); err != nil {
   840  		die(err)
   841  	}
   842  }
   843  
   844  func enqueueCall(stmt ast.Stmt) *ast.CallExpr {
   845  	exprStmt, ok := stmt.(*ast.ExprStmt)
   846  	if !ok {
   847  		return nil
   848  	}
   849  	call, ok := exprStmt.X.(*ast.CallExpr)
   850  	if !ok {
   851  		return nil
   852  	}
   853  	fun, ok := call.Fun.(*ast.SelectorExpr)
   854  	if !ok {
   855  		return nil
   856  	}
   857  	if fun.Sel.Name != "enqueue" {
   858  		return nil
   859  	}
   860  	return call
   861  }
   862  
   863  func setEnqueueBlocking(c *ast.CallExpr) {
   864  	lit := c.Args[0].(*ast.CompositeLit)
   865  	for _, elt := range lit.Elts {
   866  		kv := elt.(*ast.KeyValueExpr)
   867  		if kv.Key.(*ast.Ident).Name == "blocking" {
   868  			kv.Value = &ast.Ident{Name: "true"}
   869  			return
   870  		}
   871  	}
   872  	lit.Elts = append(lit.Elts, &ast.KeyValueExpr{
   873  		Key: &ast.Ident{
   874  			NamePos: lit.Rbrace,
   875  			Name:    "blocking",
   876  		},
   877  		Value: &ast.Ident{Name: "true"},
   878  	})
   879  }
   880  
   881  const preamble = `// Copyright 2014 The Go Authors.  All rights reserved.
   882  // Use of this source code is governed by a BSD-style
   883  // license that can be found in the LICENSE file.
   884  
   885  // Code generated from gl.go using go generate. DO NOT EDIT.
   886  // See doc.go for details.
   887  
   888  // +build darwin linux openbsd windows
   889  // +build gldebug
   890  
   891  package gl
   892  
   893  import (
   894  	"fmt"
   895  	"log"
   896  	"math"
   897  	"sync/atomic"
   898  	"unsafe"
   899  )
   900  
   901  func (ctx *context) errDrain() string {
   902  	var errs []Enum
   903  	for {
   904  		e := ctx.GetError()
   905  		if e == 0 {
   906  			break
   907  		}
   908  		errs = append(errs, e)
   909  	}
   910  	if len(errs) > 0 {
   911  		return fmt.Sprintf(" error: %v", errs)
   912  	}
   913  	return ""
   914  }
   915  
   916  func (ctx *context) enqueueDebug(c call) uintptr {
   917  	numCalls := atomic.AddInt32(&ctx.debug, 1)
   918  	if numCalls > 1 {
   919  		panic("concurrent calls made to the same GL context")
   920  	}
   921  	defer func() {
   922  		if atomic.AddInt32(&ctx.debug, -1) > 0 {
   923  			select {} // block so you see us in the panic
   924  		}
   925  	}()
   926  
   927  	return ctx.enqueue(c)
   928  }
   929  
   930  `
   931  
   932  type entry struct {
   933  	name  string
   934  	value uint64
   935  }
   936  
   937  func genWhitelistMap(whitelist []string) map[string]bool {
   938  	m := make(map[string]bool)
   939  	for _, v := range enumWhitelist {
   940  		m[v] = true
   941  	}
   942  	return m
   943  }
   944  
   945  // enum builds a list of all GL constants that make up the gl.Enum type.
   946  func enum(f *ast.File) []entry {
   947  	var entries []entry
   948  	whitelist := genWhitelistMap(enumWhitelist)
   949  	for _, d := range f.Decls {
   950  		gendecl, ok := d.(*ast.GenDecl)
   951  		if !ok {
   952  			continue
   953  		}
   954  		if gendecl.Tok != token.CONST {
   955  			continue
   956  		}
   957  		for _, s := range gendecl.Specs {
   958  			v, ok := s.(*ast.ValueSpec)
   959  			if !ok {
   960  				continue
   961  			}
   962  			if len(v.Names) != 1 || len(v.Values) != 1 {
   963  				continue
   964  			}
   965  			if _, ok := whitelist[v.Names[0].Name]; !ok {
   966  				continue
   967  			}
   968  			val, err := strconv.ParseUint(v.Values[0].(*ast.BasicLit).Value, 0, 64)
   969  			if err != nil {
   970  				log.Fatalf("enum %s: %v", v.Names[0].Name, err)
   971  			}
   972  			entries = append(entries, entry{v.Names[0].Name, val})
   973  		}
   974  	}
   975  	return entries
   976  }
   977  
   978  func dedup(entries []entry) []entry {
   979  	// Find all duplicates. Use "%d" as the name of any value with duplicates.
   980  	seen := make(map[uint64]int)
   981  	for _, e := range entries {
   982  		seen[e.value]++
   983  	}
   984  	var dedup []entry
   985  	for _, e := range entries {
   986  		switch seen[e.value] {
   987  		case 0: // skip, already here
   988  		case 1:
   989  			dedup = append(dedup, e)
   990  		default:
   991  			// value is duplicated
   992  			dedup = append(dedup, entry{fmt.Sprintf("%d", e.value), e.value})
   993  			seen[e.value] = 0
   994  		}
   995  	}
   996  	return dedup
   997  }