<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title xmlns:xlink="http://www.w3.org/1999/xlink">eglGetProcAddress - EGL Reference Pages</title>
    <link rel="stylesheet" type="text/css" href="khronos-man.css"/>
    <meta name="generator" content="DocBook XSL Stylesheets V1.78.1"/>
  </head>
  <body>
    <header/>
    <div class="refentry" id="eglGetProcAddress">
      <div class="titlepage"/>
      <div class="refnamediv">
        <h2>Name</h2>
        <p>eglGetProcAddress — 
            return a <abbr class="acronym">GL</abbr> or an <abbr class="acronym">EGL</abbr>
            extension function
        </p>
      </div>
      <div class="refsynopsisdiv">
        <h2>C Specification</h2>
        <div class="funcsynopsis">
          <table style="border: 0; cellspacing: 0; cellpadding: 0;" class="funcprototype-table">
            <tr>
              <td>
                <code class="funcdef">void (* <strong class="fsfunc">eglGetProcAddress</strong>)()(</code>
              </td>
              <td>char const * <var class="pdparam">procname</var><code>)</code>;</td>
            </tr>
          </table>
          <div class="funcprototype-spacer"> </div>
        </div>
      </div>
      <div class="refsect1" id="parameters">
        <h2>Parameters</h2>
        <div class="variablelist">
          <dl class="variablelist">
            <dt>
              <span class="term">
                <em class="parameter">
                  <code>procname</code>
                </em>
              </span>
            </dt>
            <dd>
              <p>
                        Specifies the name of the function to return.
                    </p>
            </dd>
          </dl>
        </div>
      </div>
      <div class="refsect1" id="description">
        <h2>Description</h2>
        <p>
            <code class="function">eglGetProcAddress</code> returns the address of
            the extension function named by <em class="parameter"><code>procname</code></em>.
            <em class="parameter"><code>procname</code></em>
            must be a null-terminated string. The pointer returned
            should be cast to a function pointer type matching the extension
            function's definition in that extension specification. A return value
            of <code class="constant">NULL</code> indicates that the specific
            function does not exist for the <abbr class="acronym">EGL</abbr> implementation.
        </p>
        <p>
            A non-<code class="constant">NULL</code> return value does not guarantee
            that an extension function is actually supported at runtime. The client
            must also query
            <a class="citerefentry" href="glGetString.xhtml"><span class="citerefentry"><span class="refentrytitle">glGetString</span></span></a>(<code class="constant">GL_EXTENSIONS</code>) or
            <a class="citerefentry" href="eglQueryString.xhtml"><span class="citerefentry"><span class="refentrytitle">eglQueryString</span></span></a>(<em class="parameter"><code>display</code></em>,
            <code class="constant">EGL_EXTENSIONS</code>) to determine if an
            extension is supported by a particular context or display.
        </p>
        <p>
            Function pointers returned by
            <code class="function">eglGetProcAddress</code> are independent of the
            display and the currently bound context and may be used by any context
            which supports the extension.
        </p>
        <p>
            <code class="function">eglGetProcAddress</code> may be queried for all
            <abbr class="acronym">GL</abbr> and <abbr class="acronym">EGL</abbr> extension functions.
        </p>
      </div>
      <div class="refsect1" id="seealso">
        <h2>See Also</h2>
        <p>
            <a class="citerefentry" href="glGetString.xhtml"><span class="citerefentry"><span class="refentrytitle">glGetString</span></span></a>,
            <a class="citerefentry" href="eglQueryString.xhtml"><span class="citerefentry"><span class="refentrytitle">eglQueryString</span></span></a>    </p>
      </div>
      <p>
    </p>
      <div class="refsect3" id="copyright">
        <img src="KhronosLogo.jpg"/>
        <p>
            Copyright © 2003-2014 The Khronos Group Inc.
            Permission is hereby granted, free of charge, to any person obtaining a
            copy of this software and/or associated documentation files (the
            "Materials"), to deal in the Materials without restriction, including
            without limitation the rights to use, copy, modify, merge, publish,
            distribute, sublicense, and/or sell copies of the Materials, and to
            permit persons to whom the Materials are furnished to do so, subject to
            the condition that this copyright notice and permission notice shall be included
            in all copies or substantial portions of the Materials.
        </p>
      </div>
      <p>
</p>
    </div>
    <footer/>
  </body>
</html>
