github.com/danbrough/mobile@v0.0.3-beta03/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 }