summaryrefslogtreecommitdiffstats
path: root/third_party/libepoxy/libepoxy/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libepoxy/libepoxy/README.md')
-rw-r--r--third_party/libepoxy/libepoxy/README.md126
1 files changed, 126 insertions, 0 deletions
diff --git a/third_party/libepoxy/libepoxy/README.md b/third_party/libepoxy/libepoxy/README.md
new file mode 100644
index 0000000000..9d83ed9e8b
--- /dev/null
+++ b/third_party/libepoxy/libepoxy/README.md
@@ -0,0 +1,126 @@
+![Ubuntu](https://github.com/anholt/libepoxy/workflows/Ubuntu/badge.svg)
+![macOS](https://github.com/anholt/libepoxy/workflows/macOS/badge.svg)
+![MSVC Build](https://github.com/anholt/libepoxy/workflows/MSVC%20Build/badge.svg)
+![MSYS2 Build](https://github.com/anholt/libepoxy/workflows/MSYS2%20Build/badge.svg)
+[![License: MIT](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT)
+
+Epoxy is a library for handling OpenGL function pointer management for
+you.
+
+It hides the complexity of `dlopen()`, `dlsym()`, `glXGetProcAddress()`,
+`eglGetProcAddress()`, etc. from the app developer, with very little
+knowledge needed on their part. They get to read GL specs and write
+code using undecorated function names like `glCompileShader()`.
+
+Don't forget to check for your extensions or versions being present
+before you use them, just like before! We'll tell you what you forgot
+to check for instead of just segfaulting, though.
+
+Features
+--------
+
+ * Automatically initializes as new GL functions are used.
+ * GL 4.6 core and compatibility context support.
+ * GLES 1/2/3 context support.
+ * Knows about function aliases so (e.g.) `glBufferData()` can be
+ used with `GL_ARB_vertex_buffer_object` implementations, along
+ with GL 1.5+ implementations.
+ * EGL, GLX, and WGL support.
+ * Can be mixed with non-epoxy GL usage.
+
+Building
+--------
+
+```sh
+mkdir _build && cd _build
+meson
+ninja
+sudo ninja install
+```
+
+Dependencies for Debian:
+
+ * meson
+ * libegl1-mesa-dev
+
+Dependencies for macOS (using MacPorts):
+
+ * pkgconfig
+ * meson
+
+The test suite has additional dependencies depending on the platform.
+(X11, EGL, a running X Server).
+
+Switching your code to using epoxy
+----------------------------------
+
+It should be as easy as replacing:
+
+```cpp
+#include <GL/gl.h>
+#include <GL/glx.h>
+#include <GL/glext.h>
+```
+
+with:
+
+```cpp
+#include <epoxy/gl.h>
+#include <epoxy/glx.h>
+```
+
+As long as epoxy's headers appear first, you should be ready to go.
+Additionally, some new helpers become available, so you don't have to
+write them:
+
+`int epoxy_gl_version()` returns the GL version:
+
+ * 12 for GL 1.2
+ * 20 for GL 2.0
+ * 44 for GL 4.4
+
+`bool epoxy_has_gl_extension()` returns whether a GL extension is
+available (`GL_ARB_texture_buffer_object`, for example).
+
+Note that this is not terribly fast, so keep it out of your hot paths,
+ok?
+
+Why not use libGLEW?
+--------------------
+
+GLEW has several issues:
+
+ * Doesn't know about aliases of functions (There are 5 providers of
+ `glPointParameterfv()`, for example, and you don't want to have to
+ choose which one to call when they're all the same).
+ * Doesn't support OpenGL ES.
+ * Has a hard-to-maintain parser of extension specification text
+ instead of using the old .spec file or the new .xml.
+ * Has significant startup time overhead when `glewInit()`
+ autodetects the world.
+ * User-visible multithreading support choice for win32.
+
+The motivation for this project came out of previous use of libGLEW in
+[piglit](http://piglit.freedesktop.org/). Other GL dispatch code
+generation projects had similar failures. Ideally, piglit wants to be
+able to build a single binary for a test that can run on whatever
+context or window system it chooses, not based on link time choices.
+
+We had to solve some of GLEW's problems for piglit and solving them
+meant replacing every single piece of GLEW, so we built
+piglit-dispatch from scratch. And since we wanted to reuse it in
+other GL-related projects, this is the result.
+
+Known issues when running on Windows
+------------------------------------
+
+The automatic per-context symbol resolution for win32 requires that
+epoxy knows when `wglMakeCurrent()` is called, because `wglGetProcAddress()`
+returns values depend on the context's device and pixel format. If
+`wglMakeCurrent()` is called from outside of epoxy (in a way that might
+change the device or pixel format), then epoxy needs to be notified of
+the change using the `epoxy_handle_external_wglMakeCurrent()` function.
+
+The win32 `wglMakeCurrent()` variants are slower than they should be,
+because they should be caching the resolved dispatch tables instead of
+resetting an entire thread-local dispatch table every time.