From f1628b98de5dcef702ca57ee363407d715d5b36e Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 31 Mar 2019 21:54:42 +0200 Subject: adding that file might be good, too --- src/libui_sdl/libui/windows/gl.cpp | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/libui_sdl/libui/windows/gl.cpp (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp new file mode 100644 index 0000000..fe21ae4 --- /dev/null +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -0,0 +1,66 @@ +// 31 march 2019 +#include "uipriv_windows.hpp" + +struct uiGLContext +{ + uiControl* c; + + HWND hwnd; + HDC dc; + HGLRC rc; +}; + + +uiGLContext* uiGLNewContext(uiControl* c) +{ + uiGLContext* ctx; + + ctx = uiNew(uiGLContext); + + ctx->c = c; + if (c) + { + ctx->hwnd = (HWND)c->Handle(c); // welp + } + else + { + // windowless context + ctx->hwnd = GetDesktopWindow(); + } + + PIXELFORMATDESCRIPTOR pfd; + memset(&pfd, 0, sizeof(pfd)); + pfd.nSize = sizeof(pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cAlphaBits = 8; + pfd.cDepthBits = 24; + pfd.cStencilBits = 8; + pfd.iLayerType = PFD_MAIN_PLANE; + + ctx->dc = GetDC(ctx->hwnd); + + int pixelformat = ChoosePixelFormat(ctx->dc, &pfd); + SetPixelFormat(ctx->dc, pixelformat, &pfd); + + ctx->rc = wglCreateContext(ctx->dc); +} + +void uiGLFreeContext(uiGLContext* ctx) +{ + wglDeleteContext(ctx->rc); + ReleaseDC(ctx->hwnd, ctx->dc); + uiFree(ctx); +} + +void uiGLMakeContextCurrent(uiGLContext* ctx) +{ + wglMakeCurrent(ctx->dc, ctx->rc); +} + +void *uiGLGetProcAddress(const char* proc) +{ + return (void*)wglGetProcAddress(proc); +} -- cgit v1.2.3 From f8751bd1fb83e85e2eb4e91b9c4b032ef0c18cdd Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 1 Apr 2019 02:51:31 +0200 Subject: first attempt at things (also fix softrenderer reset) --- melonDS.cbp | 68 ++++++------------ src/GPU3D.cpp | 20 ++++-- src/GPU3D.h | 14 ++++ src/GPU3D_OpenGL43.cpp | 138 +++++++++++++++++++++++++++++++++++++ src/GPU3D_Soft.cpp | 6 +- src/Platform.h | 2 + src/libui_sdl/Platform.cpp | 7 ++ src/libui_sdl/libui/ui.h | 2 +- src/libui_sdl/libui/windows/gl.cpp | 69 ++++++++++++++++++- src/libui_sdl/main.cpp | 11 +++ 10 files changed, 275 insertions(+), 62 deletions(-) create mode 100644 src/GPU3D_OpenGL43.cpp (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/melonDS.cbp b/melonDS.cbp index 9f105fc..0ba8653 100644 --- a/melonDS.cbp +++ b/melonDS.cbp @@ -19,22 +19,6 @@ - - - - - - - - - - - - - - - - @@ -51,22 +35,6 @@ - - - - - - - - - - - - - - - - @@ -82,22 +50,6 @@ - - - - - - - - - - - - - - - - @@ -107,6 +59,25 @@ + + + + + + + + + + + + + + + + + + + @@ -135,6 +106,7 @@ + diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index 802c9cd..b4211f0 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -275,14 +275,16 @@ bool Init() CmdStallQueue = new FIFO(64); - if (!SoftRenderer::Init()) return false; + //if (!SoftRenderer::Init()) return false; + if (!GLRenderer43::Init()) return false; return true; } void DeInit() { - SoftRenderer::DeInit(); + //SoftRenderer::DeInit(); + GLRenderer43::DeInit(); delete CmdFIFO; delete CmdPIPE; @@ -382,7 +384,8 @@ void Reset() FlushAttributes = 0; ResetRenderingState(); - SoftRenderer::Reset(); + //SoftRenderer::Reset(); + GLRenderer43::Reset(); } void DoSavestate(Savestate* file) @@ -2331,7 +2334,7 @@ void CheckFIFODMA() void VCount144() { - SoftRenderer::VCount144(); + //SoftRenderer::VCount144(); } @@ -2413,17 +2416,20 @@ void VBlank() void VCount215() { - SoftRenderer::RenderFrame(); + //SoftRenderer::RenderFrame(); + GLRenderer43::RenderFrame(); } void RequestLine(int line) { - return SoftRenderer::RequestLine(line); + //return SoftRenderer::RequestLine(line); + return GLRenderer43::RequestLine(line); } u32* GetLine(int line) { - return SoftRenderer::GetLine(line); + //return SoftRenderer::GetLine(line); + return GLRenderer43::GetLine(line); } diff --git a/src/GPU3D.h b/src/GPU3D.h index 279494a..f300da8 100644 --- a/src/GPU3D.h +++ b/src/GPU3D.h @@ -132,6 +132,20 @@ u32* GetLine(int line); } +namespace GLRenderer43 +{ + +bool Init(); +void DeInit(); +void Reset(); + +void VCount144(); +void RenderFrame(); +void RequestLine(int line); +u32* GetLine(int line); + +} + } #endif diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp new file mode 100644 index 0000000..acb1436 --- /dev/null +++ b/src/GPU3D_OpenGL43.cpp @@ -0,0 +1,138 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include +#include + +#include +#include +#include "NDS.h" +#include "GPU.h" +#include "Platform.h" + +namespace GPU3D +{ +namespace GLRenderer43 +{ + +PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; + + +GLuint FramebufferID; +u8 Framebuffer[256*192*4]; +u8 CurLine[256*4]; + + +bool InitGLExtensions() +{ +#define LOADPROC(type, name) \ + name = (PFN##type##PROC)Platform::GL_GetProcAddress(#name); \ + if (!name) return false; + + LOADPROC(GLGENFRAMEBUFFERS, glGenFramebuffers); + LOADPROC(GLBINDFRAMEBUFFER, glBindFramebuffer); + LOADPROC(GLFRAMEBUFFERTEXTURE, glFramebufferTexture); + +#undef LOADPROC + return true; +} + +bool Init() +{ + if (!InitGLExtensions()) return false; + + u8* test_tex = new u8[256*192*4]; + u8* ptr = test_tex; + for (int y = 0; y < 192; y++) + { + for (int x = 0; x < 256; x++) + { + if ((x & 0x10) ^ (y & 0x10)) + { + *ptr++ = 0x00; + *ptr++ = 0x00; + *ptr++ = 0x3F; + *ptr++ = 0x1F; + } + else + { + *ptr++ = 0; + *ptr++ = y>>2; + *ptr++ = 0x3F; + *ptr++ = 0x1F; + } + } + } + + glGenFramebuffers(1, &FramebufferID); + glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID); + + GLuint frametex; + glGenTextures(1, &frametex); + glBindTexture(GL_TEXTURE_2D, frametex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_BYTE, test_tex); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, frametex, 0); + + return true; +} + +void DeInit() +{ + // +} + +void Reset() +{ + // +} + + +void VCount144() +{ +} + +void RenderFrame() +{ + // +} + +void RequestLine(int line) +{ + // +} + +u32* GetLine(int line) +{ + if (line == 0) + { + glBindFramebuffer(GL_FRAMEBUFFER, FramebufferID); + glReadBuffer(GL_COLOR_ATTACHMENT0); + glReadPixels(0, 0, 256, 192, GL_RGBA, GL_UNSIGNED_BYTE, Framebuffer); + } + + return (u32*)&Framebuffer[256*4 * line]; +} + +} +} diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 29b46e1..8d18a35 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -129,9 +129,9 @@ void DeInit() void Reset() { - memset(ColorBuffer, 0, 256*192 * 4); - memset(DepthBuffer, 0, 256*192 * 4); - memset(AttrBuffer, 0, 256*192 * 4); + memset(ColorBuffer, 0, BufferSize * 2 * 4); + memset(DepthBuffer, 0, BufferSize * 2 * 4); + memset(AttrBuffer, 0, BufferSize * 2 * 4); PrevIsShadowMask = false; diff --git a/src/Platform.h b/src/Platform.h index df3335b..ca6971e 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -68,6 +68,8 @@ void Semaphore_Reset(void* sema); void Semaphore_Wait(void* sema); void Semaphore_Post(void* sema); +void* GL_GetProcAddress(const char* proc); + // local multiplayer comm interface // packet type: DS-style TX header (12 bytes) + original 802.11 frame bool MP_Init(); diff --git a/src/libui_sdl/Platform.cpp b/src/libui_sdl/Platform.cpp index 6ebe8c3..e3035b3 100644 --- a/src/libui_sdl/Platform.cpp +++ b/src/libui_sdl/Platform.cpp @@ -24,6 +24,7 @@ #include "PlatformConfig.h" #include "LAN_Socket.h" #include "LAN_PCap.h" +#include "libui/ui.h" #include #ifdef __WIN32__ @@ -302,6 +303,12 @@ void Semaphore_Post(void* sema) } +void* GL_GetProcAddress(const char* proc) +{ + return uiGLGetProcAddress(proc); +} + + bool MP_Init() { int opt_true = 1; diff --git a/src/libui_sdl/libui/ui.h b/src/libui_sdl/libui/ui.h index 381b85b..dd1c786 100644 --- a/src/libui_sdl/libui/ui.h +++ b/src/libui_sdl/libui/ui.h @@ -604,7 +604,7 @@ _UI_EXTERN void uiDrawText(uiDrawContext *c, double x, double y, uiDrawTextLayou typedef struct uiGLContext uiGLContext; -_UI_EXTERN uiGLContext *uiGLNewContext(uiControl* c); +_UI_EXTERN uiGLContext *uiGLNewContext(uiControl* c, int vermajor, int verminor); _UI_EXTERN void uiGLFreeContext(uiGLContext* ctx); _UI_EXTERN void uiGLMakeContextCurrent(uiGLContext* ctx); _UI_EXTERN void *uiGLGetProcAddress(const char* proc); diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp index fe21ae4..eb7d33d 100644 --- a/src/libui_sdl/libui/windows/gl.cpp +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -1,6 +1,9 @@ // 31 march 2019 #include "uipriv_windows.hpp" +#include +#include + struct uiGLContext { uiControl* c; @@ -11,9 +14,10 @@ struct uiGLContext }; -uiGLContext* uiGLNewContext(uiControl* c) +uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor) { uiGLContext* ctx; + BOOL res; ctx = uiNew(uiGLContext); @@ -25,7 +29,10 @@ uiGLContext* uiGLNewContext(uiControl* c) else { // windowless context - ctx->hwnd = GetDesktopWindow(); + //ctx->hwnd = GetDesktopWindow(); + // nope. + uiFree(ctx); + return NULL; } PIXELFORMATDESCRIPTOR pfd; @@ -41,15 +48,71 @@ uiGLContext* uiGLNewContext(uiControl* c) pfd.iLayerType = PFD_MAIN_PLANE; ctx->dc = GetDC(ctx->hwnd); + if (!ctx->dc) + { + uiFree(ctx); + return NULL; + } int pixelformat = ChoosePixelFormat(ctx->dc, &pfd); - SetPixelFormat(ctx->dc, pixelformat, &pfd); + res = SetPixelFormat(ctx->dc, pixelformat, &pfd); + if (!res) + { + ReleaseDC(ctx->hwnd, ctx->dc); + uiFree(ctx); + return NULL; + } ctx->rc = wglCreateContext(ctx->dc); + if (!ctx->rc) + { + ReleaseDC(ctx->hwnd, ctx->dc); + uiFree(ctx); + return NULL; + } + + wglMakeCurrent(ctx->dc, ctx->rc); + + if (vermajor >= 3) + { + HGLRC (*wglCreateContextAttribsARB)(HDC,HGLRC,const int*); + HGLRC rc_better = NULL; + + wglCreateContextAttribsARB = (HGLRC(*)(HDC,HGLRC,const int*))wglGetProcAddress("wglCreateContextAttribsARB"); + if (wglCreateContextAttribsARB) + { + int attribs[15]; + int i = 0; + + attribs[i++] = WGL_CONTEXT_MAJOR_VERSION_ARB; + attribs[i++] = vermajor; + attribs[i++] = WGL_CONTEXT_MINOR_VERSION_ARB; + attribs[i++] = verminor; + + attribs[i] = 0; + rc_better = wglCreateContextAttribsARB(ctx->dc, NULL, attribs); + } + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(ctx->rc); + + if (!rc_better) + { + ReleaseDC(ctx->hwnd, ctx->dc); + uiFree(ctx); + return NULL; + } + + ctx->rc = rc_better; + wglMakeCurrent(ctx->dc, ctx->rc); + } + + return ctx; } void uiGLFreeContext(uiGLContext* ctx) { + wglMakeCurrent(NULL, NULL); wglDeleteContext(ctx->rc); ReleaseDC(ctx->hwnd, ctx->dc); uiFree(ctx); diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp index 566b346..d892912 100644 --- a/src/libui_sdl/main.cpp +++ b/src/libui_sdl/main.cpp @@ -392,6 +392,14 @@ void FeedMicInput() int EmuThreadFunc(void* burp) { + // TODO: fail gracefully, support older OpenGL, etc + 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(); MainScreenPos[0] = 0; @@ -616,6 +624,8 @@ int EmuThreadFunc(void* burp) NDS::DeInit(); Platform::LAN_DeInit(); + uiGLFreeContext(glctx); + return 44203; } @@ -1652,6 +1662,7 @@ void ApplyNewSettings(int type) if (type == 0) // general emu settings { + // TODO!! REMOVE ME GPU3D::SoftRenderer::SetupRenderThread(); } else if (type == 1) // wifi settings -- cgit v1.2.3 From 1f13d9ce80c0cd5e94ba883ff6bb30c95d48a48a Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 1 Apr 2019 04:50:48 +0200 Subject: * move GL init to main thread * fix potential bug causing the screen bitmap to be created twice --- src/GPU3D_OpenGL43.cpp | 2 +- src/libui_sdl/libui/windows/alloc.cpp | 2 +- src/libui_sdl/libui/windows/gl.cpp | 9 ++++++++- src/libui_sdl/main.cpp | 29 +++++++++++++++++------------ 4 files changed, 27 insertions(+), 15 deletions(-) (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp index 58539fa..ea8bbd7 100644 --- a/src/GPU3D_OpenGL43.cpp +++ b/src/GPU3D_OpenGL43.cpp @@ -53,7 +53,7 @@ bool InitGLExtensions() { #define LOADPROC(type, 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(GLDELETEFRAMEBUFFERS, glDeleteFramebuffers); diff --git a/src/libui_sdl/libui/windows/alloc.cpp b/src/libui_sdl/libui/windows/alloc.cpp index cf6bd2e..e29d60e 100644 --- a/src/libui_sdl/libui/windows/alloc.cpp +++ b/src/libui_sdl/libui/windows/alloc.cpp @@ -32,7 +32,7 @@ void *uiAlloc(size_t size, const char *type) { 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; types[out] = type; return rawBytes(out); diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp index eb7d33d..beccb79 100644 --- a/src/libui_sdl/libui/windows/gl.cpp +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -120,7 +120,14 @@ void uiGLFreeContext(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) diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp index d892912..2705560 100644 --- a/src/libui_sdl/main.cpp +++ b/src/libui_sdl/main.cpp @@ -60,6 +60,7 @@ char* EmuDirectory; uiWindow* MainWindow; uiArea* MainDrawArea; +uiGLContext* GLContext; int WindowWidth, WindowHeight; @@ -392,14 +393,7 @@ void FeedMicInput() int EmuThreadFunc(void* burp) { - // TODO: fail gracefully, support older OpenGL, etc - 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); - + uiGLMakeContextCurrent(GLContext); NDS::Init(); MainScreenPos[0] = 0; @@ -407,7 +401,6 @@ int EmuThreadFunc(void* burp) MainScreenPos[2] = 0; AutoScreenSizing = 0; - ScreenDrawInited = false; Touching = false; KeyInputMask = 0xFFF; HotkeyMask = 0; @@ -440,6 +433,8 @@ int EmuThreadFunc(void* burp) { EmuStatus = 1; + uiGLMakeContextCurrent(GLContext); + SDL_JoystickUpdate(); if (Joystick) @@ -624,8 +619,6 @@ int EmuThreadFunc(void* burp) NDS::DeInit(); Platform::LAN_DeInit(); - uiGLFreeContext(glctx); - return 44203; } @@ -634,8 +627,8 @@ void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params) { if (!ScreenDrawInited) { - ScreenBitmap = uiDrawNewBitmap(params->Context, 256, 384); ScreenDrawInited = true; + ScreenBitmap = uiDrawNewBitmap(params->Context, 256, 384); } if (!ScreenBitmap) return; @@ -1981,6 +1974,7 @@ int main(int argc, char** argv) areahandler.KeyEvent = OnAreaKeyEvent; areahandler.Resize = OnAreaResize; + ScreenDrawInited = false; MainDrawArea = uiNewArea(&areahandler); uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); @@ -2011,6 +2005,15 @@ int main(int argc, char** argv) 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; memset(&whatIwant, 0, sizeof(SDL_AudioSpec)); whatIwant.freq = 47340; @@ -2092,6 +2095,8 @@ int main(int argc, char** argv) if (MicWavBuffer) delete[] MicWavBuffer; + uiGLFreeContext(GLContext); + Config::ScreenRotation = ScreenRotation; Config::ScreenGap = ScreenGap; Config::ScreenLayout = ScreenLayout; -- cgit v1.2.3 From a89366cb5a1106152374c9e91ebef96149db76cc Mon Sep 17 00:00:00 2001 From: Arisotura Date: Wed, 15 May 2019 16:43:56 +0200 Subject: begin butchering uiArea --- src/libui_sdl/DlgInputConfig.cpp | 2 +- src/libui_sdl/libui/ui.h | 3 ++- src/libui_sdl/libui/windows/area.cpp | 23 +++++++++++++++++++---- src/libui_sdl/libui/windows/area.hpp | 6 +++++- src/libui_sdl/libui/windows/areadraw.cpp | 27 ++++++++++++++++++++------- src/libui_sdl/libui/windows/areaevents.cpp | 2 +- src/libui_sdl/libui/windows/areautil.cpp | 21 ++++++++++++++++++--- src/libui_sdl/libui/windows/gl.cpp | 5 +++++ src/libui_sdl/main.cpp | 6 ++++-- 9 files changed, 75 insertions(+), 20 deletions(-) (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/src/libui_sdl/DlgInputConfig.cpp b/src/libui_sdl/DlgInputConfig.cpp index 513bd90..4c464f1 100644 --- a/src/libui_sdl/DlgInputConfig.cpp +++ b/src/libui_sdl/DlgInputConfig.cpp @@ -432,7 +432,7 @@ void Open(int type) uiLabel* dummy = uiNewLabel(""); uiBoxAppend(in_ctrl, uiControl(dummy), 1); - dlg->keypresscatcher = uiNewArea(&dlg->areahandler); + dlg->keypresscatcher = uiNewArea(&dlg->areahandler, 0); uiControl(dlg->keypresscatcher)->UserData = dlg; uiBoxAppend(in_ctrl, uiControl(dlg->keypresscatcher), 0); diff --git a/src/libui_sdl/libui/ui.h b/src/libui_sdl/libui/ui.h index dd1c786..2641f30 100644 --- a/src/libui_sdl/libui/ui.h +++ b/src/libui_sdl/libui/ui.h @@ -341,7 +341,7 @@ _UI_EXTERN void uiAreaScrollTo(uiArea *a, double x, double y, double width, doub _UI_EXTERN void uiAreaBeginUserWindowMove(uiArea *a); _UI_EXTERN void uiAreaBeginUserWindowResize(uiArea *a, uiWindowResizeEdge edge); _UI_EXTERN void uiAreaSetBackgroundColor(uiArea *a, int r, int g, int b); -_UI_EXTERN uiArea *uiNewArea(uiAreaHandler *ah); +_UI_EXTERN uiArea *uiNewArea(uiAreaHandler *ah, int opengl); _UI_EXTERN uiArea *uiNewScrollingArea(uiAreaHandler *ah, int width, int height); struct uiAreaDrawParams { @@ -608,6 +608,7 @@ _UI_EXTERN uiGLContext *uiGLNewContext(uiControl* c, int vermajor, int verminor) _UI_EXTERN void uiGLFreeContext(uiGLContext* ctx); _UI_EXTERN void uiGLMakeContextCurrent(uiGLContext* ctx); _UI_EXTERN void *uiGLGetProcAddress(const char* proc); +_UI_EXTERN void uiGLSwapBuffers(uiGLContext* ctx); _UI_ENUM(uiModifiers) { diff --git a/src/libui_sdl/libui/windows/area.cpp b/src/libui_sdl/libui/windows/area.cpp index 2185f25..99c843e 100644 --- a/src/libui_sdl/libui/windows/area.cpp +++ b/src/libui_sdl/libui/windows/area.cpp @@ -25,8 +25,11 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM } // always recreate the render target if necessary - if (a->rt == NULL) - a->rt = makeHWNDRenderTarget(a->hwnd); + if (!a->openGL) + { + if (a->rt == NULL) + a->rt = makeHWNDRenderTarget(a->hwnd); + } if (areaDoDraw(a, uMsg, wParam, lParam, &lResult) != FALSE) return lResult; @@ -34,12 +37,14 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM if (uMsg == WM_WINDOWPOSCHANGED) { if ((wp->flags & SWP_NOSIZE) != 0) return DefWindowProcW(hwnd, uMsg, wParam, lParam); + a->width = -1; + a->height = -1; uiWindowsEnsureGetClientRect(a->hwnd, &client); areaDrawOnResize(a, &client); areaScrollOnResize(a, &client); { double w, h; - loadAreaSize(a, a->rt, &w, &h); + loadAreaSize(a, &w, &h); a->ah->Resize(a->ah, a, (int)w, (int)h); } return 0; @@ -176,12 +181,15 @@ void uiAreaSetBackgroundColor(uiArea *a, int r, int g, int b) } -uiArea *uiNewArea(uiAreaHandler *ah) +uiArea *uiNewArea(uiAreaHandler *ah, int opengl) { uiArea *a; uiWindowsNewControl(uiArea, a); + a->width = -1; + a->height = -1; + a->ah = ah; a->scrolling = FALSE; clickCounterReset(&(a->cc)); @@ -195,6 +203,8 @@ uiArea *uiNewArea(uiAreaHandler *ah) uiAreaSetBackgroundColor(a, -1, -1, -1); + a->openGL = opengl; + return a; } @@ -204,6 +214,9 @@ uiArea *uiNewScrollingArea(uiAreaHandler *ah, int width, int height) uiWindowsNewControl(uiArea, a); + a->width = -1; + a->height = -1; + a->ah = ah; a->scrolling = TRUE; a->scrollWidth = width; @@ -219,6 +232,8 @@ uiArea *uiNewScrollingArea(uiAreaHandler *ah, int width, int height) uiAreaSetBackgroundColor(a, -1, -1, -1); + a->openGL = 0; // TODO, eventually??? + // set initial scrolling parameters areaUpdateScroll(a); diff --git a/src/libui_sdl/libui/windows/area.hpp b/src/libui_sdl/libui/windows/area.hpp index add62dd..f8abd4f 100644 --- a/src/libui_sdl/libui/windows/area.hpp +++ b/src/libui_sdl/libui/windows/area.hpp @@ -10,6 +10,8 @@ struct uiArea { HWND hwnd; uiAreaHandler *ah; + int width, height; + BOOL scrolling; int scrollWidth; int scrollHeight; @@ -26,6 +28,8 @@ struct uiArea { int bgR, bgG, bgB; + int openGL; + ID2D1HwndRenderTarget *rt; }; @@ -42,6 +46,6 @@ extern void areaUpdateScroll(uiArea *a); extern BOOL areaDoEvents(uiArea *a, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *lResult); // areautil.cpp -extern void loadAreaSize(uiArea *a, ID2D1RenderTarget *rt, double *width, double *height); +extern void loadAreaSize(uiArea *a, double *width, double *height); extern void pixelsToDIP(uiArea *a, double *x, double *y); extern void dipToPixels(uiArea *a, double *x, double *y); diff --git a/src/libui_sdl/libui/windows/areadraw.cpp b/src/libui_sdl/libui/windows/areadraw.cpp index a9ad477..6b4845a 100644 --- a/src/libui_sdl/libui/windows/areadraw.cpp +++ b/src/libui_sdl/libui/windows/areadraw.cpp @@ -6,6 +6,13 @@ static HRESULT doPaint(uiArea *a, ID2D1RenderTarget *rt, RECT *clip) { uiAreaHandler *ah = a->ah; uiAreaDrawParams dp; + + if (a->openGL) + { + (*(ah->Draw))(ah, a, &dp); + return S_OK; + } + COLORREF bgcolorref; D2D1_COLOR_F bgcolor; D2D1_MATRIX_3X2_F scrollTransform; @@ -13,7 +20,7 @@ static HRESULT doPaint(uiArea *a, ID2D1RenderTarget *rt, RECT *clip) // no need to save or restore the graphics state to reset transformations; it's handled by resetTarget() in draw.c, called during the following dp.Context = newContext(rt); - loadAreaSize(a, rt, &(dp.AreaWidth), &(dp.AreaHeight)); + loadAreaSize(a, &(dp.AreaWidth), &(dp.AreaHeight)); dp.ClipX = clip->left; dp.ClipY = clip->top; @@ -113,6 +120,9 @@ static void onWM_PAINT(uiArea *a) static void onWM_PRINTCLIENT(uiArea *a, HDC dc) { + // TODO???? + if (a->openGL) return; + ID2D1DCRenderTarget *rt; RECT client; HRESULT hr; @@ -143,13 +153,16 @@ BOOL areaDoDraw(uiArea *a, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *lRe // TODO only if the render target wasn't just created? void areaDrawOnResize(uiArea *a, RECT *newClient) { - D2D1_SIZE_U size; + if (!a->openGL) + { + D2D1_SIZE_U size; - size.width = newClient->right - newClient->left; - size.height = newClient->bottom - newClient->top; - // don't track the error; we'll get that in EndDraw() - // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd370994%28v=vs.85%29.aspx - a->rt->Resize(&size); + size.width = newClient->right - newClient->left; + size.height = newClient->bottom - newClient->top; + // don't track the error; we'll get that in EndDraw() + // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd370994%28v=vs.85%29.aspx + a->rt->Resize(&size); + } // according to Rick Brewster, we must always redraw the entire client area after calling ID2D1RenderTarget::Resize() (see http://stackoverflow.com/a/33222983/3408572) // we used to have a uiAreaHandler.RedrawOnResize() method to decide this; now you know why we don't anymore diff --git a/src/libui_sdl/libui/windows/areaevents.cpp b/src/libui_sdl/libui/windows/areaevents.cpp index 3ff7a47..46d6ab9 100644 --- a/src/libui_sdl/libui/windows/areaevents.cpp +++ b/src/libui_sdl/libui/windows/areaevents.cpp @@ -109,7 +109,7 @@ static void areaMouseEvent(uiArea *a, int down, int up, WPARAM wParam, LPARAM l me.Y += a->vscrollpos; } - loadAreaSize(a, NULL, &(me.AreaWidth), &(me.AreaHeight)); + loadAreaSize(a, &(me.AreaWidth), &(me.AreaHeight)); me.Down = down; me.Up = up; diff --git a/src/libui_sdl/libui/windows/areautil.cpp b/src/libui_sdl/libui/windows/areautil.cpp index 212ea42..ea13221 100644 --- a/src/libui_sdl/libui/windows/areautil.cpp +++ b/src/libui_sdl/libui/windows/areautil.cpp @@ -2,20 +2,35 @@ #include "uipriv_windows.hpp" #include "area.hpp" -void loadAreaSize(uiArea *a, ID2D1RenderTarget *rt, double *width, double *height) +// TODO: make those int rather than double +void loadAreaSize(uiArea *a, double *width, double *height) { D2D1_SIZE_F size; + if (a->width != -1) + { + *width = (double)a->width; + *height = (double)a->height; + return; + } + *width = 0; *height = 0; if (!a->scrolling) { - if (rt == NULL) + /*if (rt == NULL) rt = a->rt; size = realGetSize(rt); *width = size.width; *height = size.height; - dipToPixels(a, width, height); + dipToPixels(a, width, height);*/ + RECT rect; + GetWindowRect(a->hwnd, &rect); + *width = (double)(rect.right - rect.left); + *height = (double)(rect.bottom - rect.top); } + + a->width = (int)*width; + a->height = (int)*height; } void pixelsToDIP(uiArea *a, double *x, double *y) diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp index beccb79..67eaeda 100644 --- a/src/libui_sdl/libui/windows/gl.cpp +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -134,3 +134,8 @@ void *uiGLGetProcAddress(const char* proc) { return (void*)wglGetProcAddress(proc); } + +void uiGLSwapBuffers(uiGLContext* ctx) +{ + SwapBuffers(ctx->dc); +} diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp index 6fcb1ae..b39f493 100644 --- a/src/libui_sdl/main.cpp +++ b/src/libui_sdl/main.cpp @@ -568,6 +568,7 @@ int EmuThreadFunc(void* burp) if (EmuRunning == 0) break; uiAreaQueueRedrawAll(MainDrawArea); + //uiGLSwapBuffers(GLContext); // framerate limiter based off SDL2_gfx float framerate; @@ -619,7 +620,8 @@ int EmuThreadFunc(void* burp) if (EmuRunning == 2) { - uiAreaQueueRedrawAll(MainDrawArea); + //uiAreaQueueRedrawAll(MainDrawArea); + //uiGLSwapBuffers(GLContext); } EmuStatus = EmuRunning; @@ -2061,7 +2063,7 @@ int main(int argc, char** argv) areahandler.Resize = OnAreaResize; ScreenDrawInited = false; - MainDrawArea = uiNewArea(&areahandler); + MainDrawArea = uiNewArea(&areahandler, 0); uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0); // TODO: make configurable? -- cgit v1.2.3 From f2725791d8c3b5f00ddc830691ed556b48f2f508 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Thu, 16 May 2019 00:30:55 +0200 Subject: preliminary, shitty, code for drawing the main window with OpenGL --- melonDS.cbp | 1 + src/GPU3D_OpenGL43.cpp | 7 +- src/OpenGLSupport.cpp | 85 ++++++++++++++ src/OpenGLSupport.h | 4 + src/libui_sdl/libui/windows/gl.cpp | 2 +- src/libui_sdl/main.cpp | 227 ++++++++++++++++++++++++++++++++++++- src/libui_sdl/main_shaders.h | 72 ++++++++++++ 7 files changed, 392 insertions(+), 6 deletions(-) create mode 100644 src/libui_sdl/main_shaders.h (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/melonDS.cbp b/melonDS.cbp index 4634513..ff01ebf 100644 --- a/melonDS.cbp +++ b/melonDS.cbp @@ -230,6 +230,7 @@ + diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp index 3a2a3f1..b3e0856 100644 --- a/src/GPU3D_OpenGL43.cpp +++ b/src/GPU3D_OpenGL43.cpp @@ -732,7 +732,8 @@ bool ChunkedRendering = false; bool InitGLExtensions() { - if (!OpenGL_Init()) return false; + // TODO move this elsewhere!! + //if (!OpenGL_Init()) return false; return true; } @@ -1385,7 +1386,7 @@ void VCount144() } void RenderFrame() -{ +{return; ShaderConfig.uScreenSize[0] = ScreenW; ShaderConfig.uScreenSize[1] = ScreenH; ShaderConfig.uDispCnt = RenderDispCnt; @@ -1544,7 +1545,7 @@ void RenderFrame() u32* GetLine(int line) { int stride = 256 << (ScaleFactor*2); - +return &Framebuffer[stride * line]; if (!ChunkedRendering) { if (line == 0) diff --git a/src/OpenGLSupport.cpp b/src/OpenGLSupport.cpp index c22fd1c..81a008b 100644 --- a/src/OpenGLSupport.cpp +++ b/src/OpenGLSupport.cpp @@ -28,3 +28,88 @@ bool OpenGL_Init() return true; } + +bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name) +{ + int len; + int res; + + ids[0] = glCreateShader(GL_VERTEX_SHADER); + len = strlen(vs); + glShaderSource(ids[0], 1, &vs, &len); + glCompileShader(ids[0]); + + glGetShaderiv(ids[0], GL_COMPILE_STATUS, &res); + if (res != GL_TRUE) + { + glGetShaderiv(ids[0], GL_INFO_LOG_LENGTH, &res); + if (res < 1) res = 1024; + char* log = new char[res+1]; + glGetShaderInfoLog(ids[0], res+1, NULL, log); + printf("OpenGL: failed to compile vertex shader %s: %s\n", name, log); + printf("shader source:\n--\n%s\n--\n", vs); + delete[] log; + + glDeleteShader(ids[0]); + + return false; + } + + ids[1] = glCreateShader(GL_FRAGMENT_SHADER); + len = strlen(fs); + glShaderSource(ids[1], 1, &fs, &len); + glCompileShader(ids[1]); + + glGetShaderiv(ids[1], GL_COMPILE_STATUS, &res); + if (res != GL_TRUE) + { + glGetShaderiv(ids[1], GL_INFO_LOG_LENGTH, &res); + if (res < 1) res = 1024; + char* log = new char[res+1]; + glGetShaderInfoLog(ids[1], res+1, NULL, log); + printf("OpenGL: failed to compile fragment shader %s: %s\n", name, log); + //printf("shader source:\n--\n%s\n--\n", fs); + delete[] log; + + glDeleteShader(ids[0]); + glDeleteShader(ids[1]); + + return false; + } + + ids[2] = glCreateProgram(); + glAttachShader(ids[2], ids[0]); + glAttachShader(ids[2], ids[1]); + glLinkProgram(ids[2]); + + glGetProgramiv(ids[2], GL_LINK_STATUS, &res); + if (res != GL_TRUE) + { + glGetProgramiv(ids[2], GL_INFO_LOG_LENGTH, &res); + if (res < 1) res = 1024; + char* log = new char[res+1]; + glGetProgramInfoLog(ids[2], res+1, NULL, log); + printf("OpenGL: failed to link program %s: %s\n", name, log); + delete[] log; + + glDeleteShader(ids[0]); + glDeleteShader(ids[1]); + glDeleteProgram(ids[2]); + + return false; + } + + return true; +} + +void OpenGL_DeleteShaderProgram(GLuint* ids) +{ + glDeleteShader(ids[0]); + glDeleteShader(ids[1]); + glDeleteProgram(ids[2]); +} + +void OpenGL_UseShaderProgram(GLuint* ids) +{ + glUseProgram(ids[2]); +} diff --git a/src/OpenGLSupport.h b/src/OpenGLSupport.h index 10ba1e5..2cee741 100644 --- a/src/OpenGLSupport.h +++ b/src/OpenGLSupport.h @@ -109,4 +109,8 @@ DO_PROCLIST(DECLPROC_EXT); bool OpenGL_Init(); +bool OpenGL_BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name); +void OpenGL_DeleteShaderProgram(GLuint* ids); +void OpenGL_UseShaderProgram(GLuint* ids); + #endif // OPENGLSUPPORT_H diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp index 67eaeda..832a2e5 100644 --- a/src/libui_sdl/libui/windows/gl.cpp +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -39,7 +39,7 @@ uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor) memset(&pfd, 0, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cAlphaBits = 8; diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp index b39f493..23e6617 100644 --- a/src/libui_sdl/main.cpp +++ b/src/libui_sdl/main.cpp @@ -24,6 +24,9 @@ #include #include "libui/ui.h" +#include "../OpenGLSupport.h" +#include "main_shaders.h" + #include "../types.h" #include "../version.h" #include "PlatformConfig.h" @@ -97,6 +100,19 @@ bool SavestateLoaded; bool ScreenDrawInited = false; uiDrawBitmap* ScreenBitmap[2] = {NULL,NULL}; +GLuint GL_ScreenShader[3]; +struct +{ + float uScreenSize[2]; + u32 uFilterMode; + +} GL_ShaderConfig; +GLuint GL_ShaderConfigUBO; +GLuint GL_ScreenVertexArrayID, GL_ScreenVertexBufferID; +float GL_ScreenVertices[2 * 3*2 * 4]; // position/texcoord +GLuint GL_ScreenTexture; +bool GL_ScreenSizeDirty; + int ScreenScale[3]; int ScreenScaleMode; @@ -141,6 +157,204 @@ void GetSavestateName(int slot, char* filename, int len); +bool GLDrawing_Init() +{ + if (!OpenGL_Init()) + return false; + + if (!OpenGL_BuildShaderProgram(kScreenVS, kScreenFS, GL_ScreenShader, "ScreenShader")) + return false; + + memset(&GL_ShaderConfig, 0, sizeof(GL_ShaderConfig)); + + glGenBuffers(1, &GL_ShaderConfigUBO); + glBindBuffer(GL_UNIFORM_BUFFER, GL_ShaderConfigUBO); + glBufferData(GL_UNIFORM_BUFFER, sizeof(GL_ShaderConfig), &GL_ShaderConfig, GL_STATIC_DRAW); + glBindBufferBase(GL_UNIFORM_BUFFER, 16, GL_ShaderConfigUBO); + glUniformBlockBinding(GL_ScreenShader[2], 0, 16); + + glGenBuffers(1, &GL_ScreenVertexBufferID); + glBindBuffer(GL_ARRAY_BUFFER, GL_ScreenVertexBufferID); + glBufferData(GL_ARRAY_BUFFER, sizeof(GL_ScreenVertices), NULL, GL_STATIC_DRAW); + + glGenVertexArrays(1, &GL_ScreenVertexArrayID); + glBindVertexArray(GL_ScreenVertexArrayID); + glEnableVertexAttribArray(0); // position + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(0)); + glEnableVertexAttribArray(1); // texcoord + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(2*4)); + + glGenTextures(1, &GL_ScreenTexture); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, GL_ScreenTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, 1024, 1536, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, NULL); + + GL_ScreenSizeDirty = true; + + return true; +} + +void GLDrawing_DeInit() +{ + glDeleteTextures(1, &GL_ScreenTexture); + + glDeleteVertexArrays(1, &GL_ScreenVertexArrayID); + glDeleteBuffers(1, &GL_ScreenVertexBufferID); + + OpenGL_DeleteShaderProgram(GL_ScreenShader); +} + +void GLDrawing_DrawScreen() +{ + if (GL_ScreenSizeDirty) + { + GL_ScreenSizeDirty = false; + + GL_ShaderConfig.uScreenSize[0] = WindowWidth; + GL_ShaderConfig.uScreenSize[1] = WindowHeight; + + glBindBuffer(GL_UNIFORM_BUFFER, GL_ShaderConfigUBO); + void* unibuf = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); + if (unibuf) memcpy(unibuf, &GL_ShaderConfig, sizeof(GL_ShaderConfig)); + glUnmapBuffer(GL_UNIFORM_BUFFER); + + float scwidth, scheight; + scwidth = 512; + scheight = 384; + + float x0, y0, x1, y1; + float s0, s1, s2, s3; + float t0, t1, t2, t3; + +#define SETVERTEX(i, x, y, s, t) \ + GL_ScreenVertices[4*(i) + 0] = x; \ + GL_ScreenVertices[4*(i) + 1] = y; \ + GL_ScreenVertices[4*(i) + 2] = s; \ + GL_ScreenVertices[4*(i) + 3] = t; + + x0 = TopScreenRect.X; + y0 = TopScreenRect.Y; + x1 = TopScreenRect.X + TopScreenRect.Width; + y1 = TopScreenRect.Y + TopScreenRect.Height; + + switch (ScreenRotation) + { + case 0: + s0 = 0; t0 = 0; + s1 = scwidth; t1 = 0; + s2 = 0; t2 = scheight; + s3 = scwidth; t3 = scheight; + break; + + case 1: + s0 = 0; t0 = scheight; + s1 = 0; t1 = 0; + s2 = scwidth; t2 = scheight; + s3 = scwidth; t3 = 0; + break; + + case 2: + s0 = scwidth; t0 = scheight; + s1 = 0; t1 = scheight; + s2 = scwidth; t2 = 0; + s3 = 0; t3 = 0; + break; + + case 3: + s0 = scwidth; t0 = 0; + s1 = scwidth; t1 = scheight; + s2 = 0; t2 = 0; + s3 = 0; t3 = scheight; + break; + } + + SETVERTEX(0, x0, y0, s0, t0); + SETVERTEX(1, x1, y1, s3, t3); + SETVERTEX(2, x1, y0, s1, t1); + SETVERTEX(3, x0, y0, s0, t0); + SETVERTEX(4, x0, y1, s2, t2); + SETVERTEX(5, x1, y1, s3, t3); + + // TODO: adjust scwidth/scheight + + x0 = BottomScreenRect.X; + y0 = BottomScreenRect.Y; + x1 = BottomScreenRect.X + BottomScreenRect.Width; + y1 = BottomScreenRect.Y + BottomScreenRect.Height; + + switch (ScreenRotation) + { + case 0: + s0 = 0; t0 = 768; + s1 = scwidth; t1 = 768; + s2 = 0; t2 = 768+scheight; + s3 = scwidth; t3 = 768+scheight; + break; + + case 1: + s0 = 0; t0 = 768+scheight; + s1 = 0; t1 = 768; + s2 = scwidth; t2 = 768+scheight; + s3 = scwidth; t3 = 768; + break; + + case 2: + s0 = scwidth; t0 = 768+scheight; + s1 = 0; t1 = 768+scheight; + s2 = scwidth; t2 = 768; + s3 = 0; t3 = 768; + break; + + case 3: + s0 = scwidth; t0 = 768; + s1 = scwidth; t1 = 768+scheight; + s2 = 0; t2 = 768; + s3 = 0; t3 = 768+scheight; + break; + } + + SETVERTEX(6, x0, y0, s0, t0); + SETVERTEX(7, x1, y1, s3, t3); + SETVERTEX(8, x1, y0, s1, t1); + SETVERTEX(9, x0, y0, s0, t0); + SETVERTEX(10, x0, y1, s2, t2); + SETVERTEX(11, x1, y1, s3, t3); + +#undef SETVERTEX + + glBindBuffer(GL_ARRAY_BUFFER, GL_ScreenVertexBufferID); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GL_ScreenVertices), GL_ScreenVertices); + } + + glDisable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + + glViewport(0, 0, WindowWidth, WindowHeight); + + OpenGL_UseShaderProgram(GL_ScreenShader); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glClearColor(0, 1, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + int frontbuf = GPU::FrontBuffer; + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, GL_ScreenTexture); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 384, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][0]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 768, 512, 384, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][1]); + + glBindBuffer(GL_ARRAY_BUFFER, GL_ScreenVertexBufferID); + glBindVertexArray(GL_ScreenVertexArrayID); + glDrawArrays(GL_TRIANGLES, 0, 4*3); + + uiGLSwapBuffers(GLContext); + uiAreaQueueRedrawAll(MainDrawArea); +} + void MicLoadWav(char* name) { SDL_AudioSpec format; @@ -397,6 +611,8 @@ void FeedMicInput() int EmuThreadFunc(void* burp) { uiGLMakeContextCurrent(GLContext); + GLDrawing_Init(); + NDS::Init(); MainScreenPos[0] = 0; @@ -567,7 +783,9 @@ int EmuThreadFunc(void* burp) if (EmuRunning == 0) break; - uiAreaQueueRedrawAll(MainDrawArea); + GLDrawing_DrawScreen(); + + //uiAreaQueueRedrawAll(MainDrawArea); //uiGLSwapBuffers(GLContext); // framerate limiter based off SDL2_gfx @@ -622,6 +840,7 @@ int EmuThreadFunc(void* burp) { //uiAreaQueueRedrawAll(MainDrawArea); //uiGLSwapBuffers(GLContext); + GLDrawing_DrawScreen(); } EmuStatus = EmuRunning; @@ -637,6 +856,8 @@ int EmuThreadFunc(void* burp) NDS::DeInit(); Platform::LAN_DeInit(); + GLDrawing_DeInit(); + return 44203; } @@ -1058,6 +1279,8 @@ void SetupScreenRects(int width, int height) } break; } + + GL_ScreenSizeDirty = true; } void SetMinSize(int w, int h) @@ -2063,7 +2286,7 @@ int main(int argc, char** argv) areahandler.Resize = OnAreaResize; ScreenDrawInited = false; - MainDrawArea = uiNewArea(&areahandler, 0); + MainDrawArea = uiNewArea(&areahandler, 1); uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0); // TODO: make configurable? diff --git a/src/libui_sdl/main_shaders.h b/src/libui_sdl/main_shaders.h new file mode 100644 index 0000000..dcf79d9 --- /dev/null +++ b/src/libui_sdl/main_shaders.h @@ -0,0 +1,72 @@ +/* + Copyright 2016-2019 Arisotura + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef MAIN_SHADERS_H +#define MAIN_SHADERS_H + +const char* kScreenVS = R"(#version 420 + +layout(std140, binding=0) uniform uConfig +{ + vec2 uScreenSize; + uint uFilterMode; +}; + +layout(location=0) in vec2 vPosition; +layout(location=1) in vec2 vTexcoord; + +smooth out vec2 fTexcoord; + +void main() +{ + vec4 fpos; + fpos.xy = ((vPosition.xy * 2.0) / uScreenSize) - 1.0; + fpos.y *= -1; + fpos.z = 0.0; + fpos.w = 1.0; + + gl_Position = fpos; + fTexcoord = vTexcoord; +} +)"; + +const char* kScreenFS = R"(#version 420 + +layout(std140, binding=0) uniform uConfig +{ + vec2 uScreenSize; + uint uFilterMode; +}; + +layout(binding=0) uniform usampler2D ScreenTex; + +smooth in vec2 fTexcoord; + +layout(location=0) out vec4 oColor; + +void main() +{ + uvec4 pixel = texelFetch(ScreenTex, ivec2(fTexcoord), 0); + + // TODO: filters + + oColor = vec4(vec3(pixel.bgr) / 255.0, 1.0); +} +)"; + +#endif // MAIN_SHADERS_H -- cgit v1.2.3 From c835b24f07a317ea435b742ec2fae12dc619c01b Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 21 May 2019 14:53:22 +0200 Subject: modify libui GL support so that it will be compatible with GTK --- melonDS.cbp | 4 +-- src/libui_sdl/DlgInputConfig.cpp | 2 +- src/libui_sdl/libui/ui.h | 11 +++++-- src/libui_sdl/libui/windows/area.cpp | 56 ++++++++++++++++++++++++++++++++++-- src/libui_sdl/libui/windows/area.hpp | 5 ++++ src/libui_sdl/libui/windows/gl.cpp | 33 ++++++++++----------- src/libui_sdl/main.cpp | 37 ++++++++++-------------- 7 files changed, 101 insertions(+), 47 deletions(-) (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/melonDS.cbp b/melonDS.cbp index 0bdac7f..bb4d8c7 100644 --- a/melonDS.cbp +++ b/melonDS.cbp @@ -106,8 +106,8 @@ - - + + diff --git a/src/libui_sdl/DlgInputConfig.cpp b/src/libui_sdl/DlgInputConfig.cpp index 4c464f1..513bd90 100644 --- a/src/libui_sdl/DlgInputConfig.cpp +++ b/src/libui_sdl/DlgInputConfig.cpp @@ -432,7 +432,7 @@ void Open(int type) uiLabel* dummy = uiNewLabel(""); uiBoxAppend(in_ctrl, uiControl(dummy), 1); - dlg->keypresscatcher = uiNewArea(&dlg->areahandler, 0); + dlg->keypresscatcher = uiNewArea(&dlg->areahandler); uiControl(dlg->keypresscatcher)->UserData = dlg; uiBoxAppend(in_ctrl, uiControl(dlg->keypresscatcher), 0); diff --git a/src/libui_sdl/libui/ui.h b/src/libui_sdl/libui/ui.h index 2641f30..09092a1 100644 --- a/src/libui_sdl/libui/ui.h +++ b/src/libui_sdl/libui/ui.h @@ -326,6 +326,10 @@ _UI_ENUM(uiWindowResizeEdge) { // 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)) // TODO give a better name // 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 uiAreaBeginUserWindowResize(uiArea *a, uiWindowResizeEdge edge); _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); struct uiAreaDrawParams { @@ -604,9 +609,9 @@ _UI_EXTERN void uiDrawText(uiDrawContext *c, double x, double y, uiDrawTextLayou typedef struct uiGLContext uiGLContext; -_UI_EXTERN uiGLContext *uiGLNewContext(uiControl* c, int vermajor, int verminor); -_UI_EXTERN void uiGLFreeContext(uiGLContext* ctx); +_UI_EXTERN uiGLContext *uiAreaGetGLContext(uiArea* a); _UI_EXTERN void uiGLMakeContextCurrent(uiGLContext* ctx); +_UI_EXTERN unsigned int uiGLGetVersion(uiGLContext* ctx); _UI_EXTERN void *uiGLGetProcAddress(const char* proc); _UI_EXTERN void uiGLSwapBuffers(uiGLContext* ctx); diff --git a/src/libui_sdl/libui/windows/area.cpp b/src/libui_sdl/libui/windows/area.cpp index 99c843e..72d5145 100644 --- a/src/libui_sdl/libui/windows/area.cpp +++ b/src/libui_sdl/libui/windows/area.cpp @@ -61,7 +61,15 @@ static LRESULT CALLBACK areaWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM // 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) { @@ -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; @@ -203,7 +211,49 @@ uiArea *uiNewArea(uiAreaHandler *ah, int opengl) 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; } diff --git a/src/libui_sdl/libui/windows/area.hpp b/src/libui_sdl/libui/windows/area.hpp index f8abd4f..cfc45a4 100644 --- a/src/libui_sdl/libui/windows/area.hpp +++ b/src/libui_sdl/libui/windows/area.hpp @@ -29,6 +29,7 @@ struct uiArea { int bgR, bgG, bgB; int openGL; + uiGLContext* glcontext; 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 pixelsToDIP(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); diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp index 832a2e5..1e3732c 100644 --- a/src/libui_sdl/libui/windows/gl.cpp +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -1,39 +1,31 @@ // 31 march 2019 #include "uipriv_windows.hpp" +#include "area.hpp" #include #include struct uiGLContext { - uiControl* c; + uiArea* a; HWND hwnd; HDC dc; HGLRC rc; + + unsigned int version; }; -uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor) +uiGLContext* createGLContext(uiArea* a, int vermajor, int verminor) { uiGLContext* ctx; BOOL res; ctx = uiNew(uiGLContext); - ctx->c = c; - if (c) - { - ctx->hwnd = (HWND)c->Handle(c); // welp - } - else - { - // windowless context - //ctx->hwnd = GetDesktopWindow(); - // nope. - uiFree(ctx); - return NULL; - } + ctx->a = a; + ctx->hwnd = a->hwnd; PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(pfd)); @@ -103,6 +95,7 @@ uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor) return NULL; } + ctx->version = uiGLVersion(vermajor, verminor); ctx->rc = rc_better; wglMakeCurrent(ctx->dc, ctx->rc); } @@ -110,8 +103,9 @@ uiGLContext* uiGLNewContext(uiControl* c, int vermajor, int verminor) return ctx; } -void uiGLFreeContext(uiGLContext* ctx) +void freeGLContext(uiGLContext* ctx) { + if (ctx == NULL) return; wglMakeCurrent(NULL, NULL); wglDeleteContext(ctx->rc); ReleaseDC(ctx->hwnd, ctx->dc); @@ -130,6 +124,12 @@ void uiGLMakeContextCurrent(uiGLContext* ctx) 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) { return (void*)wglGetProcAddress(proc); @@ -137,5 +137,6 @@ void *uiGLGetProcAddress(const char* proc) void uiGLSwapBuffers(uiGLContext* ctx) { + if (ctx == NULL) return; SwapBuffers(ctx->dc); } diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp index c68f323..b499da7 100644 --- a/src/libui_sdl/main.cpp +++ b/src/libui_sdl/main.cpp @@ -64,6 +64,9 @@ char* EmuDirectory; uiWindow* MainWindow; uiArea* MainDrawArea; +uiAreaHandler MainDrawAreaHandler; + +const u32 kGLVersions[] = {uiGLVersion(3,1), 0}; uiGLContext* GLContext; int WindowWidth, WindowHeight; @@ -1792,7 +1795,7 @@ void OnOpenHotkeyConfig(uiMenuItem* item, uiWindow* window, void* blarg) { DlgInputConfig::Open(1); } -uiAreaHandler eeareahandler; + void OnOpenVideoSettings(uiMenuItem* item, uiWindow* window, void* blarg) { //DlgVideoSettings::Open(); @@ -1805,25 +1808,17 @@ void OnOpenVideoSettings(uiMenuItem* item, uiWindow* window, void* blarg) GPU3D::GLRenderer::DeInit(); GLDrawing_DeInit(); uiGLMakeContextCurrent(NULL); - uiGLFreeContext(GLContext); uiWindowSetChild(MainWindow, NULL); uiControlDestroy(uiControl(MainDrawArea)); - eeareahandler.Draw = OnAreaDraw; - eeareahandler.MouseEvent = OnAreaMouseEvent; - eeareahandler.MouseCrossed = OnAreaMouseCrossed; - eeareahandler.DragBroken = OnAreaDragBroken; - eeareahandler.KeyEvent = OnAreaKeyEvent; - eeareahandler.Resize = OnAreaResize; - - MainDrawArea = uiNewArea(&eeareahandler, 1); + MainDrawArea = uiNewGLArea(&MainDrawAreaHandler, kGLVersions); uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); uiAreaSetBackgroundColor(MainDrawArea, 0, 0, 0); //uiControlShow(uiControl(MainDrawArea)); - GLContext = uiGLNewContext(uiControl(MainDrawArea), 3, 1); + GLContext = uiAreaGetGLContext(MainDrawArea); uiGLMakeContextCurrent(GLContext); GLDrawing_Init(); @@ -2343,16 +2338,16 @@ int main(int argc, char** argv) uiMenuItemDisable(MenuItem_Reset); uiMenuItemDisable(MenuItem_Stop); - uiAreaHandler areahandler; - areahandler.Draw = OnAreaDraw; - areahandler.MouseEvent = OnAreaMouseEvent; - areahandler.MouseCrossed = OnAreaMouseCrossed; - areahandler.DragBroken = OnAreaDragBroken; - areahandler.KeyEvent = OnAreaKeyEvent; - areahandler.Resize = OnAreaResize; + MainDrawAreaHandler.Draw = OnAreaDraw; + MainDrawAreaHandler.MouseEvent = OnAreaMouseEvent; + MainDrawAreaHandler.MouseCrossed = OnAreaMouseCrossed; + MainDrawAreaHandler.DragBroken = OnAreaDragBroken; + MainDrawAreaHandler.KeyEvent = OnAreaKeyEvent; + MainDrawAreaHandler.Resize = OnAreaResize; ScreenDrawInited = false; - MainDrawArea = uiNewArea(&areahandler, 1); + //MainDrawArea = uiNewArea(&MainDrawAreaHandler); + MainDrawArea = uiNewGLArea(&MainDrawAreaHandler, kGLVersions); uiWindowSetChild(MainWindow, uiControl(MainDrawArea)); uiControlSetMinSize(uiControl(MainDrawArea), 256, 384); 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]); // TODO: fail gracefully, support older OpenGL, etc - GLContext = uiGLNewContext(uiControl(MainDrawArea), 3, 1); // haw haw haw + GLContext = uiAreaGetGLContext(MainDrawArea); uiGLMakeContextCurrent(GLContext); void* testor = uiGLGetProcAddress("glUseProgram"); @@ -2472,8 +2467,6 @@ int main(int argc, char** argv) if (MicWavBuffer) delete[] MicWavBuffer; - uiGLFreeContext(GLContext); - Config::ScreenRotation = ScreenRotation; Config::ScreenGap = ScreenGap; Config::ScreenLayout = ScreenLayout; -- cgit v1.2.3 From f6814e02c02a0ad68af107e7605c08ee47de79f4 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Fri, 31 May 2019 21:37:30 +0200 Subject: * add needed libui functions under Windows, even if they don't do a whole lot * fix ass-stupid fog bug --- src/GPU3D_OpenGL.cpp | 5 +---- src/GPU3D_OpenGL_shaders.h | 9 +++++++-- src/libui_sdl/libui/windows/gl.cpp | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) (limited to 'src/libui_sdl/libui/windows/gl.cpp') diff --git a/src/GPU3D_OpenGL.cpp b/src/GPU3D_OpenGL.cpp index db2617c..95243d1 100644 --- a/src/GPU3D_OpenGL.cpp +++ b/src/GPU3D_OpenGL.cpp @@ -187,7 +187,7 @@ void SetupDefaultTexParams(GLuint tex) bool Init() { GLint uni_id; - + glEnable(GL_DEPTH_TEST); glEnable(GL_STENCIL_TEST); @@ -1043,9 +1043,6 @@ void RenderFrame() { if (RenderPolygonRAM[i]->Degenerate) continue; - // zog. - //if (RenderPolygonRAM[i]->YBottom <= 96 || RenderPolygonRAM[i]->YTop >= 144) continue; - SetupPolygon(&PolygonList[npolys], RenderPolygonRAM[i]); if (firsttrans < 0 && RenderPolygonRAM[i]->Translucent) firsttrans = npolys; diff --git a/src/GPU3D_OpenGL_shaders.h b/src/GPU3D_OpenGL_shaders.h index b12dc61..4c5b82e 100644 --- a/src/GPU3D_OpenGL_shaders.h +++ b/src/GPU3D_OpenGL_shaders.h @@ -42,7 +42,7 @@ uniform uint uOpaquePolyID; uniform uint uFogFlag; out vec4 oColor; -out vec3 oAttr; +out vec4 oAttr; void main() { @@ -50,6 +50,7 @@ void main() oAttr.r = float(uOpaquePolyID) / 63.0; oAttr.g = 0; oAttr.b = float(uFogFlag); + oAttr.a = 1; } )"; @@ -178,7 +179,7 @@ smooth in vec2 fTexcoord; flat in ivec3 fPolygonAttr; out vec4 oColor; -out vec3 oAttr; +out vec4 oAttr; int TexcoordWrap(int c, int maxc, int mode) { @@ -620,6 +621,7 @@ void main() oColor = col; oAttr.r = float((fPolygonAttr.x >> 24) & 0x3F) / 63.0; oAttr.b = float((fPolygonAttr.x >> 15) & 0x1); + oAttr.a = 1; } )"; @@ -635,6 +637,7 @@ void main() oColor = col; oAttr.r = float((fPolygonAttr.x >> 24) & 0x3F) / 63.0; oAttr.b = float((fPolygonAttr.x >> 15) & 0x1); + oAttr.a = 1; gl_FragDepth = fZ; } )"; @@ -649,6 +652,7 @@ void main() oColor = col; oAttr.b = 0; + oAttr.a = 1; } )"; @@ -664,6 +668,7 @@ void main() oColor = col; oAttr.b = 0; + oAttr.a = 1; gl_FragDepth = fZ; } )"; diff --git a/src/libui_sdl/libui/windows/gl.cpp b/src/libui_sdl/libui/windows/gl.cpp index 1e3732c..c621721 100644 --- a/src/libui_sdl/libui/windows/gl.cpp +++ b/src/libui_sdl/libui/windows/gl.cpp @@ -135,8 +135,27 @@ void *uiGLGetProcAddress(const char* proc) return (void*)wglGetProcAddress(proc); } +void uiGLBegin(uiGLContext* ctx) +{ +} + +void uiGLEnd(uiGLContext* ctx) +{ +} + void uiGLSwapBuffers(uiGLContext* ctx) { if (ctx == NULL) return; SwapBuffers(ctx->dc); } + +int uiGLGetFramebuffer(uiGLContext* ctx) +{ + return 0; +} + +float uiGLGetFramebufferScale(uiGLContext* ctx) +{ + // TODO + return 1; +} -- cgit v1.2.3