mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-25 13:21:28 +00:00
Fix linux compile errors and build the BuilderNative.so library
This commit is contained in:
parent
51fabae1e7
commit
3cd96fc788
8 changed files with 242 additions and 210 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -27,3 +27,4 @@ obj
|
|||
*.ipdb
|
||||
/Source/Plugins/vpo_dll/Release
|
||||
/Source/Core/*.user
|
||||
/Build/BuilderNative.so
|
||||
|
|
1
Makefile
1
Makefile
|
@ -1,3 +1,4 @@
|
|||
|
||||
all:
|
||||
msbuild -p:Configuration=Release BuilderMono.sln
|
||||
g++ -O2 --shared -o Build/BuilderNative.so -fPIC -I Source/Native Source/Native/*.cpp Source/Native/gl_load/*.c
|
||||
|
|
|
@ -32,7 +32,7 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
{
|
||||
public RenderDevice(RenderTargetControl rendertarget)
|
||||
{
|
||||
Handle = RenderDevice_New(rendertarget.Handle);
|
||||
Handle = RenderDevice_New(IntPtr.Zero, rendertarget.Handle);
|
||||
if (Handle == IntPtr.Zero)
|
||||
throw new Exception("RenderDevice_New failed");
|
||||
|
||||
|
@ -333,7 +333,7 @@ namespace CodeImp.DoomBuilder.Rendering
|
|||
IntPtr Handle;
|
||||
|
||||
[DllImport("BuilderNative.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||
static extern IntPtr RenderDevice_New(IntPtr hwnd);
|
||||
static extern IntPtr RenderDevice_New(IntPtr display, IntPtr window);
|
||||
|
||||
[DllImport("BuilderNative.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||
static extern void RenderDevice_Delete(IntPtr handle);
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
|
||||
#include "Precomp.h"
|
||||
#include "OpenGLContext.h"
|
||||
#include <CommCtrl.h>
|
||||
#include <stdexcept>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#include <CommCtrl.h>
|
||||
|
||||
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
|
||||
|
@ -64,6 +65,49 @@
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class OpenGLContext : public IOpenGLContext
|
||||
{
|
||||
public:
|
||||
OpenGLContext(void* window);
|
||||
~OpenGLContext();
|
||||
|
||||
void MakeCurrent() override;
|
||||
void ClearCurrent() override;
|
||||
void SwapBuffers() override;
|
||||
|
||||
int GetWidth() const override;
|
||||
int GetHeight() const override;
|
||||
|
||||
bool IsValid() const { return context != 0; }
|
||||
|
||||
private:
|
||||
HWND window;
|
||||
HDC dc;
|
||||
HGLRC context;
|
||||
};
|
||||
|
||||
class OpenGLCreationHelper
|
||||
{
|
||||
public:
|
||||
OpenGLCreationHelper(HWND window);
|
||||
~OpenGLCreationHelper();
|
||||
|
||||
HGLRC CreateContext(HDC hdc, int major_version, int minor_version, HGLRC share_context = 0);
|
||||
|
||||
private:
|
||||
HWND window;
|
||||
HDC hdc;
|
||||
HWND query_window = 0;
|
||||
HDC query_dc = 0;
|
||||
HGLRC query_context = 0;
|
||||
|
||||
typedef HGLRC(WINAPI* ptr_wglCreateContextAttribsARB)(HDC, HGLRC, const int*);
|
||||
|
||||
typedef BOOL(WINAPI* ptr_wglGetPixelFormatAttribivEXT)(HDC, int, int, UINT, int*, int*);
|
||||
typedef BOOL(WINAPI* ptr_wglGetPixelFormatAttribfvEXT)(HDC, int, int, UINT, int*, FLOAT*);
|
||||
typedef BOOL(WINAPI* ptr_wglChoosePixelFormatEXT)(HDC, const int*, const FLOAT*, UINT, int*, UINT*);
|
||||
};
|
||||
|
||||
class OpenGLLoadFunctions
|
||||
{
|
||||
public:
|
||||
|
@ -231,8 +275,152 @@ HGLRC OpenGLCreationHelper::CreateContext(HDC hdc, int major_version, int minor_
|
|||
return opengl3_context;
|
||||
}
|
||||
|
||||
std::unique_ptr<IOpenGLContext> Create(void* disp, void* window)
|
||||
{
|
||||
auto ctx = std::make_unique<OpenGLContext>(window);
|
||||
if (!ctx->IsValid()) return nullptr;
|
||||
return ctx;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <GL/glx.h>
|
||||
|
||||
#define GLFUNC
|
||||
|
||||
typedef GLXContext(*ptr_glXCreateContextAttribs)(::Display* dpy, GLXFBConfig config, GLXContext share_list, Bool direct, const int* attrib_list);
|
||||
|
||||
class GL_GLXFunctions
|
||||
{
|
||||
public:
|
||||
typedef XVisualInfo* (GLFUNC* ptr_glXChooseVisual)(::Display* dpy, int screen, int* attrib_list);
|
||||
typedef void (GLFUNC* ptr_glXCopyContext)(::Display* dpy, GLXContext src, GLXContext dst, unsigned long mask);
|
||||
typedef GLXContext(GLFUNC* ptr_glXCreateContext)(::Display* dpy, XVisualInfo* vis, GLXContext share_list, Bool direct);
|
||||
typedef GLXPixmap(GLFUNC* ptr_glXCreateGLXPixmap)(::Display* dpy, XVisualInfo* vis, Pixmap pixmap);
|
||||
typedef void (GLFUNC* ptr_glXDestroyContext)(::Display* dpy, GLXContext ctx);
|
||||
typedef void (GLFUNC* ptr_glXDestroyGLXPixmap)(::Display* dpy, GLXPixmap pix);
|
||||
typedef int (GLFUNC* ptr_glXGetConfig)(::Display* dpy, XVisualInfo* vis, int attrib, int* value);
|
||||
typedef GLXContext(GLFUNC* ptr_glXGetCurrentContext)(void);
|
||||
typedef GLXDrawable(GLFUNC* ptr_glXGetCurrentDrawable)(void);
|
||||
typedef Bool(GLFUNC* ptr_glXIsDirect)(::Display* dpy, GLXContext ctx);
|
||||
typedef Bool(GLFUNC* ptr_glXMakeCurrent)(::Display* dpy, GLXDrawable drawable, GLXContext ctx);
|
||||
typedef Bool(GLFUNC* ptr_glXQueryExtension)(::Display* dpy, int* error_base, int* event_base);
|
||||
typedef Bool(GLFUNC* ptr_glXQueryVersion)(::Display* dpy, int* major, int* minor);
|
||||
typedef void (GLFUNC* ptr_glXSwapBuffers)(::Display* dpy, GLXDrawable drawable);
|
||||
typedef void (GLFUNC* ptr_glXUseXFont)(Font font, int first, int count, int list_base);
|
||||
typedef void (GLFUNC* ptr_glXWaitGL)(void);
|
||||
typedef void (GLFUNC* ptr_glXWaitX)(void);
|
||||
typedef const char* (GLFUNC* ptr_glXGetClientString)(::Display* dpy, int name);
|
||||
typedef const char* (GLFUNC* ptr_glXQueryServerString)(::Display* dpy, int screen, int name);
|
||||
typedef const char* (GLFUNC* ptr_glXQueryExtensionsString)(::Display* dpy, int screen);
|
||||
typedef ::Display* (GLFUNC* ptr_glXGetCurrentDisplay)(void);
|
||||
typedef GLXFBConfig* (GLFUNC* ptr_glXChooseFBConfig)(::Display* dpy, int screen, const int* attrib_list, int* nelements);
|
||||
typedef GLXContext(GLFUNC* ptr_glXCreateNewContext)(::Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
|
||||
typedef GLXPbuffer(GLFUNC* ptr_glXCreatePbuffer)(::Display* dpy, GLXFBConfig config, const int* attrib_list);
|
||||
typedef GLXPixmap(GLFUNC* ptr_glXCreatePixmap)(::Display* dpy, GLXFBConfig config, Pixmap pixmap, const int* attrib_list);
|
||||
typedef GLXWindow(GLFUNC* ptr_glXCreateWindow)(::Display* dpy, GLXFBConfig config, Window win, const int* attrib_list);
|
||||
typedef void (GLFUNC* ptr_glXDestroyPbuffer)(::Display* dpy, GLXPbuffer pbuf);
|
||||
typedef void (GLFUNC* ptr_glXDestroyPixmap)(::Display* dpy, GLXPixmap pixmap);
|
||||
typedef void (GLFUNC* ptr_glXDestroyWindow)(::Display* dpy, GLXWindow win);
|
||||
typedef GLXDrawable(GLFUNC* ptr_glXGetCurrentReadDrawable)(void);
|
||||
typedef int (GLFUNC* ptr_glXGetFBConfigAttrib)(::Display* dpy, GLXFBConfig config, int attribute, int* value);
|
||||
typedef GLXFBConfig* (GLFUNC* ptr_glXGetFBConfigs)(::Display* dpy, int screen, int* nelements);
|
||||
typedef void (GLFUNC* ptr_glXGetSelectedEvent)(::Display* dpy, GLXDrawable draw, unsigned long* event_mask);
|
||||
typedef XVisualInfo* (GLFUNC* ptr_glXGetVisualFromFBConfig)(::Display* dpy, GLXFBConfig config);
|
||||
typedef Bool(GLFUNC* ptr_glXMakeContextCurrent)(::Display* display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
|
||||
typedef int (GLFUNC* ptr_glXQueryContext)(::Display* dpy, GLXContext ctx, int attribute, int* value);
|
||||
typedef void (GLFUNC* ptr_glXQueryDrawable)(::Display* dpy, GLXDrawable draw, int attribute, unsigned int* value);
|
||||
typedef void (GLFUNC* ptr_glXSelectEvent)(::Display* dpy, GLXDrawable draw, unsigned long event_mask);
|
||||
|
||||
typedef __GLXextFuncPtr(GLFUNC* ptr_glXGetProcAddress) (const GLubyte*);
|
||||
typedef void (*(GLFUNC* ptr_glXGetProcAddressARB)(const GLubyte* procName))(void);
|
||||
|
||||
public:
|
||||
ptr_glXChooseVisual glXChooseVisual;
|
||||
ptr_glXCopyContext glXCopyContext;
|
||||
ptr_glXCreateContext glXCreateContext;
|
||||
ptr_glXCreateGLXPixmap glXCreateGLXPixmap;
|
||||
ptr_glXDestroyContext glXDestroyContext;
|
||||
ptr_glXDestroyGLXPixmap glXDestroyGLXPixmap;
|
||||
ptr_glXGetConfig glXGetConfig;
|
||||
ptr_glXGetCurrentContext glXGetCurrentContext;
|
||||
ptr_glXGetCurrentDrawable glXGetCurrentDrawable;
|
||||
ptr_glXIsDirect glXIsDirect;
|
||||
ptr_glXMakeCurrent glXMakeCurrent;
|
||||
ptr_glXQueryExtension glXQueryExtension;
|
||||
ptr_glXQueryVersion glXQueryVersion;
|
||||
ptr_glXSwapBuffers glXSwapBuffers;
|
||||
ptr_glXUseXFont glXUseXFont;
|
||||
ptr_glXWaitGL glXWaitGL;
|
||||
ptr_glXWaitX glXWaitX;
|
||||
ptr_glXGetClientString glXGetClientString;
|
||||
ptr_glXQueryServerString glXQueryServerString;
|
||||
ptr_glXQueryExtensionsString glXQueryExtensionsString;
|
||||
ptr_glXGetCurrentDisplay glXGetCurrentDisplay;
|
||||
ptr_glXChooseFBConfig glXChooseFBConfig;
|
||||
ptr_glXCreateNewContext glXCreateNewContext;
|
||||
ptr_glXCreatePbuffer glXCreatePbuffer;
|
||||
ptr_glXCreatePixmap glXCreatePixmap;
|
||||
ptr_glXCreateWindow glXCreateWindow;
|
||||
ptr_glXDestroyPbuffer glXDestroyPbuffer;
|
||||
ptr_glXDestroyPixmap glXDestroyPixmap;
|
||||
ptr_glXDestroyWindow glXDestroyWindow;
|
||||
ptr_glXGetCurrentReadDrawable glXGetCurrentReadDrawable;
|
||||
ptr_glXGetFBConfigAttrib glXGetFBConfigAttrib;
|
||||
ptr_glXGetFBConfigs glXGetFBConfigs;
|
||||
ptr_glXGetSelectedEvent glXGetSelectedEvent;
|
||||
ptr_glXGetVisualFromFBConfig glXGetVisualFromFBConfig;
|
||||
ptr_glXMakeContextCurrent glXMakeContextCurrent;
|
||||
ptr_glXQueryContext glXQueryContext;
|
||||
ptr_glXQueryDrawable glXQueryDrawable;
|
||||
ptr_glXSelectEvent glXSelectEvent;
|
||||
ptr_glXGetProcAddress glXGetProcAddress;
|
||||
ptr_glXGetProcAddressARB glXGetProcAddressARB;
|
||||
};
|
||||
|
||||
class OpenGLContext : public IOpenGLContext
|
||||
{
|
||||
public:
|
||||
OpenGLContext(void* display, void* window);
|
||||
~OpenGLContext();
|
||||
|
||||
void MakeCurrent() override;
|
||||
void ClearCurrent() override;
|
||||
void SwapBuffers() override;
|
||||
|
||||
int GetWidth() const override;
|
||||
int GetHeight() const override;
|
||||
|
||||
bool IsValid() const { return opengl_context != 0; }
|
||||
|
||||
private:
|
||||
void CreateContext();
|
||||
|
||||
::Display* disp = nullptr;
|
||||
::Window window = 0;
|
||||
GLXContext opengl_context = 0;
|
||||
|
||||
XVisualInfo* opengl_visual_info = nullptr;
|
||||
GLXFBConfig fbconfig;
|
||||
|
||||
GL_GLXFunctions glx;
|
||||
|
||||
typedef void(ProcAddress)();
|
||||
ProcAddress* get_proc_address(const char *function_name) const;
|
||||
|
||||
GLXContext create_context_glx_1_3(GLXContext shared_context);
|
||||
void create_glx_1_3(::Display* disp);
|
||||
|
||||
bool is_glx_extension_supported(const char* ext_name);
|
||||
|
||||
int major_version = 3;
|
||||
int minor_version = 2;
|
||||
|
||||
void* opengl_lib_handle = nullptr;
|
||||
};
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#define GL_USE_DLOPEN // Using dlopen for linux by default
|
||||
|
@ -271,7 +459,7 @@ OpenGLContext::~OpenGLContext()
|
|||
if (opengl_context)
|
||||
{
|
||||
if (glx.glXGetCurrentContext() == opengl_context)
|
||||
OpenGL::set_active(nullptr);
|
||||
ClearCurrent();
|
||||
|
||||
if (disp)
|
||||
glx.glXDestroyContext(disp, opengl_context);
|
||||
|
@ -299,8 +487,8 @@ int OpenGLContext::GetWidth() const
|
|||
{
|
||||
::Window root_window;
|
||||
int x, y;
|
||||
unsigned int width, height, border_width, border_height, depth;
|
||||
Status result = XGetGeometry(disp, window, &root_window, &x, &y, &width, &height, &border_width, &border_height, &depth);
|
||||
unsigned int width, height, border_width, depth;
|
||||
Status result = XGetGeometry(disp, window, &root_window, &x, &y, &width, &height, &border_width, &depth);
|
||||
return (result != 0) ? width: 0;
|
||||
}
|
||||
|
||||
|
@ -308,12 +496,12 @@ int OpenGLContext::GetHeight() const
|
|||
{
|
||||
::Window root_window;
|
||||
int x, y;
|
||||
unsigned int width, height, border_width, border_height, depth;
|
||||
Status result = XGetGeometry(disp, window, &root_window, &x, &y, &width, &height, &border_width, &border_height, &depth);
|
||||
unsigned int width, height, border_width, depth;
|
||||
Status result = XGetGeometry(disp, window, &root_window, &x, &y, &width, &height, &border_width, &depth);
|
||||
return (result != 0) ? height : 0;
|
||||
}
|
||||
|
||||
ProcAddress* OpenGLContext::get_proc_address(const char *function_name) const
|
||||
OpenGLContext::ProcAddress* OpenGLContext::get_proc_address(const char *function_name) const
|
||||
{
|
||||
if (glx.glXGetProcAddressARB)
|
||||
return glx.glXGetProcAddressARB((GLubyte*)function_name);
|
||||
|
@ -621,4 +809,11 @@ GLXContext OpenGLContext::create_context_glx_1_3(GLXContext shared_context)
|
|||
return context;
|
||||
}
|
||||
|
||||
std::unique_ptr<IOpenGLContext> Create(void* disp, void* window)
|
||||
{
|
||||
auto ctx = std::make_unique<OpenGLContext>(disp, window);
|
||||
if (!ctx->IsValid()) return nullptr;
|
||||
return ctx;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,176 +1,18 @@
|
|||
#pragma once
|
||||
|
||||
#ifdef WIN32
|
||||
#include <memory>
|
||||
|
||||
class OpenGLContext
|
||||
class IOpenGLContext
|
||||
{
|
||||
public:
|
||||
OpenGLContext(void* window);
|
||||
~OpenGLContext();
|
||||
virtual ~IOpenGLContext() = default;
|
||||
|
||||
void MakeCurrent();
|
||||
void ClearCurrent();
|
||||
void SwapBuffers();
|
||||
virtual void MakeCurrent() = 0;
|
||||
virtual void ClearCurrent() = 0;
|
||||
virtual void SwapBuffers() = 0;
|
||||
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
virtual int GetWidth() const = 0;
|
||||
virtual int GetHeight() const = 0;
|
||||
|
||||
explicit operator bool() const { return context != 0; }
|
||||
|
||||
private:
|
||||
HWND window;
|
||||
HDC dc;
|
||||
HGLRC context;
|
||||
static std::unique_ptr<IOpenGLContext> Create(void* disp, void* window);
|
||||
};
|
||||
|
||||
class OpenGLCreationHelper
|
||||
{
|
||||
public:
|
||||
OpenGLCreationHelper(HWND window);
|
||||
~OpenGLCreationHelper();
|
||||
|
||||
HGLRC CreateContext(HDC hdc, int major_version, int minor_version, HGLRC share_context = 0);
|
||||
|
||||
private:
|
||||
HWND window;
|
||||
HDC hdc;
|
||||
HWND query_window = 0;
|
||||
HDC query_dc = 0;
|
||||
HGLRC query_context = 0;
|
||||
|
||||
typedef HGLRC(WINAPI* ptr_wglCreateContextAttribsARB)(HDC, HGLRC, const int*);
|
||||
|
||||
typedef BOOL(WINAPI* ptr_wglGetPixelFormatAttribivEXT)(HDC, int, int, UINT, int*, int*);
|
||||
typedef BOOL(WINAPI* ptr_wglGetPixelFormatAttribfvEXT)(HDC, int, int, UINT, int*, FLOAT*);
|
||||
typedef BOOL(WINAPI* ptr_wglChoosePixelFormatEXT)(HDC, const int*, const FLOAT*, UINT, int*, UINT*);
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
typedef GLXContext(*ptr_glXCreateContextAttribs)(::Display* dpy, GLXFBConfig config, GLXContext share_list, Bool direct, const int* attrib_list);
|
||||
|
||||
class GL_GLXFunctions
|
||||
{
|
||||
public:
|
||||
typedef XVisualInfo* (GLFUNC* ptr_glXChooseVisual)(::Display* dpy, int screen, int* attrib_list);
|
||||
typedef void (GLFUNC* ptr_glXCopyContext)(::Display* dpy, GLXContext src, GLXContext dst, unsigned long mask);
|
||||
typedef GLXContext(GLFUNC* ptr_glXCreateContext)(::Display* dpy, XVisualInfo* vis, GLXContext share_list, Bool direct);
|
||||
typedef GLXPixmap(GLFUNC* ptr_glXCreateGLXPixmap)(::Display* dpy, XVisualInfo* vis, Pixmap pixmap);
|
||||
typedef void (GLFUNC* ptr_glXDestroyContext)(::Display* dpy, GLXContext ctx);
|
||||
typedef void (GLFUNC* ptr_glXDestroyGLXPixmap)(::Display* dpy, GLXPixmap pix);
|
||||
typedef int (GLFUNC* ptr_glXGetConfig)(::Display* dpy, XVisualInfo* vis, int attrib, int* value);
|
||||
typedef GLXContext(GLFUNC* ptr_glXGetCurrentContext)(void);
|
||||
typedef GLXDrawable(GLFUNC* ptr_glXGetCurrentDrawable)(void);
|
||||
typedef Bool(GLFUNC* ptr_glXIsDirect)(::Display* dpy, GLXContext ctx);
|
||||
typedef Bool(GLFUNC* ptr_glXMakeCurrent)(::Display* dpy, GLXDrawable drawable, GLXContext ctx);
|
||||
typedef Bool(GLFUNC* ptr_glXQueryExtension)(::Display* dpy, int* error_base, int* event_base);
|
||||
typedef Bool(GLFUNC* ptr_glXQueryVersion)(::Display* dpy, int* major, int* minor);
|
||||
typedef void (GLFUNC* ptr_glXSwapBuffers)(::Display* dpy, GLXDrawable drawable);
|
||||
typedef void (GLFUNC* ptr_glXUseXFont)(Font font, int first, int count, int list_base);
|
||||
typedef void (GLFUNC* ptr_glXWaitGL)(void);
|
||||
typedef void (GLFUNC* ptr_glXWaitX)(void);
|
||||
typedef const char* (GLFUNC* ptr_glXGetClientString)(::Display* dpy, int name);
|
||||
typedef const char* (GLFUNC* ptr_glXQueryServerString)(::Display* dpy, int screen, int name);
|
||||
typedef const char* (GLFUNC* ptr_glXQueryExtensionsString)(::Display* dpy, int screen);
|
||||
typedef ::Display* (GLFUNC* ptr_glXGetCurrentDisplay)(void);
|
||||
typedef GLXFBConfig* (GLFUNC* ptr_glXChooseFBConfig)(::Display* dpy, int screen, const int* attrib_list, int* nelements);
|
||||
typedef GLXContext(GLFUNC* ptr_glXCreateNewContext)(::Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
|
||||
typedef GLXPbuffer(GLFUNC* ptr_glXCreatePbuffer)(::Display* dpy, GLXFBConfig config, const int* attrib_list);
|
||||
typedef GLXPixmap(GLFUNC* ptr_glXCreatePixmap)(::Display* dpy, GLXFBConfig config, Pixmap pixmap, const int* attrib_list);
|
||||
typedef GLXWindow(GLFUNC* ptr_glXCreateWindow)(::Display* dpy, GLXFBConfig config, Window win, const int* attrib_list);
|
||||
typedef void (GLFUNC* ptr_glXDestroyPbuffer)(::Display* dpy, GLXPbuffer pbuf);
|
||||
typedef void (GLFUNC* ptr_glXDestroyPixmap)(::Display* dpy, GLXPixmap pixmap);
|
||||
typedef void (GLFUNC* ptr_glXDestroyWindow)(::Display* dpy, GLXWindow win);
|
||||
typedef GLXDrawable(GLFUNC* ptr_glXGetCurrentReadDrawable)(void);
|
||||
typedef int (GLFUNC* ptr_glXGetFBConfigAttrib)(::Display* dpy, GLXFBConfig config, int attribute, int* value);
|
||||
typedef GLXFBConfig* (GLFUNC* ptr_glXGetFBConfigs)(::Display* dpy, int screen, int* nelements);
|
||||
typedef void (GLFUNC* ptr_glXGetSelectedEvent)(::Display* dpy, GLXDrawable draw, unsigned long* event_mask);
|
||||
typedef XVisualInfo* (GLFUNC* ptr_glXGetVisualFromFBConfig)(::Display* dpy, GLXFBConfig config);
|
||||
typedef Bool(GLFUNC* ptr_glXMakeContextCurrent)(::Display* display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
|
||||
typedef int (GLFUNC* ptr_glXQueryContext)(::Display* dpy, GLXContext ctx, int attribute, int* value);
|
||||
typedef void (GLFUNC* ptr_glXQueryDrawable)(::Display* dpy, GLXDrawable draw, int attribute, unsigned int* value);
|
||||
typedef void (GLFUNC* ptr_glXSelectEvent)(::Display* dpy, GLXDrawable draw, unsigned long event_mask);
|
||||
|
||||
typedef __GLXextFuncPtr(GLFUNC* ptr_glXGetProcAddress) (const GLubyte*);
|
||||
typedef void (*(GLFUNC* ptr_glXGetProcAddressARB)(const GLubyte* procName))(void);
|
||||
|
||||
public:
|
||||
ptr_glXChooseVisual glXChooseVisual;
|
||||
ptr_glXCopyContext glXCopyContext;
|
||||
ptr_glXCreateContext glXCreateContext;
|
||||
ptr_glXCreateGLXPixmap glXCreateGLXPixmap;
|
||||
ptr_glXDestroyContext glXDestroyContext;
|
||||
ptr_glXDestroyGLXPixmap glXDestroyGLXPixmap;
|
||||
ptr_glXGetConfig glXGetConfig;
|
||||
ptr_glXGetCurrentContext glXGetCurrentContext;
|
||||
ptr_glXGetCurrentDrawable glXGetCurrentDrawable;
|
||||
ptr_glXIsDirect glXIsDirect;
|
||||
ptr_glXMakeCurrent glXMakeCurrent;
|
||||
ptr_glXQueryExtension glXQueryExtension;
|
||||
ptr_glXQueryVersion glXQueryVersion;
|
||||
ptr_glXSwapBuffers glXSwapBuffers;
|
||||
ptr_glXUseXFont glXUseXFont;
|
||||
ptr_glXWaitGL glXWaitGL;
|
||||
ptr_glXWaitX glXWaitX;
|
||||
ptr_glXGetClientString glXGetClientString;
|
||||
ptr_glXQueryServerString glXQueryServerString;
|
||||
ptr_glXQueryExtensionsString glXQueryExtensionsString;
|
||||
ptr_glXGetCurrentDisplay glXGetCurrentDisplay;
|
||||
ptr_glXChooseFBConfig glXChooseFBConfig;
|
||||
ptr_glXCreateNewContext glXCreateNewContext;
|
||||
ptr_glXCreatePbuffer glXCreatePbuffer;
|
||||
ptr_glXCreatePixmap glXCreatePixmap;
|
||||
ptr_glXCreateWindow glXCreateWindow;
|
||||
ptr_glXDestroyPbuffer glXDestroyPbuffer;
|
||||
ptr_glXDestroyPixmap glXDestroyPixmap;
|
||||
ptr_glXDestroyWindow glXDestroyWindow;
|
||||
ptr_glXGetCurrentReadDrawable glXGetCurrentReadDrawable;
|
||||
ptr_glXGetFBConfigAttrib glXGetFBConfigAttrib;
|
||||
ptr_glXGetFBConfigs glXGetFBConfigs;
|
||||
ptr_glXGetSelectedEvent glXGetSelectedEvent;
|
||||
ptr_glXGetVisualFromFBConfig glXGetVisualFromFBConfig;
|
||||
ptr_glXMakeContextCurrent glXMakeContextCurrent;
|
||||
ptr_glXQueryContext glXQueryContext;
|
||||
ptr_glXQueryDrawable glXQueryDrawable;
|
||||
ptr_glXSelectEvent glXSelectEvent;
|
||||
ptr_glXGetProcAddress glXGetProcAddress;
|
||||
ptr_glXGetProcAddressARB glXGetProcAddressARB;
|
||||
};
|
||||
|
||||
class OpenGLContext
|
||||
{
|
||||
public:
|
||||
OpenGLContext(void* display, void* window);
|
||||
~OpenGLContext();
|
||||
|
||||
void Begin();
|
||||
void End();
|
||||
void SwapBuffers();
|
||||
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
|
||||
explicit operator bool() const { return opengl_context != 0; }
|
||||
|
||||
private:
|
||||
void CreateContext();
|
||||
|
||||
::Display* disp = nullptr;
|
||||
::Window window = 0;
|
||||
GLXContext opengl_context = 0;
|
||||
|
||||
XVisualInfo* opengl_visual_info = nullptr;
|
||||
GLXFBConfig fbconfig;
|
||||
|
||||
GL_GLXFunctions glx;
|
||||
|
||||
ProcAddress* get_proc_address(const char *function_name) const;
|
||||
|
||||
GLXContext create_context_glx_1_3(GLXContext shared_context);
|
||||
void create_glx_1_3(::Display* disp);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -7,17 +7,14 @@
|
|||
#include "ShaderManager.h"
|
||||
#include <stdexcept>
|
||||
|
||||
#ifdef WIN32
|
||||
RenderDevice::RenderDevice(void* hwnd) : Context(hwnd)
|
||||
#else
|
||||
RenderDevice::RenderDevice(void* disp, void* window) : Context(disp, window)
|
||||
#endif
|
||||
RenderDevice::RenderDevice(void* disp, void* window)
|
||||
{
|
||||
memset(mUniforms, 0, sizeof(mUniforms));
|
||||
|
||||
Context = IOpenGLContext::Create(disp, window);
|
||||
if (Context)
|
||||
{
|
||||
Context.MakeCurrent();
|
||||
Context->MakeCurrent();
|
||||
|
||||
glGenVertexArrays(1, &mStreamVAO);
|
||||
glGenBuffers(1, &mStreamVertexBuffer);
|
||||
|
@ -29,7 +26,7 @@ RenderDevice::RenderDevice(void* disp, void* window) : Context(disp, window)
|
|||
mShaderManager = std::make_unique<ShaderManager>();
|
||||
|
||||
CheckError();
|
||||
Context.ClearCurrent();
|
||||
Context->ClearCurrent();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,11 +34,11 @@ RenderDevice::~RenderDevice()
|
|||
{
|
||||
if (Context)
|
||||
{
|
||||
Context.MakeCurrent();
|
||||
Context->MakeCurrent();
|
||||
glDeleteBuffers(1, &mStreamVertexBuffer);
|
||||
glDeleteVertexArrays(1, &mStreamVAO);
|
||||
mShaderManager->ReleaseResources();
|
||||
Context.ClearCurrent();
|
||||
Context->ClearCurrent();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -260,7 +257,7 @@ void RenderDevice::DrawData(PrimitiveType type, int startIndex, int primitiveCou
|
|||
|
||||
void RenderDevice::StartRendering(bool clear, int backcolor, Texture* target, bool usedepthbuffer)
|
||||
{
|
||||
Context.MakeCurrent();
|
||||
Context->MakeCurrent();
|
||||
mContextIsCurrent = true;
|
||||
|
||||
if (target)
|
||||
|
@ -271,7 +268,7 @@ void RenderDevice::StartRendering(bool clear, int backcolor, Texture* target, bo
|
|||
else
|
||||
{
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||
glViewport(0, 0, Context.GetWidth(), Context.GetHeight());
|
||||
glViewport(0, 0, Context->GetWidth(), Context->GetHeight());
|
||||
}
|
||||
|
||||
if (clear && usedepthbuffer)
|
||||
|
@ -302,13 +299,13 @@ void RenderDevice::StartRendering(bool clear, int backcolor, Texture* target, bo
|
|||
void RenderDevice::FinishRendering()
|
||||
{
|
||||
CheckError();
|
||||
Context.ClearCurrent();
|
||||
Context->ClearCurrent();
|
||||
mContextIsCurrent = false;
|
||||
}
|
||||
|
||||
void RenderDevice::Present()
|
||||
{
|
||||
Context.SwapBuffers();
|
||||
Context->SwapBuffers();
|
||||
}
|
||||
|
||||
void RenderDevice::ClearTexture(int backcolor, Texture* texture)
|
||||
|
@ -328,7 +325,7 @@ void RenderDevice::CopyTexture(Texture* dst, CubeMapFace face)
|
|||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
|
||||
};
|
||||
|
||||
if (!mContextIsCurrent) Context.MakeCurrent();
|
||||
if (!mContextIsCurrent) Context->MakeCurrent();
|
||||
GLint oldTexture = 0;
|
||||
glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &oldTexture);
|
||||
|
||||
|
@ -338,41 +335,41 @@ void RenderDevice::CopyTexture(Texture* dst, CubeMapFace face)
|
|||
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
|
||||
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, oldTexture);
|
||||
if (!mContextIsCurrent) Context.ClearCurrent();
|
||||
if (!mContextIsCurrent) Context->ClearCurrent();
|
||||
}
|
||||
|
||||
void RenderDevice::SetVertexBufferData(VertexBuffer* buffer, void* data, int64_t size, VertexFormat format)
|
||||
{
|
||||
if (!mContextIsCurrent) Context.MakeCurrent();
|
||||
if (!mContextIsCurrent) Context->MakeCurrent();
|
||||
buffer->Format = format;
|
||||
GLint oldbinding = 0;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &oldbinding);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, buffer->GetBuffer());
|
||||
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, oldbinding);
|
||||
if (!mContextIsCurrent) Context.ClearCurrent();
|
||||
if (!mContextIsCurrent) Context->ClearCurrent();
|
||||
}
|
||||
|
||||
void RenderDevice::SetVertexBufferSubdata(VertexBuffer* buffer, int64_t destOffset, void* data, int64_t size)
|
||||
{
|
||||
if (!mContextIsCurrent) Context.MakeCurrent();
|
||||
if (!mContextIsCurrent) Context->MakeCurrent();
|
||||
GLint oldbinding = 0;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &oldbinding);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, buffer->GetBuffer());
|
||||
glBufferSubData(GL_ARRAY_BUFFER, destOffset, size, data);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, oldbinding);
|
||||
if (!mContextIsCurrent) Context.ClearCurrent();
|
||||
if (!mContextIsCurrent) Context->ClearCurrent();
|
||||
}
|
||||
|
||||
void RenderDevice::SetIndexBufferData(IndexBuffer* buffer, void* data, int64_t size)
|
||||
{
|
||||
if (!mContextIsCurrent) Context.MakeCurrent();
|
||||
if (!mContextIsCurrent) Context->MakeCurrent();
|
||||
GLint oldbinding = 0;
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &oldbinding);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->GetBuffer());
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oldbinding);
|
||||
if (!mContextIsCurrent) Context.ClearCurrent();
|
||||
if (!mContextIsCurrent) Context->ClearCurrent();
|
||||
}
|
||||
|
||||
void RenderDevice::SetPixels(Texture* texture, const void* data)
|
||||
|
@ -391,9 +388,9 @@ void RenderDevice::InvalidateTexture(Texture* texture)
|
|||
{
|
||||
if (texture->IsTextureCreated())
|
||||
{
|
||||
if (!mContextIsCurrent) Context.MakeCurrent();
|
||||
if (!mContextIsCurrent) Context->MakeCurrent();
|
||||
texture->Invalidate();
|
||||
if (!mContextIsCurrent) Context.ClearCurrent();
|
||||
if (!mContextIsCurrent) Context->ClearCurrent();
|
||||
mNeedApply = true;
|
||||
mTexturesChanged = true;
|
||||
}
|
||||
|
@ -621,9 +618,9 @@ void RenderDevice::ApplyTextures()
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
RenderDevice* RenderDevice_New(void* hwnd)
|
||||
RenderDevice* RenderDevice_New(void* disp, void* window)
|
||||
{
|
||||
RenderDevice *device = new RenderDevice(hwnd);
|
||||
RenderDevice *device = new RenderDevice(disp, window);
|
||||
if (!device->Context)
|
||||
{
|
||||
delete device;
|
||||
|
|
|
@ -77,11 +77,7 @@ enum class UniformName : int
|
|||
class RenderDevice
|
||||
{
|
||||
public:
|
||||
#ifdef WIN32
|
||||
RenderDevice(void* hwnd);
|
||||
#else
|
||||
RenderDevice(void* disp, void* window);
|
||||
#endif
|
||||
~RenderDevice();
|
||||
|
||||
void SetShader(ShaderName name);
|
||||
|
@ -135,7 +131,7 @@ public:
|
|||
|
||||
GLint GetGLMinFilter(TextureFilter filter, TextureFilter mipfilter);
|
||||
|
||||
OpenGLContext Context;
|
||||
std::unique_ptr<IOpenGLContext> Context;
|
||||
|
||||
struct TextureUnit
|
||||
{
|
||||
|
|
|
@ -3293,7 +3293,7 @@ static int Load_Version_4_5(void)
|
|||
typedef int (*PFN_LOADFUNCPOINTERS)(void);
|
||||
typedef struct ogl_StrToExtMap_s
|
||||
{
|
||||
char *extensionName;
|
||||
const char *extensionName;
|
||||
int *extensionVariable;
|
||||
PFN_LOADFUNCPOINTERS LoadExtension;
|
||||
} ogl_StrToExtMap;
|
||||
|
|
Loading…
Reference in a new issue