* move GL init to main thread

* fix potential bug causing the screen bitmap to be created twice
This commit is contained in:
Arisotura 2019-04-01 04:50:48 +02:00
parent 2d0d501d1f
commit 1f13d9ce80
4 changed files with 27 additions and 15 deletions

View File

@ -53,7 +53,7 @@ bool InitGLExtensions()
{ {
#define LOADPROC(type, name) \ #define LOADPROC(type, name) \
name = (PFN##type##PROC)Platform::GL_GetProcAddress(#name); \ name = (PFN##type##PROC)Platform::GL_GetProcAddress(#name); \
if (!name) return false; if (!name) { printf("OpenGL: " #name " not found\n"); return false; }
LOADPROC(GLGENFRAMEBUFFERS, glGenFramebuffers); LOADPROC(GLGENFRAMEBUFFERS, glGenFramebuffers);
LOADPROC(GLDELETEFRAMEBUFFERS, glDeleteFramebuffers); LOADPROC(GLDELETEFRAMEBUFFERS, glDeleteFramebuffers);

View File

@ -32,7 +32,7 @@ void *uiAlloc(size_t size, const char *type)
{ {
byteArray *out; byteArray *out;
out = new byteArray(size, 0); out = new byteArray(size, 0);//printf("alloc %s at %08X\n", type, rawBytes(out));
heap[rawBytes(out)] = out; heap[rawBytes(out)] = out;
types[out] = type; types[out] = type;
return rawBytes(out); return rawBytes(out);

View File

@ -120,7 +120,14 @@ void uiGLFreeContext(uiGLContext* ctx)
void uiGLMakeContextCurrent(uiGLContext* ctx) void uiGLMakeContextCurrent(uiGLContext* ctx)
{ {
wglMakeCurrent(ctx->dc, ctx->rc); if (ctx == NULL)
{
wglMakeCurrent(NULL, NULL);
return;
}
if (wglGetCurrentContext() == ctx->rc) return;
int res = wglMakeCurrent(ctx->dc, ctx->rc);
} }
void *uiGLGetProcAddress(const char* proc) void *uiGLGetProcAddress(const char* proc)

View File

@ -60,6 +60,7 @@ char* EmuDirectory;
uiWindow* MainWindow; uiWindow* MainWindow;
uiArea* MainDrawArea; uiArea* MainDrawArea;
uiGLContext* GLContext;
int WindowWidth, WindowHeight; int WindowWidth, WindowHeight;
@ -392,14 +393,7 @@ void FeedMicInput()
int EmuThreadFunc(void* burp) int EmuThreadFunc(void* burp)
{ {
// TODO: fail gracefully, support older OpenGL, etc uiGLMakeContextCurrent(GLContext);
uiGLContext* glctx = uiGLNewContext(uiControl(MainDrawArea), 4, 3); // haw haw haw
uiGLMakeContextCurrent(glctx);
void* testor = uiGLGetProcAddress("glUseProgram");
void* testor2 = uiGLGetProcAddress("glBindFramebuffer");
printf("OPENGL: %p %p\n", testor, testor2);
NDS::Init(); NDS::Init();
MainScreenPos[0] = 0; MainScreenPos[0] = 0;
@ -407,7 +401,6 @@ int EmuThreadFunc(void* burp)
MainScreenPos[2] = 0; MainScreenPos[2] = 0;
AutoScreenSizing = 0; AutoScreenSizing = 0;
ScreenDrawInited = false;
Touching = false; Touching = false;
KeyInputMask = 0xFFF; KeyInputMask = 0xFFF;
HotkeyMask = 0; HotkeyMask = 0;
@ -440,6 +433,8 @@ int EmuThreadFunc(void* burp)
{ {
EmuStatus = 1; EmuStatus = 1;
uiGLMakeContextCurrent(GLContext);
SDL_JoystickUpdate(); SDL_JoystickUpdate();
if (Joystick) if (Joystick)
@ -624,8 +619,6 @@ int EmuThreadFunc(void* burp)
NDS::DeInit(); NDS::DeInit();
Platform::LAN_DeInit(); Platform::LAN_DeInit();
uiGLFreeContext(glctx);
return 44203; return 44203;
} }
@ -634,8 +627,8 @@ void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params)
{ {
if (!ScreenDrawInited) if (!ScreenDrawInited)
{ {
ScreenBitmap = uiDrawNewBitmap(params->Context, 256, 384);
ScreenDrawInited = true; ScreenDrawInited = true;
ScreenBitmap = uiDrawNewBitmap(params->Context, 256, 384);
} }
if (!ScreenBitmap) return; if (!ScreenBitmap) return;
@ -1981,6 +1974,7 @@ int main(int argc, char** argv)
areahandler.KeyEvent = OnAreaKeyEvent; areahandler.KeyEvent = OnAreaKeyEvent;
areahandler.Resize = OnAreaResize; areahandler.Resize = OnAreaResize;
ScreenDrawInited = false;
MainDrawArea = uiNewArea(&areahandler); MainDrawArea = uiNewArea(&areahandler);
uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiWindowSetChild(MainWindow, uiControl(MainDrawArea));
uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384);
@ -2011,6 +2005,15 @@ 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
GLContext = uiGLNewContext(uiControl(MainDrawArea), 4, 3); // haw haw haw
uiGLMakeContextCurrent(GLContext);
void* testor = uiGLGetProcAddress("glUseProgram");
void* testor2 = uiGLGetProcAddress("glBindFramebuffer");
printf("OPENGL: %p %p\n", testor, testor2);
uiGLMakeContextCurrent(NULL);
SDL_AudioSpec whatIwant, whatIget; SDL_AudioSpec whatIwant, whatIget;
memset(&whatIwant, 0, sizeof(SDL_AudioSpec)); memset(&whatIwant, 0, sizeof(SDL_AudioSpec));
whatIwant.freq = 47340; whatIwant.freq = 47340;
@ -2092,6 +2095,8 @@ 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;