gendebug.go 21 KB

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