modify libui GL support so that it will be compatible with GTK

This commit is contained in:
Arisotura 2019-05-21 14:53:22 +02:00
parent 139c2d24ec
commit c835b24f07
7 changed files with 101 additions and 47 deletions

View File

@ -106,8 +106,8 @@
<Unit filename="src/GPU2D.h" /> <Unit filename="src/GPU2D.h" />
<Unit filename="src/GPU3D.cpp" /> <Unit filename="src/GPU3D.cpp" />
<Unit filename="src/GPU3D.h" /> <Unit filename="src/GPU3D.h" />
<Unit filename="src/GPU3D_OpenGL43.cpp" /> <Unit filename="src/GPU3D_OpenGL.cpp" />
<Unit filename="src/GPU3D_OpenGL43_shaders.h" /> <Unit filename="src/GPU3D_OpenGL_shaders.h" />
<Unit filename="src/GPU3D_Soft.cpp" /> <Unit filename="src/GPU3D_Soft.cpp" />
<Unit filename="src/NDS.cpp" /> <Unit filename="src/NDS.cpp" />
<Unit filename="src/NDS.h" /> <Unit filename="src/NDS.h" />

View File

@ -432,7 +432,7 @@ void Open(int type)
uiLabel* dummy = uiNewLabel(""); uiLabel* dummy = uiNewLabel("");
uiBoxAppend(in_ctrl, uiControl(dummy), 1); uiBoxAppend(in_ctrl, uiControl(dummy), 1);
dlg->keypresscatcher = uiNewArea(&dlg->areahandler, 0); dlg->keypresscatcher = uiNewArea(&dlg->areahandler);
uiControl(dlg->keypresscatcher)->UserData = dlg; uiControl(dlg->keypresscatcher)->UserData = dlg;
uiBoxAppend(in_ctrl, uiControl(dlg->keypresscatcher), 0); uiBoxAppend(in_ctrl, uiControl(dlg->keypresscatcher), 0);

View File

@ -326,6 +326,10 @@ _UI_ENUM(uiWindowResizeEdge) {
// TODO way to bring up the system menu instead? // TODO way to bring up the system menu instead?
}; };
#define uiGLVersion(major, minor) ((major) | ((minor)<<16))
#define uiGLVerMajor(ver) ((ver) & 0xFFFF)
#define uiGLVerMinor(ver) ((ver) >> 16)
#define uiArea(this) ((uiArea *) (this)) #define uiArea(this) ((uiArea *) (this))
// TODO give a better name // TODO give a better name
// TODO document the types of width and height // TODO document the types of width and height
@ -341,7 +345,8 @@ _UI_EXTERN void uiAreaScrollTo(uiArea *a, double x, double y, double width, doub
_UI_EXTERN void uiAreaBeginUserWindowMove(uiArea *a); _UI_EXTERN void uiAreaBeginUserWindowMove(uiArea *a);
_UI_EXTERN void uiAreaBeginUserWindowResize(uiArea *a, uiWindowResizeEdge edge); _UI_EXTERN void uiAreaBeginUserWindowResize(uiArea *a, uiWindowResizeEdge edge);
_UI_EXTERN void uiAreaSetBackgroundColor(uiArea *a, int r, int g, int b); _UI_EXTERN void uiAreaSetBackgroundColor(uiArea *a, int r, int g, int b);
_UI_EXTERN uiArea *uiNewArea(uiAreaHandler *ah, int opengl); _UI_EXTERN uiArea *uiNewArea(uiAreaHandler *ah);
_UI_EXTERN uiArea *uiNewGLArea(uiAreaHandler *ah, const unsigned int* req_versions);
_UI_EXTERN uiArea *uiNewScrollingArea(uiAreaHandler *ah, int width, int height); _UI_EXTERN uiArea *uiNewScrollingArea(uiAreaHandler *ah, int width, int height);
struct uiAreaDrawParams { struct uiAreaDrawParams {
@ -604,9 +609,9 @@ _UI_EXTERN void uiDrawText(uiDrawContext *c, double x, double y, uiDrawTextLayou
typedef struct uiGLContext uiGLContext; typedef struct uiGLContext uiGLContext;
_UI_EXTERN uiGLContext *uiGLNewContext(uiControl* c, int vermajor, int verminor); _UI_EXTERN uiGLContext *uiAreaGetGLContext(uiArea* a);
_UI_EXTERN void uiGLFreeContext(uiGLContext* ctx);
_UI_EXTERN void uiGLMakeContextCurrent(uiGLContext* ctx); _UI_EXTERN void uiGLMakeContextCurrent(uiGLContext* ctx);
_UI_EXTERN unsigned int uiGLGetVersion(uiGLContext* ctx);
_UI_EXTERN void *uiGLGetProcAddress(const char* proc); _UI_EXTERN void *uiGLGetProcAddress(const char* proc);
_UI_EXTERN void uiGLSwapBuffers(uiGLContext* ctx); _UI_EXTERN void uiGLSwapBuffers(uiGLContext* ctx);

View File

@ -61,7 +61,15 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
// control implementation // control implementation
uiWindowsControlAllDefaults(uiArea) uiWindowsControlAllDefaultsExceptDestroy(uiArea)
static void uiAreaDestroy(uiControl *c)
{
uiArea* a = uiArea(c);
if (a->openGL && a->glcontext) freeGLContext(a->glcontext);
uiWindowsEnsureDestroyWindow(a->hwnd);
uiFreeControl(c);
}
static void uiAreaMinimumSize(uiWindowsControl *c, int *width, int *height) static void uiAreaMinimumSize(uiWindowsControl *c, int *width, int *height)
{ {
@ -181,7 +189,7 @@ void uiAreaSetBackgroundColor(uiArea *a, int r, int g, int b)
} }
uiArea *uiNewArea(uiAreaHandler *ah, int opengl) uiArea *uiNewArea(uiAreaHandler *ah)
{ {
uiArea *a; uiArea *a;
@ -203,7 +211,49 @@ uiArea *uiNewArea(uiAreaHandler *ah, int opengl)
uiAreaSetBackgroundColor(a, -1, -1, -1); uiAreaSetBackgroundColor(a, -1, -1, -1);
a->openGL = opengl; a->openGL = 0;
return a;
}
uiGLContext *uiAreaGetGLContext(uiArea* a)
{
if (!a->openGL) userbug("trying to get GL context from non-GL area");
return a->glcontext;
}
uiArea *uiNewGLArea(uiAreaHandler *ah, const unsigned int* req_versions)
{
uiArea *a;
uiWindowsNewControl(uiArea, a);
a->width = -1;
a->height = -1;
a->ah = ah;
a->scrolling = FALSE;
clickCounterReset(&(a->cc));
// a->hwnd is assigned in areaWndProc()
uiWindowsEnsureCreateControlHWND(0,
areaClass, L"",
0,
hInstance, a,
FALSE);
uiAreaSetBackgroundColor(a, -1, -1, -1);
a->openGL = 1;
for (int i = 0; req_versions[i]; i++)
{
int major = uiGLVerMajor(req_versions[i]);
int minor = uiGLVerMinor(req_versions[i]);
a->glcontext = createGLContext(a, major, minor);
if (a->glcontext) break;
}
return a; return a;
} }

View File

@ -29,6 +29,7 @@ struct uiArea {
int bgR, bgG, bgB; int bgR, bgG, bgB;
int openGL; int openGL;
uiGLContext* glcontext;
ID2D1HwndRenderTarget *rt; ID2D1HwndRenderTarget *rt;
}; };
@ -49,3 +50,7 @@ extern BOOL areaDoEvents(uiArea *a, UINT uMsg, WPARAM wParam, LPARAM lParam, LRE
extern void loadAreaSize(uiArea *a, double *width, double *height); extern void loadAreaSize(uiArea *a, double *width, double *height);
extern void pixelsToDIP(uiArea *a, double *x, double *y); extern void pixelsToDIP(uiArea *a, double *x, double *y);
extern void dipToPixels(uiArea *a, double *x, double *y); extern void dipToPixels(uiArea *a, double *x, double *y);
// gl.cpp
extern uiGLContext* createGLContext(uiArea* a, int vermajor, int verminor);
extern void freeGLContext(uiGLContext* c);

View File

@ -1,39 +1,31 @@
// 31 march 2019 // 31 march 2019
#include "uipriv_windows.hpp" #include "uipriv_windows.hpp"
#include "area.hpp"
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/wglext.h> #include <GL/wglext.h>
struct uiGLContext struct uiGLContext
{ {
uiControl* c; uiArea* a;
HWND hwnd; HWND hwnd;
HDC dc; HDC dc;
HGLRC rc; HGLRC rc;
unsigned int version;
}; };
uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor) uiGLContext* createGLContext(uiArea* a, int vermajor, int verminor)
{ {
uiGLContext* ctx; uiGLContext* ctx;
BOOL res; BOOL res;
ctx = uiNew(uiGLContext); ctx = uiNew(uiGLContext);
ctx->c = c; ctx->a = a;
if (c) ctx->hwnd = a->hwnd;
{
ctx->hwnd = (HWND)c->Handle(c); // welp
}
else
{
// windowless context
//ctx->hwnd = GetDesktopWindow();
// nope.
uiFree(ctx);
return NULL;
}
PIXELFORMATDESCRIPTOR pfd; PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd)); memset(&pfd, 0, sizeof(pfd));
@ -103,6 +95,7 @@ uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor)
return NULL; return NULL;
} }
ctx->version = uiGLVersion(vermajor, verminor);
ctx->rc = rc_better; ctx->rc = rc_better;
wglMakeCurrent(ctx->dc, ctx->rc); wglMakeCurrent(ctx->dc, ctx->rc);
} }
@ -110,8 +103,9 @@ uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor)
return ctx; return ctx;
} }
void uiGLFreeContext(uiGLContext* ctx) void freeGLContext(uiGLContext* ctx)
{ {
if (ctx == NULL) return;
wglMakeCurrent(NULL, NULL); wglMakeCurrent(NULL, NULL);
wglDeleteContext(ctx->rc); wglDeleteContext(ctx->rc);
ReleaseDC(ctx->hwnd, ctx->dc); ReleaseDC(ctx->hwnd, ctx->dc);
@ -130,6 +124,12 @@ void uiGLMakeContextCurrent(uiGLContext* ctx)
int res = wglMakeCurrent(ctx->dc, ctx->rc); int res = wglMakeCurrent(ctx->dc, ctx->rc);
} }
unsigned int uiGLGetVersion(uiGLContext* ctx)
{
if (ctx == NULL) return 0;
return ctx->version;
}
void *uiGLGetProcAddress(const char* proc) void *uiGLGetProcAddress(const char* proc)
{ {
return (void*)wglGetProcAddress(proc); return (void*)wglGetProcAddress(proc);
@ -137,5 +137,6 @@ void *uiGLGetProcAddress(const char* proc)
void uiGLSwapBuffers(uiGLContext* ctx) void uiGLSwapBuffers(uiGLContext* ctx)
{ {
if (ctx == NULL) return;
SwapBuffers(ctx->dc); SwapBuffers(ctx->dc);
} }

View File

@ -64,6 +64,9 @@ char* EmuDirectory;
uiWindow* MainWindow; uiWindow* MainWindow;
uiArea* MainDrawArea; uiArea* MainDrawArea;
uiAreaHandler MainDrawAreaHandler;
const u32 kGLVersions[] = {uiGLVersion(3,1), 0};
uiGLContext* GLContext; uiGLContext* GLContext;
int WindowWidth, WindowHeight; int WindowWidth, WindowHeight;
@ -1792,7 +1795,7 @@ void OnOpenHotkeyConfig(uiMenuItem* item, uiWindow* window, void* blarg)
{ {
DlgInputConfig::Open(1); DlgInputConfig::Open(1);
} }
uiAreaHandler eeareahandler;
void OnOpenVideoSettings(uiMenuItem* item, uiWindow* window, void* blarg) void OnOpenVideoSettings(uiMenuItem* item, uiWindow* window, void* blarg)
{ {
//DlgVideoSettings::Open(); //DlgVideoSettings::Open();
@ -1805,25 +1808,17 @@ void OnOpenVideoSettings(uiMenuItem* item, uiWindow* window, void* blarg)
GPU3D::GLRenderer::DeInit(); GPU3D::GLRenderer::DeInit();
GLDrawing_DeInit(); GLDrawing_DeInit();
uiGLMakeContextCurrent(NULL); uiGLMakeContextCurrent(NULL);
uiGLFreeContext(GLContext);
uiWindowSetChild(MainWindow, NULL); uiWindowSetChild(MainWindow, NULL);
uiControlDestroy(uiControl(MainDrawArea)); uiControlDestroy(uiControl(MainDrawArea));
eeareahandler.Draw = OnAreaDraw; MainDrawArea = uiNewGLArea(&MainDrawAreaHandler, kGLVersions);
eeareahandler.MouseEvent = OnAreaMouseEvent;
eeareahandler.MouseCrossed = OnAreaMouseCrossed;
eeareahandler.DragBroken = OnAreaDragBroken;
eeareahandler.KeyEvent = OnAreaKeyEvent;
eeareahandler.Resize = OnAreaResize;
MainDrawArea = uiNewArea(&eeareahandler, 1);
uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiWindowSetChild(MainWindow, uiControl(MainDrawArea));
uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384);
uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0); uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0);
//uiControlShow(uiControl(MainDrawArea)); //uiControlShow(uiControl(MainDrawArea));
GLContext = uiGLNewContext(uiControl(MainDrawArea), 3, 1); GLContext = uiAreaGetGLContext(MainDrawArea);
uiGLMakeContextCurrent(GLContext); uiGLMakeContextCurrent(GLContext);
GLDrawing_Init(); GLDrawing_Init();
@ -2343,16 +2338,16 @@ int main(int argc, char** argv)
uiMenuItemDisable(MenuItem_Reset); uiMenuItemDisable(MenuItem_Reset);
uiMenuItemDisable(MenuItem_Stop); uiMenuItemDisable(MenuItem_Stop);
uiAreaHandler areahandler; MainDrawAreaHandler.Draw = OnAreaDraw;
areahandler.Draw = OnAreaDraw; MainDrawAreaHandler.MouseEvent = OnAreaMouseEvent;
areahandler.MouseEvent = OnAreaMouseEvent; MainDrawAreaHandler.MouseCrossed = OnAreaMouseCrossed;
areahandler.MouseCrossed = OnAreaMouseCrossed; MainDrawAreaHandler.DragBroken = OnAreaDragBroken;
areahandler.DragBroken = OnAreaDragBroken; MainDrawAreaHandler.KeyEvent = OnAreaKeyEvent;
areahandler.KeyEvent = OnAreaKeyEvent; MainDrawAreaHandler.Resize = OnAreaResize;
areahandler.Resize = OnAreaResize;
ScreenDrawInited = false; ScreenDrawInited = false;
MainDrawArea = uiNewArea(&areahandler, 1); //MainDrawArea = uiNewArea(&MainDrawAreaHandler);
MainDrawArea = uiNewGLArea(&MainDrawAreaHandler, kGLVersions);
uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiWindowSetChild(MainWindow, uiControl(MainDrawArea));
uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384);
uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0); // TODO: make configurable? uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0); // TODO: make configurable?
@ -2383,7 +2378,7 @@ int main(int argc, char** argv)
OnSetScreenRotation(MenuItem_ScreenRot[ScreenRotation], MainWindow, (void*)&kScreenRot[ScreenRotation]); OnSetScreenRotation(MenuItem_ScreenRot[ScreenRotation], MainWindow, (void*)&kScreenRot[ScreenRotation]);
// TODO: fail gracefully, support older OpenGL, etc // TODO: fail gracefully, support older OpenGL, etc
GLContext = uiGLNewContext(uiControl(MainDrawArea), 3, 1); // haw haw haw GLContext = uiAreaGetGLContext(MainDrawArea);
uiGLMakeContextCurrent(GLContext); uiGLMakeContextCurrent(GLContext);
void* testor = uiGLGetProcAddress("glUseProgram"); void* testor = uiGLGetProcAddress("glUseProgram");
@ -2472,8 +2467,6 @@ int main(int argc, char** argv)
if (MicWavBuffer) delete[] MicWavBuffer; if (MicWavBuffer) delete[] MicWavBuffer;
uiGLFreeContext(GLContext);
Config::ScreenRotation = ScreenRotation; Config::ScreenRotation = ScreenRotation;
Config::ScreenGap = ScreenGap; Config::ScreenGap = ScreenGap;
Config::ScreenLayout = ScreenLayout; Config::ScreenLayout = ScreenLayout;