<?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.79.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 client API or EGL 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 matching the function's definition in
            the corresponding API or extension specification. A return value
            of <code class="constant">NULL</code> indicates that the specific
            function does not exist for the 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 make a corresponding query, such as
            <code class="function">glGetString</code>(<code class="constant">GL_EXTENSIONS</code>)
            for OpenGL and OpenGL ES extensions;
            <code class="function">vgGetString</code>(<code class="constant">VG_EXTENSIONS</code>)
            for OpenVG extensions;
            <code class="function">eglQueryString</code>(<em class="parameter"><code>display</code></em>,
            <code class="constant">EGL_EXTENSIONS</code>); or query the EGL or client
            API version for non-extension functions, to determine if a
            function is supported by EGL or a specific client API context.
        </p>
        <p>
            Client API function pointers returned by
            <code class="function">eglGetProcAddress</code> are independent of the
            display and the currently bound client API context, and may be
            used by any client API context which supports the function.
        </p>
        <p>
            <code class="function">eglGetProcAddress</code> may be queried for all
            EGL and client API functions supported by the implementation
            (whether those functions are extensions or not, and whether they
            are supported by the current client API context or not).
        </p>
        <p>
            For functions that are queryable with
            <code class="function">eglGetProcAddress</code>, implementations may
            choose to also export those functions statically from the object
            libraries implementing those functions. However, portable
            clients cannot rely on this behavior.
        </p>
      </div>
      <div class="refsect1" id="notes">
        <h2>Notes</h2>
        <p>
            If the EGL version is not 1.5 or greater, only queries of EGL
            and client API <span class="emphasis"><em>extension</em></span> functions will
            succeed.
        </p>
      </div>
      <div class="refsect1" id="seealso">
        <h2>See Also</h2>
        <p>
            <code class="function">glGetString</code>
            <a class="citerefentry" href="eglQueryString.xhtml"><span class="citerefentry"><span class="refentrytitle">eglQueryString</span></span></a>    </p>
        <code class="function">vgGetString</code>
      </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>
