Cleanup: move all GLX to render_context_glx.
This commit is contained in:
		@ -185,7 +185,9 @@ def mat4_mul_mat4(ret, a, b):
 | 
			
		||||
initialize = _lib.rk_initialize
 | 
			
		||||
initialize.restype = ctypes.c_void_p
 | 
			
		||||
initialize.argtypes = (
 | 
			
		||||
    ctypes.c_char_p,) # name
 | 
			
		||||
    ctypes.c_char_p, # name
 | 
			
		||||
    ctypes.c_uint, # width
 | 
			
		||||
    ctypes.c_uint) # height
 | 
			
		||||
 | 
			
		||||
_load_shader = _lib.rk_load_shader
 | 
			
		||||
_load_shader.restype = ctypes.c_void_p
 | 
			
		||||
 | 
			
		||||
@ -13,16 +13,19 @@
 | 
			
		||||
// You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
#ifndef _RK_ENGINE_RENDER_OPENGL_CONTEXT_H
 | 
			
		||||
#define _RK_ENGINE_RENDER_OPENGL_CONTEXT_H
 | 
			
		||||
#ifndef _RK_ENGINE_RENDER_CONTEXT_H
 | 
			
		||||
#define _RK_ENGINE_RENDER_CONTEXT_H
 | 
			
		||||
 | 
			
		||||
#include "../render.hpp"
 | 
			
		||||
#include <GL/glx.h>
 | 
			
		||||
 | 
			
		||||
extern PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC rk_DrawElementsInstancedBaseInstance;
 | 
			
		||||
extern PFNGLMULTIDRAWELEMENTSINDIRECTPROC rk_MultiDrawElementsIndirect;
 | 
			
		||||
 | 
			
		||||
RK_EXPORT rk_window_t rk_create_context(
 | 
			
		||||
    char const * name,
 | 
			
		||||
    int profile,
 | 
			
		||||
    int major,
 | 
			
		||||
    int minor);
 | 
			
		||||
    rk_uint width,
 | 
			
		||||
    rk_uint height);
 | 
			
		||||
 | 
			
		||||
RK_EXPORT char ** rk_load_shader_source(
 | 
			
		||||
    char const * filename,
 | 
			
		||||
@ -35,4 +38,4 @@ RK_EXPORT void rk_free_shader_source(
 | 
			
		||||
RK_EXPORT void rk_swap_buffers();
 | 
			
		||||
RK_EXPORT void rk_destroy_context();
 | 
			
		||||
 | 
			
		||||
#endif // _RK_ENGINE_RENDER_OPENGL_CONTEXT_H
 | 
			
		||||
#endif // _RK_ENGINE_RENDER_CONTEXT_H
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,7 @@
 | 
			
		||||
#include "render_context.hpp"
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <GL/glx.h>
 | 
			
		||||
#include <GLES3/gl32.h>
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
 | 
			
		||||
static Display * rk_display = nullptr;
 | 
			
		||||
@ -31,6 +31,31 @@ static bool rk_error_occured = false;
 | 
			
		||||
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
 | 
			
		||||
typedef GLXContext (*glXCreateContextAttribsARBProc)(Display *, GLXFBConfig, GLXContext, Bool, int const *);
 | 
			
		||||
 | 
			
		||||
PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC rk_DrawElementsInstancedBaseInstance = nullptr;
 | 
			
		||||
PFNGLMULTIDRAWELEMENTSINDIRECTPROC rk_MultiDrawElementsIndirect = nullptr;
 | 
			
		||||
 | 
			
		||||
static int const rk_visual_attribs[] = {
 | 
			
		||||
    GLX_X_RENDERABLE, True,
 | 
			
		||||
    GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
 | 
			
		||||
    GLX_RENDER_TYPE, GLX_RGBA_BIT,
 | 
			
		||||
    GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
 | 
			
		||||
    GLX_RED_SIZE, 8,
 | 
			
		||||
    GLX_GREEN_SIZE, 8,
 | 
			
		||||
    GLX_BLUE_SIZE, 8,
 | 
			
		||||
    GLX_ALPHA_SIZE, 8,
 | 
			
		||||
    GLX_DEPTH_SIZE, 24,
 | 
			
		||||
    GLX_STENCIL_SIZE, 8,
 | 
			
		||||
    GLX_DOUBLEBUFFER, True,
 | 
			
		||||
    None
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int const rk_context_attribs[] = {
 | 
			
		||||
    GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
 | 
			
		||||
    GLX_CONTEXT_MINOR_VERSION_ARB, 2,
 | 
			
		||||
    GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES_PROFILE_BIT_EXT,
 | 
			
		||||
    None
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void rk_printf(
 | 
			
		||||
    char const * messsage) {
 | 
			
		||||
    printf("[GLX] %s\n", messsage);
 | 
			
		||||
@ -66,30 +91,14 @@ static int rk_error_handler(
 | 
			
		||||
 | 
			
		||||
rk_window_t rk_create_context(
 | 
			
		||||
    char const * name,
 | 
			
		||||
    int profile,
 | 
			
		||||
    int major,
 | 
			
		||||
    int minor) {
 | 
			
		||||
    rk_uint width,
 | 
			
		||||
    rk_uint height) {
 | 
			
		||||
    rk_display = XOpenDisplay(nullptr);
 | 
			
		||||
    if (!rk_display) {
 | 
			
		||||
        rk_printf("Failed to open X display.");
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static int const visual_attribs[] = {
 | 
			
		||||
        GLX_X_RENDERABLE, True,
 | 
			
		||||
        GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
 | 
			
		||||
        GLX_RENDER_TYPE, GLX_RGBA_BIT,
 | 
			
		||||
        GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
 | 
			
		||||
        GLX_RED_SIZE, 8,
 | 
			
		||||
        GLX_GREEN_SIZE, 8,
 | 
			
		||||
        GLX_BLUE_SIZE, 8,
 | 
			
		||||
        GLX_ALPHA_SIZE, 8,
 | 
			
		||||
        GLX_DEPTH_SIZE, 24,
 | 
			
		||||
        GLX_STENCIL_SIZE, 8,
 | 
			
		||||
        GLX_DOUBLEBUFFER, True,
 | 
			
		||||
        None
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    int glx_major, glx_minor;
 | 
			
		||||
    if (!glXQueryVersion(rk_display, &glx_major, &glx_minor) || (glx_major == 1 && glx_minor < 3) || glx_major < 1) {
 | 
			
		||||
        rk_printf("Invalid GLX version.");
 | 
			
		||||
@ -98,7 +107,7 @@ rk_window_t rk_create_context(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int fbcount;
 | 
			
		||||
    GLXFBConfig * const fbc = glXChooseFBConfig(rk_display, DefaultScreen(rk_display), visual_attribs, &fbcount);
 | 
			
		||||
    GLXFBConfig * const fbc = glXChooseFBConfig(rk_display, DefaultScreen(rk_display), rk_visual_attribs, &fbcount);
 | 
			
		||||
    if (!fbc) {
 | 
			
		||||
        rk_printf("Failed to retrieve a framebuffer config.");
 | 
			
		||||
        rk_destroy_context();
 | 
			
		||||
@ -141,7 +150,7 @@ rk_window_t rk_create_context(
 | 
			
		||||
    swa.border_pixel = 0;
 | 
			
		||||
    swa.event_mask = StructureNotifyMask;
 | 
			
		||||
    rk_window = XCreateWindow(rk_display, RootWindow(rk_display, vi->screen),
 | 
			
		||||
                                0, 0, 1600, 900, 0, vi->depth, InputOutput, vi->visual,
 | 
			
		||||
                                0, 0, width, height, 0, vi->depth, InputOutput, vi->visual,
 | 
			
		||||
                                CWBorderPixel | CWColormap | CWEventMask, &swa);
 | 
			
		||||
    if (!rk_window) {
 | 
			
		||||
        rk_printf("Failed to create window.");
 | 
			
		||||
@ -150,27 +159,21 @@ rk_window_t rk_create_context(
 | 
			
		||||
    }
 | 
			
		||||
    XFree(vi);
 | 
			
		||||
    XStoreName(rk_display, rk_window, name);
 | 
			
		||||
    XMapWindow( rk_display, rk_window );
 | 
			
		||||
    XMapWindow(rk_display, rk_window);
 | 
			
		||||
 | 
			
		||||
    char const * const glxExts = glXQueryExtensionsString(rk_display, DefaultScreen(rk_display));
 | 
			
		||||
    glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;
 | 
			
		||||
    glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)
 | 
			
		||||
        glXGetProcAddressARB((const GLubyte *)("glXCreateContextAttribsARB"));
 | 
			
		||||
    glXCreateContextAttribsARBProc const glXCreateContextAttribsARB =
 | 
			
		||||
        reinterpret_cast<glXCreateContextAttribsARBProc>(
 | 
			
		||||
            glXGetProcAddressARB(reinterpret_cast<const GLubyte *>("glXCreateContextAttribsARB")));
 | 
			
		||||
 | 
			
		||||
    rk_error_occured = false;
 | 
			
		||||
    int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&rk_error_handler);
 | 
			
		||||
    if (!rk_extension_supported(glxExts, "GLX_ARB_create_context") || !glXCreateContextAttribsARB) {
 | 
			
		||||
        rk_printf("glXCreateContextAttribsARB() not found.");
 | 
			
		||||
        rk_printf("glXCreateContextAttribsARB() extension not found.");
 | 
			
		||||
        rk_destroy_context();
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    } else {
 | 
			
		||||
        const int context_attribs[] = {
 | 
			
		||||
            GLX_CONTEXT_MAJOR_VERSION_ARB, major,
 | 
			
		||||
            GLX_CONTEXT_MINOR_VERSION_ARB, minor,
 | 
			
		||||
            GLX_CONTEXT_PROFILE_MASK_ARB, profile,
 | 
			
		||||
            None
 | 
			
		||||
        };
 | 
			
		||||
        rk_context = glXCreateContextAttribsARB(rk_display, bestFbc, 0, True, context_attribs);
 | 
			
		||||
        rk_context = glXCreateContextAttribsARB(rk_display, bestFbc, 0, True, rk_context_attribs);
 | 
			
		||||
        XSync(rk_display, False);
 | 
			
		||||
        if (rk_error_occured || !rk_context) {
 | 
			
		||||
            rk_printf("Failed to create context.");
 | 
			
		||||
@ -184,6 +187,24 @@ rk_window_t rk_create_context(
 | 
			
		||||
        rk_printf("Warning: Rendering context is indirect.");
 | 
			
		||||
    }
 | 
			
		||||
    glXMakeCurrent(rk_display, rk_window, rk_context);
 | 
			
		||||
 | 
			
		||||
    if (rk_extension_supported(glxExts, "GL_EXT_base_instance")) {
 | 
			
		||||
        rk_DrawElementsInstancedBaseInstance =
 | 
			
		||||
            reinterpret_cast<PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC>(
 | 
			
		||||
                glXGetProcAddressARB(reinterpret_cast<const GLubyte *>("DrawElementsInstancedBaseInstance")));
 | 
			
		||||
        if (rk_DrawElementsInstancedBaseInstance) {
 | 
			
		||||
            rk_printf("Using extension GL_EXT_base_instance::DrawElementsInstancedBaseInstance.");
 | 
			
		||||
            if (rk_extension_supported(glxExts, "GL_EXT_multi_draw_indirect")) {
 | 
			
		||||
                rk_MultiDrawElementsIndirect =
 | 
			
		||||
                    reinterpret_cast<PFNGLMULTIDRAWELEMENTSINDIRECTPROC>(
 | 
			
		||||
                        glXGetProcAddressARB(reinterpret_cast<const GLubyte *>("MultiDrawElementsIndirectEXT")));
 | 
			
		||||
                if (rk_MultiDrawElementsIndirect) {
 | 
			
		||||
                    rk_printf("Using extension GL_EXT_multi_draw_indirect::MultiDrawElementsIndirectEXT.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return reinterpret_cast<rk_window_t>(rk_window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -15,18 +15,11 @@
 | 
			
		||||
 | 
			
		||||
#include "render_opengles.hpp"
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
//TODO: move the GLX stuff to render_context_glx.cpp
 | 
			
		||||
#include <GL/glx.h>
 | 
			
		||||
 | 
			
		||||
static rk_shader const * rk_current_shader = nullptr;
 | 
			
		||||
static rk_vertices const * rk_current_vertices = nullptr;
 | 
			
		||||
static bool rk_frame = false;
 | 
			
		||||
 | 
			
		||||
static PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC rk_DrawElementsInstancedBaseInstance = nullptr;
 | 
			
		||||
static PFNGLMULTIDRAWELEMENTSINDIRECTPROC rk_MultiDrawElementsIndirect = nullptr;
 | 
			
		||||
 | 
			
		||||
static void rk_printf(char const * messsage) {
 | 
			
		||||
    printf("[RK_ENGINE] %s\n", messsage);
 | 
			
		||||
}
 | 
			
		||||
@ -47,26 +40,11 @@ static void rk_debug_message_callback(
 | 
			
		||||
    printf("[RK_ENGINE][GL] (id=%d) %s\n", id, message);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __GLXextFuncPtr rk_extension(
 | 
			
		||||
    char const * const name,
 | 
			
		||||
    char const * const func) {
 | 
			
		||||
    __GLXextFuncPtr ext_ptr = nullptr;
 | 
			
		||||
    GLint num_exts = 0;
 | 
			
		||||
    glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts);
 | 
			
		||||
    for (int ext_index = 0; ext_index < num_exts; ++ext_index) {
 | 
			
		||||
        char const * const ext_name = reinterpret_cast<char const *>(glGetStringi(GL_EXTENSIONS, ext_index));
 | 
			
		||||
        if (strcmp(name, ext_name) == 0) {
 | 
			
		||||
            ext_ptr = glXGetProcAddressARB(reinterpret_cast<GLubyte const *>(func));
 | 
			
		||||
            printf("[RK_ENGINE] Using extension %s::%s\n", name, func);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ext_ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rk_window_t rk_initialize(
 | 
			
		||||
    char const * name) {
 | 
			
		||||
    rk_window_t const window = rk_create_context(name, GLX_CONTEXT_ES_PROFILE_BIT_EXT, 3, 2);
 | 
			
		||||
    char const * name,
 | 
			
		||||
    rk_uint width,
 | 
			
		||||
    rk_uint height) {
 | 
			
		||||
    rk_window_t const window = rk_create_context(name, width, height);
 | 
			
		||||
    if (window) {
 | 
			
		||||
        GLubyte const * const vendor = glGetString(GL_VENDOR);
 | 
			
		||||
        GLubyte const * const renderer = glGetString(GL_RENDERER);
 | 
			
		||||
@ -75,15 +53,6 @@ rk_window_t rk_initialize(
 | 
			
		||||
        GLubyte const * const language = glGetString(GL_SHADING_LANGUAGE_VERSION);
 | 
			
		||||
        printf("[RK_ENGINE] version: %s, language: %s\n", version, language);
 | 
			
		||||
 | 
			
		||||
        rk_DrawElementsInstancedBaseInstance =
 | 
			
		||||
            reinterpret_cast<PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC>(
 | 
			
		||||
                rk_extension("GL_EXT_base_instance", "DrawElementsInstancedBaseInstance"));
 | 
			
		||||
        if (rk_DrawElementsInstancedBaseInstance) {
 | 
			
		||||
            rk_MultiDrawElementsIndirect =
 | 
			
		||||
                reinterpret_cast<PFNGLMULTIDRAWELEMENTSINDIRECTPROC>(
 | 
			
		||||
                    rk_extension("GL_EXT_multi_draw_indirect", "MultiDrawElementsIndirectEXT"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        GLint context_flags = 0;
 | 
			
		||||
        glGetIntegerv(GL_CONTEXT_FLAGS, &context_flags);
 | 
			
		||||
        if (context_flags & GL_CONTEXT_FLAG_DEBUG_BIT) {
 | 
			
		||||
 | 
			
		||||
@ -99,7 +99,9 @@ union rk_mesh {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
RK_EXPORT rk_window_t rk_initialize(
 | 
			
		||||
    char const * name);
 | 
			
		||||
    char const * name,
 | 
			
		||||
    rk_uint width,
 | 
			
		||||
    rk_uint height);
 | 
			
		||||
 | 
			
		||||
RK_EXPORT rk_shader_t rk_load_shader(
 | 
			
		||||
    char const * name);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user