libglvnd/src/GLX/glvnd_genentry.h

112 lines
3.9 KiB
C

/*
* Copyright (c) 2015, NVIDIA CORPORATION.
*
* 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 following conditions:
*
* The above copyright notice and this permission notice shall be included
* unaltered in all copies or substantial portions of the Materials.
* Any additions, deletions, or changes to the original source files
* must be clearly indicated in accompanying documentation.
*
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
#ifndef GLVND_GENENTRY_H
#define GLVND_GENENTRY_H
/**
* \file
*
* Functions for generating simple entrypoints that only jump to another
* function.
*
* Unlike the functions generated from libGLdispatch, these functions don't use
* any per-thread state. Each one has exactly one function that it jumps to.
*
* These are used to generate entrypoints for GLX extension functions when we
* haven't loaded a vendor library that supports them yet. We can return a
* generated entrypoint function to the app, and then later on, after we load a
* vendor library, we can find and plug in the actual dispatch functions.
*
* Each entrypoint starts with a default dispatch function, which currently
* does nothing and returns NULL.
*
* Note that these functions are not thread-safe. The caller must ensure that
* only one thread at a time calls \c glvndGenerateEntrypoint or
* \c glvndUpdateEntrypoints.
*/
#if defined(__cplusplus)
extern "C" {
#endif
/**
* A typedef used for a generic entrypoint or dispatch stub.
*
* Note that this type is identical to __GLXextFuncPtr,
* __eglMustCastToProperFunctionPointerType, and __GLdispatchProc.
*/
typedef void (* GLVNDentrypointStub)(void);
/**
* A callback used by \c glvndUpdateEntrypoints.
*
* It should return a pointer to a function, which will be plugged into the
* entrypoint.
*
* If no matching function is found, then the callback should return \c NULL.
*
* \param procName The name of the function to look up.
* \param param The parameter passed to \c glvndUpdateEntrypoints.
* \return A function pointer, or NULL.
*/
typedef GLVNDentrypointStub (* GLVNDentrypointUpdateCallback) (const char *procName, void *param);
/**
* Generates an entrypoint for a function.
*
* Multiple calls for the same name will return the same function.
*
* \param procName The name of the function.
* \return A newly-generated entrypoint function, or \c NULL on error.
*/
GLVNDentrypointStub glvndGenerateEntrypoint(const char *procName);
/**
* Frees any memory allocated for the generated entrypoints.
*/
void glvndFreeEntrypoints(void);
/**
* Goes through the list of entrypoints and calls \p callback for each
* entrypoint that doesn't have a function assigned to it yet.
*
* If the callback returns a non-NULL value, then that function will be
* assigned to the entrypoint.
*
* If the callback returns \c NULL, then the entrypoint is not modified.
*
* \param callback A callback to look up the functions for each entrypoint.
* \param param An arbitrary value passed to \p callback.
*/
void glvndUpdateEntrypoints(GLVNDentrypointUpdateCallback callback, void *param);
#if defined(__cplusplus)
}
#endif
#endif // GLVND_GENENTRY_H