generate_bindings.py 171 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250
  1. #!/usr/bin/env python3
  2. # Copyright (c) 2012 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. """code generator for GL/GLES extension wrangler."""
  6. import optparse
  7. import os
  8. import collections
  9. import re
  10. import platform
  11. import sys
  12. from subprocess import call
  13. from collections import namedtuple
  14. HEADER_PATHS = [
  15. '../../third_party/khronos',
  16. '../../third_party/mesa_headers',
  17. '.',
  18. '../../gpu',
  19. ]
  20. UNCONDITIONALLY_BOUND_EXTENSIONS = set([
  21. 'GL_CHROMIUM_gles_depth_binding_hack', # crbug.com/448206
  22. 'GL_CHROMIUM_glgetstringi_hack', # crbug.com/470396
  23. 'GL_CHROMIUM_egl_khr_fence_sync_hack', # crbug.com/504758
  24. 'GL_CHROMIUM_egl_android_native_fence_sync_hack', # crbug.com/775707
  25. ])
  26. """Function binding conditions can be specified manually by supplying a versions
  27. array instead of the names array. Each version has the following keys:
  28. name: Mandatory. Name of the function. Multiple versions can have the same
  29. name but different conditions.
  30. extensions: Extra Extensions for which the function is bound. Only needed
  31. in some cases where the extension cannot be parsed from the
  32. headers.
  33. explicit_only: if True, only extensions in 'extensions' are considered.
  34. is_optional: True if the GetProcAddress can return NULL for the
  35. function. This may happen for example when functions
  36. are added to a new version of an extension, but the
  37. extension string is not modified.
  38. By default, the function gets its name from the first name in its names or
  39. versions array. This can be overridden by supplying a 'known_as' key.
  40. """
  41. GL_FUNCTIONS = [
  42. { 'return_type': 'void',
  43. 'versions': [{ 'name': 'glAcquireTexturesANGLE',
  44. 'extensions': ['GL_ANGLE_vulkan_image'] }],
  45. 'arguments': 'GLuint numTextures, const GLuint* textures, '
  46. 'const GLenum* layouts', },
  47. { 'return_type': 'void',
  48. 'names': ['glActiveShaderProgram'],
  49. 'arguments': 'GLuint pipeline, GLuint program', },
  50. { 'return_type': 'void',
  51. 'names': ['glActiveTexture'],
  52. 'arguments': 'GLenum texture', },
  53. { 'return_type': 'void',
  54. 'names': ['glAttachShader'],
  55. 'arguments': 'GLuint program, GLuint shader', },
  56. { 'return_type': 'void',
  57. 'versions': [{ 'name': 'glBeginQuery' },
  58. { 'name': 'glBeginQueryARB' },
  59. { 'name': 'glBeginQueryEXT',
  60. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  61. 'arguments': 'GLenum target, GLuint id', },
  62. { 'return_type': 'void',
  63. 'versions': [{ 'name': 'glBeginTransformFeedback' },
  64. { 'name': 'glBeginTransformFeedbackEXT',
  65. 'extension': ['GL_EXT_transform_feedback'] }],
  66. 'arguments': 'GLenum primitiveMode', },
  67. { 'return_type': 'void',
  68. 'names': ['glBindAttribLocation'],
  69. 'arguments': 'GLuint program, GLuint index, const char* name', },
  70. { 'return_type': 'void',
  71. 'names': ['glBindBuffer'],
  72. 'arguments': 'GLenum target, GLuint buffer', },
  73. { 'return_type': 'void',
  74. 'versions': [{ 'name': 'glBindBufferBase' },
  75. { 'name': 'glBindBufferBaseEXT',
  76. 'extension': ['GL_EXT_transform_feedback'] }],
  77. 'arguments': 'GLenum target, GLuint index, GLuint buffer', },
  78. { 'return_type': 'void',
  79. 'versions': [{ 'name': 'glBindBufferRange' },
  80. { 'name': 'glBindBufferRangeEXT',
  81. 'extension': ['GL_EXT_transform_feedback'] }],
  82. 'arguments': 'GLenum target, GLuint index, GLuint buffer, GLintptr offset, '
  83. 'GLsizeiptr size', },
  84. { 'return_type': 'void',
  85. 'versions': [{ 'name': 'glBindFragDataLocation',
  86. 'extensions': ['GL_ARB_blend_func_extended'] },
  87. { 'name': 'glBindFragDataLocationEXT',
  88. 'extensions': ['GL_EXT_blend_func_extended'] }],
  89. 'arguments': 'GLuint program, GLuint colorNumber, const char* name', },
  90. { 'return_type': 'void',
  91. 'versions': [{ 'name': 'glBindFragDataLocationIndexed',
  92. 'extensions': ['GL_ARB_blend_func_extended'] },
  93. { 'name': 'glBindFragDataLocationIndexedEXT',
  94. 'extensions': ['GL_EXT_blend_func_extended'] }],
  95. 'arguments':
  96. 'GLuint program, GLuint colorNumber, GLuint index, const char* name',
  97. },
  98. { 'return_type': 'void',
  99. 'versions': [{ 'name': 'glBindFragmentInputLocationCHROMIUM',
  100. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  101. 'arguments': 'GLuint program, GLint location, const char* name', },
  102. { 'return_type': 'void',
  103. 'names': ['glBindFramebufferEXT', 'glBindFramebuffer'],
  104. 'arguments': 'GLenum target, GLuint framebuffer', },
  105. { 'return_type': 'void',
  106. 'known_as': 'glBindImageTextureEXT',
  107. 'versions': [{ 'name': 'glBindImageTexture',
  108. 'extensions': ['GL_ARB_shader_image_load_store'] },
  109. { 'name': 'glBindImageTextureEXT',
  110. 'extensions': ['GL_EXT_shader_image_load_store'] }],
  111. 'arguments': 'GLuint index, GLuint texture, GLint level, GLboolean layered,'
  112. 'GLint layer, GLenum access, GLint format', },
  113. { 'return_type': 'void',
  114. 'names': ['glBindProgramPipeline'],
  115. 'arguments': 'GLuint pipeline', },
  116. { 'return_type': 'void',
  117. 'names': ['glBindRenderbufferEXT', 'glBindRenderbuffer'],
  118. 'arguments': 'GLenum target, GLuint renderbuffer', },
  119. { 'return_type': 'void',
  120. 'versions': [{ 'name': 'glBindSampler',
  121. 'extensions': ['GL_ARB_sampler_objects'] }],
  122. 'arguments': 'GLuint unit, GLuint sampler', },
  123. { 'return_type': 'void',
  124. 'names': ['glBindTexture'],
  125. 'arguments': 'GLenum target, GLuint texture', },
  126. { 'return_type': 'void',
  127. 'versions': [{ 'name': 'glBindTransformFeedback',
  128. 'extensions': ['GL_ARB_transform_feedback2'] }],
  129. 'arguments': 'GLenum target, GLuint id', },
  130. { 'return_type': 'void',
  131. 'versions': [{ 'name': 'glBindUniformLocationCHROMIUM',
  132. 'extensions': ['GL_CHROMIUM_bind_uniform_location'] }],
  133. 'arguments': 'GLuint program, GLint location, const char* name' },
  134. { 'return_type': 'void',
  135. 'known_as': 'glBindVertexArrayOES',
  136. 'versions': [{ 'name': 'glBindVertexArray',
  137. 'extensions': ['GL_ARB_vertex_array_object'], },
  138. { 'name': 'glBindVertexArrayOES' },
  139. { 'name': 'glBindVertexArrayAPPLE',
  140. 'extensions': ['GL_APPLE_vertex_array_object'] }],
  141. 'arguments': 'GLuint array' },
  142. { 'return_type': 'void',
  143. 'names': ['glBindVertexBuffer'],
  144. 'arguments': 'GLuint bindingindex, GLuint buffer, GLintptr offset, '
  145. 'GLsizei stride', },
  146. { 'return_type': 'void',
  147. 'known_as': 'glBlendBarrierKHR',
  148. 'versions': [{ 'name': 'glBlendBarrierNV',
  149. 'extensions': ['GL_NV_blend_equation_advanced'] },
  150. { 'name': 'glBlendBarrierKHR',
  151. 'extensions': ['GL_KHR_blend_equation_advanced'] }],
  152. 'arguments': 'void' },
  153. { 'return_type': 'void',
  154. 'names': ['glBlendColor'],
  155. 'arguments': 'GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha', },
  156. { 'return_type': 'void',
  157. 'names': ['glBlendEquation'],
  158. 'arguments': ' GLenum mode ', },
  159. { 'return_type': 'void',
  160. 'known_as': 'glBlendEquationiOES',
  161. 'versions': [
  162. { 'name': 'glBlendEquationi' },
  163. { 'name': 'glBlendEquationiOES', 'extensions':
  164. ['GL_OES_draw_buffers_indexed'] }
  165. ],
  166. 'arguments': ' GLuint buf, GLenum mode ', },
  167. { 'return_type': 'void',
  168. 'names': ['glBlendEquationSeparate'],
  169. 'arguments': 'GLenum modeRGB, GLenum modeAlpha', },
  170. { 'return_type': 'void',
  171. 'known_as': 'glBlendEquationSeparateiOES',
  172. 'versions': [
  173. { 'name': 'glBlendEquationSeparatei' },
  174. { 'name': 'glBlendEquationSeparateiOES', 'extensions':
  175. ['GL_OES_draw_buffers_indexed'] }
  176. ],
  177. 'arguments': 'GLuint buf, GLenum modeRGB, GLenum modeAlpha', },
  178. { 'return_type': 'void',
  179. 'names': ['glBlendFunc'],
  180. 'arguments': 'GLenum sfactor, GLenum dfactor', },
  181. { 'return_type': 'void',
  182. 'known_as': 'glBlendFunciOES',
  183. 'versions': [
  184. { 'name': 'glBlendFunci' },
  185. { 'name': 'glBlendFunciOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
  186. ],
  187. 'arguments': 'GLuint buf, GLenum sfactor, GLenum dfactor', },
  188. { 'return_type': 'void',
  189. 'names': ['glBlendFuncSeparate'],
  190. 'arguments':
  191. 'GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha', },
  192. { 'return_type': 'void',
  193. 'known_as': 'glBlendFuncSeparateiOES',
  194. 'versions': [
  195. { 'name': 'glBlendFuncSeparatei' },
  196. { 'name': 'glBlendFuncSeparateiOES', 'extensions':
  197. ['GL_OES_draw_buffers_indexed'] }
  198. ],
  199. 'arguments':
  200. 'GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, '
  201. 'GLenum dstAlpha', },
  202. { 'return_type': 'void',
  203. 'versions' : [{'name': 'glBlitFramebuffer',
  204. 'extensions': ['GL_ARB_framebuffer_object']},
  205. {'name': 'glBlitFramebufferNV',
  206. 'extensions': ['GL_NV_framebuffer_blit']},
  207. {'name': 'glBlitFramebufferANGLE'},
  208. {'name': 'glBlitFramebufferEXT'}],
  209. 'arguments': 'GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, '
  210. 'GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, '
  211. 'GLbitfield mask, GLenum filter', },
  212. { 'return_type': 'void',
  213. 'names': ['glBufferData'],
  214. 'arguments':
  215. 'GLenum target, GLsizeiptr size, const void* data, GLenum usage', },
  216. { 'return_type': 'void',
  217. 'names': ['glBufferSubData'],
  218. 'arguments':
  219. 'GLenum target, GLintptr offset, GLsizeiptr size, const void* data', },
  220. { 'return_type': 'GLenum',
  221. 'names': ['glCheckFramebufferStatusEXT',
  222. 'glCheckFramebufferStatus'],
  223. 'arguments': 'GLenum target',
  224. 'logging_code': """
  225. GL_SERVICE_LOG("GL_RESULT: " << GLEnums::GetStringEnum(result));
  226. """, },
  227. { 'return_type': 'void',
  228. 'names': ['glClear'],
  229. 'arguments': 'GLbitfield mask', },
  230. { 'return_type': 'void',
  231. 'versions': [{ 'name': 'glClearBufferfi' }],
  232. 'arguments': 'GLenum buffer, GLint drawbuffer, const GLfloat depth, '
  233. 'GLint stencil', },
  234. { 'return_type': 'void',
  235. 'versions': [{ 'name': 'glClearBufferfv' }],
  236. 'arguments': 'GLenum buffer, GLint drawbuffer, const GLfloat* value', },
  237. { 'return_type': 'void',
  238. 'versions': [{ 'name': 'glClearBufferiv' }],
  239. 'arguments': 'GLenum buffer, GLint drawbuffer, const GLint* value', },
  240. { 'return_type': 'void',
  241. 'versions': [{ 'name': 'glClearBufferuiv' }],
  242. 'arguments': 'GLenum buffer, GLint drawbuffer, const GLuint* value', },
  243. { 'return_type': 'void',
  244. 'names': ['glClearColor'],
  245. 'arguments': 'GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha', },
  246. { 'return_type': 'void',
  247. 'versions': [{ 'name': 'glClearDepth',
  248. 'extensions': ['GL_CHROMIUM_gles_depth_binding_hack'] }],
  249. 'arguments': 'GLclampd depth', },
  250. { 'return_type': 'void',
  251. 'names': ['glClearDepthf'],
  252. 'arguments': 'GLclampf depth', },
  253. { 'return_type': 'void',
  254. 'names': ['glClearStencil'],
  255. 'arguments': 'GLint s', },
  256. { 'return_type': 'void',
  257. 'versions': [{ 'name': 'glClearTexImage',
  258. 'extensions': ['GL_ARB_clear_texture'] },
  259. { 'name': 'glClearTexImageEXT',
  260. 'extensions': ['GL_EXT_clear_texture'] }],
  261. 'arguments':
  262. 'GLuint texture, GLint level, GLenum format, GLenum type, '
  263. 'const GLvoid* data', },
  264. { 'return_type': 'void',
  265. 'versions': [{ 'name': 'glClearTexSubImage',
  266. 'extensions': ['GL_EXT_clear_texture'] },
  267. { 'name': 'glClearTexSubImageEXT',
  268. 'extensions': ['GL_EXT_clear_texture'] }],
  269. 'arguments':
  270. 'GLuint texture, GLint level, GLint xoffset, GLint yoffset, '
  271. 'GLint zoffset, GLint width, GLint height, GLint depth, GLenum format, '
  272. 'GLenum type, const GLvoid* data', },
  273. { 'return_type': 'GLenum',
  274. 'versions': [{ 'name': 'glClientWaitSync',
  275. 'extensions': ['GL_ARB_sync'] }],
  276. 'arguments': 'GLsync sync, GLbitfield flags, GLuint64 timeout', },
  277. { 'return_type': 'GLenum',
  278. 'versions': [{ 'name': 'glClientWaitSyncAPPLE',
  279. 'extensions': ['GL_APPLE_sync'] }],
  280. 'arguments': 'GLsync sync, GLbitfield flags, GLuint64 timeout', },
  281. { 'return_type': 'void',
  282. 'names': ['glColorMask'],
  283. 'arguments':
  284. 'GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha', },
  285. { 'return_type': 'void',
  286. 'known_as': 'glColorMaskiOES',
  287. 'versions': [
  288. { 'name': 'glColorMaski' },
  289. { 'name': 'glColorMaskiOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
  290. ],
  291. 'arguments':
  292. 'GLuint buf, GLboolean red, GLboolean green, GLboolean blue, '
  293. 'GLboolean alpha', },
  294. { 'return_type': 'void',
  295. 'names': ['glCompileShader'],
  296. 'arguments': 'GLuint shader', },
  297. { 'return_type': 'void',
  298. 'names': ['glCompressedTexImage2D'],
  299. 'arguments':
  300. 'GLenum target, GLint level, GLenum internalformat, GLsizei width, '
  301. 'GLsizei height, GLint border, GLsizei imageSize, const void* data', },
  302. { 'return_type': 'void',
  303. 'versions': [{'name': 'glCompressedTexImage2DRobustANGLE',
  304. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  305. 'arguments':
  306. 'GLenum target, GLint level, GLenum internalformat, GLsizei width, '
  307. 'GLsizei height, GLint border, GLsizei imageSize, GLsizei dataSize, '
  308. 'const void* data', },
  309. { 'return_type': 'void',
  310. 'versions': [{ 'name': 'glCompressedTexImage3D' }],
  311. 'arguments':
  312. 'GLenum target, GLint level, GLenum internalformat, GLsizei width, '
  313. 'GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, '
  314. 'const void* data', },
  315. { 'return_type': 'void',
  316. 'versions': [{'name': 'glCompressedTexImage3DRobustANGLE',
  317. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  318. 'arguments':
  319. 'GLenum target, GLint level, GLenum internalformat, GLsizei width, '
  320. 'GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, '
  321. 'GLsizei dataSize, const void* data', },
  322. { 'return_type': 'void',
  323. 'names': ['glCompressedTexSubImage2D'],
  324. 'arguments':
  325. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  326. 'GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, '
  327. 'const void* data', },
  328. { 'return_type': 'void',
  329. 'versions': [{'name': 'glCompressedTexSubImage2DRobustANGLE',
  330. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  331. 'arguments':
  332. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  333. 'GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, '
  334. 'GLsizei dataSize, const void* data', },
  335. { 'return_type': 'void',
  336. 'versions': [{ 'name': 'glCompressedTexSubImage3D' }],
  337. 'arguments':
  338. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  339. 'GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, '
  340. 'GLenum format, GLsizei imageSize, const void* data', },
  341. { 'return_type': 'void',
  342. 'versions': [{'name': 'glCompressedTexSubImage3DRobustANGLE',
  343. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  344. 'arguments':
  345. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  346. 'GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, '
  347. 'GLenum format, GLsizei imageSize, GLsizei dataSize, '
  348. 'const void* data', },
  349. { 'return_type': 'void',
  350. 'versions': [{ 'name': 'glCopyBufferSubData' }],
  351. 'arguments':
  352. 'GLenum readTarget, GLenum writeTarget, GLintptr readOffset, '
  353. 'GLintptr writeOffset, GLsizeiptr size', },
  354. { 'return_type': 'void',
  355. 'versions': [{ 'name': 'glCopySubTextureCHROMIUM',
  356. 'extensions': ['GL_CHROMIUM_copy_texture'], }],
  357. 'arguments':
  358. 'GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, '
  359. 'GLint destLevel, GLint xoffset, GLint yoffset, GLint x, GLint y, '
  360. 'GLsizei width, GLsizei height, GLboolean unpackFlipY, '
  361. 'GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha', },
  362. { 'return_type': 'void',
  363. 'names': ['glCopyTexImage2D'],
  364. 'arguments':
  365. 'GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, '
  366. 'GLsizei width, GLsizei height, GLint border', },
  367. { 'return_type': 'void',
  368. 'names': ['glCopyTexSubImage2D'],
  369. 'arguments':
  370. 'GLenum target, GLint level, GLint xoffset, '
  371. 'GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height', },
  372. { 'return_type': 'void',
  373. 'versions': [{ 'name': 'glCopyTexSubImage3D' }],
  374. 'arguments':
  375. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  376. 'GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height', },
  377. { 'return_type': 'void',
  378. 'versions': [{ 'name': 'glCopyTextureCHROMIUM',
  379. 'extensions': ['GL_CHROMIUM_copy_texture'], }],
  380. 'arguments':
  381. 'GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, '
  382. 'GLint destLevel, GLint internalFormat, GLenum destType, '
  383. 'GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, '
  384. 'GLboolean unpackUnmultiplyAlpha', },
  385. { 'return_type': 'void',
  386. 'names': ['glCoverageModulationNV'],
  387. 'versions': [{ 'name': 'glCoverageModulationNV',
  388. 'extensions': ['GL_NV_framebuffer_mixed_samples'] },
  389. { 'name': 'glCoverageModulationCHROMIUM',
  390. 'extensions': ['GL_CHROMIUM_framebuffer_mixed_samples'] }],
  391. 'arguments': 'GLenum components'},
  392. { 'return_type': 'void',
  393. 'names': ['glCoverFillPathInstancedNV'],
  394. 'versions': [{ 'name': 'glCoverFillPathInstancedNV',
  395. 'extensions': ['GL_NV_path_rendering'] },
  396. { 'name': 'glCoverFillPathInstancedCHROMIUM',
  397. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  398. 'arguments': 'GLsizei numPaths, GLenum pathNameType, const void* paths, '
  399. 'GLuint pathBase, GLenum coverMode, GLenum transformType, '
  400. 'const GLfloat* transformValues' },
  401. { 'return_type': 'void',
  402. 'names': ['glCoverFillPathNV'],
  403. 'versions': [{ 'name': 'glCoverFillPathNV',
  404. 'extensions': ['GL_NV_path_rendering'] },
  405. { 'name': 'glCoverFillPathCHROMIUM',
  406. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  407. 'arguments': 'GLuint path, GLenum coverMode' },
  408. { 'return_type': 'void',
  409. 'names': ['glCoverStrokePathInstancedNV'],
  410. 'versions': [{ 'name': 'glCoverStrokePathInstancedNV',
  411. 'extensions': ['GL_NV_path_rendering'] },
  412. { 'name': 'glCoverStrokePathInstancedCHROMIUM',
  413. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  414. 'arguments': 'GLsizei numPaths, GLenum pathNameType, const void* paths, '
  415. 'GLuint pathBase, GLenum coverMode, GLenum transformType, '
  416. 'const GLfloat* transformValues' },
  417. { 'return_type': 'void',
  418. 'names': ['glCoverStrokePathNV'],
  419. 'versions': [{ 'name': 'glCoverStrokePathNV',
  420. 'extensions': ['GL_NV_path_rendering'] },
  421. { 'name': 'glCoverStrokePathCHROMIUM',
  422. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  423. 'arguments': 'GLuint name, GLenum coverMode' },
  424. { 'return_type': 'void',
  425. 'names': [ 'glCreateMemoryObjectsEXT' ],
  426. 'arguments': 'GLsizei n, GLuint* memoryObjects', },
  427. { 'return_type': 'GLuint',
  428. 'names': ['glCreateProgram'],
  429. 'arguments': 'void', },
  430. { 'return_type': 'GLuint',
  431. 'names': ['glCreateShader'],
  432. 'arguments': 'GLenum type', },
  433. { 'return_type': 'GLuint',
  434. 'names': ['glCreateShaderProgramv'],
  435. 'arguments': 'GLenum type, GLsizei count, const char* const* strings', },
  436. { 'return_type': 'void',
  437. 'names': ['glCullFace'],
  438. 'arguments': 'GLenum mode', },
  439. { 'return_type': 'void',
  440. 'versions': [{ 'name': 'glDebugMessageCallback' },
  441. { 'name': 'glDebugMessageCallbackKHR',
  442. 'extensions': ['GL_KHR_debug'] }],
  443. 'arguments': 'GLDEBUGPROC callback, const void* userParam', },
  444. { 'return_type': 'void',
  445. 'versions': [{ 'name': 'glDebugMessageControl' },
  446. { 'name': 'glDebugMessageControlKHR',
  447. 'extensions': ['GL_KHR_debug'] }],
  448. 'arguments':
  449. 'GLenum source, GLenum type, GLenum severity, GLsizei count, '
  450. 'const GLuint* ids, GLboolean enabled', },
  451. { 'return_type': 'void',
  452. 'versions': [{ 'name': 'glDebugMessageInsert' },
  453. { 'name': 'glDebugMessageInsertKHR',
  454. 'extensions': ['GL_KHR_debug'] }],
  455. 'arguments':
  456. 'GLenum source, GLenum type, GLuint id, GLenum severity, '
  457. 'GLsizei length, const char* buf', },
  458. { 'return_type': 'void',
  459. 'names': ['glDeleteBuffers'],
  460. 'known_as': 'glDeleteBuffersARB',
  461. 'arguments': 'GLsizei n, const GLuint* buffers', },
  462. { 'return_type': 'void',
  463. 'known_as': 'glDeleteFencesAPPLE',
  464. 'versions': [{ 'name': 'glDeleteFencesAPPLE',
  465. 'extensions': ['GL_APPLE_fence'] }],
  466. 'arguments': 'GLsizei n, const GLuint* fences', },
  467. { 'return_type': 'void',
  468. 'names': ['glDeleteFencesNV'],
  469. 'arguments': 'GLsizei n, const GLuint* fences', },
  470. { 'return_type': 'void',
  471. 'names': ['glDeleteFramebuffersEXT', 'glDeleteFramebuffers'],
  472. 'arguments': 'GLsizei n, const GLuint* framebuffers', },
  473. { 'return_type': 'void',
  474. 'names': [ 'glDeleteMemoryObjectsEXT' ],
  475. 'versions': [{ 'name': 'glDeleteMemoryObjectsEXT',
  476. 'extensions': ['GL_EXT_memory_object'] }],
  477. 'arguments': 'GLsizei n, const GLuint* memoryObjects', },
  478. { 'return_type': 'void',
  479. 'names': ['glDeletePathsNV'],
  480. 'versions': [{ 'name': 'glDeletePathsNV',
  481. 'extensions': ['GL_NV_path_rendering'] },
  482. { 'name': 'glDeletePathsCHROMIUM',
  483. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  484. 'arguments': 'GLuint path, GLsizei range' },
  485. { 'return_type': 'void',
  486. 'names': ['glDeleteProgram'],
  487. 'arguments': 'GLuint program', },
  488. { 'return_type': 'void',
  489. 'names': ['glDeleteProgramPipelines'],
  490. 'arguments': 'GLsizei n, const GLuint* pipelines', },
  491. { 'return_type': 'void',
  492. 'versions': [{ 'name': 'glDeleteQueries' },
  493. { 'name': 'glDeleteQueriesARB'},
  494. { 'name': 'glDeleteQueriesEXT',
  495. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  496. 'arguments': 'GLsizei n, const GLuint* ids', },
  497. { 'return_type': 'void',
  498. 'names': ['glDeleteRenderbuffersEXT', 'glDeleteRenderbuffers'],
  499. 'arguments': 'GLsizei n, const GLuint* renderbuffers', },
  500. { 'return_type': 'void',
  501. 'versions': [{ 'name': 'glDeleteSamplers',
  502. 'extensions': ['GL_ARB_sampler_objects'] }],
  503. 'arguments': 'GLsizei n, const GLuint* samplers', },
  504. { 'return_type': 'void',
  505. 'names': ['glDeleteSemaphoresEXT'],
  506. 'arguments': 'GLsizei n, const GLuint* semaphores', },
  507. { 'return_type': 'void',
  508. 'names': ['glDeleteShader'],
  509. 'arguments': 'GLuint shader', },
  510. { 'return_type': 'void',
  511. 'versions': [{ 'name': 'glDeleteSync',
  512. 'extensions': ['GL_ARB_sync'] }],
  513. 'arguments': 'GLsync sync', },
  514. { 'return_type': 'void',
  515. 'versions': [{ 'name': 'glDeleteSyncAPPLE',
  516. 'extensions': ['GL_APPLE_sync'] }],
  517. 'arguments': 'GLsync sync', },
  518. { 'return_type': 'void',
  519. 'names': ['glDeleteTextures'],
  520. 'arguments': 'GLsizei n, const GLuint* textures', },
  521. { 'return_type': 'void',
  522. 'versions': [{ 'name': 'glDeleteTransformFeedbacks',
  523. 'extensions': ['GL_ARB_transform_feedback2'] }],
  524. 'arguments': 'GLsizei n, const GLuint* ids', },
  525. { 'return_type': 'void',
  526. 'known_as': 'glDeleteVertexArraysOES',
  527. 'versions': [{ 'name': 'glDeleteVertexArrays',
  528. 'extensions': ['GL_ARB_vertex_array_object'], },
  529. { 'name': 'glDeleteVertexArraysOES' },
  530. { 'name': 'glDeleteVertexArraysAPPLE',
  531. 'extensions': ['GL_APPLE_vertex_array_object'] }],
  532. 'arguments': 'GLsizei n, const GLuint* arrays' },
  533. { 'return_type': 'void',
  534. 'names': ['glDepthFunc'],
  535. 'arguments': 'GLenum func', },
  536. { 'return_type': 'void',
  537. 'names': ['glDepthMask'],
  538. 'arguments': 'GLboolean flag', },
  539. { 'return_type': 'void',
  540. 'versions': [{ 'name': 'glDepthRange',
  541. 'extensions': ['GL_CHROMIUM_gles_depth_binding_hack'] }],
  542. 'arguments': 'GLclampd zNear, GLclampd zFar', },
  543. { 'return_type': 'void',
  544. 'names': ['glDepthRangef'],
  545. 'arguments': 'GLclampf zNear, GLclampf zFar', },
  546. { 'return_type': 'void',
  547. 'names': ['glDetachShader'],
  548. 'arguments': 'GLuint program, GLuint shader', },
  549. { 'return_type': 'void',
  550. 'names': ['glDisable'],
  551. 'arguments': 'GLenum cap', },
  552. { 'return_type': 'void',
  553. 'versions': [{ 'name': 'glDisableExtensionANGLE',
  554. 'extensions': ['GL_ANGLE_request_extension'] }],
  555. 'arguments': 'const char* name', },
  556. { 'return_type': 'void',
  557. 'known_as': 'glDisableiOES',
  558. 'versions': [
  559. { 'name': 'glDisablei' },
  560. { 'name': 'glDisableiOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
  561. ],
  562. 'arguments': 'GLenum target, GLuint index', },
  563. { 'return_type': 'void',
  564. 'names': ['glDisableVertexAttribArray'],
  565. 'arguments': 'GLuint index', },
  566. { 'return_type': 'void',
  567. 'versions': [{ 'name': 'glDiscardFramebufferEXT',
  568. 'extensions': ['GL_EXT_discard_framebuffer'] }],
  569. 'arguments': 'GLenum target, GLsizei numAttachments, '
  570. 'const GLenum* attachments' },
  571. { 'return_type': 'void',
  572. 'names': ['glDispatchCompute'],
  573. 'arguments': 'GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ', },
  574. { 'return_type': 'void',
  575. 'names': ['glDispatchComputeIndirect'],
  576. 'arguments': 'GLintptr indirect', },
  577. { 'return_type': 'void',
  578. 'names': ['glDrawArrays'],
  579. 'arguments': 'GLenum mode, GLint first, GLsizei count', },
  580. { 'return_type': 'void',
  581. 'names': ['glDrawArraysIndirect'],
  582. 'arguments': 'GLenum mode, const void* indirect', },
  583. { 'return_type': 'void',
  584. 'known_as': 'glDrawArraysInstancedANGLE',
  585. 'names': ['glDrawArraysInstancedARB', 'glDrawArraysInstancedANGLE',
  586. 'glDrawArraysInstanced'],
  587. 'arguments': 'GLenum mode, GLint first, GLsizei count, GLsizei primcount', },
  588. { 'return_type': 'void',
  589. 'known_as': 'glDrawArraysInstancedBaseInstanceANGLE',
  590. #TODO(shrekshao): workaround when native support not available for cmd decoder
  591. 'versions' : [{ 'name': 'glDrawArraysInstancedBaseInstance',
  592. 'extensions': ['GL_ARB_base_instance'] },
  593. { 'name': 'glDrawArraysInstancedBaseInstanceEXT' },
  594. { 'name': 'glDrawArraysInstancedBaseInstanceANGLE',
  595. 'extensions': ['GL_ANGLE_base_vertex_base_instance'] }],
  596. 'arguments': 'GLenum mode, GLint first, GLsizei count, GLsizei primcount, '
  597. 'GLuint baseinstance', },
  598. { 'return_type': 'void',
  599. 'names': ['glDrawBuffer'],
  600. 'arguments': 'GLenum mode', },
  601. { 'return_type': 'void',
  602. 'names': ['glDrawBuffersARB', 'glDrawBuffersEXT', 'glDrawBuffers'],
  603. 'arguments': 'GLsizei n, const GLenum* bufs', },
  604. { 'return_type': 'void',
  605. 'names': ['glDrawElements'],
  606. 'arguments':
  607. 'GLenum mode, GLsizei count, GLenum type, const void* indices', },
  608. { 'return_type': 'void',
  609. 'names': ['glDrawElementsIndirect'],
  610. 'arguments': 'GLenum mode, GLenum type, const void* indirect', },
  611. { 'return_type': 'void',
  612. 'known_as': 'glDrawElementsInstancedANGLE',
  613. 'names': ['glDrawElementsInstancedARB', 'glDrawElementsInstancedANGLE',
  614. 'glDrawElementsInstanced'],
  615. 'arguments':
  616. 'GLenum mode, GLsizei count, GLenum type, const void* indices, '
  617. 'GLsizei primcount', },
  618. { 'return_type': 'void',
  619. 'known_as': 'glDrawElementsInstancedBaseVertexBaseInstanceANGLE',
  620. #TODO(shrekshao): workaround when native support not available for cmd decoder
  621. 'versions' : [{ 'name': 'glDrawElementsInstancedBaseVertexBaseInstance',
  622. 'extensions': ['GL_ARB_base_instance'] },
  623. { 'name': 'glDrawElementsInstancedBaseVertexBaseInstanceEXT' },
  624. { 'name': 'glDrawElementsInstancedBaseVertexBaseInstanceANGLE',
  625. 'extensions': ['GL_ANGLE_base_vertex_base_instance'] }],
  626. 'arguments':
  627. 'GLenum mode, GLsizei count, GLenum type, const void* indices, '
  628. 'GLsizei primcount, GLint baseVertex, GLuint baseInstance', },
  629. { 'return_type': 'void',
  630. 'versions': [{ 'name': 'glDrawRangeElements' }],
  631. 'arguments': 'GLenum mode, GLuint start, GLuint end, GLsizei count, '
  632. 'GLenum type, const void* indices', },
  633. { 'return_type': 'void',
  634. 'names': ['glEGLImageTargetRenderbufferStorageOES'],
  635. 'arguments': 'GLenum target, GLeglImageOES image', },
  636. { 'return_type': 'void',
  637. 'names': ['glEGLImageTargetTexture2DOES'],
  638. 'arguments': 'GLenum target, GLeglImageOES image', },
  639. { 'return_type': 'void',
  640. 'names': ['glEnable'],
  641. 'arguments': 'GLenum cap', },
  642. { 'return_type': 'void',
  643. 'known_as': 'glEnableiOES',
  644. 'versions': [
  645. { 'name': 'glEnablei' },
  646. { 'name': 'glEnableiOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
  647. ],
  648. 'arguments': 'GLenum target, GLuint index', },
  649. { 'return_type': 'void',
  650. 'names': ['glEnableVertexAttribArray'],
  651. 'arguments': 'GLuint index', },
  652. { 'return_type': 'void',
  653. 'versions': [{ 'name': 'glEndQuery' },
  654. { 'name': 'glEndQueryARB' },
  655. { 'name': 'glEndQueryEXT',
  656. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  657. 'arguments': 'GLenum target', },
  658. { 'return_type': 'void',
  659. 'versions': [{ 'name': 'glEndTilingQCOM',
  660. 'extension': ['GL_QCOM_tiled_rendering'] }],
  661. 'arguments': 'GLbitfield preserveMask', },
  662. { 'return_type': 'void',
  663. 'versions': [{ 'name': 'glEndTransformFeedback' },
  664. { 'name': 'glEndTransformFeedbackEXT',
  665. 'extension': ['GL_EXT_transform_feedback'] }],
  666. 'arguments': 'void', },
  667. { 'return_type': 'GLsync',
  668. 'versions': [{ 'name': 'glFenceSync',
  669. 'extensions': ['GL_ARB_sync'] }],
  670. 'arguments': 'GLenum condition, GLbitfield flags', },
  671. { 'return_type': 'GLsync',
  672. 'versions': [{ 'name': 'glFenceSyncAPPLE',
  673. 'extensions': ['GL_APPLE_sync'] }],
  674. 'arguments': 'GLenum condition, GLbitfield flags', },
  675. { 'return_type': 'void',
  676. 'names': ['glFinish'],
  677. 'arguments': 'void', },
  678. { 'return_type': 'void',
  679. 'known_as': 'glFinishFenceAPPLE',
  680. 'versions': [{ 'name': 'glFinishFenceAPPLE',
  681. 'extensions': ['GL_APPLE_fence'] }],
  682. 'arguments': 'GLuint fence', },
  683. { 'return_type': 'void',
  684. 'names': ['glFinishFenceNV'],
  685. 'arguments': 'GLuint fence', },
  686. { 'return_type': 'void',
  687. 'names': ['glFlush'],
  688. 'arguments': 'void', },
  689. { 'return_type': 'void',
  690. 'versions': [{'name': 'glFlushMappedBufferRange',
  691. 'extensions': ['GL_ARB_map_buffer_range']},
  692. {'name': 'glFlushMappedBufferRangeEXT'}],
  693. 'arguments': 'GLenum target, GLintptr offset, GLsizeiptr length', },
  694. { 'return_type': 'void',
  695. 'versions': [{'name': 'glFramebufferParameteri'},
  696. {'name': 'glFramebufferParameteriMESA',
  697. 'extensions': ['GL_MESA_framebuffer_flip_y']}],
  698. 'arguments': 'GLenum target, GLenum pname, GLint param', },
  699. { 'return_type': 'void',
  700. 'names': ['glFramebufferRenderbufferEXT', 'glFramebufferRenderbuffer'],
  701. 'arguments':
  702. 'GLenum target, GLenum attachment, GLenum renderbuffertarget, '
  703. 'GLuint renderbuffer', },
  704. { 'return_type': 'void',
  705. 'names': ['glFramebufferTexture2DEXT', 'glFramebufferTexture2D'],
  706. 'arguments':
  707. 'GLenum target, GLenum attachment, GLenum textarget, GLuint texture, '
  708. 'GLint level', },
  709. { 'return_type': 'void',
  710. 'versions': [{'name': 'glFramebufferTexture2DMultisampleEXT'},
  711. {'name': 'glFramebufferTexture2DMultisampleIMG'}],
  712. 'arguments':
  713. 'GLenum target, GLenum attachment, GLenum textarget, GLuint texture, '
  714. 'GLint level, GLsizei samples', },
  715. { 'return_type': 'void',
  716. 'versions': [{ 'name': 'glFramebufferTextureLayer' }],
  717. 'arguments': 'GLenum target, GLenum attachment, GLuint texture, GLint level, '
  718. 'GLint layer', },
  719. { 'return_type': 'void',
  720. 'versions': [{'name': 'glFramebufferTextureMultiviewOVR',
  721. 'extensions': ['GL_OVR_multiview2']}],
  722. 'arguments': 'GLenum target, GLenum attachment, GLuint texture, GLint level, '
  723. 'GLint baseViewIndex, GLsizei numViews', },
  724. { 'return_type': 'void',
  725. 'names': ['glFrontFace'],
  726. 'arguments': 'GLenum mode', },
  727. { 'return_type': 'void',
  728. 'names': ['glGenBuffers'],
  729. 'known_as': 'glGenBuffersARB',
  730. 'arguments': 'GLsizei n, GLuint* buffers', },
  731. { 'return_type': 'void',
  732. 'names': ['glGenerateMipmapEXT', 'glGenerateMipmap'],
  733. 'arguments': 'GLenum target', },
  734. { 'return_type': 'void',
  735. 'known_as': 'glGenFencesAPPLE',
  736. 'versions': [{ 'name': 'glGenFencesAPPLE',
  737. 'extensions': ['GL_APPLE_fence'] }],
  738. 'arguments': 'GLsizei n, GLuint* fences', },
  739. { 'return_type': 'void',
  740. 'names': ['glGenFencesNV'],
  741. 'arguments': 'GLsizei n, GLuint* fences', },
  742. { 'return_type': 'void',
  743. 'names': ['glGenFramebuffersEXT', 'glGenFramebuffers'],
  744. 'arguments': 'GLsizei n, GLuint* framebuffers', },
  745. { 'return_type': 'GLuint',
  746. 'names': ['glGenPathsNV'],
  747. 'versions': [{ 'name': 'glGenPathsNV',
  748. 'extensions': ['GL_NV_path_rendering'] },
  749. { 'name': 'glGenPathsCHROMIUM',
  750. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  751. 'arguments': 'GLsizei range' },
  752. { 'return_type': 'GLuint',
  753. 'names': ['glGenProgramPipelines'],
  754. 'arguments': 'GLsizei n, GLuint* pipelines' },
  755. { 'return_type': 'void',
  756. 'versions': [{ 'name': 'glGenQueries' },
  757. { 'name': 'glGenQueriesARB', },
  758. { 'name' : 'glGenQueriesEXT',
  759. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  760. 'arguments': 'GLsizei n, GLuint* ids', },
  761. { 'return_type': 'void',
  762. 'names': ['glGenRenderbuffersEXT', 'glGenRenderbuffers'],
  763. 'arguments': 'GLsizei n, GLuint* renderbuffers', },
  764. { 'return_type': 'void',
  765. 'versions': [{ 'name': 'glGenSamplers',
  766. 'extensions': ['GL_ARB_sampler_objects'] }],
  767. 'arguments': 'GLsizei n, GLuint* samplers', },
  768. { 'return_type': 'void',
  769. 'names': ['glGenSemaphoresEXT'],
  770. 'arguments': 'GLsizei n, GLuint* semaphores', },
  771. { 'return_type': 'void',
  772. 'names': ['glGenTextures'],
  773. 'arguments': 'GLsizei n, GLuint* textures', },
  774. { 'return_type': 'void',
  775. 'versions': [{ 'name': 'glGenTransformFeedbacks',
  776. 'extensions': ['GL_ARB_transform_feedback2'] }],
  777. 'arguments': 'GLsizei n, GLuint* ids', },
  778. { 'return_type': 'void',
  779. 'known_as': 'glGenVertexArraysOES',
  780. 'versions': [{ 'name': 'glGenVertexArrays',
  781. 'extensions': ['GL_ARB_vertex_array_object'], },
  782. { 'name': 'glGenVertexArraysOES' },
  783. { 'name': 'glGenVertexArraysAPPLE',
  784. 'extensions': ['GL_APPLE_vertex_array_object'] }],
  785. 'arguments': 'GLsizei n, GLuint* arrays', },
  786. { 'return_type': 'void',
  787. 'names': ['glGetActiveAttrib'],
  788. 'arguments':
  789. 'GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, '
  790. 'GLint* size, GLenum* type, char* name', },
  791. { 'return_type': 'void',
  792. 'names': ['glGetActiveUniform'],
  793. 'arguments':
  794. 'GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, '
  795. 'GLint* size, GLenum* type, char* name', },
  796. { 'return_type': 'void',
  797. 'versions': [{ 'name': 'glGetActiveUniformBlockiv' }],
  798. 'arguments': 'GLuint program, GLuint uniformBlockIndex, GLenum pname, '
  799. 'GLint* params', },
  800. { 'return_type': 'void',
  801. 'versions': [{'name': 'glGetActiveUniformBlockivRobustANGLE',
  802. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  803. 'arguments':
  804. 'GLuint program, GLuint uniformBlockIndex, GLenum pname, '
  805. 'GLsizei bufSize, GLsizei* length, GLint* params', },
  806. { 'return_type': 'void',
  807. 'versions': [{ 'name': 'glGetActiveUniformBlockName' }],
  808. 'arguments': 'GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, '
  809. 'GLsizei* length, char* uniformBlockName', },
  810. { 'return_type': 'void',
  811. 'versions': [{ 'name': 'glGetActiveUniformsiv' }],
  812. 'arguments': 'GLuint program, GLsizei uniformCount, '
  813. 'const GLuint* uniformIndices, GLenum pname, GLint* params', },
  814. { 'return_type': 'void',
  815. 'names': ['glGetAttachedShaders'],
  816. 'arguments':
  817. 'GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders', },
  818. { 'return_type': 'GLint',
  819. 'names': ['glGetAttribLocation'],
  820. 'arguments': 'GLuint program, const char* name', },
  821. { 'return_type': 'void',
  822. 'names': ['glGetBooleani_v'],
  823. 'arguments': 'GLenum target, GLuint index, GLboolean* data', },
  824. { 'return_type': 'void',
  825. 'versions': [{'name': 'glGetBooleani_vRobustANGLE',
  826. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  827. 'arguments':
  828. 'GLenum target, GLuint index, GLsizei bufSize, GLsizei* length, '
  829. 'GLboolean* data', },
  830. { 'return_type': 'void',
  831. 'names': ['glGetBooleanv'],
  832. 'arguments': 'GLenum pname, GLboolean* params', },
  833. { 'return_type': 'void',
  834. 'versions': [{'name': 'glGetBooleanvRobustANGLE',
  835. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  836. 'arguments':
  837. 'GLenum pname, GLsizei bufSize, GLsizei* length, GLboolean* data', },
  838. { 'return_type': 'void',
  839. 'versions': [{'name': 'glGetBufferParameteri64vRobustANGLE',
  840. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  841. 'arguments':
  842. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  843. 'GLint64* params', },
  844. { 'return_type': 'void',
  845. 'names': ['glGetBufferParameteriv'],
  846. 'arguments': 'GLenum target, GLenum pname, GLint* params', },
  847. { 'return_type': 'void',
  848. 'versions': [{'name': 'glGetBufferParameterivRobustANGLE',
  849. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  850. 'arguments':
  851. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  852. 'GLint* params', },
  853. { 'return_type': 'void',
  854. 'versions': [{'name': 'glGetBufferPointervRobustANGLE',
  855. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  856. 'arguments':
  857. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  858. 'void** params', },
  859. { 'return_type': 'GLuint',
  860. 'versions': [{ 'name': 'glGetDebugMessageLog' },
  861. { 'name': 'glGetDebugMessageLogKHR',
  862. 'extensions': ['GL_KHR_debug'] }],
  863. 'arguments':
  864. 'GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, '
  865. 'GLuint* ids, GLenum* severities, GLsizei* lengths, char* messageLog', },
  866. { 'return_type': 'GLenum',
  867. 'names': ['glGetError'],
  868. 'arguments': 'void',
  869. 'logging_code': """
  870. GL_SERVICE_LOG("GL_RESULT: " << GLEnums::GetStringError(result));
  871. """, },
  872. { 'return_type': 'void',
  873. 'names': ['glGetFenceivNV'],
  874. 'arguments': 'GLuint fence, GLenum pname, GLint* params', },
  875. { 'return_type': 'void',
  876. 'names': ['glGetFloatv'],
  877. 'arguments': 'GLenum pname, GLfloat* params', },
  878. { 'return_type': 'void',
  879. 'versions': [{'name': 'glGetFloatvRobustANGLE',
  880. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  881. 'arguments':
  882. 'GLenum pname, GLsizei bufSize, GLsizei* length, GLfloat* data', },
  883. { 'return_type': 'GLint',
  884. 'versions': [{'name': 'glGetFragDataIndex',
  885. 'extensions': ['GL_ARB_blend_func_extended']},
  886. {'name': 'glGetFragDataIndexEXT',
  887. 'extensions': ['GL_EXT_blend_func_extended']}],
  888. 'arguments': 'GLuint program, const char* name', },
  889. { 'return_type': 'GLint',
  890. 'versions': [{ 'name': 'glGetFragDataLocation' }],
  891. 'arguments': 'GLuint program, const char* name', },
  892. { 'return_type': 'void',
  893. 'names': ['glGetFramebufferAttachmentParameterivEXT',
  894. 'glGetFramebufferAttachmentParameteriv'],
  895. 'arguments': 'GLenum target, '
  896. 'GLenum attachment, GLenum pname, GLint* params', },
  897. { 'return_type': 'void',
  898. 'versions': [{'name': 'glGetFramebufferAttachmentParameterivRobustANGLE',
  899. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  900. 'arguments':
  901. 'GLenum target, GLenum attachment, GLenum pname, GLsizei bufSize, '
  902. 'GLsizei* length, GLint* params', },
  903. { 'return_type': 'void',
  904. 'names': ['glGetFramebufferParameteriv'],
  905. 'arguments': 'GLenum target, GLenum pname, GLint* params', },
  906. { 'return_type': 'void',
  907. 'versions': [{'name': 'glGetFramebufferParameterivRobustANGLE',
  908. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  909. 'arguments':
  910. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  911. 'GLint* params', },
  912. { 'return_type': 'GLenum',
  913. 'names': ['glGetGraphicsResetStatusARB',
  914. 'glGetGraphicsResetStatusKHR',
  915. 'glGetGraphicsResetStatusEXT',
  916. 'glGetGraphicsResetStatus'],
  917. 'arguments': 'void', },
  918. { 'return_type': 'void',
  919. 'versions': [{ 'name': 'glGetInteger64i_v' }],
  920. 'arguments': 'GLenum target, GLuint index, GLint64* data', },
  921. { 'return_type': 'void',
  922. 'versions': [{'name': 'glGetInteger64i_vRobustANGLE',
  923. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  924. 'arguments':
  925. 'GLenum target, GLuint index, GLsizei bufSize, GLsizei* length, '
  926. 'GLint64* data', },
  927. { 'return_type': 'void',
  928. 'names': ['glGetInteger64v'],
  929. 'arguments': 'GLenum pname, GLint64* params', },
  930. { 'return_type': 'void',
  931. 'versions': [{'name': 'glGetInteger64vRobustANGLE',
  932. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  933. 'arguments':
  934. 'GLenum pname, GLsizei bufSize, GLsizei* length, GLint64* data', },
  935. { 'return_type': 'void',
  936. 'versions': [{ 'name': 'glGetIntegeri_v' }],
  937. 'arguments': 'GLenum target, GLuint index, GLint* data', },
  938. { 'return_type': 'void',
  939. 'versions': [{'name': 'glGetIntegeri_vRobustANGLE',
  940. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  941. 'arguments':
  942. 'GLenum target, GLuint index, GLsizei bufSize, GLsizei* length, '
  943. 'GLint* data', },
  944. { 'return_type': 'void',
  945. 'names': ['glGetIntegerv'],
  946. 'arguments': 'GLenum pname, GLint* params', },
  947. { 'return_type': 'void',
  948. 'versions': [{'name': 'glGetIntegervRobustANGLE',
  949. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  950. 'arguments':
  951. 'GLenum pname, GLsizei bufSize, GLsizei* length, GLint* data', },
  952. { 'return_type': 'void',
  953. 'versions': [{'name': 'glGetInternalformativ',
  954. 'extensions': ['GL_ARB_internalformat_query']}],
  955. 'arguments': 'GLenum target, GLenum internalformat, GLenum pname, '
  956. 'GLsizei bufSize, GLint* params', },
  957. { 'return_type': 'void',
  958. 'versions': [{'name': 'glGetInternalformativRobustANGLE',
  959. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  960. 'arguments':
  961. 'GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, '
  962. 'GLsizei* length, GLint* params', },
  963. { 'return_type': 'void',
  964. 'versions': [{'name': 'glGetInternalformatSampleivNV',
  965. 'extensions': ['GL_NV_internalformat_sample_query']}],
  966. 'arguments': 'GLenum target, GLenum internalformat, GLsizei samples, '
  967. 'GLenum pname, GLsizei bufSize, GLint* params', },
  968. { 'return_type': 'void',
  969. 'versions': [{'name': 'glGetMultisamplefv',
  970. 'extensions': ['GL_ARB_texture_multisample']}],
  971. 'arguments': 'GLenum pname, GLuint index, GLfloat* val', },
  972. { 'return_type': 'void',
  973. 'versions': [{'name': 'glGetMultisamplefvRobustANGLE',
  974. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  975. 'arguments':
  976. 'GLenum pname, GLuint index, GLsizei bufSize, GLsizei* length, '
  977. 'GLfloat* val', },
  978. { 'return_type': 'void',
  979. 'versions': [{'name': 'glGetnUniformfvRobustANGLE',
  980. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  981. 'arguments':
  982. 'GLuint program, GLint location, GLsizei bufSize, GLsizei* length, '
  983. 'GLfloat* params', },
  984. { 'return_type': 'void',
  985. 'versions': [{'name': 'glGetnUniformivRobustANGLE',
  986. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  987. 'arguments':
  988. 'GLuint program, GLint location, GLsizei bufSize, GLsizei* length, '
  989. 'GLint* params', },
  990. { 'return_type': 'void',
  991. 'versions': [{'name': 'glGetnUniformuivRobustANGLE',
  992. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  993. 'arguments':
  994. 'GLuint program, GLint location, GLsizei bufSize, GLsizei* length, '
  995. 'GLuint* params', },
  996. { 'return_type': 'void',
  997. 'versions': [{ 'name': 'glGetObjectLabel' },
  998. { 'name': 'glGetObjectLabelKHR',
  999. 'extensions': ['GL_KHR_debug'] }],
  1000. 'arguments':
  1001. 'GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, '
  1002. 'char* label', },
  1003. { 'return_type': 'void',
  1004. 'versions': [{ 'name': 'glGetObjectPtrLabel' },
  1005. { 'name': 'glGetObjectPtrLabelKHR',
  1006. 'extensions': ['GL_KHR_debug'] }],
  1007. 'arguments': 'void* ptr, GLsizei bufSize, GLsizei* length, char* label', },
  1008. { 'return_type': 'void',
  1009. 'versions': [{ 'name': 'glGetPointerv' },
  1010. { 'name': 'glGetPointervKHR',
  1011. 'extensions': ['GL_KHR_debug'] }],
  1012. 'arguments': 'GLenum pname, void** params', },
  1013. { 'return_type': 'void',
  1014. 'versions': [{'name': 'glGetPointervRobustANGLERobustANGLE',
  1015. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1016. 'arguments':
  1017. 'GLenum pname, GLsizei bufSize, GLsizei* length, void** params', },
  1018. { 'return_type': 'void',
  1019. 'known_as': 'glGetProgramBinary',
  1020. 'versions': [{ 'name': 'glGetProgramBinaryOES' },
  1021. { 'name': 'glGetProgramBinary',
  1022. 'extensions': ['GL_ARB_get_program_binary'] }],
  1023. 'arguments': 'GLuint program, GLsizei bufSize, GLsizei* length, '
  1024. 'GLenum* binaryFormat, GLvoid* binary' },
  1025. { 'return_type': 'void',
  1026. 'names': ['glGetProgramInfoLog'],
  1027. 'arguments':
  1028. 'GLuint program, GLsizei bufsize, GLsizei* length, char* infolog', },
  1029. { 'return_type': 'void',
  1030. 'versions': [{'name': 'glGetProgramInterfaceiv',
  1031. 'extensions': ['GL_ARB_program_interface_query']}],
  1032. 'arguments': 'GLuint program, GLenum programInterface, GLenum pname, '
  1033. 'GLint* params'},
  1034. { 'return_type': 'void',
  1035. 'versions': [{'name': 'glGetProgramInterfaceivRobustANGLE',
  1036. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1037. 'arguments':
  1038. 'GLuint program, GLenum programInterface, GLenum pname, '
  1039. 'GLsizei bufSize, GLsizei* length, GLint* params', },
  1040. { 'return_type': 'void',
  1041. 'names': ['glGetProgramiv'],
  1042. 'arguments': 'GLuint program, GLenum pname, GLint* params', },
  1043. { 'return_type': 'void',
  1044. 'versions': [{'name': 'glGetProgramivRobustANGLE',
  1045. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1046. 'arguments':
  1047. 'GLuint program, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1048. 'GLint* params', },
  1049. { 'return_type': 'void',
  1050. 'names': ['glGetProgramPipelineInfoLog'],
  1051. 'arguments':
  1052. 'GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog', },
  1053. { 'return_type': 'void',
  1054. 'names': ['glGetProgramPipelineiv'],
  1055. 'arguments':
  1056. 'GLuint pipeline, GLenum pname, GLint* params', },
  1057. { 'return_type': 'GLuint',
  1058. 'versions': [{'name': 'glGetProgramResourceIndex',
  1059. 'extensions': ['GL_ARB_program_interface_query']}],
  1060. 'arguments':
  1061. 'GLuint program, GLenum programInterface, const GLchar* name', },
  1062. { 'return_type': 'void',
  1063. 'versions': [{'name': 'glGetProgramResourceiv',
  1064. 'extensions': ['GL_ARB_program_interface_query']}],
  1065. 'arguments': 'GLuint program, GLenum programInterface, GLuint index, '
  1066. 'GLsizei propCount, const GLenum* props, GLsizei bufSize, '
  1067. 'GLsizei* length, GLint* params'},
  1068. { 'return_type': 'GLint',
  1069. 'versions': [{'name': 'glGetProgramResourceLocation',
  1070. 'extensions': ['GL_ARB_program_interface_query']}],
  1071. 'arguments': 'GLuint program, GLenum programInterface, const char* name', },
  1072. { 'return_type': 'void',
  1073. 'versions': [{'name': 'glGetProgramResourceName',
  1074. 'extensions': ['GL_ARB_program_interface_query']}],
  1075. 'arguments': 'GLuint program, GLenum programInterface, GLuint index, '
  1076. 'GLsizei bufSize, GLsizei* length, GLchar* name'},
  1077. { 'return_type': 'void',
  1078. 'versions': [{ 'name': 'glGetQueryiv' },
  1079. { 'name': 'glGetQueryivARB' },
  1080. { 'name': 'glGetQueryivEXT',
  1081. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  1082. 'arguments': 'GLenum target, GLenum pname, GLint* params', },
  1083. { 'return_type': 'void',
  1084. 'versions': [{'name': 'glGetQueryivRobustANGLE',
  1085. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1086. 'arguments':
  1087. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1088. 'GLint* params', },
  1089. { 'return_type': 'void',
  1090. 'versions': [{ 'name': 'glGetQueryObjecti64v',
  1091. 'extensions': ['GL_ARB_timer_query'] },
  1092. { 'name': 'glGetQueryObjecti64vEXT' }],
  1093. 'arguments': 'GLuint id, GLenum pname, GLint64* params', },
  1094. { 'return_type': 'void',
  1095. 'versions': [{'name': 'glGetQueryObjecti64vRobustANGLE',
  1096. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1097. 'arguments':
  1098. 'GLuint id, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1099. 'GLint64* params', },
  1100. { 'return_type': 'void',
  1101. 'versions': [{ 'name': 'glGetQueryObjectiv' },
  1102. { 'name': 'glGetQueryObjectivARB' },
  1103. { 'name': 'glGetQueryObjectivEXT' }],
  1104. 'arguments': 'GLuint id, GLenum pname, GLint* params', },
  1105. { 'return_type': 'void',
  1106. 'versions': [{'name': 'glGetQueryObjectivRobustANGLE',
  1107. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1108. 'arguments':
  1109. 'GLuint id, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1110. 'GLint* params', },
  1111. { 'return_type': 'void',
  1112. 'versions': [{ 'name': 'glGetQueryObjectui64v',
  1113. 'extensions': ['GL_ARB_timer_query'] },
  1114. { 'name': 'glGetQueryObjectui64vEXT' }],
  1115. 'arguments': 'GLuint id, GLenum pname, GLuint64* params', },
  1116. { 'return_type': 'void',
  1117. 'versions': [{'name': 'glGetQueryObjectui64vRobustANGLE',
  1118. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1119. 'arguments':
  1120. 'GLuint id, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1121. 'GLuint64* params', },
  1122. { 'return_type': 'void',
  1123. 'versions': [{ 'name': 'glGetQueryObjectuiv' },
  1124. { 'name': 'glGetQueryObjectuivARB' },
  1125. { 'name': 'glGetQueryObjectuivEXT',
  1126. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  1127. 'arguments': 'GLuint id, GLenum pname, GLuint* params', },
  1128. { 'return_type': 'void',
  1129. 'versions': [{'name': 'glGetQueryObjectuivRobustANGLE',
  1130. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1131. 'arguments':
  1132. 'GLuint id, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1133. 'GLuint* params', },
  1134. { 'return_type': 'void',
  1135. 'names': ['glGetRenderbufferParameterivEXT', 'glGetRenderbufferParameteriv'],
  1136. 'arguments': 'GLenum target, GLenum pname, GLint* params', },
  1137. { 'return_type': 'void',
  1138. 'versions': [{'name': 'glGetRenderbufferParameterivRobustANGLE',
  1139. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1140. 'arguments':
  1141. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1142. 'GLint* params', },
  1143. { 'return_type': 'void',
  1144. 'versions': [{ 'name': 'glGetSamplerParameterfv',
  1145. 'extensions': ['GL_ARB_sampler_objects'] }],
  1146. 'arguments': 'GLuint sampler, GLenum pname, GLfloat* params', },
  1147. { 'return_type': 'void',
  1148. 'versions': [{'name': 'glGetSamplerParameterfvRobustANGLE',
  1149. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1150. 'arguments':
  1151. 'GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1152. 'GLfloat* params', },
  1153. { 'return_type': 'void',
  1154. 'versions': [{'name': 'glGetSamplerParameterIivRobustANGLE',
  1155. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1156. 'arguments':
  1157. 'GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1158. 'GLint* params', },
  1159. { 'return_type': 'void',
  1160. 'versions': [{'name': 'glGetSamplerParameterIuivRobustANGLE',
  1161. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1162. 'arguments':
  1163. 'GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1164. 'GLuint* params', },
  1165. { 'return_type': 'void',
  1166. 'versions': [{ 'name': 'glGetSamplerParameteriv',
  1167. 'extensions': ['GL_ARB_sampler_objects'] }],
  1168. 'arguments': 'GLuint sampler, GLenum pname, GLint* params', },
  1169. { 'return_type': 'void',
  1170. 'versions': [{'name': 'glGetSamplerParameterivRobustANGLE',
  1171. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1172. 'arguments':
  1173. 'GLuint sampler, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1174. 'GLint* params', },
  1175. { 'return_type': 'void',
  1176. 'names': ['glGetShaderInfoLog'],
  1177. 'arguments':
  1178. 'GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog', },
  1179. { 'return_type': 'void',
  1180. 'names': ['glGetShaderiv'],
  1181. 'arguments': 'GLuint shader, GLenum pname, GLint* params', },
  1182. { 'return_type': 'void',
  1183. 'versions': [{'name': 'glGetShaderivRobustANGLE',
  1184. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1185. 'arguments':
  1186. 'GLuint shader, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1187. 'GLint* params', },
  1188. { 'return_type': 'void',
  1189. 'versions': [{'name': 'glGetShaderPrecisionFormat',
  1190. 'extensions': ['GL_ARB_ES2_compatibility']}],
  1191. 'arguments': 'GLenum shadertype, GLenum precisiontype, '
  1192. 'GLint* range, GLint* precision', },
  1193. { 'return_type': 'void',
  1194. 'names': ['glGetShaderSource'],
  1195. 'arguments':
  1196. 'GLuint shader, GLsizei bufsize, GLsizei* length, char* source', },
  1197. { 'return_type': 'const GLubyte*',
  1198. 'names': ['glGetString'],
  1199. 'arguments': 'GLenum name', },
  1200. { 'return_type': 'const GLubyte*',
  1201. # This is needed for bootstrapping on the desktop GL core profile.
  1202. # It won't be called unless the expected GL version is used.
  1203. 'versions': [{ 'name': 'glGetStringi',
  1204. 'extensions': ['GL_CHROMIUM_glgetstringi_hack'] }],
  1205. 'arguments': 'GLenum name, GLuint index', },
  1206. { 'return_type': 'void',
  1207. 'versions': [{ 'name': 'glGetSynciv',
  1208. 'extensions': ['GL_ARB_sync'] }],
  1209. 'arguments':
  1210. 'GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length,'
  1211. 'GLint* values', },
  1212. { 'return_type': 'void',
  1213. 'versions': [{ 'name': 'glGetTexLevelParameterfv' },
  1214. {'name': 'glGetTexLevelParameterfvANGLE',
  1215. 'extensions': ['GL_ANGLE_get_tex_level_parameter']}],
  1216. 'arguments': 'GLenum target, GLint level, GLenum pname, GLfloat* params', },
  1217. { 'return_type': 'void',
  1218. 'versions': [{'name': 'glGetTexLevelParameterfvRobustANGLE',
  1219. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1220. 'arguments':
  1221. 'GLenum target, GLint level, GLenum pname, GLsizei bufSize, '
  1222. 'GLsizei* length, GLfloat* params', },
  1223. { 'return_type': 'void',
  1224. 'versions': [{ 'name': 'glGetTexLevelParameteriv' },
  1225. {'name': 'glGetTexLevelParameterivANGLE',
  1226. 'extensions': ['GL_ANGLE_get_tex_level_parameter']}],
  1227. 'arguments': 'GLenum target, GLint level, GLenum pname, GLint* params', },
  1228. { 'return_type': 'void',
  1229. 'versions': [{'name': 'glGetTexLevelParameterivRobustANGLE',
  1230. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1231. 'arguments':
  1232. 'GLenum target, GLint level, GLenum pname, GLsizei bufSize, '
  1233. 'GLsizei* length, GLint* params', },
  1234. { 'return_type': 'void',
  1235. 'names': ['glGetTexParameterfv'],
  1236. 'arguments': 'GLenum target, GLenum pname, GLfloat* params', },
  1237. { 'return_type': 'void',
  1238. 'versions': [{'name': 'glGetTexParameterfvRobustANGLE',
  1239. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1240. 'arguments':
  1241. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1242. 'GLfloat* params', },
  1243. { 'return_type': 'void',
  1244. 'versions': [{'name': 'glGetTexParameterIivRobustANGLE',
  1245. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1246. 'arguments':
  1247. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1248. 'GLint* params', },
  1249. { 'return_type': 'void',
  1250. 'versions': [{'name': 'glGetTexParameterIuivRobustANGLE',
  1251. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1252. 'arguments':
  1253. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1254. 'GLuint* params', },
  1255. { 'return_type': 'void',
  1256. 'names': ['glGetTexParameteriv'],
  1257. 'arguments': 'GLenum target, GLenum pname, GLint* params', },
  1258. { 'return_type': 'void',
  1259. 'versions': [{'name': 'glGetTexParameterivRobustANGLE',
  1260. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1261. 'arguments':
  1262. 'GLenum target, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1263. 'GLint* params', },
  1264. { 'return_type': 'void',
  1265. 'versions': [{ 'name': 'glGetTransformFeedbackVarying' },
  1266. { 'name': 'glGetTransformFeedbackVaryingEXT',
  1267. 'extension': ['GL_EXT_transform_feedback'] }],
  1268. 'arguments': 'GLuint program, GLuint index, GLsizei bufSize, '
  1269. 'GLsizei* length, GLsizei* size, GLenum* type, char* name', },
  1270. { 'return_type': 'void',
  1271. 'names': ['glGetTranslatedShaderSourceANGLE'],
  1272. 'arguments':
  1273. 'GLuint shader, GLsizei bufsize, GLsizei* length, char* source', },
  1274. { 'return_type': 'GLuint',
  1275. 'versions': [{ 'name': 'glGetUniformBlockIndex' }],
  1276. 'arguments': 'GLuint program, const char* uniformBlockName', },
  1277. { 'return_type': 'void',
  1278. 'names': ['glGetUniformfv'],
  1279. 'arguments': 'GLuint program, GLint location, GLfloat* params', },
  1280. { 'return_type': 'void',
  1281. 'versions': [{'name': 'glGetUniformfvRobustANGLE',
  1282. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1283. 'arguments':
  1284. 'GLuint program, GLint location, GLsizei bufSize, GLsizei* length, '
  1285. 'GLfloat* params', },
  1286. { 'return_type': 'void',
  1287. 'versions': [{ 'name': 'glGetUniformIndices' }],
  1288. 'arguments': 'GLuint program, GLsizei uniformCount, '
  1289. 'const char* const* uniformNames, GLuint* uniformIndices', },
  1290. { 'return_type': 'void',
  1291. 'names': ['glGetUniformiv'],
  1292. 'arguments': 'GLuint program, GLint location, GLint* params', },
  1293. { 'return_type': 'void',
  1294. 'versions': [{'name': 'glGetUniformivRobustANGLE',
  1295. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1296. 'arguments':
  1297. 'GLuint program, GLint location, GLsizei bufSize, GLsizei* length, '
  1298. 'GLint* params', },
  1299. { 'return_type': 'GLint',
  1300. 'names': ['glGetUniformLocation'],
  1301. 'arguments': 'GLuint program, const char* name', },
  1302. { 'return_type': 'void',
  1303. 'names': ['glGetUniformuiv'],
  1304. 'arguments': 'GLuint program, GLint location, GLuint* params', },
  1305. { 'return_type': 'void',
  1306. 'versions': [{'name': 'glGetUniformuivRobustANGLE',
  1307. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1308. 'arguments':
  1309. 'GLuint program, GLint location, GLsizei bufSize, GLsizei* length, '
  1310. 'GLuint* params', },
  1311. { 'return_type': 'void',
  1312. 'names': ['glGetVertexAttribfv'],
  1313. 'arguments': 'GLuint index, GLenum pname, GLfloat* params', },
  1314. { 'return_type': 'void',
  1315. 'versions': [{'name': 'glGetVertexAttribfvRobustANGLE',
  1316. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1317. 'arguments':
  1318. 'GLuint index, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1319. 'GLfloat* params', },
  1320. { 'return_type': 'void',
  1321. 'versions': [{'name': 'glGetVertexAttribIivRobustANGLE',
  1322. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1323. 'arguments':
  1324. 'GLuint index, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1325. 'GLint* params', },
  1326. { 'return_type': 'void',
  1327. 'versions': [{'name': 'glGetVertexAttribIuivRobustANGLE',
  1328. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1329. 'arguments':
  1330. 'GLuint index, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1331. 'GLuint* params', },
  1332. { 'return_type': 'void',
  1333. 'names': ['glGetVertexAttribiv'],
  1334. 'arguments': 'GLuint index, GLenum pname, GLint* params', },
  1335. { 'return_type': 'void',
  1336. 'versions': [{'name': 'glGetVertexAttribivRobustANGLE',
  1337. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1338. 'arguments':
  1339. 'GLuint index, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1340. 'GLint* params', },
  1341. { 'return_type': 'void',
  1342. 'names': ['glGetVertexAttribPointerv'],
  1343. 'arguments': 'GLuint index, GLenum pname, void** pointer', },
  1344. { 'return_type': 'void',
  1345. 'versions': [{'name': 'glGetVertexAttribPointervRobustANGLE',
  1346. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1347. 'arguments':
  1348. 'GLuint index, GLenum pname, GLsizei bufSize, GLsizei* length, '
  1349. 'void** pointer', },
  1350. { 'return_type': 'void',
  1351. 'names': ['glHint'],
  1352. 'arguments': 'GLenum target, GLenum mode', },
  1353. { 'return_type': 'void',
  1354. 'names': ['glImportMemoryFdEXT'],
  1355. 'arguments': 'GLuint memory, GLuint64 size, GLenum handleType, GLint fd', },
  1356. { 'return_type': 'void',
  1357. 'names': ['glImportMemoryWin32HandleEXT'],
  1358. 'arguments': 'GLuint memory, GLuint64 size, GLenum handleType, void* handle',
  1359. },
  1360. { 'return_type': 'void',
  1361. 'arguments': 'GLuint memory, GLuint64 size, GLenum handleType, GLuint handle',
  1362. 'versions': [{'name': 'glImportMemoryZirconHandleANGLE',
  1363. 'extensions': ['GL_ANGLE_memory_object_fuchsia']}]},
  1364. { 'return_type': 'void',
  1365. 'names': ['glImportSemaphoreFdEXT'],
  1366. 'arguments': 'GLuint semaphore, GLenum handleType, GLint fd', },
  1367. { 'return_type': 'void',
  1368. 'names': ['glImportSemaphoreWin32HandleEXT'],
  1369. 'arguments': 'GLuint semaphore, GLenum handleType, void* handle', },
  1370. { 'return_type': 'void',
  1371. 'arguments': 'GLuint semaphore, GLenum handleType, GLuint handle',
  1372. 'versions': [{'name': 'glImportSemaphoreZirconHandleANGLE',
  1373. 'extensions': ['GL_ANGLE_semaphore_fuchsia']}]},
  1374. { 'return_type': 'void',
  1375. 'names': ['glInsertEventMarkerEXT'],
  1376. 'arguments': 'GLsizei length, const char* marker', },
  1377. { 'return_type': 'void',
  1378. 'versions': [{ 'name': 'glInvalidateFramebuffer' }],
  1379. 'arguments': 'GLenum target, GLsizei numAttachments, '
  1380. 'const GLenum* attachments' },
  1381. { 'return_type': 'void',
  1382. 'versions': [{ 'name': 'glInvalidateSubFramebuffer' }],
  1383. 'arguments':
  1384. 'GLenum target, GLsizei numAttachments, const GLenum* attachments, '
  1385. 'GLint x, GLint y, GLint width, GLint height', },
  1386. { 'return_type': 'void',
  1387. 'versions': [{ 'name': 'glInvalidateTextureANGLE',
  1388. 'extensions': ['GL_ANGLE_texture_external_update'] } ],
  1389. 'arguments': 'GLenum target', },
  1390. { 'return_type': 'GLboolean',
  1391. 'names': ['glIsBuffer'],
  1392. 'arguments': 'GLuint buffer', },
  1393. { 'return_type': 'GLboolean',
  1394. 'names': ['glIsEnabled'],
  1395. 'arguments': 'GLenum cap', },
  1396. { 'return_type': 'GLboolean',
  1397. 'known_as': 'glIsEnablediOES',
  1398. 'versions': [
  1399. { 'name': 'glIsEnabledi' },
  1400. { 'name': 'glIsEnablediOES', 'extensions': ['GL_OES_draw_buffers_indexed'] }
  1401. ],
  1402. 'arguments': 'GLenum target, GLuint index', },
  1403. { 'return_type': 'GLboolean',
  1404. 'known_as': 'glIsFenceAPPLE',
  1405. 'versions': [{ 'name': 'glIsFenceAPPLE',
  1406. 'extensions': ['GL_APPLE_fence'] }],
  1407. 'arguments': 'GLuint fence', },
  1408. { 'return_type': 'GLboolean',
  1409. 'names': ['glIsFenceNV'],
  1410. 'arguments': 'GLuint fence', },
  1411. { 'return_type': 'GLboolean',
  1412. 'names': ['glIsFramebufferEXT', 'glIsFramebuffer'],
  1413. 'arguments': 'GLuint framebuffer', },
  1414. { 'return_type': 'GLboolean',
  1415. 'names': ['glIsPathNV'],
  1416. 'versions': [{ 'name': 'glIsPathNV',
  1417. 'extensions': ['GL_NV_path_rendering'] },
  1418. { 'name': 'glIsPathCHROMIUM',
  1419. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1420. 'arguments': 'GLuint path' },
  1421. { 'return_type': 'GLboolean',
  1422. 'names': ['glIsProgram'],
  1423. 'arguments': 'GLuint program', },
  1424. { 'return_type': 'GLboolean',
  1425. 'names': ['glIsProgramPipeline'],
  1426. 'arguments': 'GLuint pipeline', },
  1427. { 'return_type': 'GLboolean',
  1428. 'versions': [{ 'name': 'glIsQuery' },
  1429. { 'name': 'glIsQueryARB' },
  1430. { 'name': 'glIsQueryEXT',
  1431. 'extensions': ['GL_EXT_occlusion_query_boolean'] }],
  1432. 'arguments': 'GLuint query', },
  1433. { 'return_type': 'GLboolean',
  1434. 'names': ['glIsRenderbufferEXT', 'glIsRenderbuffer'],
  1435. 'arguments': 'GLuint renderbuffer', },
  1436. { 'return_type': 'GLboolean',
  1437. 'versions': [{ 'name': 'glIsSampler',
  1438. 'extensions': ['GL_ARB_sampler_objects'] }],
  1439. 'arguments': 'GLuint sampler', },
  1440. { 'return_type': 'GLboolean',
  1441. 'names': ['glIsShader'],
  1442. 'arguments': 'GLuint shader', },
  1443. { 'return_type': 'GLboolean',
  1444. 'versions': [{ 'name': 'glIsSync',
  1445. 'extensions': ['GL_ARB_sync'] }],
  1446. 'arguments': 'GLsync sync', },
  1447. { 'return_type': 'GLboolean',
  1448. 'versions': [{ 'name': 'glIsSyncAPPLE',
  1449. 'extensions': ['GL_APPLE_sync'] }],
  1450. 'arguments': 'GLsync sync', },
  1451. { 'return_type': 'GLboolean',
  1452. 'names': ['glIsTexture'],
  1453. 'arguments': 'GLuint texture', },
  1454. { 'return_type': 'GLboolean',
  1455. 'versions': [{ 'name': 'glIsTransformFeedback',
  1456. 'extensions': ['GL_ARB_transform_feedback2'] }],
  1457. 'arguments': 'GLuint id', },
  1458. { 'return_type': 'GLboolean',
  1459. 'known_as': 'glIsVertexArrayOES',
  1460. 'versions': [{ 'name': 'glIsVertexArray',
  1461. 'extensions': ['GL_ARB_vertex_array_object'], },
  1462. { 'name': 'glIsVertexArrayOES' },
  1463. { 'name': 'glIsVertexArrayAPPLE',
  1464. 'extensions': ['GL_APPLE_vertex_array_object'] }],
  1465. 'arguments': 'GLuint array' },
  1466. { 'return_type': 'void',
  1467. 'names': ['glLineWidth'],
  1468. 'arguments': 'GLfloat width', },
  1469. { 'return_type': 'void',
  1470. 'names': ['glLinkProgram'],
  1471. 'arguments': 'GLuint program', },
  1472. { 'return_type': 'void*',
  1473. 'known_as': 'glMapBuffer',
  1474. 'names': ['glMapBufferOES', 'glMapBuffer'],
  1475. 'arguments': 'GLenum target, GLenum access', },
  1476. { 'return_type': 'void*',
  1477. 'known_as': 'glMapBufferRange',
  1478. 'versions': [{ 'name': 'glMapBufferRange',
  1479. 'extensions': ['GL_ARB_map_buffer_range'] },
  1480. { 'name': 'glMapBufferRangeEXT',
  1481. 'extensions': ['GL_EXT_map_buffer_range'] }],
  1482. 'arguments':
  1483. 'GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access', },
  1484. { 'return_type': 'void',
  1485. 'known_as': 'glMatrixLoadfEXT',
  1486. 'versions': [{ 'name': 'glMatrixLoadfEXT',
  1487. 'extensions': ['GL_EXT_direct_state_access',
  1488. 'GL_NV_path_rendering'] },
  1489. { 'name': 'glMatrixLoadfCHROMIUM',
  1490. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1491. 'arguments': 'GLenum matrixMode, const GLfloat* m' },
  1492. { 'return_type': 'void',
  1493. 'known_as': 'glMatrixLoadIdentityEXT',
  1494. 'versions': [{ 'name': 'glMatrixLoadIdentityEXT',
  1495. 'extensions': ['GL_EXT_direct_state_access',
  1496. 'GL_NV_path_rendering'] },
  1497. { 'name': 'glMatrixLoadIdentityCHROMIUM',
  1498. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1499. 'arguments': 'GLenum matrixMode' },
  1500. {'return_type': 'void',
  1501. 'known_as': 'glMaxShaderCompilerThreadsKHR',
  1502. 'versions': [{ 'name': 'glMaxShaderCompilerThreadsKHR',
  1503. 'extensions': ['GL_KHR_parallel_shader_compile'] }],
  1504. 'arguments': 'GLuint count', },
  1505. { 'return_type': 'void',
  1506. 'names': ['glMemoryBarrierByRegion'],
  1507. 'arguments': 'GLbitfield barriers', },
  1508. {'return_type': 'void',
  1509. 'known_as': 'glMemoryBarrierEXT',
  1510. 'versions': [{ 'name': 'glMemoryBarrier',
  1511. 'extensions': ['GL_ARB_shader_image_load_store'] },
  1512. { 'name': 'glMemoryBarrierEXT',
  1513. 'extensions': ['GL_EXT_shader_image_load_store'] }],
  1514. 'arguments': 'GLbitfield barriers', },
  1515. { 'return_type': 'void',
  1516. 'names': ['glMemoryObjectParameterivEXT'],
  1517. 'arguments': 'GLuint memoryObject, GLenum pname, const GLint* param'},
  1518. { 'return_type': 'void',
  1519. 'names': ['glMinSampleShading'],
  1520. 'arguments': 'GLfloat value', },
  1521. { 'return_type': 'void',
  1522. 'versions' : [{'name': 'glMultiDrawArraysANGLE',
  1523. 'extensions': ['GL_ANGLE_multi_draw'] }],
  1524. 'arguments': 'GLenum mode, const GLint* firsts, '
  1525. 'const GLsizei* counts, GLsizei drawcount', },
  1526. { 'return_type': 'void',
  1527. 'versions' : [{'name': 'glMultiDrawArraysInstancedANGLE',
  1528. 'extensions': ['GL_ANGLE_multi_draw'] }],
  1529. 'arguments': 'GLenum mode, const GLint* firsts, '
  1530. 'const GLsizei* counts, const GLsizei* instanceCounts, '
  1531. 'GLsizei drawcount', },
  1532. { 'return_type': 'void',
  1533. 'versions' : [{'name': 'glMultiDrawArraysInstancedBaseInstanceANGLE',
  1534. 'extensions': ['GL_ANGLE_base_vertex_base_instance'] }],
  1535. 'arguments': 'GLenum mode, const GLint* firsts, '
  1536. 'const GLsizei* counts, const GLsizei* instanceCounts, '
  1537. 'const GLuint* baseInstances, GLsizei drawcount', },
  1538. { 'return_type': 'void',
  1539. 'versions' : [{'name': 'glMultiDrawElementsANGLE',
  1540. 'extensions': ['GL_ANGLE_multi_draw'] }],
  1541. 'arguments': 'GLenum mode, const GLsizei* counts, '
  1542. 'GLenum type, const GLvoid* const* indices, '
  1543. 'GLsizei drawcount', },
  1544. { 'return_type': 'void',
  1545. 'versions' : [{'name': 'glMultiDrawElementsInstancedANGLE',
  1546. 'extensions': ['GL_ANGLE_multi_draw'] }],
  1547. 'arguments': 'GLenum mode, const GLsizei* counts, '
  1548. 'GLenum type, const GLvoid* const* indices, '
  1549. 'const GLsizei* instanceCounts, GLsizei drawcount', },
  1550. { 'return_type': 'void',
  1551. 'versions' : [{'name': 'glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE',
  1552. 'extensions': ['GL_ANGLE_base_vertex_base_instance'] }],
  1553. 'arguments': 'GLenum mode, '
  1554. 'const GLsizei* counts, GLenum type, '
  1555. 'const GLvoid* const* indices, const GLsizei* instanceCounts, '
  1556. 'const GLint* baseVertices, const GLuint* baseInstances, '
  1557. 'GLsizei drawcount', },
  1558. { 'return_type': 'void',
  1559. 'versions': [{ 'name': 'glObjectLabel' },
  1560. { 'name': 'glObjectLabelKHR',
  1561. 'extensions': ['GL_KHR_debug'] }],
  1562. 'arguments':
  1563. 'GLenum identifier, GLuint name, GLsizei length, const char* label', },
  1564. { 'return_type': 'void',
  1565. 'versions': [{ 'name': 'glObjectPtrLabel' },
  1566. { 'name': 'glObjectPtrLabelKHR',
  1567. 'extensions': ['GL_KHR_debug'] }],
  1568. 'arguments': 'void* ptr, GLsizei length, const char* label', },
  1569. { 'return_type': 'void',
  1570. 'versions': [{ 'name': 'glPatchParameteri',
  1571. 'extensions': ['GL_ARB_tessellation_shader'] },
  1572. { 'name': 'glPatchParameteriOES',
  1573. 'extensions': ['GL_OES_tessellation_shader'] }],
  1574. 'arguments': 'GLenum pname, GLint value', },
  1575. { 'return_type': 'void',
  1576. 'names': ['glPathCommandsNV'],
  1577. 'versions': [{ 'name': 'glPathCommandsNV',
  1578. 'extensions': ['GL_NV_path_rendering'] },
  1579. { 'name': 'glPathCommandsCHROMIUM',
  1580. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1581. 'arguments': 'GLuint path, GLsizei numCommands, const GLubyte* commands, '
  1582. 'GLsizei numCoords, GLenum coordType, const GLvoid* coords' },
  1583. { 'return_type': 'void',
  1584. 'names': ['glPathParameterfNV'],
  1585. 'versions': [{ 'name': 'glPathParameterfNV',
  1586. 'extensions': ['GL_NV_path_rendering'] },
  1587. { 'name': 'glPathParameterfCHROMIUM',
  1588. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1589. 'arguments': 'GLuint path, GLenum pname, GLfloat value' },
  1590. { 'return_type': 'void',
  1591. 'names': ['glPathParameteriNV'],
  1592. 'versions': [{ 'name': 'glPathParameteriNV',
  1593. 'extensions': ['GL_NV_path_rendering'] },
  1594. { 'name': 'glPathParameteriCHROMIUM',
  1595. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1596. 'arguments': 'GLuint path, GLenum pname, GLint value' },
  1597. { 'return_type': 'void',
  1598. 'names': ['glPathStencilFuncNV'],
  1599. 'versions': [{ 'name': 'glPathStencilFuncNV',
  1600. 'extensions': ['GL_NV_path_rendering'] },
  1601. { 'name': 'glPathStencilFuncCHROMIUM',
  1602. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1603. 'arguments': 'GLenum func, GLint ref, GLuint mask' },
  1604. { 'return_type': 'void',
  1605. 'versions': [{ 'name': 'glPauseTransformFeedback',
  1606. 'extensions': ['GL_ARB_transform_feedback2'] }],
  1607. 'arguments': 'void', },
  1608. { 'return_type': 'void',
  1609. 'names': ['glPixelStorei'],
  1610. 'arguments': 'GLenum pname, GLint param', },
  1611. { 'return_type': 'void',
  1612. 'names': ['glPointParameteri'],
  1613. 'arguments': 'GLenum pname, GLint param', },
  1614. { 'return_type': 'void',
  1615. 'names': ['glPolygonMode'],
  1616. 'arguments': 'GLenum face, GLenum mode', },
  1617. { 'return_type': 'void',
  1618. 'names': ['glPolygonOffset'],
  1619. 'arguments': 'GLfloat factor, GLfloat units', },
  1620. { 'return_type': 'void',
  1621. 'versions': [{ 'name': 'glPopDebugGroup' },
  1622. { 'name': 'glPopDebugGroupKHR',
  1623. 'extensions': ['GL_KHR_debug'] }],
  1624. 'arguments': '', },
  1625. { 'return_type': 'void',
  1626. 'names': ['glPopGroupMarkerEXT'],
  1627. 'arguments': 'void', },
  1628. { 'return_type': 'void',
  1629. 'names': ['glPrimitiveRestartIndex'],
  1630. 'arguments': 'GLuint index', },
  1631. { 'return_type': 'void',
  1632. 'known_as': 'glProgramBinary',
  1633. 'versions': [{ 'name': 'glProgramBinaryOES' },
  1634. { 'name': 'glProgramBinary',
  1635. 'extensions': ['GL_ARB_get_program_binary'] }],
  1636. 'arguments': 'GLuint program, GLenum binaryFormat, '
  1637. 'const GLvoid* binary, GLsizei length' },
  1638. { 'return_type': 'void',
  1639. 'versions': [{ 'name': 'glProgramParameteri',
  1640. 'extensions': ['GL_ARB_get_program_binary'] }],
  1641. 'arguments': 'GLuint program, GLenum pname, GLint value' },
  1642. { 'return_type': 'void',
  1643. 'names': ['glProgramPathFragmentInputGenNV'],
  1644. 'versions': [{ 'name': 'glProgramPathFragmentInputGenNV',
  1645. 'extensions': ['GL_NV_path_rendering'] },
  1646. { 'name': 'glProgramPathFragmentInputGenCHROMIUM',
  1647. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1648. 'arguments': 'GLuint program, GLint location, GLenum genMode, '
  1649. 'GLint components, const GLfloat* coeffs',
  1650. 'is_optional': True, },
  1651. { 'return_type': 'void',
  1652. 'names': ['glProgramUniform1f'],
  1653. 'arguments': 'GLuint program, GLint location, GLfloat v0' },
  1654. { 'return_type': 'void',
  1655. 'names': ['glProgramUniform1fv'],
  1656. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1657. 'const GLfloat* value' },
  1658. { 'return_type': 'void',
  1659. 'names': ['glProgramUniform1i'],
  1660. 'arguments': 'GLuint program, GLint location, GLint v0' },
  1661. { 'return_type': 'void',
  1662. 'names': ['glProgramUniform1iv'],
  1663. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1664. 'const GLint* value' },
  1665. { 'return_type': 'void',
  1666. 'names': ['glProgramUniform1ui'],
  1667. 'arguments': 'GLuint program, GLint location, GLuint v0' },
  1668. { 'return_type': 'void',
  1669. 'names': ['glProgramUniform1uiv'],
  1670. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1671. 'const GLuint* value' },
  1672. { 'return_type': 'void',
  1673. 'names': ['glProgramUniform2f'],
  1674. 'arguments': 'GLuint program, GLint location, GLfloat v0, GLfloat v1' },
  1675. { 'return_type': 'void',
  1676. 'names': ['glProgramUniform2fv'],
  1677. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1678. 'const GLfloat* value' },
  1679. { 'return_type': 'void',
  1680. 'names': ['glProgramUniform2i'],
  1681. 'arguments': 'GLuint program, GLint location, GLint v0, GLint v1' },
  1682. { 'return_type': 'void',
  1683. 'names': ['glProgramUniform2iv'],
  1684. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1685. 'const GLint* value' },
  1686. { 'return_type': 'void',
  1687. 'names': ['glProgramUniform2ui'],
  1688. 'arguments': 'GLuint program, GLint location, GLuint v0, GLuint v1' },
  1689. { 'return_type': 'void',
  1690. 'names': ['glProgramUniform2uiv'],
  1691. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1692. 'const GLuint* value' },
  1693. { 'return_type': 'void',
  1694. 'names': ['glProgramUniform3f'],
  1695. 'arguments': 'GLuint program, GLint location, GLfloat v0, GLfloat v1, '
  1696. 'GLfloat v2' },
  1697. { 'return_type': 'void',
  1698. 'names': ['glProgramUniform3fv'],
  1699. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1700. 'const GLfloat* value' },
  1701. { 'return_type': 'void',
  1702. 'names': ['glProgramUniform3i'],
  1703. 'arguments': 'GLuint program, GLint location, GLint v0, GLint v1, GLint v2' },
  1704. { 'return_type': 'void',
  1705. 'names': ['glProgramUniform3iv'],
  1706. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1707. 'const GLint* value' },
  1708. { 'return_type': 'void',
  1709. 'names': ['glProgramUniform3ui'],
  1710. 'arguments': 'GLuint program, GLint location, GLuint v0, GLuint v1, '
  1711. 'GLuint v2' },
  1712. { 'return_type': 'void',
  1713. 'names': ['glProgramUniform3uiv'],
  1714. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1715. 'const GLuint* value' },
  1716. { 'return_type': 'void',
  1717. 'names': ['glProgramUniform4f'],
  1718. 'arguments': 'GLuint program, GLint location, GLfloat v0, GLfloat v1, '
  1719. 'GLfloat v2, GLfloat v3' },
  1720. { 'return_type': 'void',
  1721. 'names': ['glProgramUniform4fv'],
  1722. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1723. 'const GLfloat* value' },
  1724. { 'return_type': 'void',
  1725. 'names': ['glProgramUniform4i'],
  1726. 'arguments': 'GLuint program, GLint location, GLint v0, GLint v1, GLint v2, '
  1727. 'GLint v3' },
  1728. { 'return_type': 'void',
  1729. 'names': ['glProgramUniform4iv'],
  1730. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1731. 'const GLint* value' },
  1732. { 'return_type': 'void',
  1733. 'names': ['glProgramUniform4ui'],
  1734. 'arguments': 'GLuint program, GLint location, GLuint v0, GLuint v1, '
  1735. 'GLuint v2, GLuint v3' },
  1736. { 'return_type': 'void',
  1737. 'names': ['glProgramUniform4uiv'],
  1738. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1739. 'const GLuint* value' },
  1740. { 'return_type': 'void',
  1741. 'names': ['glProgramUniformMatrix2fv'],
  1742. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1743. 'GLboolean transpose, const GLfloat* value' },
  1744. { 'return_type': 'void',
  1745. 'names': ['glProgramUniformMatrix2x3fv'],
  1746. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1747. 'GLboolean transpose, const GLfloat* value' },
  1748. { 'return_type': 'void',
  1749. 'names': ['glProgramUniformMatrix2x4fv'],
  1750. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1751. 'GLboolean transpose, const GLfloat* value' },
  1752. { 'return_type': 'void',
  1753. 'names': ['glProgramUniformMatrix3fv'],
  1754. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1755. 'GLboolean transpose, const GLfloat* value' },
  1756. { 'return_type': 'void',
  1757. 'names': ['glProgramUniformMatrix3x2fv'],
  1758. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1759. 'GLboolean transpose, const GLfloat* value' },
  1760. { 'return_type': 'void',
  1761. 'names': ['glProgramUniformMatrix3x4fv'],
  1762. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1763. 'GLboolean transpose, const GLfloat* value' },
  1764. { 'return_type': 'void',
  1765. 'names': ['glProgramUniformMatrix4fv'],
  1766. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1767. 'GLboolean transpose, const GLfloat* value' },
  1768. { 'return_type': 'void',
  1769. 'names': ['glProgramUniformMatrix4x2fv'],
  1770. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1771. 'GLboolean transpose, const GLfloat* value' },
  1772. { 'return_type': 'void',
  1773. 'names': ['glProgramUniformMatrix4x3fv'],
  1774. 'arguments': 'GLuint program, GLint location, GLsizei count, '
  1775. 'GLboolean transpose, const GLfloat* value' },
  1776. { 'return_type': 'void',
  1777. 'versions': [{ 'name': 'glPushDebugGroup' },
  1778. { 'name': 'glPushDebugGroupKHR',
  1779. 'extensions': ['GL_KHR_debug'] }],
  1780. 'arguments':
  1781. 'GLenum source, GLuint id, GLsizei length, const char* message', },
  1782. { 'return_type': 'void',
  1783. 'names': ['glPushGroupMarkerEXT'],
  1784. 'arguments': 'GLsizei length, const char* marker', },
  1785. { 'return_type': 'void',
  1786. 'versions': [{ 'name': 'glQueryCounter',
  1787. 'extensions': ['GL_ARB_timer_query'] },
  1788. { 'name': 'glQueryCounterEXT' }],
  1789. 'arguments': 'GLuint id, GLenum target', },
  1790. { 'return_type': 'void',
  1791. 'names': ['glReadBuffer'],
  1792. 'arguments': 'GLenum src', },
  1793. { 'return_type': 'void',
  1794. 'versions': [{'name': 'glReadnPixelsRobustANGLE',
  1795. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1796. 'arguments':
  1797. 'GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, '
  1798. 'GLenum type, GLsizei bufSize, GLsizei* length, GLsizei* columns, '
  1799. 'GLsizei* rows, void* data', },
  1800. { 'return_type': 'void',
  1801. 'names': ['glReadPixels'],
  1802. 'arguments':
  1803. 'GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, '
  1804. 'GLenum type, void* pixels', },
  1805. { 'return_type': 'void',
  1806. 'versions': [{'name': 'glReadPixelsRobustANGLE',
  1807. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1808. 'arguments':
  1809. 'GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, '
  1810. 'GLenum type, GLsizei bufSize, GLsizei* length, GLsizei* columns, '
  1811. 'GLsizei* rows, void* pixels', },
  1812. { 'return_type': 'void',
  1813. 'names': ['glReleaseShaderCompiler'],
  1814. 'arguments': 'void', },
  1815. { 'return_type': 'void',
  1816. 'versions': [{ 'name': 'glReleaseTexturesANGLE',
  1817. 'extensions': ['GL_ANGLE_vulkan_image'] }],
  1818. 'arguments': 'GLuint numTextures, const GLuint* textures, GLenum* layouts', },
  1819. { 'return_type': 'void',
  1820. 'names': ['glRenderbufferStorageEXT', 'glRenderbufferStorage'],
  1821. 'arguments':
  1822. 'GLenum target, GLenum internalformat, GLsizei width, GLsizei height', },
  1823. { 'return_type': 'void',
  1824. 'versions' : [{'name': 'glRenderbufferStorageMultisample',
  1825. 'extensions': ['GL_ARB_framebuffer_object']},
  1826. {'name': 'glRenderbufferStorageMultisampleANGLE'},
  1827. {'name': 'glRenderbufferStorageMultisampleEXT',
  1828. 'extensions': ['GL_EXT_framebuffer_multisample'],
  1829. 'explicit_only': True}],
  1830. 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, '
  1831. 'GLsizei width, GLsizei height', },
  1832. { 'return_type': 'void',
  1833. 'versions' : [{'name': 'glRenderbufferStorageMultisampleAdvancedAMD',
  1834. 'extensions': ['GL_AMD_framebuffer_multisample_advanced'] ,
  1835. 'explicit_only': True}],
  1836. 'arguments': 'GLenum target, GLsizei samples, GLsizei storageSamples, '
  1837. 'GLenum internalformat,GLsizei width, GLsizei height', },
  1838. { 'return_type': 'void',
  1839. 'versions' : [{'name': 'glRenderbufferStorageMultisampleEXT',
  1840. 'extensions': ['GL_EXT_multisampled_render_to_texture'],
  1841. 'explicit_only': True},
  1842. {'name': 'glRenderbufferStorageMultisampleIMG'}],
  1843. 'arguments': 'GLenum target, GLsizei samples, GLenum internalformat, '
  1844. 'GLsizei width, GLsizei height', },
  1845. { 'return_type': 'void',
  1846. 'versions': [{ 'name': 'glRequestExtensionANGLE',
  1847. 'extensions': ['GL_ANGLE_request_extension'] }],
  1848. 'arguments': 'const char* name', },
  1849. { 'return_type': 'void',
  1850. 'versions': [{ 'name': 'glResumeTransformFeedback',
  1851. 'extensions': ['GL_ARB_transform_feedback2'] }],
  1852. 'arguments': 'void', },
  1853. { 'return_type': 'void',
  1854. 'names': ['glSampleCoverage'],
  1855. 'arguments': 'GLclampf value, GLboolean invert', },
  1856. { 'return_type': 'void',
  1857. 'names': ['glSampleMaski'],
  1858. 'arguments': 'GLuint maskNumber, GLbitfield mask', },
  1859. { 'return_type': 'void',
  1860. 'versions': [{ 'name': 'glSamplerParameterf',
  1861. 'extensions': ['GL_ARB_sampler_objects'] }],
  1862. 'arguments': 'GLuint sampler, GLenum pname, GLfloat param', },
  1863. { 'return_type': 'void',
  1864. 'versions': [{ 'name': 'glSamplerParameterfv',
  1865. 'extensions': ['GL_ARB_sampler_objects'] }],
  1866. 'arguments': 'GLuint sampler, GLenum pname, const GLfloat* params', },
  1867. { 'return_type': 'void',
  1868. 'versions': [{'name': 'glSamplerParameterfvRobustANGLE',
  1869. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1870. 'arguments':
  1871. 'GLuint sampler, GLenum pname, GLsizei bufSize, const GLfloat* param', },
  1872. { 'return_type': 'void',
  1873. 'versions': [{ 'name': 'glSamplerParameteri',
  1874. 'extensions': ['GL_ARB_sampler_objects'] }],
  1875. 'arguments': 'GLuint sampler, GLenum pname, GLint param', },
  1876. { 'return_type': 'void',
  1877. 'versions': [{'name': 'glSamplerParameterIivRobustANGLE',
  1878. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1879. 'arguments':
  1880. 'GLuint sampler, GLenum pname, GLsizei bufSize, const GLint* param', },
  1881. { 'return_type': 'void',
  1882. 'versions': [{'name': 'glSamplerParameterIuivRobustANGLE',
  1883. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1884. 'arguments':
  1885. 'GLuint sampler, GLenum pname, GLsizei bufSize, const GLuint* param', },
  1886. { 'return_type': 'void',
  1887. 'versions': [{ 'name': 'glSamplerParameteriv',
  1888. 'extensions': ['GL_ARB_sampler_objects'] }],
  1889. 'arguments': 'GLuint sampler, GLenum pname, const GLint* params', },
  1890. { 'return_type': 'void',
  1891. 'versions': [{'name': 'glSamplerParameterivRobustANGLE',
  1892. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  1893. 'arguments':
  1894. 'GLuint sampler, GLenum pname, GLsizei bufSize, const GLint* param', },
  1895. { 'return_type': 'void',
  1896. 'names': ['glScissor'],
  1897. 'arguments': 'GLint x, GLint y, GLsizei width, GLsizei height', },
  1898. { 'return_type': 'void',
  1899. 'known_as': 'glSetFenceAPPLE',
  1900. 'versions': [{ 'name': 'glSetFenceAPPLE',
  1901. 'extensions': ['GL_APPLE_fence'] }],
  1902. 'arguments': 'GLuint fence', },
  1903. { 'return_type': 'void',
  1904. 'names': ['glSetFenceNV'],
  1905. 'arguments': 'GLuint fence, GLenum condition', },
  1906. { 'return_type': 'void',
  1907. 'names': ['glShaderBinary'],
  1908. 'arguments': 'GLsizei n, const GLuint* shaders, GLenum binaryformat, '
  1909. 'const void* binary, GLsizei length', },
  1910. { 'return_type': 'void',
  1911. 'names': ['glShaderSource'],
  1912. 'arguments': 'GLuint shader, GLsizei count, const char* const* str, '
  1913. 'const GLint* length',
  1914. 'logging_code': """
  1915. GL_SERVICE_LOG_CODE_BLOCK({
  1916. for (GLsizei ii = 0; ii < count; ++ii) {
  1917. if (str[ii]) {
  1918. if (length && length[ii] >= 0) {
  1919. std::string source(str[ii], length[ii]);
  1920. GL_SERVICE_LOG(" " << ii << ": ---\\n" << source << "\\n---");
  1921. } else {
  1922. GL_SERVICE_LOG(" " << ii << ": ---\\n" << str[ii] << "\\n---");
  1923. }
  1924. } else {
  1925. GL_SERVICE_LOG(" " << ii << ": NULL");
  1926. }
  1927. }
  1928. });
  1929. """, },
  1930. { 'return_type': 'void',
  1931. 'names': ['glSignalSemaphoreEXT'],
  1932. 'arguments': 'GLuint semaphore, GLuint numBufferBarriers, '
  1933. 'const GLuint* buffers, GLuint numTextureBarriers, '
  1934. 'const GLuint* textures, const GLenum* dstLayouts', },
  1935. { 'return_type': 'void',
  1936. 'names': ['glStartTilingQCOM'],
  1937. 'versions': [{ 'name': 'glStartTilingQCOM',
  1938. 'extension': ['GL_QCOM_tiled_rendering'] }],
  1939. 'arguments':
  1940. 'GLuint x, GLuint y, GLuint width, GLuint height, '
  1941. 'GLbitfield preserveMask', },
  1942. { 'return_type': 'void',
  1943. 'names': ['glStencilFillPathInstancedNV'],
  1944. 'versions': [{ 'name': 'glStencilFillPathInstancedNV',
  1945. 'extensions': ['GL_NV_path_rendering'] },
  1946. { 'name': 'glStencilFillPathInstancedCHROMIUM',
  1947. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1948. 'arguments': 'GLsizei numPaths, GLenum pathNameType, const void* paths, '
  1949. 'GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, '
  1950. 'const GLfloat* transformValues' },
  1951. { 'return_type': 'void',
  1952. 'names': ['glStencilFillPathNV'],
  1953. 'versions': [{ 'name': 'glStencilFillPathNV',
  1954. 'extensions': ['GL_NV_path_rendering'] },
  1955. { 'name': 'glStencilFillPathCHROMIUM',
  1956. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1957. 'arguments': 'GLuint path, GLenum fillMode, GLuint mask' },
  1958. { 'return_type': 'void',
  1959. 'names': ['glStencilFunc'],
  1960. 'arguments': 'GLenum func, GLint ref, GLuint mask', },
  1961. { 'return_type': 'void',
  1962. 'names': ['glStencilFuncSeparate'],
  1963. 'arguments': 'GLenum face, GLenum func, GLint ref, GLuint mask', },
  1964. { 'return_type': 'void',
  1965. 'names': ['glStencilMask'],
  1966. 'arguments': 'GLuint mask', },
  1967. { 'return_type': 'void',
  1968. 'names': ['glStencilMaskSeparate'],
  1969. 'arguments': 'GLenum face, GLuint mask', },
  1970. { 'return_type': 'void',
  1971. 'names': ['glStencilOp'],
  1972. 'arguments': 'GLenum fail, GLenum zfail, GLenum zpass', },
  1973. { 'return_type': 'void',
  1974. 'names': ['glStencilOpSeparate'],
  1975. 'arguments': 'GLenum face, GLenum fail, GLenum zfail, GLenum zpass', },
  1976. { 'return_type': 'void',
  1977. 'names': ['glStencilStrokePathInstancedNV'],
  1978. 'versions': [{ 'name': 'glStencilStrokePathInstancedNV',
  1979. 'extensions': ['GL_NV_path_rendering'] },
  1980. { 'name': 'glStencilStrokePathInstancedCHROMIUM',
  1981. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1982. 'arguments': 'GLsizei numPaths, GLenum pathNameType, const void* paths, '
  1983. 'GLuint pathBase, GLint ref, GLuint mask, GLenum transformType, '
  1984. 'const GLfloat* transformValues' },
  1985. { 'return_type': 'void',
  1986. 'names': ['glStencilStrokePathNV'],
  1987. 'versions': [{ 'name': 'glStencilStrokePathNV',
  1988. 'extensions': ['GL_NV_path_rendering'] },
  1989. { 'name': 'glStencilStrokePathCHROMIUM',
  1990. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1991. 'arguments': 'GLuint path, GLint reference, GLuint mask' },
  1992. { 'return_type': 'void',
  1993. 'names': ['glStencilThenCoverFillPathInstancedNV'],
  1994. 'versions': [{ 'name': 'glStencilThenCoverFillPathInstancedNV',
  1995. 'extensions': ['GL_NV_path_rendering'] },
  1996. { 'name': 'glStencilThenCoverFillPathInstancedCHROMIUM',
  1997. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  1998. 'arguments': 'GLsizei numPaths, GLenum pathNameType, const void* paths, '
  1999. 'GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, '
  2000. 'GLenum transformType, const GLfloat* transformValues',
  2001. 'is_optional': True, },
  2002. { 'return_type': 'void',
  2003. 'names': ['glStencilThenCoverFillPathNV'],
  2004. 'versions': [{ 'name': 'glStencilThenCoverFillPathNV',
  2005. 'extensions': ['GL_NV_path_rendering'] },
  2006. { 'name': 'glStencilThenCoverFillPathCHROMIUM',
  2007. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  2008. 'arguments': 'GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode',
  2009. 'is_optional': True, },
  2010. { 'return_type': 'void',
  2011. 'names': ['glStencilThenCoverStrokePathInstancedNV'],
  2012. 'versions': [{ 'name': 'glStencilThenCoverStrokePathInstancedNV',
  2013. 'extensions': ['GL_NV_path_rendering'] },
  2014. { 'name': 'glStencilThenCoverStrokePathInstancedCHROMIUM',
  2015. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  2016. 'arguments': 'GLsizei numPaths, GLenum pathNameType, const void* paths, '
  2017. 'GLuint pathBase, GLint ref, GLuint mask, GLenum coverMode, '
  2018. 'GLenum transformType, const GLfloat* transformValues',
  2019. 'is_optional': True, },
  2020. { 'return_type': 'void',
  2021. 'names': ['glStencilThenCoverStrokePathNV'],
  2022. 'versions': [{ 'name': 'glStencilThenCoverStrokePathNV',
  2023. 'extensions': ['GL_NV_path_rendering'] },
  2024. { 'name': 'glStencilThenCoverStrokePathCHROMIUM',
  2025. 'extensions': ['GL_CHROMIUM_path_rendering'] }],
  2026. 'arguments': 'GLuint path, GLint reference, GLuint mask, GLenum coverMode',
  2027. 'is_optional': True, },
  2028. { 'return_type': 'GLboolean',
  2029. 'known_as': 'glTestFenceAPPLE',
  2030. 'versions': [{ 'name': 'glTestFenceAPPLE',
  2031. 'extensions': ['GL_APPLE_fence'] }],
  2032. 'arguments': 'GLuint fence', },
  2033. { 'return_type': 'GLboolean',
  2034. 'names': ['glTestFenceNV'],
  2035. 'arguments': 'GLuint fence', },
  2036. { 'return_type': 'void',
  2037. 'names': ['glTexBuffer', 'glTexBufferOES', 'glTexBufferEXT'],
  2038. 'arguments': 'GLenum target, GLenum internalformat, GLuint buffer', } ,
  2039. { 'return_type': 'void',
  2040. 'names': ['glTexBufferRange', 'glTexBufferRangeOES', 'glTexBufferRangeEXT'],
  2041. 'arguments':
  2042. 'GLenum target, GLenum internalformat, GLuint buffer, '
  2043. 'GLintptr offset, GLsizeiptr size', },
  2044. { 'return_type': 'void',
  2045. 'names': ['glTexImage2D'],
  2046. 'arguments':
  2047. 'GLenum target, GLint level, GLint internalformat, GLsizei width, '
  2048. 'GLsizei height, GLint border, GLenum format, GLenum type, '
  2049. 'const void* pixels', },
  2050. { 'return_type': 'void',
  2051. 'versions': [{ 'name': 'glTexImage2DExternalANGLE',
  2052. 'extensions': ['GL_ANGLE_texture_external_update'] } ],
  2053. 'arguments': 'GLenum target, GLint level, GLint internalformat, '
  2054. 'GLsizei width, GLsizei height, GLint border, GLenum format, '
  2055. 'GLenum type', },
  2056. { 'return_type': 'void',
  2057. 'versions': [{'name': 'glTexImage2DRobustANGLE',
  2058. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2059. 'arguments':
  2060. 'GLenum target, GLint level, GLint internalformat, GLsizei width, '
  2061. 'GLsizei height, GLint border, GLenum format, GLenum type, '
  2062. 'GLsizei bufSize, const void* pixels', },
  2063. { 'return_type': 'void',
  2064. 'versions': [{ 'name': 'glTexImage3D' }],
  2065. 'arguments':
  2066. 'GLenum target, GLint level, GLint internalformat, GLsizei width, '
  2067. 'GLsizei height, GLsizei depth, GLint border, GLenum format, '
  2068. 'GLenum type, const void* pixels', },
  2069. { 'return_type': 'void',
  2070. 'versions': [{'name': 'glTexImage3DRobustANGLE',
  2071. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2072. 'arguments':
  2073. 'GLenum target, GLint level, GLint internalformat, GLsizei width, '
  2074. 'GLsizei height, GLsizei depth, GLint border, GLenum format, '
  2075. 'GLenum type, GLsizei bufSize, const void* pixels', },
  2076. { 'return_type': 'void',
  2077. 'names': ['glTexParameterf'],
  2078. 'arguments': 'GLenum target, GLenum pname, GLfloat param', },
  2079. { 'return_type': 'void',
  2080. 'names': ['glTexParameterfv'],
  2081. 'arguments': 'GLenum target, GLenum pname, const GLfloat* params', },
  2082. { 'return_type': 'void',
  2083. 'versions': [{'name': 'glTexParameterfvRobustANGLE',
  2084. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2085. 'arguments':
  2086. 'GLenum target, GLenum pname, GLsizei bufSize, const GLfloat* params', },
  2087. { 'return_type': 'void',
  2088. 'names': ['glTexParameteri'],
  2089. 'arguments': 'GLenum target, GLenum pname, GLint param', },
  2090. { 'return_type': 'void',
  2091. 'versions': [{'name': 'glTexParameterIivRobustANGLE',
  2092. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2093. 'arguments':
  2094. 'GLenum target, GLenum pname, GLsizei bufSize, const GLint* params', },
  2095. { 'return_type': 'void',
  2096. 'versions': [{'name': 'glTexParameterIuivRobustANGLE',
  2097. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2098. 'arguments':
  2099. 'GLenum target, GLenum pname, GLsizei bufSize, const GLuint* params', },
  2100. { 'return_type': 'void',
  2101. 'names': ['glTexParameteriv'],
  2102. 'arguments': 'GLenum target, GLenum pname, const GLint* params', },
  2103. { 'return_type': 'void',
  2104. 'versions': [{'name': 'glTexParameterivRobustANGLE',
  2105. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2106. 'arguments':
  2107. 'GLenum target, GLenum pname, GLsizei bufSize, const GLint* params', },
  2108. { 'return_type': 'void',
  2109. 'known_as': 'glTexStorage2DEXT',
  2110. 'versions': [{ 'name': 'glTexStorage2D',
  2111. 'extensions': ['GL_ARB_texture_storage'] },
  2112. { 'name': 'glTexStorage2DEXT',
  2113. 'extensions': ['GL_EXT_texture_storage'] }],
  2114. 'arguments': 'GLenum target, GLsizei levels, GLenum internalformat, '
  2115. 'GLsizei width, GLsizei height', },
  2116. { 'return_type': 'void',
  2117. 'names': ['glTexStorage2DMultisample'],
  2118. 'arguments':
  2119. 'GLenum target, GLsizei samples, GLenum internalformat, '
  2120. 'GLsizei width, GLsizei height, GLboolean fixedsamplelocations', },
  2121. { 'return_type': 'void',
  2122. 'versions': [{ 'name': 'glTexStorage3D',
  2123. 'extensions': ['GL_ARB_texture_storage'] }],
  2124. 'arguments': 'GLenum target, GLsizei levels, GLenum internalformat, '
  2125. 'GLsizei width, GLsizei height, GLsizei depth', },
  2126. { 'return_type': 'void',
  2127. 'names': [ 'glTexStorageMem2DEXT'] ,
  2128. 'arguments': 'GLenum target, GLsizei levels, GLenum internalFormat, '
  2129. 'GLsizei width, GLsizei height, GLuint memory, GLuint64 offset', },
  2130. { 'return_type': 'void',
  2131. 'names': [ 'glTexStorageMemFlags2DANGLE'] ,
  2132. 'versions': [{ 'name': 'glTexStorageMemFlags2DANGLE',
  2133. 'extensions': ['GL_ANGLE_memory_object_flags'] }],
  2134. 'arguments': 'GLenum target, GLsizei levels, GLenum internalFormat, '
  2135. 'GLsizei width, GLsizei height, GLuint memory, GLuint64 offset, '
  2136. 'GLbitfield createFlags, GLbitfield usageFlags, '
  2137. 'const void* imageCreateInfoPNext', },
  2138. { 'return_type': 'void',
  2139. 'names': ['glTexSubImage2D'],
  2140. 'arguments':
  2141. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  2142. 'GLsizei width, GLsizei height, GLenum format, GLenum type, '
  2143. 'const void* pixels', },
  2144. { 'return_type': 'void',
  2145. 'versions': [{'name': 'glTexSubImage2DRobustANGLE',
  2146. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2147. 'arguments':
  2148. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  2149. 'GLsizei width, GLsizei height, GLenum format, GLenum type, '
  2150. 'GLsizei bufSize, const void* pixels', },
  2151. { 'return_type': 'void',
  2152. 'versions': [{ 'name': 'glTexSubImage3D' }],
  2153. 'arguments':
  2154. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  2155. 'GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, '
  2156. 'GLenum format, GLenum type, const void* pixels', },
  2157. { 'return_type': 'void',
  2158. 'versions': [{'name': 'glTexSubImage3DRobustANGLE',
  2159. 'extensions': ['GL_ANGLE_robust_client_memory']}],
  2160. 'arguments':
  2161. 'GLenum target, GLint level, GLint xoffset, GLint yoffset, '
  2162. 'GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, '
  2163. 'GLenum format, GLenum type, GLsizei bufSize, const void* pixels', },
  2164. { 'return_type': 'void',
  2165. 'versions': [{ 'name': 'glTransformFeedbackVaryings' },
  2166. { 'name': 'glTransformFeedbackVaryingsEXT',
  2167. 'extension': ['GL_EXT_transform_feedback'] }],
  2168. 'arguments': 'GLuint program, GLsizei count, const char* const* varyings, '
  2169. 'GLenum bufferMode', },
  2170. { 'return_type': 'void',
  2171. 'names': ['glUniform1f'],
  2172. 'arguments': 'GLint location, GLfloat x', },
  2173. { 'return_type': 'void',
  2174. 'names': ['glUniform1fv'],
  2175. 'arguments': 'GLint location, GLsizei count, const GLfloat* v', },
  2176. { 'return_type': 'void',
  2177. 'names': ['glUniform1i'],
  2178. 'arguments': 'GLint location, GLint x', },
  2179. { 'return_type': 'void',
  2180. 'names': ['glUniform1iv'],
  2181. 'arguments': 'GLint location, GLsizei count, const GLint* v', },
  2182. { 'return_type': 'void',
  2183. 'versions': [{ 'name': 'glUniform1ui' }],
  2184. 'arguments': 'GLint location, GLuint v0', },
  2185. { 'return_type': 'void',
  2186. 'versions': [{ 'name': 'glUniform1uiv' }],
  2187. 'arguments': 'GLint location, GLsizei count, const GLuint* v', },
  2188. { 'return_type': 'void',
  2189. 'names': ['glUniform2f'],
  2190. 'arguments': 'GLint location, GLfloat x, GLfloat y', },
  2191. { 'return_type': 'void',
  2192. 'names': ['glUniform2fv'],
  2193. 'arguments': 'GLint location, GLsizei count, const GLfloat* v', },
  2194. { 'return_type': 'void',
  2195. 'names': ['glUniform2i'],
  2196. 'arguments': 'GLint location, GLint x, GLint y', },
  2197. { 'return_type': 'void',
  2198. 'names': ['glUniform2iv'],
  2199. 'arguments': 'GLint location, GLsizei count, const GLint* v', },
  2200. { 'return_type': 'void',
  2201. 'versions': [{ 'name': 'glUniform2ui' }],
  2202. 'arguments': 'GLint location, GLuint v0, GLuint v1', },
  2203. { 'return_type': 'void',
  2204. 'versions': [{ 'name': 'glUniform2uiv' }],
  2205. 'arguments': 'GLint location, GLsizei count, const GLuint* v', },
  2206. { 'return_type': 'void',
  2207. 'names': ['glUniform3f'],
  2208. 'arguments': 'GLint location, GLfloat x, GLfloat y, GLfloat z', },
  2209. { 'return_type': 'void',
  2210. 'names': ['glUniform3fv'],
  2211. 'arguments': 'GLint location, GLsizei count, const GLfloat* v', },
  2212. { 'return_type': 'void',
  2213. 'names': ['glUniform3i'],
  2214. 'arguments': 'GLint location, GLint x, GLint y, GLint z', },
  2215. { 'return_type': 'void',
  2216. 'names': ['glUniform3iv'],
  2217. 'arguments': 'GLint location, GLsizei count, const GLint* v', },
  2218. { 'return_type': 'void',
  2219. 'versions': [{ 'name': 'glUniform3ui' }],
  2220. 'arguments': 'GLint location, GLuint v0, GLuint v1, GLuint v2', },
  2221. { 'return_type': 'void',
  2222. 'versions': [{ 'name': 'glUniform3uiv' }],
  2223. 'arguments': 'GLint location, GLsizei count, const GLuint* v', },
  2224. { 'return_type': 'void',
  2225. 'names': ['glUniform4f'],
  2226. 'arguments': 'GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w', },
  2227. { 'return_type': 'void',
  2228. 'names': ['glUniform4fv'],
  2229. 'arguments': 'GLint location, GLsizei count, const GLfloat* v', },
  2230. { 'return_type': 'void',
  2231. 'names': ['glUniform4i'],
  2232. 'arguments': 'GLint location, GLint x, GLint y, GLint z, GLint w', },
  2233. { 'return_type': 'void',
  2234. 'names': ['glUniform4iv'],
  2235. 'arguments': 'GLint location, GLsizei count, const GLint* v', },
  2236. { 'return_type': 'void',
  2237. 'versions': [{ 'name': 'glUniform4ui' }],
  2238. 'arguments': 'GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3', },
  2239. { 'return_type': 'void',
  2240. 'versions': [{ 'name': 'glUniform4uiv' }],
  2241. 'arguments': 'GLint location, GLsizei count, const GLuint* v', },
  2242. { 'return_type': 'void',
  2243. 'versions': [{ 'name': 'glUniformBlockBinding' }],
  2244. 'arguments': 'GLuint program, GLuint uniformBlockIndex, '
  2245. 'GLuint uniformBlockBinding', },
  2246. { 'return_type': 'void',
  2247. 'names': ['glUniformMatrix2fv'],
  2248. 'arguments': 'GLint location, GLsizei count, '
  2249. 'GLboolean transpose, const GLfloat* value', },
  2250. { 'return_type': 'void',
  2251. 'versions': [{ 'name': 'glUniformMatrix2x3fv' }],
  2252. 'arguments': 'GLint location, GLsizei count, '
  2253. 'GLboolean transpose, const GLfloat* value', },
  2254. { 'return_type': 'void',
  2255. 'versions': [{ 'name': 'glUniformMatrix2x4fv' }],
  2256. 'arguments': 'GLint location, GLsizei count, '
  2257. 'GLboolean transpose, const GLfloat* value', },
  2258. { 'return_type': 'void',
  2259. 'names': ['glUniformMatrix3fv'],
  2260. 'arguments': 'GLint location, GLsizei count, '
  2261. 'GLboolean transpose, const GLfloat* value', },
  2262. { 'return_type': 'void',
  2263. 'versions': [{ 'name': 'glUniformMatrix3x2fv' }],
  2264. 'arguments': 'GLint location, GLsizei count, '
  2265. 'GLboolean transpose, const GLfloat* value', },
  2266. { 'return_type': 'void',
  2267. 'versions': [{ 'name': 'glUniformMatrix3x4fv' }],
  2268. 'arguments': 'GLint location, GLsizei count, '
  2269. 'GLboolean transpose, const GLfloat* value', },
  2270. { 'return_type': 'void',
  2271. 'names': ['glUniformMatrix4fv'],
  2272. 'arguments': 'GLint location, GLsizei count, '
  2273. 'GLboolean transpose, const GLfloat* value', },
  2274. { 'return_type': 'void',
  2275. 'versions': [{ 'name': 'glUniformMatrix4x2fv' }],
  2276. 'arguments': 'GLint location, GLsizei count, '
  2277. 'GLboolean transpose, const GLfloat* value', },
  2278. { 'return_type': 'void',
  2279. 'versions': [{ 'name': 'glUniformMatrix4x3fv' }],
  2280. 'arguments': 'GLint location, GLsizei count, '
  2281. 'GLboolean transpose, const GLfloat* value', },
  2282. { 'return_type': 'GLboolean',
  2283. 'known_as': 'glUnmapBuffer',
  2284. 'names': ['glUnmapBufferOES', 'glUnmapBuffer'],
  2285. 'arguments': 'GLenum target', },
  2286. { 'return_type': 'void',
  2287. 'names': ['glUseProgram'],
  2288. 'arguments': 'GLuint program', },
  2289. { 'return_type': 'void',
  2290. 'names': ['glUseProgramStages'],
  2291. 'arguments': 'GLuint pipeline, GLbitfield stages, GLuint program', },
  2292. { 'return_type': 'void',
  2293. 'names': ['glValidateProgram'],
  2294. 'arguments': 'GLuint program', },
  2295. { 'return_type': 'void',
  2296. 'names': ['glValidateProgramPipeline'],
  2297. 'arguments': 'GLuint pipeline', },
  2298. { 'return_type': 'void',
  2299. 'names': ['glVertexAttrib1f'],
  2300. 'arguments': 'GLuint indx, GLfloat x', },
  2301. { 'return_type': 'void',
  2302. 'names': ['glVertexAttrib1fv'],
  2303. 'arguments': 'GLuint indx, const GLfloat* values', },
  2304. { 'return_type': 'void',
  2305. 'names': ['glVertexAttrib2f'],
  2306. 'arguments': 'GLuint indx, GLfloat x, GLfloat y', },
  2307. { 'return_type': 'void',
  2308. 'names': ['glVertexAttrib2fv'],
  2309. 'arguments': 'GLuint indx, const GLfloat* values', },
  2310. { 'return_type': 'void',
  2311. 'names': ['glVertexAttrib3f'],
  2312. 'arguments': 'GLuint indx, GLfloat x, GLfloat y, GLfloat z', },
  2313. { 'return_type': 'void',
  2314. 'names': ['glVertexAttrib3fv'],
  2315. 'arguments': 'GLuint indx, const GLfloat* values', },
  2316. { 'return_type': 'void',
  2317. 'names': ['glVertexAttrib4f'],
  2318. 'arguments': 'GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w', },
  2319. { 'return_type': 'void',
  2320. 'names': ['glVertexAttrib4fv'],
  2321. 'arguments': 'GLuint indx, const GLfloat* values', },
  2322. { 'return_type': 'void',
  2323. 'names': ['glVertexAttribBinding'],
  2324. 'arguments': 'GLuint attribindex, GLuint bindingindex', },
  2325. { 'return_type': 'void',
  2326. 'known_as': 'glVertexAttribDivisorANGLE',
  2327. 'names': ['glVertexAttribDivisorARB', 'glVertexAttribDivisorANGLE',
  2328. 'glVertexAttribDivisorEXT', 'glVertexAttribDivisor'],
  2329. 'arguments':
  2330. 'GLuint index, GLuint divisor', },
  2331. { 'return_type': 'void',
  2332. 'names': ['glVertexAttribFormat'],
  2333. 'arguments': 'GLuint attribindex, GLint size, GLenum type, '
  2334. 'GLboolean normalized, GLuint relativeoffset', },
  2335. { 'return_type': 'void',
  2336. 'versions': [{ 'name': 'glVertexAttribI4i' }],
  2337. 'arguments': 'GLuint indx, GLint x, GLint y, GLint z, GLint w', },
  2338. { 'return_type': 'void',
  2339. 'versions': [{ 'name': 'glVertexAttribI4iv' }],
  2340. 'arguments': 'GLuint indx, const GLint* values', },
  2341. { 'return_type': 'void',
  2342. 'versions': [{ 'name': 'glVertexAttribI4ui' }],
  2343. 'arguments': 'GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w', },
  2344. { 'return_type': 'void',
  2345. 'versions': [{ 'name': 'glVertexAttribI4uiv' }],
  2346. 'arguments': 'GLuint indx, const GLuint* values', },
  2347. { 'return_type': 'void',
  2348. 'names': ['glVertexAttribIFormat'],
  2349. 'arguments': 'GLuint attribindex, GLint size, GLenum type, '
  2350. 'GLuint relativeoffset', },
  2351. { 'return_type': 'void',
  2352. 'versions': [{ 'name': 'glVertexAttribIPointer' }],
  2353. 'arguments': 'GLuint indx, GLint size, GLenum type, GLsizei stride, '
  2354. 'const void* ptr', },
  2355. { 'return_type': 'void',
  2356. 'names': ['glVertexAttribPointer'],
  2357. 'arguments': 'GLuint indx, GLint size, GLenum type, GLboolean normalized, '
  2358. 'GLsizei stride, const void* ptr', },
  2359. { 'return_type': 'void',
  2360. 'names': ['glVertexBindingDivisor'],
  2361. 'arguments': 'GLuint bindingindex, GLuint divisor', },
  2362. { 'return_type': 'void',
  2363. 'names': ['glViewport'],
  2364. 'arguments': 'GLint x, GLint y, GLsizei width, GLsizei height', },
  2365. { 'return_type': 'void',
  2366. 'names': ['glWaitSemaphoreEXT'],
  2367. 'arguments': 'GLuint semaphore, GLuint numBufferBarriers, '
  2368. 'const GLuint* buffers, GLuint numTextureBarriers, const GLuint* textures, '
  2369. 'const GLenum* srcLayouts', },
  2370. { 'return_type': 'void',
  2371. 'versions': [{ 'name': 'glWaitSync',
  2372. 'extensions': ['GL_ARB_sync'] }],
  2373. 'arguments':
  2374. 'GLsync sync, GLbitfield flags, GLuint64 timeout', },
  2375. { 'return_type': 'void',
  2376. 'versions': [{ 'name': 'glWaitSyncAPPLE',
  2377. 'extensions': ['GL_APPLE_sync'] }],
  2378. 'arguments':
  2379. 'GLsync sync, GLbitfield flags, GLuint64 timeout', },
  2380. { 'return_type': 'void',
  2381. 'names': ['glWindowRectanglesEXT'],
  2382. 'arguments': 'GLenum mode, GLsizei n, const GLint* box', },
  2383. ]
  2384. EGL_FUNCTIONS = [
  2385. { 'return_type': 'EGLBoolean',
  2386. 'names': ['eglBindAPI'],
  2387. 'arguments': 'EGLenum api', },
  2388. { 'return_type': 'EGLBoolean',
  2389. 'names': ['eglBindTexImage'],
  2390. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLint buffer', },
  2391. { 'return_type': 'EGLBoolean',
  2392. 'names': ['eglChooseConfig'],
  2393. 'arguments': 'EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs, '
  2394. 'EGLint config_size, EGLint* num_config', },
  2395. { 'return_type': 'EGLint',
  2396. 'versions': [{ 'name': 'eglClientWaitSyncKHR',
  2397. 'extensions': [
  2398. 'EGL_KHR_fence_sync',
  2399. 'GL_CHROMIUM_egl_khr_fence_sync_hack'
  2400. ] }],
  2401. 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, '
  2402. 'EGLTimeKHR timeout' },
  2403. { 'return_type': 'EGLBoolean',
  2404. 'names': ['eglCopyBuffers'],
  2405. 'arguments':
  2406. 'EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target', },
  2407. { 'return_type': 'EGLContext',
  2408. 'names': ['eglCreateContext'],
  2409. 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLContext share_context, '
  2410. 'const EGLint* attrib_list', },
  2411. { 'return_type': 'EGLImageKHR',
  2412. 'versions': [{ 'name': 'eglCreateImageKHR',
  2413. 'extensions':
  2414. ['EGL_KHR_image_base', 'EGL_KHR_gl_texture_2D_image'] }],
  2415. 'arguments':
  2416. 'EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, '
  2417. 'const EGLint* attrib_list' },
  2418. { 'return_type': 'EGLSurface',
  2419. 'names': ['eglCreatePbufferFromClientBuffer'],
  2420. 'arguments':
  2421. 'EGLDisplay dpy, EGLenum buftype, void* buffer, EGLConfig config, '
  2422. 'const EGLint* attrib_list', },
  2423. { 'return_type': 'EGLSurface',
  2424. 'names': ['eglCreatePbufferSurface'],
  2425. 'arguments': 'EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list', },
  2426. { 'return_type': 'EGLSurface',
  2427. 'names': ['eglCreatePixmapSurface'],
  2428. 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, '
  2429. 'const EGLint* attrib_list', },
  2430. { 'return_type': 'EGLStreamKHR',
  2431. 'versions': [{ 'name': 'eglCreateStreamKHR',
  2432. 'extensions': ['EGL_KHR_stream'] }],
  2433. 'arguments': 'EGLDisplay dpy, const EGLint* attrib_list' },
  2434. { 'return_type': 'EGLBoolean',
  2435. 'versions': [{'name': 'eglCreateStreamProducerD3DTextureANGLE',
  2436. 'extensions':
  2437. ['EGL_ANGLE_stream_producer_d3d_texture']}],
  2438. 'arguments':
  2439. 'EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib* attrib_list', },
  2440. { 'return_type': 'EGLSyncKHR',
  2441. 'versions': [{ 'name': 'eglCreateSyncKHR',
  2442. 'extensions': [
  2443. 'EGL_KHR_fence_sync',
  2444. 'GL_CHROMIUM_egl_khr_fence_sync_hack'
  2445. ] }],
  2446. 'arguments': 'EGLDisplay dpy, EGLenum type, const EGLint* attrib_list' },
  2447. { 'return_type': 'EGLSurface',
  2448. 'names': ['eglCreateWindowSurface'],
  2449. 'arguments': 'EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, '
  2450. 'const EGLint* attrib_list', },
  2451. { 'return_type': 'EGLint',
  2452. 'known_as': 'eglDebugMessageControlKHR',
  2453. 'versions': [{ 'name': 'eglDebugMessageControlKHR',
  2454. 'client_extensions': ['EGL_KHR_debug'], }],
  2455. 'arguments': 'EGLDEBUGPROCKHR callback, const EGLAttrib* attrib_list', },
  2456. { 'return_type': 'EGLBoolean',
  2457. 'names': ['eglDestroyContext'],
  2458. 'arguments': 'EGLDisplay dpy, EGLContext ctx', },
  2459. { 'return_type': 'EGLBoolean',
  2460. 'versions': [{ 'name' : 'eglDestroyImageKHR',
  2461. 'extensions': ['EGL_KHR_image_base'] }],
  2462. 'arguments': 'EGLDisplay dpy, EGLImageKHR image' },
  2463. { 'return_type': 'EGLBoolean',
  2464. 'versions': [{ 'name': 'eglDestroyStreamKHR',
  2465. 'extensions': ['EGL_KHR_stream'] }],
  2466. 'arguments': 'EGLDisplay dpy, EGLStreamKHR stream' },
  2467. { 'return_type': 'EGLBoolean',
  2468. 'names': ['eglDestroySurface'],
  2469. 'arguments': 'EGLDisplay dpy, EGLSurface surface', },
  2470. { 'return_type': 'EGLBoolean',
  2471. 'versions': [{ 'name': 'eglDestroySyncKHR',
  2472. 'extensions': [
  2473. 'EGL_KHR_fence_sync',
  2474. 'GL_CHROMIUM_egl_khr_fence_sync_hack'
  2475. ] }],
  2476. 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync' },
  2477. { 'return_type': 'EGLint',
  2478. # At least some Android O devices such as Pixel implement this
  2479. # but don't export the EGL_ANDROID_native_fence_sync extension.
  2480. 'versions': [{ 'name': 'eglDupNativeFenceFDANDROID',
  2481. 'extensions': [
  2482. 'EGL_ANDROID_native_fence_sync',
  2483. 'GL_CHROMIUM_egl_android_native_fence_sync_hack']}],
  2484. 'arguments':
  2485. 'EGLDisplay dpy, EGLSyncKHR sync' },
  2486. { 'return_type': 'EGLBoolean',
  2487. 'versions': [{ 'name': 'eglExportDMABUFImageMESA',
  2488. 'extensions': ['EGL_MESA_image_dma_buf_export'] }],
  2489. 'arguments': 'EGLDisplay dpy, EGLImageKHR image, int* fds, EGLint* strides, '
  2490. 'EGLint* offsets', },
  2491. { 'return_type': 'EGLBoolean',
  2492. 'versions': [{ 'name': 'eglExportDMABUFImageQueryMESA',
  2493. 'extensions': ['EGL_MESA_image_dma_buf_export'] }],
  2494. 'arguments': 'EGLDisplay dpy, EGLImageKHR image, int* fourcc, '
  2495. 'int* num_planes, EGLuint64KHR* modifiers', },
  2496. { 'return_type': 'EGLBoolean',
  2497. 'versions': [{'name': 'eglExportVkImageANGLE',
  2498. 'extensions':
  2499. ['EGL_ANGLE_vulkan_image']}],
  2500. 'arguments': 'EGLDisplay dpy, EGLImageKHR image, void* vk_image, '
  2501. 'void* vk_image_create_info', },
  2502. { 'return_type': 'EGLBoolean',
  2503. 'versions': [{ 'name': 'eglGetCompositorTimingANDROID',
  2504. 'extensions': [
  2505. 'EGL_ANDROID_get_frame_timestamps'
  2506. ] }],
  2507. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, '
  2508. 'EGLint* names, EGLnsecsANDROID* values', },
  2509. { 'return_type': 'EGLBoolean',
  2510. 'versions': [{ 'name': 'eglGetCompositorTimingSupportedANDROID',
  2511. 'extensions': [
  2512. 'EGL_ANDROID_get_frame_timestamps'
  2513. ] }],
  2514. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLint timestamp', },
  2515. { 'return_type': 'EGLBoolean',
  2516. 'names': ['eglGetConfigAttrib'],
  2517. 'arguments':
  2518. 'EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value', },
  2519. { 'return_type': 'EGLBoolean',
  2520. 'names': ['eglGetConfigs'],
  2521. 'arguments': 'EGLDisplay dpy, EGLConfig* configs, EGLint config_size, '
  2522. 'EGLint* num_config', },
  2523. { 'return_type': 'EGLContext',
  2524. 'names': ['eglGetCurrentContext'],
  2525. 'arguments': 'void', },
  2526. { 'return_type': 'EGLDisplay',
  2527. 'names': ['eglGetCurrentDisplay'],
  2528. 'arguments': 'void', },
  2529. { 'return_type': 'EGLSurface',
  2530. 'names': ['eglGetCurrentSurface'],
  2531. 'arguments': 'EGLint readdraw', },
  2532. { 'return_type': 'EGLDisplay',
  2533. 'names': ['eglGetDisplay'],
  2534. 'arguments': 'EGLNativeDisplayType display_id', },
  2535. { 'return_type': 'EGLint',
  2536. 'names': ['eglGetError'],
  2537. 'arguments': 'void', },
  2538. { 'return_type': 'EGLBoolean',
  2539. 'versions': [{ 'name': 'eglGetFrameTimestampsANDROID',
  2540. 'extensions': [
  2541. 'EGL_ANDROID_get_frame_timestamps'
  2542. ] }],
  2543. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, '
  2544. 'EGLint numTimestamps, EGLint* timestamps, '
  2545. 'EGLnsecsANDROID* values', },
  2546. { 'return_type': 'EGLBoolean',
  2547. 'versions': [{ 'name': 'eglGetFrameTimestampSupportedANDROID',
  2548. 'extensions': [
  2549. 'EGL_ANDROID_get_frame_timestamps'
  2550. ] }],
  2551. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLint timestamp', },
  2552. { 'return_type': 'EGLBoolean',
  2553. 'versions': [{ 'name': 'eglGetMscRateANGLE',
  2554. 'extensions': [
  2555. 'EGL_ANGLE_sync_control_rate'
  2556. ] }],
  2557. 'arguments':
  2558. 'EGLDisplay dpy, EGLSurface surface, '
  2559. 'EGLint* numerator, EGLint* denominator', },
  2560. { 'return_type': 'EGLClientBuffer',
  2561. 'versions': [{ 'name': 'eglGetNativeClientBufferANDROID',
  2562. 'extensions': ['EGL_ANDROID_get_native_client_buffer'], }],
  2563. 'arguments': 'const struct AHardwareBuffer* ahardwarebuffer', },
  2564. { 'return_type': 'EGLBoolean',
  2565. 'versions': [{ 'name': 'eglGetNextFrameIdANDROID',
  2566. 'extensions': [
  2567. 'EGL_ANDROID_get_frame_timestamps'
  2568. ] }],
  2569. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLuint64KHR* frameId', },
  2570. { 'return_type': 'EGLDisplay',
  2571. 'names': ['eglGetPlatformDisplay'],
  2572. 'arguments': 'EGLenum platform, void* native_display, '
  2573. 'const EGLAttrib* attrib_list', },
  2574. { 'return_type': '__eglMustCastToProperFunctionPointerType',
  2575. 'names': ['eglGetProcAddress'],
  2576. 'arguments': 'const char* procname',
  2577. 'logging_code': """
  2578. GL_SERVICE_LOG("GL_RESULT: " << reinterpret_cast<void*>(result));
  2579. """, },
  2580. { 'return_type': 'EGLBoolean',
  2581. 'versions': [{ 'name': 'eglGetSyncAttribKHR',
  2582. 'extensions': [
  2583. 'EGL_KHR_fence_sync',
  2584. 'GL_CHROMIUM_egl_khr_fence_sync_hack'
  2585. ] }],
  2586. 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, '
  2587. 'EGLint* value' },
  2588. { 'return_type': 'EGLBoolean',
  2589. 'versions': [{ 'name': 'eglGetSyncValuesCHROMIUM',
  2590. 'extensions': [
  2591. 'EGL_CHROMIUM_sync_control'
  2592. ] }],
  2593. 'arguments':
  2594. 'EGLDisplay dpy, EGLSurface surface, '
  2595. 'EGLuint64CHROMIUM* ust, EGLuint64CHROMIUM* msc, '
  2596. 'EGLuint64CHROMIUM* sbc', },
  2597. { 'return_type': 'void',
  2598. 'versions': [{ 'name': 'eglHandleGPUSwitchANGLE',
  2599. 'extensions': ['EGL_ANGLE_power_preference'] }],
  2600. 'arguments': 'EGLDisplay dpy' },
  2601. { 'return_type': 'EGLBoolean',
  2602. 'versions': [{ 'name': 'eglImageFlushExternalEXT',
  2603. 'extensions': ['EGL_EXT_image_flush_external'] }],
  2604. 'arguments':
  2605. 'EGLDisplay dpy, EGLImageKHR image, const EGLAttrib* attrib_list' },
  2606. { 'return_type': 'EGLBoolean',
  2607. 'names': ['eglInitialize'],
  2608. 'arguments': 'EGLDisplay dpy, EGLint* major, EGLint* minor', },
  2609. { 'return_type': 'EGLint',
  2610. 'known_as': 'eglLabelObjectKHR',
  2611. 'versions': [{ 'name': 'eglLabelObjectKHR',
  2612. 'client_extensions': ['EGL_KHR_debug'], }],
  2613. 'arguments': 'EGLDisplay display, EGLenum objectType, EGLObjectKHR object, '
  2614. 'EGLLabelKHR label', },
  2615. { 'return_type': 'EGLBoolean',
  2616. 'names': ['eglMakeCurrent'],
  2617. 'arguments':
  2618. 'EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx', },
  2619. { 'return_type': 'EGLBoolean',
  2620. 'names': ['eglPostSubBufferNV'],
  2621. 'arguments': 'EGLDisplay dpy, EGLSurface surface, '
  2622. 'EGLint x, EGLint y, EGLint width, EGLint height', },
  2623. { 'return_type': 'EGLenum',
  2624. 'names': ['eglQueryAPI'],
  2625. 'arguments': 'void', },
  2626. { 'return_type': 'EGLBoolean',
  2627. 'names': ['eglQueryContext'],
  2628. 'arguments':
  2629. 'EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value', },
  2630. { 'return_type': 'EGLBoolean',
  2631. 'known_as': 'eglQueryDebugKHR',
  2632. 'versions': [{ 'name': 'eglQueryDebugKHR',
  2633. 'client_extensions': ['EGL_KHR_debug'], }],
  2634. 'arguments': 'EGLint attribute, EGLAttrib* value', },
  2635. {
  2636. 'return_type': 'EGLBoolean',
  2637. 'versions': [{ 'name': 'eglQueryDeviceAttribEXT',
  2638. 'client_extensions': ['EGL_EXT_device_query'], }],
  2639. 'arguments': 'EGLDeviceEXT device, EGLint attribute, EGLAttrib* value' },
  2640. { 'return_type': 'EGLBoolean',
  2641. 'known_as': 'eglQueryDevicesEXT',
  2642. 'versions': [{ 'name': 'eglQueryDevicesEXT',
  2643. 'client_extensions': ['EGL_EXT_device_enumeration'], }],
  2644. 'arguments':
  2645. 'EGLint max_devices, EGLDeviceEXT* devices, EGLint* num_devices', },
  2646. { 'return_type': 'const char *',
  2647. 'known_as': 'eglQueryDeviceStringEXT',
  2648. 'versions': [{ 'name': 'eglQueryDeviceStringEXT',
  2649. 'client_extensions': ['EGL_EXT_device_query'], }],
  2650. 'arguments': 'EGLDeviceEXT device, EGLint name', },
  2651. { 'return_type': 'EGLBoolean',
  2652. 'versions': [{ 'name': 'eglQueryDisplayAttribANGLE',
  2653. 'client_extensions': ['EGL_ANGLE_feature_control'] }],
  2654. 'arguments': 'EGLDisplay dpy, EGLint attribute, EGLAttrib* value' },
  2655. {
  2656. 'return_type': 'EGLBoolean',
  2657. 'versions': [{ 'name': 'eglQueryDisplayAttribEXT',
  2658. 'client_extensions': ['EGL_EXT_device_query'], }],
  2659. 'arguments': 'EGLDisplay dpy, EGLint attribute, EGLAttrib* value' },
  2660. {
  2661. 'return_type': 'EGLBoolean',
  2662. 'versions': [{ 'name': 'eglQueryDmaBufFormatsEXT',
  2663. 'extensions':
  2664. ['EGL_EXT_image_dma_buf_import_modifiers'], }],
  2665. 'arguments':
  2666. 'EGLDisplay dpy, EGLint max_formats, '
  2667. 'EGLint* formats, EGLint* num_formats' },
  2668. {
  2669. 'return_type': 'EGLBoolean',
  2670. 'versions': [{ 'name': 'eglQueryDmaBufModifiersEXT',
  2671. 'extensions':
  2672. ['EGL_EXT_image_dma_buf_import_modifiers'], }],
  2673. 'arguments':
  2674. 'EGLDisplay dpy, EGLint format, EGLint max_modifiers, '
  2675. 'EGLuint64KHR* modifiers, EGLBoolean* external_only, '
  2676. 'EGLint* num_modifiers' },
  2677. { 'return_type': 'EGLBoolean',
  2678. 'versions': [{ 'name': 'eglQueryStreamKHR',
  2679. 'extensions': ['EGL_KHR_stream'] }],
  2680. 'arguments':
  2681. 'EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, '
  2682. 'EGLint* value' },
  2683. { 'return_type': 'EGLBoolean',
  2684. 'versions': [{ 'name': 'eglQueryStreamu64KHR',
  2685. 'extensions': ['EGL_KHR_stream'] }],
  2686. 'arguments':
  2687. 'EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, '
  2688. 'EGLuint64KHR* value' },
  2689. { 'return_type': 'const char*',
  2690. 'names': ['eglQueryString'],
  2691. 'arguments': 'EGLDisplay dpy, EGLint name', },
  2692. { 'return_type': 'const char *',
  2693. 'versions': [{ 'name': 'eglQueryStringiANGLE',
  2694. 'client_extensions': ['EGL_ANGLE_feature_control'] }],
  2695. 'arguments': 'EGLDisplay dpy, EGLint name, EGLint index' },
  2696. { 'return_type': 'EGLBoolean',
  2697. 'names': ['eglQuerySurface'],
  2698. 'arguments':
  2699. 'EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value', },
  2700. { 'return_type': 'EGLBoolean',
  2701. 'names': ['eglQuerySurfacePointerANGLE'],
  2702. 'arguments':
  2703. 'EGLDisplay dpy, EGLSurface surface, EGLint attribute, void** value', },
  2704. { 'return_type': 'void',
  2705. 'versions': [{ 'name': 'eglReacquireHighPowerGPUANGLE',
  2706. 'extensions': ['EGL_ANGLE_power_preference'] }],
  2707. 'arguments': 'EGLDisplay dpy, EGLContext ctx' },
  2708. { 'return_type': 'void',
  2709. 'versions': [{ 'name': 'eglReleaseHighPowerGPUANGLE',
  2710. 'extensions': ['EGL_ANGLE_power_preference'] }],
  2711. 'arguments': 'EGLDisplay dpy, EGLContext ctx' },
  2712. { 'return_type': 'EGLBoolean',
  2713. 'names': ['eglReleaseTexImage'],
  2714. 'arguments': 'EGLDisplay dpy, EGLSurface surface, EGLint buffer', },
  2715. { 'return_type': 'EGLBoolean',
  2716. 'names': ['eglReleaseThread'],
  2717. 'arguments': 'void', },
  2718. { 'return_type': 'void',
  2719. 'versions': [{ 'name': 'eglSetBlobCacheFuncsANDROID',
  2720. 'extensions': ['EGL_ANDROID_blob_cache'] }],
  2721. 'arguments':
  2722. 'EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get' },
  2723. { 'return_type': 'EGLBoolean',
  2724. 'versions': [{ 'name': 'eglStreamAttribKHR',
  2725. 'extensions': ['EGL_KHR_stream'] }],
  2726. 'arguments':
  2727. 'EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value' },
  2728. { 'return_type': 'EGLBoolean',
  2729. 'versions': [{ 'name': 'eglStreamConsumerAcquireKHR',
  2730. 'extensions': ['EGL_KHR_stream_consumer_gltexture']}],
  2731. 'arguments':
  2732. 'EGLDisplay dpy, EGLStreamKHR stream', },
  2733. { 'return_type': 'EGLBoolean',
  2734. 'versions': [{ 'name': 'eglStreamConsumerGLTextureExternalAttribsNV',
  2735. 'extensions': ['EGL_NV_stream_consumer_gltexture_yuv']}],
  2736. 'arguments':
  2737. 'EGLDisplay dpy, EGLStreamKHR stream, EGLAttrib* attrib_list', },
  2738. { 'return_type': 'EGLBoolean',
  2739. 'versions': [{ 'name': 'eglStreamConsumerGLTextureExternalKHR',
  2740. 'extensions': ['EGL_KHR_stream_consumer_gltexture']}],
  2741. 'arguments':
  2742. 'EGLDisplay dpy, EGLStreamKHR stream', },
  2743. { 'return_type': 'EGLBoolean',
  2744. 'versions': [{ 'name': 'eglStreamConsumerReleaseKHR',
  2745. 'extensions': ['EGL_KHR_stream_consumer_gltexture']}],
  2746. 'arguments':
  2747. 'EGLDisplay dpy, EGLStreamKHR stream', },
  2748. { 'return_type': 'EGLBoolean',
  2749. 'versions': [{ 'name': 'eglStreamPostD3DTextureANGLE',
  2750. 'extensions':
  2751. ['EGL_ANGLE_stream_producer_d3d_texture']}],
  2752. 'arguments':
  2753. 'EGLDisplay dpy, EGLStreamKHR stream, void* texture, '
  2754. 'const EGLAttrib* attrib_list', },
  2755. { 'return_type': 'EGLBoolean',
  2756. 'names': ['eglSurfaceAttrib'],
  2757. 'arguments':
  2758. 'EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value', },
  2759. { 'return_type': 'EGLBoolean',
  2760. 'names': ['eglSwapBuffers'],
  2761. 'arguments': 'EGLDisplay dpy, EGLSurface surface', },
  2762. { 'return_type': 'EGLBoolean',
  2763. 'names': ['eglSwapBuffersWithDamageKHR'],
  2764. 'arguments':
  2765. 'EGLDisplay dpy, EGLSurface surface, EGLint* rects, EGLint n_rects', },
  2766. { 'return_type': 'EGLBoolean',
  2767. 'names': ['eglSwapInterval'],
  2768. 'arguments': 'EGLDisplay dpy, EGLint interval', },
  2769. { 'return_type': 'EGLBoolean',
  2770. 'names': ['eglTerminate'],
  2771. 'arguments': 'EGLDisplay dpy', },
  2772. { 'return_type': 'EGLBoolean',
  2773. 'names': ['eglWaitClient'],
  2774. 'arguments': 'void', },
  2775. { 'return_type': 'EGLBoolean',
  2776. 'names': ['eglWaitGL'],
  2777. 'arguments': 'void', },
  2778. { 'return_type': 'EGLBoolean',
  2779. 'names': ['eglWaitNative'],
  2780. 'arguments': 'EGLint engine', },
  2781. { 'return_type': 'EGLint',
  2782. 'versions': [{ 'name': 'eglWaitSyncKHR',
  2783. 'extensions': ['EGL_KHR_wait_sync'] }],
  2784. 'arguments': 'EGLDisplay dpy, EGLSyncKHR sync, EGLint flags' },
  2785. ]
  2786. # EGL client extensions that may not add a function but are still queried.
  2787. EGL_CLIENT_EXTENSIONS_EXTRA = [
  2788. 'EGL_ANGLE_display_power_preference',
  2789. 'EGL_ANGLE_platform_angle',
  2790. 'EGL_ANGLE_platform_angle_d3d',
  2791. 'EGL_ANGLE_platform_angle_device_id',
  2792. 'EGL_ANGLE_platform_angle_device_type_egl_angle',
  2793. 'EGL_ANGLE_platform_angle_device_type_swiftshader',
  2794. 'EGL_ANGLE_platform_angle_metal',
  2795. 'EGL_ANGLE_platform_angle_null',
  2796. 'EGL_ANGLE_platform_angle_opengl',
  2797. 'EGL_ANGLE_platform_angle_vulkan',
  2798. 'EGL_EXT_platform_device',
  2799. 'EGL_MESA_platform_surfaceless',
  2800. ]
  2801. # EGL extensions that may not add a function but are still queried.
  2802. EGL_EXTENSIONS_EXTRA = [
  2803. 'EGL_ANDROID_create_native_client_buffer',
  2804. 'EGL_ANDROID_front_buffer_auto_refresh',
  2805. 'EGL_ANGLE_display_semaphore_share_group',
  2806. 'EGL_ANGLE_display_texture_share_group',
  2807. 'EGL_ANGLE_context_virtualization',
  2808. 'EGL_ANGLE_create_context_backwards_compatible',
  2809. 'EGL_ANGLE_create_context_client_arrays',
  2810. 'EGL_ANGLE_create_context_webgl_compatibility',
  2811. 'EGL_ANGLE_external_context_and_surface',
  2812. 'EGL_ANGLE_keyed_mutex',
  2813. 'EGL_ANGLE_program_cache_control',
  2814. 'EGL_ANGLE_robust_resource_initialization',
  2815. 'EGL_ANGLE_surface_orientation',
  2816. 'EGL_ANGLE_window_fixed_size',
  2817. 'EGL_ARM_implicit_external_sync',
  2818. 'EGL_CHROMIUM_create_context_bind_generates_resource',
  2819. 'EGL_EXT_create_context_robustness',
  2820. 'EGL_EXT_gl_colorspace_display_p3',
  2821. 'EGL_EXT_gl_colorspace_display_p3_passthrough',
  2822. 'EGL_EXT_image_dma_buf_import',
  2823. 'EGL_EXT_pixel_format_float',
  2824. 'EGL_IMG_context_priority',
  2825. 'EGL_KHR_create_context',
  2826. 'EGL_KHR_gl_colorspace',
  2827. 'EGL_KHR_no_config_context',
  2828. 'EGL_KHR_surfaceless_context',
  2829. 'EGL_NV_robustness_video_memory_purge',
  2830. 'EGL_NOK_texture_from_pixmap',
  2831. ]
  2832. GLX_FUNCTIONS = [
  2833. { 'return_type': 'void',
  2834. 'names': ['glXBindTexImageEXT'],
  2835. 'arguments':
  2836. 'Display* dpy, GLXDrawable drawable, int buffer, int* attribList', },
  2837. { 'return_type': 'GLXFBConfig*',
  2838. 'names': ['glXChooseFBConfig'],
  2839. 'arguments':
  2840. 'Display* dpy, int screen, const int* attribList, int* nitems', },
  2841. { 'return_type': 'XVisualInfo*',
  2842. 'names': ['glXChooseVisual'],
  2843. 'arguments': 'Display* dpy, int screen, int* attribList', },
  2844. { 'return_type': 'void',
  2845. 'names': ['glXCopyContext'],
  2846. 'arguments':
  2847. 'Display* dpy, GLXContext src, GLXContext dst, unsigned long mask', },
  2848. { 'return_type': 'void',
  2849. 'names': ['glXCopySubBufferMESA'],
  2850. 'arguments': 'Display* dpy, GLXDrawable drawable, '
  2851. 'int x, int y, int width, int height', },
  2852. { 'return_type': 'GLXContext',
  2853. 'names': ['glXCreateContext'],
  2854. 'arguments':
  2855. 'Display* dpy, XVisualInfo* vis, GLXContext shareList, int direct', },
  2856. { 'return_type': 'GLXContext',
  2857. 'names': ['glXCreateContextAttribsARB'],
  2858. 'arguments':
  2859. 'Display* dpy, GLXFBConfig config, GLXContext share_context, int direct, '
  2860. 'const int* attrib_list', },
  2861. { 'return_type': 'GLXPixmap',
  2862. 'names': ['glXCreateGLXPixmap'],
  2863. 'arguments': 'Display* dpy, XVisualInfo* visual, Pixmap pixmap', },
  2864. { 'return_type': 'GLXContext',
  2865. 'names': ['glXCreateNewContext'],
  2866. 'arguments': 'Display* dpy, GLXFBConfig config, int renderType, '
  2867. 'GLXContext shareList, int direct', },
  2868. { 'return_type': 'GLXPbuffer',
  2869. 'names': ['glXCreatePbuffer'],
  2870. 'arguments': 'Display* dpy, GLXFBConfig config, const int* attribList', },
  2871. { 'return_type': 'GLXPixmap',
  2872. 'names': ['glXCreatePixmap'],
  2873. 'arguments': 'Display* dpy, GLXFBConfig config, '
  2874. 'Pixmap pixmap, const int* attribList', },
  2875. { 'return_type': 'GLXWindow',
  2876. 'names': ['glXCreateWindow'],
  2877. 'arguments':
  2878. 'Display* dpy, GLXFBConfig config, Window win, const int* attribList', },
  2879. { 'return_type': 'void',
  2880. 'names': ['glXDestroyContext'],
  2881. 'arguments': 'Display* dpy, GLXContext ctx', },
  2882. { 'return_type': 'void',
  2883. 'names': ['glXDestroyGLXPixmap'],
  2884. 'arguments': 'Display* dpy, GLXPixmap pixmap', },
  2885. { 'return_type': 'void',
  2886. 'names': ['glXDestroyPbuffer'],
  2887. 'arguments': 'Display* dpy, GLXPbuffer pbuf', },
  2888. { 'return_type': 'void',
  2889. 'names': ['glXDestroyPixmap'],
  2890. 'arguments': 'Display* dpy, GLXPixmap pixmap', },
  2891. { 'return_type': 'void',
  2892. 'names': ['glXDestroyWindow'],
  2893. 'arguments': 'Display* dpy, GLXWindow window', },
  2894. { 'return_type': 'const char*',
  2895. 'names': ['glXGetClientString'],
  2896. 'arguments': 'Display* dpy, int name', },
  2897. { 'return_type': 'int',
  2898. 'names': ['glXGetConfig'],
  2899. 'arguments': 'Display* dpy, XVisualInfo* visual, int attrib, int* value', },
  2900. { 'return_type': 'GLXContext',
  2901. 'names': ['glXGetCurrentContext'],
  2902. 'arguments': 'void', },
  2903. { 'return_type': 'Display*',
  2904. 'names': ['glXGetCurrentDisplay'],
  2905. 'arguments': 'void', },
  2906. { 'return_type': 'GLXDrawable',
  2907. 'names': ['glXGetCurrentDrawable'],
  2908. 'arguments': 'void', },
  2909. { 'return_type': 'GLXDrawable',
  2910. 'names': ['glXGetCurrentReadDrawable'],
  2911. 'arguments': 'void', },
  2912. { 'return_type': 'int',
  2913. 'names': ['glXGetFBConfigAttrib'],
  2914. 'arguments': 'Display* dpy, GLXFBConfig config, int attribute, int* value', },
  2915. { 'return_type': 'GLXFBConfig',
  2916. 'names': ['glXGetFBConfigFromVisualSGIX'],
  2917. 'arguments': 'Display* dpy, XVisualInfo* visualInfo', },
  2918. { 'return_type': 'GLXFBConfig*',
  2919. 'names': ['glXGetFBConfigs'],
  2920. 'arguments': 'Display* dpy, int screen, int* nelements', },
  2921. { 'return_type': 'bool',
  2922. 'names': ['glXGetMscRateOML'],
  2923. 'arguments':
  2924. 'Display* dpy, GLXDrawable drawable, int32_t* numerator, '
  2925. 'int32_t* denominator' },
  2926. { 'return_type': 'void',
  2927. 'names': ['glXGetSelectedEvent'],
  2928. 'arguments': 'Display* dpy, GLXDrawable drawable, unsigned long* mask', },
  2929. { 'return_type': 'bool',
  2930. 'names': ['glXGetSyncValuesOML'],
  2931. 'arguments':
  2932. 'Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, '
  2933. 'int64_t* sbc' },
  2934. { 'return_type': 'XVisualInfo*',
  2935. 'names': ['glXGetVisualFromFBConfig'],
  2936. 'arguments': 'Display* dpy, GLXFBConfig config', },
  2937. { 'return_type': 'int',
  2938. 'names': ['glXIsDirect'],
  2939. 'arguments': 'Display* dpy, GLXContext ctx', },
  2940. { 'return_type': 'int',
  2941. 'names': ['glXMakeContextCurrent'],
  2942. 'arguments':
  2943. 'Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx', },
  2944. { 'return_type': 'int',
  2945. 'names': ['glXMakeCurrent'],
  2946. 'arguments': 'Display* dpy, GLXDrawable drawable, GLXContext ctx', },
  2947. { 'return_type': 'int',
  2948. 'names': ['glXQueryContext'],
  2949. 'arguments': 'Display* dpy, GLXContext ctx, int attribute, int* value', },
  2950. { 'return_type': 'void',
  2951. 'names': ['glXQueryDrawable'],
  2952. 'arguments':
  2953. 'Display* dpy, GLXDrawable draw, int attribute, unsigned int* value', },
  2954. { 'return_type': 'int',
  2955. 'names': ['glXQueryExtension'],
  2956. 'arguments': 'Display* dpy, int* errorb, int* event', },
  2957. { 'return_type': 'const char*',
  2958. 'names': ['glXQueryExtensionsString'],
  2959. 'arguments': 'Display* dpy, int screen', },
  2960. { 'return_type': 'const char*',
  2961. 'names': ['glXQueryServerString'],
  2962. 'arguments': 'Display* dpy, int screen, int name', },
  2963. { 'return_type': 'int',
  2964. 'names': ['glXQueryVersion'],
  2965. 'arguments': 'Display* dpy, int* maj, int* min', },
  2966. { 'return_type': 'void',
  2967. 'names': ['glXReleaseTexImageEXT'],
  2968. 'arguments': 'Display* dpy, GLXDrawable drawable, int buffer', },
  2969. { 'return_type': 'void',
  2970. 'names': ['glXSelectEvent'],
  2971. 'arguments': 'Display* dpy, GLXDrawable drawable, unsigned long mask', },
  2972. { 'return_type': 'void',
  2973. 'names': ['glXSwapBuffers'],
  2974. 'arguments': 'Display* dpy, GLXDrawable drawable', },
  2975. { 'return_type': 'void',
  2976. 'names': ['glXSwapIntervalEXT'],
  2977. 'arguments': 'Display* dpy, GLXDrawable drawable, int interval', },
  2978. { 'return_type': 'void',
  2979. 'names': ['glXSwapIntervalMESA'],
  2980. 'arguments': 'unsigned int interval', },
  2981. { 'return_type': 'void',
  2982. 'names': ['glXUseXFont'],
  2983. 'arguments': 'Font font, int first, int count, int list', },
  2984. { 'return_type': 'void',
  2985. 'names': ['glXWaitGL'],
  2986. 'arguments': 'void', },
  2987. { 'return_type': 'int',
  2988. 'names': ['glXWaitVideoSyncSGI'],
  2989. 'arguments': 'int divisor, int remainder, unsigned int* count', },
  2990. { 'return_type': 'void',
  2991. 'names': ['glXWaitX'],
  2992. 'arguments': 'void', },
  2993. ]
  2994. FUNCTION_SETS = [
  2995. [GL_FUNCTIONS, 'gl', [
  2996. 'GL/gl.h',
  2997. 'noninclude/GL/glext.h',
  2998. 'GLES2/gl2ext.h',
  2999. 'GLES3/gl3.h',
  3000. 'GLES3/gl31.h',
  3001. 'GLES3/gl32.h',
  3002. # Files below are Chromium-specific and shipped with Chromium sources.
  3003. 'GL/glextchromium.h',
  3004. 'GLES2/gl2chromium.h',
  3005. 'GLES2/gl2extchromium.h'
  3006. ], [
  3007. "GL_ANGLE_robust_resource_initialization",
  3008. "GL_ANGLE_webgl_compatibility",
  3009. "GL_ARB_texture_swizzle",
  3010. "GL_EXT_texture_swizzle",
  3011. "GL_EXT_texture_format_BGRA8888",
  3012. "GL_EXT_unpack_subimage",
  3013. ]
  3014. ],
  3015. [EGL_FUNCTIONS, 'egl', [
  3016. 'EGL/eglext.h',
  3017. ],
  3018. [
  3019. 'EGL_ANGLE_d3d_share_handle_client_buffer',
  3020. 'EGL_ANGLE_surface_d3d_texture_2d_share_handle',
  3021. ],
  3022. ],
  3023. [GLX_FUNCTIONS, 'glx', ['GL/glx.h', 'noninclude/GL/glxext.h'], []],
  3024. ]
  3025. GLES2_HEADERS_WITH_ENUMS = [
  3026. 'GLES2/gl2.h',
  3027. 'GLES2/gl2ext.h',
  3028. 'GLES2/gl2chromium.h',
  3029. 'GLES2/gl2extchromium.h',
  3030. 'GLES3/gl3.h',
  3031. 'GLES3/gl31.h',
  3032. ]
  3033. SELF_LOCATION = os.path.dirname(os.path.abspath(__file__))
  3034. LICENSE_AND_HEADER = """\
  3035. // Copyright 2016 The Chromium Authors. All rights reserved.
  3036. // Use of this source code is governed by a BSD-style license that can be
  3037. // found in the LICENSE file.
  3038. //
  3039. // This file is auto-generated from
  3040. // ui/gl/generate_bindings.py
  3041. // It's formatted by clang-format using chromium coding style:
  3042. // clang-format -i -style=chromium filename
  3043. // DO NOT EDIT!
  3044. """
  3045. GLVersion = namedtuple('GLVersion', 'is_es major_version minor_version')
  3046. def GLVersionBindAlways(version):
  3047. return version.major_version <= 2
  3048. def GetStaticBinding(func):
  3049. """If this function has a name assigned to it that should be bound always,
  3050. then return this name.
  3051. This will be the case if either a function name is specified
  3052. that depends on an extension from UNCONDITIONALLY_BOUND_EXTENSIONS,
  3053. or if the GL version it depends on is assumed to be available (e.g. <=2.1).
  3054. There can only be one name that satisfies this condition (or the bindings
  3055. would be ambiguous)."""
  3056. static_bindings = set([])
  3057. for version in func['versions']:
  3058. if 'extensions' in version:
  3059. extensions = version['extensions']
  3060. num_unconditional_extensions = len(
  3061. extensions & UNCONDITIONALLY_BOUND_EXTENSIONS)
  3062. if num_unconditional_extensions:
  3063. static_bindings.add(version['name'])
  3064. elif 'gl_versions' in version:
  3065. versions = [v for v in version['gl_versions'] if GLVersionBindAlways(v)]
  3066. # It's only unconditional if it exists in GL and GLES
  3067. if len(versions) == 2:
  3068. assert versions[0].is_es != versions[1].is_es
  3069. static_bindings.add(version['name'])
  3070. else:
  3071. static_bindings.add(version['name'])
  3072. # Avoid ambiguous bindings (static binding with different names)
  3073. assert len(static_bindings) <= 1
  3074. if len(static_bindings):
  3075. static_name = static_bindings.pop()
  3076. # Avoid ambiguous bindings (static and dynamic bindings with
  3077. # different names)
  3078. assert len([v['name'] for v in func['versions']
  3079. if v['name'] != static_name]) == 0, func
  3080. return static_name
  3081. else:
  3082. return None
  3083. def GenerateHeader(file, functions, set_name,
  3084. used_extensions, used_client_extensions):
  3085. """Generates gl_bindings_autogen_x.h"""
  3086. # Write file header.
  3087. file.write(LICENSE_AND_HEADER +
  3088. """
  3089. #ifndef UI_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
  3090. #define UI_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
  3091. #include <string>
  3092. namespace gl {
  3093. class GLContext;
  3094. """ % {'name': set_name.upper()})
  3095. # Write typedefs for function pointer types. Always use the GL name for the
  3096. # typedef.
  3097. file.write('\n')
  3098. for func in functions:
  3099. file.write('typedef %s (GL_BINDING_CALL *%sProc)(%s);\n' %
  3100. (func['return_type'], func['known_as'], func['arguments']))
  3101. # Write declarations for booleans indicating which extensions are available.
  3102. file.write('\n')
  3103. if set_name == 'egl':
  3104. file.write('struct GL_EXPORT ClientExtensionsEGL {\n')
  3105. for extension in sorted(used_client_extensions):
  3106. file.write(' bool b_%s;\n' % extension)
  3107. file.write(
  3108. """
  3109. void InitializeClientExtensionSettings();
  3110. private:
  3111. static std::string GetClientExtensions();
  3112. };
  3113. struct GL_EXPORT DisplayExtensionsEGL {
  3114. """)
  3115. else:
  3116. assert len(used_client_extensions) == 0
  3117. file.write("struct Extensions%s {\n" % set_name.upper())
  3118. for extension in sorted(used_extensions):
  3119. file.write(' bool b_%s;\n' % extension)
  3120. if set_name == 'egl':
  3121. file.write(
  3122. """
  3123. void InitializeExtensionSettings(EGLDisplay display);
  3124. void UpdateConditionalExtensionSettings(EGLDisplay display);
  3125. static std::string GetPlatformExtensions(EGLDisplay display);
  3126. """)
  3127. file.write('};\n')
  3128. file.write('\n')
  3129. # Write Procs struct.
  3130. file.write("struct Procs%s {\n" % set_name.upper())
  3131. for func in functions:
  3132. file.write(' %sProc %sFn;\n' % (func['known_as'], func['known_as']))
  3133. file.write('};\n')
  3134. file.write('\n')
  3135. # Write Api class.
  3136. file.write(
  3137. """class GL_EXPORT %(name)sApi {
  3138. public:
  3139. %(name)sApi();
  3140. virtual ~%(name)sApi();
  3141. virtual void SetDisabledExtensions(
  3142. const std::string& disabled_extensions) {}
  3143. """ % {'name': set_name.upper()})
  3144. for func in functions:
  3145. file.write(' virtual %s %sFn(%s) = 0;\n' %
  3146. (func['return_type'], func['known_as'], func['arguments']))
  3147. file.write('};\n')
  3148. file.write('\n')
  3149. file.write( '} // namespace gl\n')
  3150. # Write macros to invoke function pointers. Always use the GL name for the
  3151. # macro.
  3152. file.write('\n')
  3153. for func in functions:
  3154. file.write('#define %s ::gl::g_current_%s_context->%sFn\n' %
  3155. (func['known_as'], set_name.lower(), func['known_as']))
  3156. file.write('\n')
  3157. file.write('#endif // UI_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
  3158. set_name.upper())
  3159. def GenerateAPIHeader(file, functions, set_name):
  3160. """Generates gl_bindings_api_autogen_x.h"""
  3161. # Write file header.
  3162. file.write(LICENSE_AND_HEADER +
  3163. """
  3164. // Silence presubmit and Tricium warnings about include guards
  3165. // no-include-guard-because-multiply-included
  3166. // NOLINT(build/header_guard)
  3167. """)
  3168. # Write API declaration.
  3169. for func in functions:
  3170. file.write(' %s %sFn(%s) override;\n' %
  3171. (func['return_type'], func['known_as'], func['arguments']))
  3172. file.write('\n')
  3173. def GenerateMockHeader(file, functions, set_name):
  3174. """Generates gl_mock_autogen_x.h"""
  3175. # Write file header.
  3176. file.write(LICENSE_AND_HEADER +
  3177. """
  3178. // Silence presubmit and Tricium warnings about include guards
  3179. // no-include-guard-because-multiply-included
  3180. // NOLINT(build/header_guard)
  3181. """)
  3182. # Write API declaration.
  3183. for func in functions:
  3184. args = func['arguments']
  3185. if args == 'void':
  3186. args = ''
  3187. arg_count = 0
  3188. if len(args):
  3189. arg_count = func['arguments'].count(',') + 1
  3190. # TODO(zmo): crbug.com/456340
  3191. # For now gmock supports at most 10 args.
  3192. if arg_count <= 10:
  3193. file.write(' MOCK_METHOD%d(%s, %s(%s));\n' %
  3194. (arg_count, func['known_as'][len(set_name):], func['return_type'],
  3195. args))
  3196. else:
  3197. file.write(' // TODO(zmo): crbug.com/456340\n')
  3198. file.write(' // %s cannot be mocked because it has %d args.\n' %
  3199. (func['known_as'], arg_count))
  3200. file.write('\n')
  3201. def GenerateStubHeader(file, functions):
  3202. """Generates gl_stub_autogen_gl.h"""
  3203. # Write file header.
  3204. file.write(LICENSE_AND_HEADER +
  3205. """
  3206. #ifndef UI_GL_GL_STUB_AUTOGEN_GL_H_
  3207. #define UI_GL_GL_STUB_AUTOGEN_GL_H_
  3208. """)
  3209. # Write API declaration.
  3210. for func in functions:
  3211. args = func['arguments']
  3212. if args == 'void':
  3213. args = ''
  3214. return_type = func['return_type'];
  3215. file.write(' %s gl%sFn(%s) override' % (return_type, func['known_as'][2:],
  3216. args))
  3217. if return_type == 'void':
  3218. file.write(' {}\n');
  3219. else:
  3220. file.write(';\n');
  3221. file.write('\n')
  3222. file.write('#endif // UI_GL_GL_STUB_AUTOGEN_GL_H_')
  3223. def GenerateStubSource(file, functions):
  3224. """Generates gl_stub_autogen_gl.cc"""
  3225. # Write file header.
  3226. file.write(LICENSE_AND_HEADER)
  3227. file.write('\n#include "ui/gl/gl_stub_api_base.h"\n\n')
  3228. file.write('namespace gl {\n\n')
  3229. # Write API declaration.
  3230. for func in functions:
  3231. return_type = func['return_type'];
  3232. if return_type == 'void':
  3233. continue
  3234. args = func['arguments']
  3235. if args == 'void':
  3236. args = ''
  3237. file.write('%s GLStubApiBase::gl%sFn(%s) {\n' % (return_type,
  3238. func['known_as'][2:],
  3239. args))
  3240. file.write(' return 0;\n');
  3241. file.write('}\n\n');
  3242. file.write('\n} // namespace gl\n')
  3243. def GenerateSource(file, functions, set_name, used_extensions,
  3244. used_client_extensions, options):
  3245. """Generates gl_bindings_autogen_x.cc"""
  3246. set_header_name = "ui/gl/gl_" + set_name.lower() + "_api_implementation.h"
  3247. include_list = [ 'base/trace_event/trace_event.h',
  3248. 'ui/gl/gl_enums.h',
  3249. 'ui/gl/gl_bindings.h',
  3250. 'ui/gl/gl_context.h',
  3251. 'ui/gl/gl_implementation.h',
  3252. 'ui/gl/gl_version_info.h',
  3253. set_header_name ]
  3254. includes_string = "\n".join(["#include \"{0}\"".format(h)
  3255. for h in sorted(include_list)])
  3256. # Write file header.
  3257. file.write(LICENSE_AND_HEADER +
  3258. """
  3259. #include <string>
  3260. %s
  3261. namespace gl {
  3262. """ % includes_string)
  3263. file.write('\n')
  3264. if set_name != 'gl':
  3265. file.write('Driver%s g_driver_%s; // Exists in .bss\n' % (
  3266. set_name.upper(), set_name.lower()))
  3267. file.write('\n')
  3268. # Write stub functions that take the place of some functions before a context
  3269. # is initialized. This is done to provide clear asserts on debug build and to
  3270. # avoid crashing in case of a bug on release build.
  3271. file.write('\n')
  3272. num_dynamic = 0
  3273. for func in functions:
  3274. static_binding = GetStaticBinding(func)
  3275. if static_binding:
  3276. func['static_binding'] = static_binding
  3277. else:
  3278. num_dynamic = num_dynamic + 1
  3279. print("[%s] %d static bindings, %d dynamic bindings" % (
  3280. set_name, len(functions) - num_dynamic, num_dynamic))
  3281. # Write function to initialize the function pointers that are always the same
  3282. # and to initialize bindings where choice of the function depends on the
  3283. # extension string or the GL version to point to stub functions.
  3284. file.write('\n')
  3285. file.write('void Driver%s::InitializeStaticBindings() {\n' %
  3286. set_name.upper())
  3287. file.write(' // Ensure struct has been zero-initialized.\n')
  3288. file.write(' char* this_bytes = reinterpret_cast<char*>(this);\n')
  3289. file.write(' DCHECK(this_bytes[0] == 0);\n');
  3290. file.write(' DCHECK('
  3291. 'memcmp(this_bytes, this_bytes + 1, sizeof(*this) - 1) == 0);\n');
  3292. file.write('\n')
  3293. def BindingsAreAllStatic(api_set_name):
  3294. return api_set_name == 'egl'
  3295. def WriteFuncBinding(file, known_as, version_name):
  3296. file.write(
  3297. ' fn.%sFn = reinterpret_cast<%sProc>(GetGLProcAddress("%s"));\n' %
  3298. (known_as, known_as, version_name))
  3299. for func in functions:
  3300. if 'static_binding' in func:
  3301. WriteFuncBinding(file, func['known_as'], func['static_binding'])
  3302. elif BindingsAreAllStatic(set_name):
  3303. assert len(func['versions']) == 1
  3304. version = func['versions'][0]
  3305. WriteFuncBinding(file, func['known_as'], version['name'])
  3306. def GetGLVersionCondition(gl_version):
  3307. if GLVersionBindAlways(gl_version):
  3308. if gl_version.is_es:
  3309. return 'ver->is_es'
  3310. else:
  3311. return '!ver->is_es'
  3312. elif gl_version.is_es:
  3313. return 'ver->IsAtLeastGLES(%du, %du)' % (
  3314. gl_version.major_version, gl_version.minor_version)
  3315. else:
  3316. return 'ver->IsAtLeastGL(%du, %du)' % (
  3317. gl_version.major_version, gl_version.minor_version)
  3318. def GetBindingCondition(version):
  3319. conditions = []
  3320. if 'gl_versions' in version:
  3321. conditions.extend(
  3322. sorted([GetGLVersionCondition(v) for v in version['gl_versions']]))
  3323. if 'extensions' in version and version['extensions']:
  3324. conditions.extend(
  3325. sorted(['ext.b_%s' % e for e in version['extensions']]))
  3326. return ' || '.join(conditions)
  3327. def WriteConditionalFuncBinding(file, func):
  3328. assert len(func['versions']) > 0
  3329. known_as = func['known_as']
  3330. i = 0
  3331. first_version = True
  3332. while i < len(func['versions']):
  3333. version = func['versions'][i]
  3334. cond = GetBindingCondition(version)
  3335. if first_version:
  3336. file.write(' if (%s) {\n ' % cond)
  3337. else:
  3338. file.write(' else if (%s) {\n ' % (cond))
  3339. WriteFuncBinding(file, known_as, version['name'])
  3340. if options.validate_bindings:
  3341. if not 'is_optional' in func or not func['is_optional']:
  3342. file.write('DCHECK(fn.%sFn);\n' % known_as)
  3343. file.write('}\n')
  3344. i += 1
  3345. first_version = False
  3346. # TODO(jmadill): make more robust
  3347. def IsClientExtensionFunc(func):
  3348. assert len(func['versions']) > 0
  3349. if 'client_extensions' in func['versions'][0]:
  3350. assert len(func['versions']) == 1
  3351. return True
  3352. return False
  3353. file.write("}\n\n");
  3354. if set_name == 'gl':
  3355. file.write("""\
  3356. void DriverGL::InitializeDynamicBindings(const GLVersionInfo* ver,
  3357. const gfx::ExtensionSet& extensions) {
  3358. """)
  3359. elif set_name == 'egl':
  3360. file.write("""\
  3361. void ClientExtensionsEGL::InitializeClientExtensionSettings() {
  3362. std::string client_extensions(GetClientExtensions());
  3363. [[maybe_unused]] gfx::ExtensionSet extensions(
  3364. gfx::MakeExtensionSet(client_extensions));
  3365. """)
  3366. else:
  3367. file.write("""\
  3368. void Driver%s::InitializeExtensionBindings() {
  3369. std::string platform_extensions(GetPlatformExtensions());
  3370. [[maybe_unused]] gfx::ExtensionSet extensions(
  3371. gfx::MakeExtensionSet(platform_extensions));
  3372. """ % (set_name.upper(),))
  3373. def OutputExtensionSettings(extension_var, extensions, struct_qualifier):
  3374. # Extra space at the end of the extension name is intentional,
  3375. # it is used as a separator
  3376. for extension in extensions:
  3377. file.write(' %sb_%s = gfx::HasExtension(%s, "%s");\n' %
  3378. (struct_qualifier, extension, extension_var, extension))
  3379. def OutputExtensionBindings(extension_funcs):
  3380. for func in extension_funcs:
  3381. if not 'static_binding' in func:
  3382. file.write('\n')
  3383. WriteConditionalFuncBinding(file, func)
  3384. OutputExtensionSettings(
  3385. 'extensions',
  3386. sorted(used_client_extensions),
  3387. '' if BindingsAreAllStatic(set_name) else 'ext.')
  3388. if not BindingsAreAllStatic(set_name):
  3389. OutputExtensionBindings(
  3390. [ f for f in functions if IsClientExtensionFunc(f) ])
  3391. if set_name == 'egl':
  3392. file.write("""\
  3393. }
  3394. void DisplayExtensionsEGL::InitializeExtensionSettings(EGLDisplay display) {
  3395. std::string platform_extensions(GetPlatformExtensions(display));
  3396. [[maybe_unused]] gfx::ExtensionSet extensions(
  3397. gfx::MakeExtensionSet(platform_extensions));
  3398. """)
  3399. OutputExtensionSettings(
  3400. 'extensions',
  3401. sorted(used_extensions),
  3402. '' if BindingsAreAllStatic(set_name) else 'ext.')
  3403. if not BindingsAreAllStatic(set_name):
  3404. OutputExtensionBindings(
  3405. [ f for f in functions if not IsClientExtensionFunc(f) ])
  3406. file.write('}\n')
  3407. # Write function to clear all function pointers.
  3408. file.write('\n')
  3409. file.write("""void Driver%s::ClearBindings() {
  3410. memset(this, 0, sizeof(*this));
  3411. }
  3412. """ % set_name.upper())
  3413. def MakeArgNames(arguments):
  3414. argument_names = re.sub(
  3415. r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments)
  3416. argument_names = re.sub(
  3417. r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names)
  3418. if argument_names == 'void' or argument_names == '':
  3419. argument_names = ''
  3420. return argument_names
  3421. # Write GLApiBase functions
  3422. for func in functions:
  3423. function_name = func['known_as']
  3424. return_type = func['return_type']
  3425. arguments = func['arguments']
  3426. file.write('\n')
  3427. file.write('%s %sApiBase::%sFn(%s) {\n' %
  3428. (return_type, set_name.upper(), function_name, arguments))
  3429. argument_names = MakeArgNames(arguments)
  3430. if return_type == 'void':
  3431. file.write(' driver_->fn.%sFn(%s);\n' %
  3432. (function_name, argument_names))
  3433. else:
  3434. file.write(' return driver_->fn.%sFn(%s);\n' %
  3435. (function_name, argument_names))
  3436. file.write('}\n')
  3437. # Write TraceGLApi functions
  3438. for func in functions:
  3439. function_name = func['known_as']
  3440. return_type = func['return_type']
  3441. arguments = func['arguments']
  3442. file.write('\n')
  3443. file.write('%s Trace%sApi::%sFn(%s) {\n' %
  3444. (return_type, set_name.upper(), function_name, arguments))
  3445. argument_names = MakeArgNames(arguments)
  3446. file.write(' TRACE_EVENT_BINARY_EFFICIENT0("gpu", "Trace%sAPI::%s");\n' %
  3447. (set_name.upper(), function_name))
  3448. if return_type == 'void':
  3449. file.write(' %s_api_->%sFn(%s);\n' %
  3450. (set_name.lower(), function_name, argument_names))
  3451. else:
  3452. file.write(' return %s_api_->%sFn(%s);\n' %
  3453. (set_name.lower(), function_name, argument_names))
  3454. file.write('}\n')
  3455. # Write LogGLApi functions
  3456. for func in functions:
  3457. return_type = func['return_type']
  3458. arguments = func['arguments']
  3459. file.write('\n')
  3460. file.write('%s Log%sApi::%sFn(%s) {\n' %
  3461. (return_type, set_name.upper(), func['known_as'], arguments))
  3462. # Strip pointer types.
  3463. argument_names = re.sub(
  3464. r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', arguments)
  3465. argument_names = re.sub(
  3466. r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2', argument_names)
  3467. # Replace certain `Type varname` combinations with TYPE_varname.
  3468. log_argument_names = re.sub(
  3469. r'const char\* ([a-zA-Z0-9_]+)', r'CONSTCHAR_\1', arguments)
  3470. log_argument_names = re.sub(
  3471. r'(const )?[a-zA-Z0-9_]+\* ([a-zA-Z0-9_]+)',
  3472. r'CONSTVOID_\2', log_argument_names)
  3473. log_argument_names = re.sub(
  3474. r'(const )?EGL[GS]etBlobFuncANDROID ([a-zA-Z0-9_]+)',
  3475. r'FUNCPTR_\2', log_argument_names)
  3476. log_argument_names = re.sub(
  3477. r'(?<!E)GLboolean ([a-zA-Z0-9_]+)', r'GLboolean_\1', log_argument_names)
  3478. log_argument_names = re.sub(
  3479. r'GLDEBUGPROC ([a-zA-Z0-9_]+)',
  3480. r'GLDEBUGPROC_\1', log_argument_names)
  3481. log_argument_names = re.sub(
  3482. r'EGLDEBUGPROCKHR ([a-zA-Z0-9_]+)',
  3483. r'EGLDEBUGPROCKHR_\1', log_argument_names)
  3484. log_argument_names = re.sub(
  3485. r'(?<!E)GLenum ([a-zA-Z0-9_]+)', r'GLenum_\1', log_argument_names)
  3486. # Strip remaining types.
  3487. log_argument_names = re.sub(
  3488. r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2',
  3489. log_argument_names)
  3490. # One more round of stripping to remove both type parts in `unsigned long`.
  3491. log_argument_names = re.sub(
  3492. r'(const )?[a-zA-Z0-9_]+\** ([a-zA-Z0-9_]+)', r'\2',
  3493. log_argument_names)
  3494. # Convert TYPE_varname log arguments to the corresponding log expression.
  3495. log_argument_names = re.sub(
  3496. r'CONSTVOID_([a-zA-Z0-9_]+)',
  3497. r'static_cast<const void*>(\1)', log_argument_names)
  3498. log_argument_names = re.sub(
  3499. r'FUNCPTR_([a-zA-Z0-9_]+)',
  3500. r'reinterpret_cast<const void*>(\1)', log_argument_names)
  3501. log_argument_names = re.sub(
  3502. r'CONSTCHAR_([a-zA-Z0-9_]+)', r'\1', log_argument_names)
  3503. log_argument_names = re.sub(
  3504. r'GLboolean_([a-zA-Z0-9_]+)', r'GLEnums::GetStringBool(\1)',
  3505. log_argument_names)
  3506. log_argument_names = re.sub(
  3507. r'GLDEBUGPROC_([a-zA-Z0-9_]+)',
  3508. r'reinterpret_cast<void*>(\1)', log_argument_names)
  3509. log_argument_names = re.sub(
  3510. r'EGLDEBUGPROCKHR_([a-zA-Z0-9_]+)',
  3511. r'reinterpret_cast<void*>(\1)', log_argument_names)
  3512. log_argument_names = re.sub(
  3513. r'GLenum_([a-zA-Z0-9_]+)', r'GLEnums::GetStringEnum(\1)',
  3514. log_argument_names)
  3515. log_argument_names = log_argument_names.replace(',', ' << ", " <<')
  3516. if argument_names == 'void' or argument_names == '':
  3517. argument_names = ''
  3518. log_argument_names = ''
  3519. else:
  3520. log_argument_names = " << " + log_argument_names
  3521. function_name = func['known_as']
  3522. if return_type == 'void':
  3523. file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' %
  3524. (function_name, log_argument_names))
  3525. file.write(' %s_api_->%sFn(%s);\n' %
  3526. (set_name.lower(), function_name, argument_names))
  3527. if 'logging_code' in func:
  3528. file.write("%s\n" % func['logging_code'])
  3529. if options.generate_dchecks and set_name == 'gl':
  3530. file.write(' {\n')
  3531. file.write(' GLenum error = %s_api_->glGetErrorFn();\n'
  3532. % set_name.lower())
  3533. file.write(' DCHECK(error == 0) << "OpenGL error 0x" << std::hex '
  3534. '<< error << std::dec;\n')
  3535. file.write(' }\n')
  3536. else:
  3537. file.write(' GL_SERVICE_LOG("%s" << "(" %s << ")");\n' %
  3538. (function_name, log_argument_names))
  3539. file.write(' %s result = %s_api_->%sFn(%s);\n' %
  3540. (return_type, set_name.lower(), function_name, argument_names))
  3541. if 'logging_code' in func:
  3542. file.write("%s\n" % func['logging_code'])
  3543. else:
  3544. file.write(' GL_SERVICE_LOG("GL_RESULT: " << result);\n')
  3545. if options.generate_dchecks and set_name == 'gl':
  3546. file.write(' {\n')
  3547. file.write(' GLenum _error = %s_api_->glGetErrorFn();\n' %
  3548. set_name.lower())
  3549. file.write(' DCHECK(_error == 0) << "OpenGL error " << std::hex '
  3550. '<< _error << std::dec;\n')
  3551. file.write(' }\n')
  3552. file.write(' return result;\n')
  3553. file.write('}\n')
  3554. # Write NoContextGLApi functions
  3555. if set_name.upper() == "GL":
  3556. file.write('\n')
  3557. file.write('namespace {\n')
  3558. file.write('void NoContextHelper(const char* method_name) {\n')
  3559. no_context_error = ('<< "Trying to call " << method_name << " without '
  3560. 'current GL context"')
  3561. file.write(' NOTREACHED() %s;\n' % no_context_error)
  3562. file.write(' LOG(ERROR) %s;\n' % no_context_error)
  3563. file.write('}\n')
  3564. file.write('} // namespace\n')
  3565. for func in functions:
  3566. function_name = func['known_as']
  3567. return_type = func['return_type']
  3568. arguments = func['arguments']
  3569. file.write('\n')
  3570. file.write('%s NoContextGLApi::%sFn(%s) {\n' %
  3571. (return_type, function_name, arguments))
  3572. argument_names = MakeArgNames(arguments)
  3573. file.write(' NoContextHelper("%s");\n' % function_name)
  3574. default_value = { 'GLenum': 'static_cast<GLenum>(0)',
  3575. 'GLuint': '0U',
  3576. 'GLint': '0',
  3577. 'GLboolean': 'GL_FALSE',
  3578. 'GLbyte': '0',
  3579. 'GLubyte': '0',
  3580. 'GLbutfield': '0',
  3581. 'GLushort': '0',
  3582. 'GLsizei': '0',
  3583. 'GLfloat': '0.0f',
  3584. 'GLdouble': '0.0',
  3585. 'GLsync': 'nullptr',
  3586. 'GLDEBUGPROC': 'NULL'}
  3587. if return_type.endswith('*'):
  3588. file.write(' return NULL;\n')
  3589. elif return_type != 'void':
  3590. file.write(' return %s;\n' % default_value[return_type])
  3591. file.write('}\n')
  3592. file.write('\n')
  3593. file.write('} // namespace gl\n')
  3594. def GetUniquelyNamedFunctions(functions):
  3595. uniquely_named_functions = {}
  3596. for func in functions:
  3597. for version in func['versions']:
  3598. uniquely_named_functions[version['name']] = ({
  3599. 'name': version['name'],
  3600. 'return_type': func['return_type'],
  3601. 'arguments': func['arguments'],
  3602. 'known_as': func['known_as']
  3603. })
  3604. return uniquely_named_functions
  3605. def GenerateMockBindingsHeader(file, functions):
  3606. """Headers for functions that invoke MockGLInterface members"""
  3607. file.write(LICENSE_AND_HEADER +
  3608. """
  3609. // Silence presubmit and Tricium warnings about include guards
  3610. // no-include-guard-because-multiply-included
  3611. // NOLINT(build/header_guard)
  3612. """)
  3613. uniquely_named_functions = GetUniquelyNamedFunctions(functions)
  3614. for key in sorted(uniquely_named_functions.keys()):
  3615. func = uniquely_named_functions[key]
  3616. file.write('static %s GL_BINDING_CALL Mock_%s(%s);\n' %
  3617. (func['return_type'], func['name'], func['arguments']))
  3618. def GenerateMockBindingsSource(file, functions, set_name):
  3619. """Generates functions that invoke MockGLInterface members and a
  3620. GetGLProcAddress function that returns addresses to those functions."""
  3621. file.write(LICENSE_AND_HEADER +
  3622. """
  3623. #include <string.h>
  3624. #include "base/notreached.h"
  3625. #include "ui/gl/%s_mock.h"
  3626. namespace {
  3627. // This is called mainly to prevent the compiler combining the code of mock
  3628. // functions with identical contents, so that their function pointers will be
  3629. // different.
  3630. void Make%sMockFunctionUnique(const char *func_name) {
  3631. VLOG(2) << "Calling mock " << func_name;
  3632. }
  3633. } // namespace
  3634. namespace gl {
  3635. """ % (set_name, set_name.capitalize()))
  3636. # Write functions that trampoline into the set MockGLInterface instance.
  3637. uniquely_named_functions = GetUniquelyNamedFunctions(functions)
  3638. sorted_function_names = sorted(uniquely_named_functions.keys())
  3639. for key in sorted_function_names:
  3640. func = uniquely_named_functions[key]
  3641. file.write('\n')
  3642. file.write('%s GL_BINDING_CALL Mock%sInterface::Mock_%s(%s) {\n' %
  3643. (func['return_type'], set_name.upper(), func['name'],
  3644. func['arguments']))
  3645. file.write(' Make%sMockFunctionUnique("%s");\n' % (set_name.capitalize(),
  3646. func['name']))
  3647. arg_re = r'(const |struct )*[a-zA-Z0-9]+((\s*const\s*)?\*)* ([a-zA-Z0-9]+)'
  3648. argument_names = re.sub(arg_re, r'\4', func['arguments'])
  3649. if argument_names == 'void':
  3650. argument_names = ''
  3651. function_name = func['known_as'][len(set_name):]
  3652. if func['return_type'] == 'void':
  3653. file.write(' interface_->%s(%s);\n' %
  3654. (function_name, argument_names))
  3655. else:
  3656. file.write(' return interface_->%s(%s);\n' %
  3657. (function_name, argument_names))
  3658. file.write('}\n')
  3659. # Write an 'invalid' function to catch code calling through uninitialized
  3660. # function pointers or trying to interpret the return value of
  3661. # GLProcAddress().
  3662. file.write('\n')
  3663. file.write('static void Mock%sInvalidFunction() {\n' % set_name.capitalize())
  3664. file.write(' NOTREACHED();\n')
  3665. file.write('}\n')
  3666. # Write a function to lookup a mock GL function based on its name.
  3667. file.write('\n')
  3668. file.write('GLFunctionPointerType GL_BINDING_CALL ' +
  3669. 'Mock%sInterface::GetGLProcAddress(const char* name) {\n' % (
  3670. set_name.upper(),))
  3671. for key in sorted_function_names:
  3672. name = uniquely_named_functions[key]['name']
  3673. file.write(' if (strcmp(name, "%s") == 0)\n' % name)
  3674. file.write(
  3675. ' return reinterpret_cast<GLFunctionPointerType>(Mock_%s);\n' %
  3676. name)
  3677. # Always return a non-NULL pointer like some EGL implementations do.
  3678. file.write(' return reinterpret_cast<GLFunctionPointerType>('
  3679. '&Mock%sInvalidFunction);\n' % set_name.capitalize())
  3680. file.write('}\n')
  3681. file.write('\n')
  3682. file.write('} // namespace gl\n')
  3683. def SamePrefix(a, b):
  3684. return a[:a.rfind("_")] == b[:b.rfind("_")]
  3685. def GenerateEnumUtils(out_file, input_filenames):
  3686. enum_re = re.compile(r'\#define\s+(GL_[a-zA-Z0-9_]+)\s+([0-9A-Fa-fx]+)')
  3687. dict = {}
  3688. for fname in input_filenames:
  3689. lines = open(fname).readlines()
  3690. for line in lines:
  3691. m = enum_re.match(line)
  3692. if m:
  3693. name = m.group(1)
  3694. value = m.group(2)
  3695. if len(value) <= 10 and value.startswith('0x'):
  3696. if not value in dict:
  3697. dict[value] = name
  3698. # check our own _CHROMIUM macro conflicts with khronos GL headers.
  3699. # we allow for name duplication if they have the same prefix.
  3700. elif dict[value] != name and ((name.endswith('_CHROMIUM') or
  3701. dict[value].endswith('_CHROMIUM')) and
  3702. not SamePrefix(name, dict[value])):
  3703. raise RuntimeError("code collision: %s and %s have the same code %s"
  3704. % (dict[value], name, value))
  3705. out_file.write(LICENSE_AND_HEADER +
  3706. """
  3707. #ifndef UI_GL_GL_ENUMS_IMPLEMENTATION_AUTOGEN_H_
  3708. #define UI_GL_GL_ENUMS_IMPLEMENTATION_AUTOGEN_H_
  3709. """)
  3710. out_file.write("static const GLEnums::EnumToString "
  3711. "enum_to_string_table[] = {\n")
  3712. for value in sorted(dict):
  3713. out_file.write(' { %s, "%s", },\n' % (value, dict[value]))
  3714. out_file.write("""};
  3715. const GLEnums::EnumToString* const GLEnums::enum_to_string_table_ =
  3716. enum_to_string_table;
  3717. const size_t GLEnums::enum_to_string_table_len_ =
  3718. sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]);
  3719. """)
  3720. out_file.write('#endif // UI_GL_GL_ENUMS_IMPLEMENTATION_AUTOGEN_H_')
  3721. def ParseFunctionsFromHeader(header_file, extensions, versions):
  3722. """Parse a C extension header file and return a map from extension names to
  3723. a list of functions.
  3724. Args:
  3725. header_file: Line-iterable C header file.
  3726. Returns:
  3727. Map of extension name => functions, Map of gl version => functions.
  3728. Functions will only be in either one of the two maps.
  3729. """
  3730. version_start = re.compile(
  3731. r'#ifndef GL_(ES_|)VERSION((?:_[0-9])+)$')
  3732. extension_start = re.compile(
  3733. r'#ifndef ((?:GL|EGL|GLX)_[A-Z]+_[a-zA-Z]\w+)')
  3734. extension_function = re.compile(r'.+\s+([a-z]+\w+)\s*\(')
  3735. typedef = re.compile(r'typedef .*')
  3736. macro_start = re.compile(r'^#(if|ifdef|ifndef).*')
  3737. macro_end = re.compile(r'^#endif.*')
  3738. macro_depth = 0
  3739. current_version = None
  3740. current_version_depth = 0
  3741. current_extension = None
  3742. current_extension_depth = 0
  3743. # Pick up all core functions here, since some of them are missing in the
  3744. # Khronos headers.
  3745. hdr = os.path.basename(header_file.name)
  3746. if hdr == "gl.h":
  3747. current_version = GLVersion(False, 1, 0)
  3748. line_num = 1
  3749. for line in header_file:
  3750. version_match = version_start.match(line)
  3751. if macro_start.match(line):
  3752. macro_depth += 1
  3753. if version_match:
  3754. if current_version:
  3755. raise RuntimeError('Nested GL version macro in %s at line %d' % (
  3756. header_file.name, line_num))
  3757. current_version_depth = macro_depth
  3758. es = version_match.group(1)
  3759. major_version, minor_version =\
  3760. version_match.group(2).lstrip('_').split('_')
  3761. is_es = len(es) > 0
  3762. if (not is_es) and (major_version == '1'):
  3763. minor_version = 0
  3764. current_version = GLVersion(
  3765. is_es, int(major_version), int(minor_version))
  3766. elif macro_end.match(line):
  3767. macro_depth -= 1
  3768. if macro_depth < current_extension_depth:
  3769. current_extension = None
  3770. if macro_depth < current_version_depth:
  3771. current_version = None
  3772. match = extension_start.match(line)
  3773. if match and not version_match:
  3774. if current_version and hdr != "gl.h":
  3775. raise RuntimeError('Nested GL version macro in %s at line %d' % (
  3776. header_file.name, line_num))
  3777. current_extension = match.group(1)
  3778. current_extension_depth = macro_depth
  3779. match = extension_function.match(line)
  3780. if match and not typedef.match(line):
  3781. if current_extension:
  3782. extensions[current_extension].add(match.group(1))
  3783. elif current_version:
  3784. versions[current_version].add(match.group(1))
  3785. line_num = line_num + 1
  3786. def GetDynamicFunctions(extension_headers):
  3787. """Parse all optional functions from a list of header files.
  3788. Args:
  3789. extension_headers: List of header file names.
  3790. Returns:
  3791. Map of extension name => list of functions,
  3792. Map of gl version => list of functions.
  3793. """
  3794. extensions = collections.defaultdict(lambda: set([]))
  3795. gl_versions = collections.defaultdict(lambda: set([]))
  3796. for header in extension_headers:
  3797. ParseFunctionsFromHeader(open(header), extensions, gl_versions)
  3798. return extensions, gl_versions
  3799. def GetFunctionToExtensionsMap(extensions):
  3800. """Construct map from a function names to extensions which define the
  3801. function.
  3802. Args:
  3803. extensions: Map of extension name => functions.
  3804. Returns:
  3805. Map of function name => extension names.
  3806. """
  3807. function_to_extensions = {}
  3808. for extension, functions in extensions.items():
  3809. for function in functions:
  3810. if not function in function_to_extensions:
  3811. function_to_extensions[function] = set([])
  3812. function_to_extensions[function].add(extension)
  3813. return function_to_extensions
  3814. def GetFunctionToGLVersionsMap(gl_versions):
  3815. """Construct map from a function names to GL versions which define the
  3816. function.
  3817. Args:
  3818. extensions: Map of gl versions => functions.
  3819. Returns:
  3820. Map of function name => gl versions.
  3821. """
  3822. function_to_gl_versions = {}
  3823. for gl_version, functions in gl_versions.items():
  3824. for function in functions:
  3825. if not function in function_to_gl_versions:
  3826. function_to_gl_versions[function] = set([])
  3827. function_to_gl_versions[function].add(gl_version)
  3828. return function_to_gl_versions
  3829. def LooksLikeExtensionFunction(function):
  3830. """Heuristic to see if a function name is consistent with extension function
  3831. naming."""
  3832. vendor = re.match(r'\w+?([A-Z][A-Z]+)$', function)
  3833. return vendor is not None and not vendor.group(1) in ['GL', 'API', 'DC']
  3834. def SortVersions(key):
  3835. # Prefer functions from the core for binding
  3836. if 'gl_versions' in key:
  3837. return 0
  3838. else:
  3839. return 1
  3840. def FillExtensionsFromHeaders(functions, extension_headers, extra_extensions):
  3841. """Determine which functions belong to extensions based on extension headers,
  3842. and fill in this information to the functions table for functions that don't
  3843. already have the information.
  3844. Args:
  3845. functions: List of (return type, function versions, arguments).
  3846. extension_headers: List of header file names.
  3847. extra_extensions: Extensions to add to the list.
  3848. Returns:
  3849. Set of used extensions.
  3850. """
  3851. # Parse known extensions.
  3852. extensions, gl_versions = GetDynamicFunctions(extension_headers)
  3853. functions_to_extensions = GetFunctionToExtensionsMap(extensions)
  3854. functions_to_gl_versions = GetFunctionToGLVersionsMap(gl_versions)
  3855. # Fill in the extension information.
  3856. used_extensions = set()
  3857. used_client_extensions = set()
  3858. used_functions_by_version = collections.defaultdict(lambda: set([]))
  3859. for func in functions:
  3860. for version in func['versions']:
  3861. name = version['name']
  3862. # There should only be one version entry per name string.
  3863. if len([v for v in func['versions'] if v['name'] == name]) > 1:
  3864. raise RuntimeError(
  3865. 'Duplicate version entries with same name for %s' % name)
  3866. # Make sure we know about all extensions and extension functions.
  3867. extensions_from_headers = set([])
  3868. if name in functions_to_extensions:
  3869. extensions_from_headers = set(functions_to_extensions[name])
  3870. explicit_extensions = set([])
  3871. if 'client_extensions' in version:
  3872. assert not 'extensions' in version
  3873. version['extensions'] = version['client_extensions']
  3874. if 'extensions' in version:
  3875. explicit_extensions = set(version['extensions'])
  3876. in_both = explicit_extensions.intersection(extensions_from_headers)
  3877. if len(in_both):
  3878. print("[%s] Specified redundant extensions for binding: %s" % (
  3879. name, ', '.join(in_both)))
  3880. diff = explicit_extensions - extensions_from_headers
  3881. if len(diff):
  3882. print("[%s] Specified extra extensions for binding: %s" % (
  3883. name, ', '.join(diff)))
  3884. if version.get('explicit_only', False):
  3885. all_extensions = explicit_extensions
  3886. else:
  3887. all_extensions = extensions_from_headers.union(explicit_extensions)
  3888. if len(all_extensions):
  3889. version['extensions'] = all_extensions
  3890. if 'extensions' in version:
  3891. assert len(version['extensions'])
  3892. if 'client_extensions' in version:
  3893. used_client_extensions.update(version['extensions'])
  3894. else:
  3895. used_extensions.update(version['extensions'])
  3896. if not 'extensions' in version and LooksLikeExtensionFunction(name):
  3897. raise RuntimeError('%s looks like an extension function but does not '
  3898. 'belong to any of the known extensions.' % name)
  3899. if name in functions_to_gl_versions:
  3900. assert not 'gl_versions' in version
  3901. version['gl_versions'] = functions_to_gl_versions[name]
  3902. for v in version['gl_versions']:
  3903. used_functions_by_version[v].add(name)
  3904. func['versions'] = sorted(func['versions'], key=SortVersions)
  3905. # Add extensions that do not have any functions.
  3906. used_extensions.update(extra_extensions)
  3907. # Print out used function count by GL(ES) version.
  3908. for v in sorted([v for v in used_functions_by_version if v.is_es]):
  3909. print("OpenGL ES %d.%d: %d used functions" % (
  3910. v.major_version, v.minor_version, len(used_functions_by_version[v])))
  3911. for v in sorted([v for v in used_functions_by_version if not v.is_es]):
  3912. print("OpenGL %d.%d: %d used functions" % (
  3913. v.major_version, v.minor_version, len(used_functions_by_version[v])))
  3914. return used_extensions, used_client_extensions
  3915. def ResolveHeader(header, header_paths):
  3916. for path in header_paths:
  3917. result = os.path.join(path, header)
  3918. if not os.path.isabs(path):
  3919. result = os.path.abspath(os.path.join(SELF_LOCATION, result))
  3920. if os.path.exists(result):
  3921. # Always use forward slashes as path separators. Otherwise backslashes
  3922. # may be incorrectly interpreted as escape characters.
  3923. return result.replace(os.path.sep, '/')
  3924. raise Exception('Header %s not found.' % header)
  3925. def main(argv):
  3926. """This is the main function."""
  3927. parser = optparse.OptionParser()
  3928. parser.add_option('--inputs', action='store_true')
  3929. parser.add_option('--verify-order', action='store_true')
  3930. parser.add_option('--generate-dchecks', action='store_true',
  3931. help='Generates DCHECKs into the logging functions '
  3932. 'asserting no GL errors (useful for debugging with '
  3933. '--enable-gpu-service-logging)')
  3934. parser.add_option('--validate-bindings', action='store_true',
  3935. help='Generate DCHECKs to validate function bindings '
  3936. ' were correctly supplied (useful for debugging)')
  3937. options, args = parser.parse_args(argv)
  3938. if options.inputs:
  3939. for [_, _, headers, _] in FUNCTION_SETS:
  3940. for header in headers:
  3941. print(ResolveHeader(header, HEADER_PATHS))
  3942. return 0
  3943. directory = SELF_LOCATION
  3944. if len(args) >= 1:
  3945. directory = args[0]
  3946. def ClangFormat(filename):
  3947. formatter = "clang-format"
  3948. if platform.system() == "Windows":
  3949. formatter += ".bat"
  3950. call([formatter, "-i", "-style=chromium", filename])
  3951. for [functions, set_name, extension_headers, extensions] in FUNCTION_SETS:
  3952. # Function names can be specified in two ways (list of unique names or list
  3953. # of versions with different binding conditions). Fill in the data to the
  3954. # versions list in case it is missing, so that can be used from here on:
  3955. for func in functions:
  3956. assert 'versions' in func or 'names' in func, 'Function with no names'
  3957. if 'versions' not in func:
  3958. func['versions'] = [{'name': n} for n in func['names']]
  3959. # Use the first version's name unless otherwise specified
  3960. if 'known_as' not in func:
  3961. func['known_as'] = func['versions'][0]['name']
  3962. # Make sure that 'names' is not accidentally used instead of 'versions'
  3963. if 'names' in func:
  3964. del func['names']
  3965. # Check function names in each set is sorted in alphabetical order.
  3966. for index in range(len(functions) - 1):
  3967. func_name = functions[index]['known_as']
  3968. next_func_name = functions[index + 1]['known_as']
  3969. if func_name.lower() > next_func_name.lower():
  3970. raise Exception(
  3971. 'function %s is not in alphabetical order' % next_func_name)
  3972. if options.verify_order:
  3973. continue
  3974. extension_headers = [ResolveHeader(h, HEADER_PATHS)
  3975. for h in extension_headers]
  3976. used_extensions, used_client_extensions = FillExtensionsFromHeaders(
  3977. functions, extension_headers, extensions)
  3978. if set_name == 'egl':
  3979. used_extensions.update(EGL_EXTENSIONS_EXTRA)
  3980. used_client_extensions.update(EGL_CLIENT_EXTENSIONS_EXTRA)
  3981. header_file = open(
  3982. os.path.join(directory, 'gl_bindings_autogen_%s.h' % set_name), 'w')
  3983. GenerateHeader(header_file, functions, set_name,
  3984. used_extensions, used_client_extensions)
  3985. header_file.close()
  3986. ClangFormat(header_file.name)
  3987. header_file = open(
  3988. os.path.join(directory, 'gl_bindings_api_autogen_%s.h' % set_name),
  3989. 'w')
  3990. GenerateAPIHeader(header_file, functions, set_name)
  3991. header_file.close()
  3992. ClangFormat(header_file.name)
  3993. source_file = open(
  3994. os.path.join(directory, 'gl_bindings_autogen_%s.cc' % set_name), 'w')
  3995. GenerateSource(source_file, functions, set_name,
  3996. used_extensions, used_client_extensions, options)
  3997. source_file.close()
  3998. ClangFormat(source_file.name)
  3999. if not options.verify_order:
  4000. header_file = open(
  4001. os.path.join(directory, 'gl_mock_autogen_gl.h'), 'w')
  4002. GenerateMockHeader(header_file, GL_FUNCTIONS, 'gl')
  4003. header_file.close()
  4004. ClangFormat(header_file.name)
  4005. header_file = open(os.path.join(directory, 'gl_bindings_autogen_mock.h'),
  4006. 'w')
  4007. GenerateMockBindingsHeader(header_file, GL_FUNCTIONS)
  4008. header_file.close()
  4009. ClangFormat(header_file.name)
  4010. source_file = open(os.path.join(directory, 'gl_bindings_autogen_mock.cc'),
  4011. 'w')
  4012. GenerateMockBindingsSource(source_file, GL_FUNCTIONS, 'gl')
  4013. source_file.close()
  4014. ClangFormat(source_file.name)
  4015. header_file = open(
  4016. os.path.join(directory, 'gl_mock_autogen_egl.h'), 'w')
  4017. GenerateMockHeader(header_file, EGL_FUNCTIONS, 'egl')
  4018. header_file.close()
  4019. ClangFormat(header_file.name)
  4020. header_file = open(os.path.join(directory, 'egl_bindings_autogen_mock.h'),
  4021. 'w')
  4022. GenerateMockBindingsHeader(header_file, EGL_FUNCTIONS)
  4023. header_file.close()
  4024. ClangFormat(header_file.name)
  4025. source_file = open(os.path.join(directory, 'egl_bindings_autogen_mock.cc'),
  4026. 'w')
  4027. GenerateMockBindingsSource(source_file, EGL_FUNCTIONS, 'egl')
  4028. source_file.close()
  4029. ClangFormat(source_file.name)
  4030. enum_header_filenames = [ResolveHeader(h, HEADER_PATHS)
  4031. for h in GLES2_HEADERS_WITH_ENUMS]
  4032. header_file = open(os.path.join(directory,
  4033. 'gl_enums_implementation_autogen.h'),
  4034. 'w')
  4035. GenerateEnumUtils(header_file, enum_header_filenames)
  4036. header_file.close()
  4037. ClangFormat(header_file.name)
  4038. header_file = open(
  4039. os.path.join(directory, 'gl_stub_autogen_gl.h'), 'w')
  4040. GenerateStubHeader(header_file, GL_FUNCTIONS)
  4041. header_file.close()
  4042. ClangFormat(header_file.name)
  4043. header_file = open(
  4044. os.path.join(directory, 'gl_stub_autogen_gl.cc'), 'w')
  4045. GenerateStubSource(header_file, GL_FUNCTIONS)
  4046. header_file.close()
  4047. ClangFormat(header_file.name)
  4048. return 0
  4049. if __name__ == '__main__':
  4050. sys.exit(main(sys.argv[1:]))