gendebug.go 21 KB

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