Last active
June 13, 2018 05:33
-
-
Save BlGene/7796f4a543e12fb4b6a7be662fc59f0f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//g++ egl.cpp ../../out/src/egl_gl.c ../../out/src/gl.c -I ../../out/include/ -l dl | |
#include <pthread.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <glad/gl.h> | |
#include <glad/egl.h> | |
struct EGLInternalData2 { | |
bool m_isInitialized; | |
int m_windowWidth; | |
int m_windowHeight; | |
int m_renderDevice; | |
EGLBoolean success; | |
EGLint num_configs; | |
EGLConfig egl_config; | |
EGLSurface egl_surface; | |
EGLContext egl_context; | |
EGLDisplay egl_display; | |
EGLInternalData2() | |
: m_isInitialized(false), | |
m_windowWidth(0), | |
m_windowHeight(0) {} | |
}; | |
int main() { | |
EGLInternalData2* m_data = new EGLInternalData2(); | |
m_data->m_windowWidth = 800; | |
m_data->m_windowHeight = 600; | |
m_data->m_renderDevice = -1; | |
EGLint egl_config_attribs[] = {EGL_RED_SIZE, | |
8, | |
EGL_GREEN_SIZE, | |
8, | |
EGL_BLUE_SIZE, | |
8, | |
EGL_DEPTH_SIZE, | |
8, | |
EGL_SURFACE_TYPE, | |
EGL_PBUFFER_BIT, | |
EGL_RENDERABLE_TYPE, | |
EGL_OPENGL_BIT, | |
EGL_NONE}; | |
EGLint egl_pbuffer_attribs[] = { | |
EGL_WIDTH, m_data->m_windowWidth, EGL_HEIGHT, m_data->m_windowHeight, | |
EGL_NONE, | |
}; | |
// Load EGL functions | |
int egl_version = gladLoadEGLInternalLoader(NULL); | |
if(!egl_version) { | |
fprintf(stderr, "failed to EGL with glad.\n"); | |
exit(EXIT_FAILURE); | |
}; | |
// Query EGL Devices | |
const int max_devices = 32; | |
EGLDeviceEXT egl_devices[max_devices]; | |
EGLint num_devices = 0; | |
EGLint egl_error = eglGetError(); | |
if (!eglQueryDevicesEXT(max_devices, egl_devices, &num_devices) || | |
egl_error != EGL_SUCCESS) { | |
printf("eglQueryDevicesEXT Failed.\n"); | |
m_data->egl_display = EGL_NO_DISPLAY; | |
} | |
// Query EGL Screens | |
if(m_data->m_renderDevice == -1) { | |
// Chose default screen, by trying all | |
for (EGLint i = 0; i < num_devices; ++i) { | |
// Set display | |
EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, | |
egl_devices[i], NULL); | |
if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) { | |
int major, minor; | |
EGLBoolean initialized = eglInitialize(display, &major, &minor); | |
if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) { | |
m_data->egl_display = display; | |
} | |
} | |
} | |
} else { | |
// Chose specific screen, by using m_renderDevice | |
if (m_data->m_renderDevice < 0 || m_data->m_renderDevice >= num_devices) { | |
fprintf(stderr, "Invalid render_device choice: %d < %d.\n", m_data->m_renderDevice, num_devices); | |
exit(EXIT_FAILURE); | |
} | |
// Set display | |
EGLDisplay display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, | |
egl_devices[m_data->m_renderDevice], NULL); | |
if (eglGetError() == EGL_SUCCESS && display != EGL_NO_DISPLAY) { | |
int major, minor; | |
EGLBoolean initialized = eglInitialize(display, &major, &minor); | |
if (eglGetError() == EGL_SUCCESS && initialized == EGL_TRUE) { | |
m_data->egl_display = display; | |
} | |
} | |
} | |
if (!eglInitialize(m_data->egl_display, NULL, NULL)) { | |
fprintf(stderr, "Unable to initialize EGL\n"); | |
exit(EXIT_FAILURE); | |
} | |
egl_version = gladLoadEGLInternalLoader(m_data->egl_display); | |
if (!egl_version) { | |
fprintf(stderr, "Unable to reload EGL.\n"); | |
exit(EXIT_FAILURE); | |
} | |
printf("Loaded EGL %d.%d after reload.\n", egl_version / 10, | |
egl_version % 10); | |
m_data->success = eglBindAPI(EGL_OPENGL_API); | |
if (!m_data->success) { | |
// TODO: Properly handle this error (requires change to default window | |
// API to change return on all window types to bool). | |
fprintf(stderr, "Failed to bind OpenGL API.\n"); | |
exit(EXIT_FAILURE); | |
} | |
m_data->success = | |
eglChooseConfig(m_data->egl_display, egl_config_attribs, | |
&m_data->egl_config, 1, &m_data->num_configs); | |
if (!m_data->success) { | |
// TODO: Properly handle this error (requires change to default window | |
// API to change return on all window types to bool). | |
fprintf(stderr, "Failed to choose config (eglError: %d)\n", eglGetError()); | |
exit(EXIT_FAILURE); | |
} | |
if (m_data->num_configs != 1) { | |
fprintf(stderr, "Didn't get exactly one config, but %d\n", m_data->num_configs); | |
exit(EXIT_FAILURE); | |
} | |
m_data->egl_surface = eglCreatePbufferSurface( | |
m_data->egl_display, m_data->egl_config, egl_pbuffer_attribs); | |
if (m_data->egl_surface == EGL_NO_SURFACE) { | |
fprintf(stderr, "Unable to create EGL surface (eglError: %d)\n", eglGetError()); | |
exit(EXIT_FAILURE); | |
} | |
m_data->egl_context = eglCreateContext( | |
m_data->egl_display, m_data->egl_config, EGL_NO_CONTEXT, NULL); | |
if (!m_data->egl_context) { | |
fprintf(stderr, "Unable to create EGL context (eglError: %d)\n",eglGetError()); | |
exit(EXIT_FAILURE); | |
} | |
eglMakeCurrent(m_data->egl_display, m_data->egl_surface, m_data->egl_surface, | |
m_data->egl_context); | |
printf("Finish creating EGL OpenGL window.\n"); | |
if (!gladLoadGLInternalLoader()) { | |
fprintf(stderr, "failed to load GL with glad.\n"); | |
exit(EXIT_FAILURE); | |
} | |
const GLubyte* ven = glGetString(GL_VENDOR); | |
printf("GL_VENDOR=%s\n", ven); | |
const GLubyte* ren = glGetString(GL_RENDERER); | |
printf("GL_RENDERER=%s\n", ren); | |
const GLubyte* ver = glGetString(GL_VERSION); | |
printf("GL_VERSION=%s\n", ver); | |
const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION); | |
printf("GL_SHADING_LANGUAGE_VERSION=%s\n", sl); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
glad --api="gl:compatibility=4.6" --extensions="GL_ARB_point_sprite" --out-path ./out c | |
glad --api="glx=1.4" --extensions="GLX_3DFX_multisample,GLX_AMD_gpu_association,GLX_ARB_context_flush_control,GLX_ARB_create_context,GLX_ARB_create_context_no_error,GLX_ARB_create_context_profile,GLX_ARB_create_context_robustness,GLX_ARB_fbconfig_float,GLX_ARB_framebuffer_sRGB,GLX_ARB_get_proc_address,GLX_ARB_multisample,GLX_ARB_robustness_application_isolation,GLX_ARB_robustness_share_group_isolation,GLX_ARB_vertex_buffer_object,GLX_EXT_buffer_age,GLX_EXT_create_context_es2_profile,GLX_EXT_create_context_es_profile,GLX_EXT_fbconfig_packed_float,GLX_EXT_framebuffer_sRGB,GLX_EXT_import_context,GLX_EXT_libglvnd,GLX_EXT_no_config_context,GLX_EXT_stereo_tree,GLX_EXT_swap_control,GLX_EXT_swap_control_tear,GLX_EXT_texture_from_pixmap,GLX_EXT_visual_info,GLX_EXT_visual_rating,GLX_INTEL_swap_event,GLX_MESA_agp_offset,GLX_MESA_copy_sub_buffer,GLX_MESA_pixmap_colormap,GLX_MESA_query_renderer,GLX_MESA_release_buffers,GLX_MESA_set_3dfx_mode,GLX_MESA_swap_control,GLX_NV_copy_buffer,GLX_NV_copy_image,GLX_NV_delay_before_swap,GLX_NV_float_buffer,GLX_NV_multisample_coverage,GLX_NV_present_video,GLX_NV_robustness_video_memory_purge,GLX_NV_swap_group,GLX_NV_video_capture,GLX_NV_video_out,GLX_OML_swap_method,GLX_OML_sync_control,GLX_SGIS_blended_overlay,GLX_SGIS_multisample,GLX_SGIS_shared_multisample,GLX_SGIX_dmbuffer,GLX_SGIX_fbconfig,GLX_SGIX_hyperpipe,GLX_SGIX_pbuffer,GLX_SGIX_swap_barrier,GLX_SGIX_swap_group,GLX_SGIX_video_resize,GLX_SGIX_video_source,GLX_SGIX_visual_select_group,GLX_SGI_cushion,GLX_SGI_make_current_read,GLX_SGI_swap_control,GLX_SGI_video_sync,GLX_SUN_get_transparent_index" --out-path ./out c | |
glad --api="egl=1.5" --extensions="EGL_EXT_device_base,EGL_EXT_device_enumeration,EGL_EXT_device_query,EGL_EXT_platform_base,EGL_EXT_platform_device,EGL_NV_cuda_event,EGL_NV_device_cuda" --out-path ./out c |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment