<refentry xmlns="http://docbook.org/ns/docbook" version="5.0" xml:base="" xml:id="eglGetProcAddress">
    <info>
         <copyright>
             <year>2003-2018</year>
             <holder>The Khronos Group Inc.</holder>
         </copyright>
    </info>
    <refmeta>
        <refentrytitle>eglGetProcAddress</refentrytitle>
        <manvolnum>3G</manvolnum>
    </refmeta>
    <refnamediv>
        <refname>eglGetProcAddress</refname>
        <refpurpose>
            return a <acronym>GL</acronym> or an <acronym>EGL</acronym>
            extension function
        </refpurpose>
    </refnamediv>
    <refsynopsisdiv>
        <title>C Specification</title>
        <funcsynopsis>
            <funcprototype>
                <funcdef>void (* <function>eglGetProcAddress</function></funcdef>
                <paramdef>char const * <parameter>procname</parameter>))(void</paramdef>
            </funcprototype>
        </funcsynopsis>
    </refsynopsisdiv>
    <refsect1 xml:id="parameters"><title>Parameters</title>
        <variablelist>
            <varlistentry>
                <term><parameter>procname</parameter></term>
                <listitem>
                    <para>
                        Specifies the name of the function to return.
                    </para>
                </listitem>
            </varlistentry>
        </variablelist>
    </refsect1>
    <refsect1 xml:id="description"><title>Description</title>
        <para>
            <function>eglGetProcAddress</function> returns the address of
            the client API or EGL function named by
            <parameter>procname</parameter>. <parameter>procname</parameter>
            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 <constant>NULL</constant> indicates that the specific
            function does not exist for the implementation.
        </para>
        <para>
            A non-<constant>NULL</constant> return value does not guarantee
            that an extension function is actually supported at runtime. The
            client must also make a corresponding query, such as
            <function>glGetString</function>(<constant>GL_EXTENSIONS</constant>)
            for OpenGL and OpenGL ES extensions;
            <function>vgGetString</function>(<constant>VG_EXTENSIONS</constant>)
            for OpenVG extensions;
            <function>eglQueryString</function>(<parameter>display</parameter>,
            <constant>EGL_EXTENSIONS</constant>); 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.
        </para>
        <para>
            Client API function pointers returned by
            <function>eglGetProcAddress</function> 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.
        </para>
        <para>
            <function>eglGetProcAddress</function> 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).
        </para>
        <para>
            For functions that are queryable with
            <function>eglGetProcAddress</function>, implementations may
            choose to also export those functions statically from the object
            libraries implementing those functions. However, portable
            clients cannot rely on this behavior.
        </para>
    </refsect1>
    <refsect1 xml:id="notes"><title>Notes</title>
        <para>
            If the EGL version is not 1.5 or greater, only queries of EGL
            and client API <emphasis>extension</emphasis> functions will
            succeed.
        </para>
    </refsect1>
    <refsect1 xml:id="seealso"><title>See Also</title>
        <para>
            <function>glGetString</function>
            <citerefentry><refentrytitle>eglQueryString</refentrytitle></citerefentry>    </para>
            <function>vgGetString</function>
    </refsect1>
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="copyright.xml"/>
</refentry>
