gendebug.go 21 KB

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