From b78f5debe69822dc1cde338b48d9b685a901616d Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 17 Dec 2012 14:54:20 -0600 Subject: [PATCH 01/20] Initial push of GLES and GLUtil file breakup. --- CMakeLists.txt | 6 + Source/Core/Common/Src/VideoBackendBase.cpp | 4 + Source/Core/Core/CMakeLists.txt | 6 +- Source/Core/DolphinWX/CMakeLists.txt | 27 +- Source/Plugins/CMakeLists.txt | 4 +- Source/Plugins/Plugin_VideoOGL/CMakeLists.txt | 15 +- Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp | 653 +++--------------- Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h | 68 +- Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 18 +- Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 7 +- .../Plugin_VideoSoftware/CMakeLists.txt | 16 +- .../Plugin_VideoSoftware/Src/EfbCopy.cpp | 3 +- .../Plugin_VideoSoftware/Src/HwRasterizer.cpp | 300 ++++++-- .../Plugin_VideoSoftware/Src/HwRasterizer.h | 3 + .../Plugin_VideoSoftware/Src/SWRenderer.cpp | 194 +++--- .../Src/SWVideoConfig.cpp | 2 +- .../Plugin_VideoSoftware/Src/SWmain.cpp | 66 +- 17 files changed, 582 insertions(+), 810 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 37e4f14f5e..15cd489dd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,6 +218,12 @@ if(FASTLOG) add_definitions(-DDEBUGFAST) endif() +option(USE_GLES "Enables GLES, disables OGL" OFF) +if(USE_GLES) + message("GLES rendering enabled") + add_definitions(-DUSE_GLES) + add_definitions(-DUSE_EGL) +endif() add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE) ######################################## diff --git a/Source/Core/Common/Src/VideoBackendBase.cpp b/Source/Core/Common/Src/VideoBackendBase.cpp index 339cb016c1..d0ec7819bc 100644 --- a/Source/Core/Common/Src/VideoBackendBase.cpp +++ b/Source/Core/Common/Src/VideoBackendBase.cpp @@ -22,7 +22,9 @@ #include "../../../Plugins/Plugin_VideoDX9/Src/VideoBackend.h" #include "../../../Plugins/Plugin_VideoDX11/Src/VideoBackend.h" #endif +#ifndef USE_GLES #include "../../../Plugins/Plugin_VideoOGL/Src/VideoBackend.h" +#endif #include "../../../Plugins/Plugin_VideoSoftware/Src/VideoBackend.h" std::vector g_available_video_backends; @@ -52,7 +54,9 @@ void VideoBackend::PopulateList() if (IsGteVista()) g_available_video_backends.push_back(new DX11::VideoBackend); #endif +#ifndef USE_GLES g_available_video_backends.push_back(new OGL::VideoBackend); +#endif g_available_video_backends.push_back(new SW::VideoSoftware); g_video_backend = g_available_video_backends.front(); diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index d11c4a350a..47276dd172 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -191,7 +191,11 @@ set(SRCS Src/ActionReplay.cpp Src/PowerPC/JitCommon/JitCache.cpp Src/PowerPC/JitCommon/Jit_Util.cpp) -set(LIBS bdisasm inputcommon videoogl videosoftware sfml-network) +set(LIBS bdisasm inputcommon videosoftware sfml-network) + +if(NOT USE_GLES) + set(LIBS ${LIBS} videoogl) +endif() if(WIN32) set(SRCS ${SRCS} Src/HW/BBA-TAP/TAP_Win32.cpp Src/stdafx.cpp diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index d03cf7c6b1..fcc531029c 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -8,7 +8,6 @@ set(LIBS core z sfml-network ${GTK2_LIBRARIES} - ${OPENGL_LIBRARIES} ${XRANDR_LIBRARIES} ${X11_LIBRARIES}) @@ -31,7 +30,8 @@ if(LIBAV_FOUND) endif() if(wxWidgets_FOUND) - set(SRCS Src/ARCodeAddEdit.cpp + set(SRCS + Src/ARCodeAddEdit.cpp Src/AboutDolphin.cpp Src/CheatsWindow.cpp Src/ConfigMain.cpp @@ -79,7 +79,28 @@ if(wxWidgets_FOUND) set(WXLIBS ${wxWidgets_LIBRARIES}) else() - set(SRCS Src/MainNoGUI.cpp) + set(SRCS + Src/MainNoGUI.cpp) +endif() + +if(USE_EGL) + set(SRCS ${SRCS} + Src/VideoInterface/EGL.cpp + ) +else() + if(WIN32) + set(SRCS ${SRCS} + Src/VideoInterface/GLW.cpp + ) + elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(SRCS ${SRCS} + Src/VideoInterface/AGL.cpp + ) + else() + set(SRCS ${SRCS} + Src/VideoInterface/GLX.cpp + ) + endif() endif() if(WIN32) diff --git a/Source/Plugins/CMakeLists.txt b/Source/Plugins/CMakeLists.txt index 0a0412377a..7dfdbaca83 100644 --- a/Source/Plugins/CMakeLists.txt +++ b/Source/Plugins/CMakeLists.txt @@ -1,3 +1,5 @@ -add_subdirectory(Plugin_VideoOGL) +if(NOT USE_GLES) + add_subdirectory(Plugin_VideoOGL) +endif() add_subdirectory(Plugin_VideoSoftware) # TODO: Add other backends here! diff --git a/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt b/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt index b506087106..43b127f5ef 100644 --- a/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt +++ b/Source/Plugins/Plugin_VideoOGL/CMakeLists.txt @@ -12,11 +12,22 @@ set(SRCS Src/FramebufferManager.cpp Src/VertexManager.cpp) set(LIBS videocommon - GLEW SOIL common - ${OPENGL_LIBRARIES} ${X11_LIBRARIES}) +if(USE_EGL) + set(LIBS ${LIBS} + EGL) +endif() + +if(USE_GLES) + set(LIBS ${LIBS} + GLESv2) +else() + set(LIBS ${LIBS} + GLEW + ${OPENGL_LIBRARIES}) +endif() if(wxWidgets_FOUND) set(LIBS ${LIBS} ${wxWidgets_LIBRARIES}) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index d6abb014c4..17986a4921 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -28,59 +28,8 @@ #include "GLUtil.h" -#if defined(_WIN32) -#include "EmuWindow.h" -static HDC hDC = NULL; // Private GDI Device Context -static HGLRC hRC = NULL; // Permanent Rendering Context -#else GLWindow GLWin; -#endif - -// Handles OpenGL and the window - -// Window dimensions. -static int s_backbuffer_width; -static int s_backbuffer_height; - -void OpenGL_SwapBuffers() -{ -#if defined(USE_WX) && USE_WX - GLWin.glCanvas->SwapBuffers(); -#elif defined(__APPLE__) - [GLWin.cocoaCtx flushBuffer]; -#elif defined(_WIN32) - SwapBuffers(hDC); -#elif defined(HAVE_X11) && HAVE_X11 - glXSwapBuffers(GLWin.dpy, GLWin.win); -#endif -} - -u32 OpenGL_GetBackbufferWidth() -{ - return s_backbuffer_width; -} - -u32 OpenGL_GetBackbufferHeight() -{ - return s_backbuffer_height; -} - -void OpenGL_SetWindowText(const char *text) -{ -#if defined(USE_WX) && USE_WX - // Handled by Host_UpdateTitle() -#elif defined(__APPLE__) - [GLWin.cocoaWin setTitle: [NSString stringWithUTF8String: text]]; -#elif defined(_WIN32) - TCHAR temp[512]; - swprintf_s(temp, sizeof(temp)/sizeof(TCHAR), _T("%hs"), text); - EmuWindow::SetWindowText(temp); -#elif defined(HAVE_X11) && HAVE_X11 - // Tell X to ask the window manager to set the window title. - // (X itself doesn't provide window title functionality.) - XStoreName(GLWin.dpy, GLWin.win, text); -#endif -} +cInterfaceBase *GLInterface; namespace OGL { @@ -88,20 +37,7 @@ namespace OGL // Draw messages on top of the screen unsigned int VideoBackend::PeekMessages() { -#ifdef _WIN32 - // TODO: peekmessage - MSG msg; - while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - return FALSE; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return TRUE; -#else - return false; -#endif + return GLInterface->PeekMessages(); } // Show the current FPS @@ -109,523 +45,86 @@ void VideoBackend::UpdateFPSDisplay(const char *text) { char temp[100]; snprintf(temp, sizeof temp, "%s | OpenGL | %s", scm_rev_str, text); - OpenGL_SetWindowText(temp); + return GLInterface->UpdateFPSDisplay(temp); } } - -#if defined(HAVE_X11) && HAVE_X11 -void XEventThread(); - -void CreateXWindow(void) +void InitInterface() { - Atom wmProtocols[1]; - - // Setup window attributes - GLWin.attr.colormap = XCreateColormap(GLWin.evdpy, - GLWin.parent, GLWin.vi->visual, AllocNone); - GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; - GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen); - GLWin.attr.border_pixel = 0; - - // Create the window - GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent, - GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, - GLWin.vi->depth, InputOutput, GLWin.vi->visual, - CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); - wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1); - XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); - XMapRaised(GLWin.evdpy, GLWin.win); - XSync(GLWin.evdpy, True); - - GLWin.xEventThread = std::thread(XEventThread); + #if defined(USE_EGL) && USE_EGL + GLInterface = new cInterfaceEGL; + #elif defined(USE_WX) && USE_WX + GLInterface = new cInterfaceWX; + #elif defined(__APPLE__) + GLInterface = new cInterfaceAGL; + #elif defined(_WIN32) + GLInterface = new cInterfaceWGL; + #elif defined(HAVE_X11) && HAVE_X11 + GLInterface = new cInterfaceGLX; + #endif } -void DestroyXWindow(void) +GLuint OpenGL_CompileProgram ( const char* vertexShader, const char* fragmentShader ) { - XUnmapWindow(GLWin.dpy, GLWin.win); - GLWin.win = 0; - if (GLWin.xEventThread.joinable()) - GLWin.xEventThread.join(); - XFreeColormap(GLWin.evdpy, GLWin.attr.colormap); -} - -void XEventThread() -{ - // Free look variables - static bool mouseLookEnabled = false; - static bool mouseMoveEnabled = false; - static float lastMouse[2]; - while (GLWin.win) - { - XEvent event; - KeySym key; - for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--) - { - XNextEvent(GLWin.evdpy, &event); - switch(event.type) { - case KeyPress: - key = XLookupKeysym((XKeyEvent*)&event, 0); - switch (key) - { - case XK_3: - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; - break; - case XK_4: - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case XK_5: - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case XK_6: - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - default: - break; - } - if (g_Config.bFreeLook) - { - static float debugSpeed = 1.0f; - switch (key) - { - case XK_parenleft: - debugSpeed /= 2.0f; - break; - case XK_parenright: - debugSpeed *= 2.0f; - break; - case XK_w: - VertexShaderManager::TranslateView(0.0f, debugSpeed); - break; - case XK_s: - VertexShaderManager::TranslateView(0.0f, -debugSpeed); - break; - case XK_a: - VertexShaderManager::TranslateView(debugSpeed, 0.0f); - break; - case XK_d: - VertexShaderManager::TranslateView(-debugSpeed, 0.0f); - break; - case XK_r: - VertexShaderManager::ResetView(); - break; - } - } - break; - case ButtonPress: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseMoveEnabled = true; - break; - case 3: // Right button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseLookEnabled = true; - break; - } - } - break; - case ButtonRelease: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - mouseMoveEnabled = false; - break; - case 3: // Right button - mouseLookEnabled = false; - break; - } - } - break; - case MotionNotify: - if (g_Config.bFreeLook) - { - if (mouseLookEnabled) - { - VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, - (event.xmotion.y - lastMouse[1]) / 200.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - - if (mouseMoveEnabled) - { - VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, - (event.xmotion.y - lastMouse[1]) / 50.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - } - break; - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy, depthDummy; - XGetGeometry(GLWin.evdpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); - s_backbuffer_width = GLWin.width; - s_backbuffer_height = GLWin.height; - break; - case ClientMessage: - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False)) - Host_Message(WM_USER_STOP); - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.evdpy, "RESIZE", False)) - XMoveResizeWindow(GLWin.evdpy, GLWin.win, - event.xclient.data.l[1], event.xclient.data.l[2], - event.xclient.data.l[3], event.xclient.data.l[4]); - break; - default: - break; - } - } - Common::SleepCurrentThread(20); - } -} -#endif - -// Create rendering window. -// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool OpenGL_Create(void *&window_handle) -{ - int _tx, _ty, _twidth, _theight; - Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); - - // Control window size and picture scaling - s_backbuffer_width = _twidth; - s_backbuffer_height = _theight; - -#if defined(USE_WX) && USE_WX - GLWin.panel = (wxPanel *)window_handle; - GLWin.glCanvas = new wxGLCanvas(GLWin.panel, wxID_ANY, NULL, - wxPoint(0, 0), wxSize(_twidth, _theight)); - GLWin.glCanvas->Show(true); - if (GLWin.glCtxt == NULL) // XXX dirty hack - GLWin.glCtxt = new wxGLContext(GLWin.glCanvas); - -#elif defined(__APPLE__) - NSRect size; - NSUInteger style = NSMiniaturizableWindowMask; - NSOpenGLPixelFormatAttribute attr[2] = { NSOpenGLPFADoubleBuffer, 0 }; - NSOpenGLPixelFormat *fmt = [[NSOpenGLPixelFormat alloc] - initWithAttributes: attr]; - if (fmt == nil) { - ERROR_LOG(VIDEO, "failed to create pixel format"); - return NULL; - } - - GLWin.cocoaCtx = [[NSOpenGLContext alloc] - initWithFormat: fmt shareContext: nil]; - [fmt release]; - if (GLWin.cocoaCtx == nil) { - ERROR_LOG(VIDEO, "failed to create context"); - return NULL; - } - - if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen) { - size = [[NSScreen mainScreen] frame]; - style |= NSBorderlessWindowMask; - } else { - size = NSMakeRect(_tx, _ty, _twidth, _theight); - style |= NSResizableWindowMask | NSTitledWindowMask; - } - - GLWin.cocoaWin = [[NSWindow alloc] initWithContentRect: size - styleMask: style backing: NSBackingStoreBuffered defer: NO]; - if (GLWin.cocoaWin == nil) { - ERROR_LOG(VIDEO, "failed to create window"); - return NULL; - } - - if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen) { - CGDisplayCapture(CGMainDisplayID()); - [GLWin.cocoaWin setLevel: CGShieldingWindowLevel()]; - } - - [GLWin.cocoaCtx setView: [GLWin.cocoaWin contentView]]; - [GLWin.cocoaWin makeKeyAndOrderFront: nil]; - -#elif defined(_WIN32) - window_handle = (void*)EmuWindow::Create((HWND)window_handle, GetModuleHandle(0), _T("Please wait...")); - if (window_handle == NULL) - { - Host_SysMessage("failed to create window"); - return false; - } - - // Show the window - EmuWindow::Show(); - - PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be - { - sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor - 1, // Version Number - PFD_DRAW_TO_WINDOW | // Format Must Support Window - PFD_SUPPORT_OPENGL | // Format Must Support OpenGL - PFD_DOUBLEBUFFER, // Must Support Double Buffering - PFD_TYPE_RGBA, // Request An RGBA Format - 32, // Select Our Color Depth - 0, 0, 0, 0, 0, 0, // Color Bits Ignored - 0, // 8bit Alpha Buffer - 0, // Shift Bit Ignored - 0, // No Accumulation Buffer - 0, 0, 0, 0, // Accumulation Bits Ignored - 24, // 24Bit Z-Buffer (Depth Buffer) - 8, // 8bit Stencil Buffer - 0, // No Auxiliary Buffer - PFD_MAIN_PLANE, // Main Drawing Layer - 0, // Reserved - 0, 0, 0 // Layer Masks Ignored - }; - - GLuint PixelFormat; // Holds The Results After Searching For A Match - - if (!(hDC=GetDC(EmuWindow::GetWnd()))) { - PanicAlert("(1) Can't create an OpenGL Device context. Fail."); - return false; - } - if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) { - PanicAlert("(2) Can't find a suitable PixelFormat."); - return false; - } - if (!SetPixelFormat(hDC, PixelFormat, &pfd)) { - PanicAlert("(3) Can't set the PixelFormat."); - return false; - } - if (!(hRC = wglCreateContext(hDC))) { - PanicAlert("(4) Can't create an OpenGL rendering context."); - return false; - } - // -------------------------------------- - -#elif defined(HAVE_X11) && HAVE_X11 - int glxMajorVersion, glxMinorVersion; - - // attributes for a single buffered visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer - int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 8, - GLX_GREEN_SIZE, 8, - GLX_BLUE_SIZE, 8, - GLX_DEPTH_SIZE, 24, - None}; - - // attributes for a double buffered visual in RGBA format with at least - // 8 bits per color and a 24 bit depth buffer - int attrListDbl[] = {GLX_RGBA, GLX_DOUBLEBUFFER, - GLX_RED_SIZE, 8, - GLX_GREEN_SIZE, 8, - GLX_BLUE_SIZE, 8, - GLX_DEPTH_SIZE, 24, - GLX_SAMPLE_BUFFERS_ARB, g_Config.iMultisampleMode != MULTISAMPLE_OFF?1:0, - GLX_SAMPLES_ARB, g_Config.iMultisampleMode != MULTISAMPLE_OFF?1:0, - None }; - - int attrListDefault[] = { - GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, - None }; - - GLWin.dpy = XOpenDisplay(0); - GLWin.evdpy = XOpenDisplay(0); - GLWin.parent = (Window)window_handle; - GLWin.screen = DefaultScreen(GLWin.dpy); - if (GLWin.parent == 0) - GLWin.parent = RootWindow(GLWin.dpy, GLWin.screen); - - glXQueryVersion(GLWin.dpy, &glxMajorVersion, &glxMinorVersion); - NOTICE_LOG(VIDEO, "glX-Version %d.%d", glxMajorVersion, glxMinorVersion); - - // Get an appropriate visual - GLWin.vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDbl); - if (GLWin.vi == NULL) - { - GLWin.vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListSgl); - if (GLWin.vi != NULL) - { - ERROR_LOG(VIDEO, "Only single buffered visual!"); - } - else - { - GLWin.vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDefault); - if (GLWin.vi == NULL) - { - ERROR_LOG(VIDEO, "Could not choose visual (glXChooseVisual)"); - return false; - } - } - } - else - NOTICE_LOG(VIDEO, "Got double buffered visual!"); - - // Create a GLX context. - GLWin.ctx = glXCreateContext(GLWin.dpy, GLWin.vi, 0, GL_TRUE); - if (!GLWin.ctx) - { - PanicAlert("Unable to create GLX context."); - return false; - } - - GLWin.x = _tx; - GLWin.y = _ty; - GLWin.width = _twidth; - GLWin.height = _theight; - - CreateXWindow(); - window_handle = (void *)GLWin.win; -#endif - return true; -} - -bool OpenGL_MakeCurrent() -{ - // connect the glx-context to the window -#if defined(USE_WX) && USE_WX - return GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); -#elif defined(__APPLE__) - [GLWin.cocoaCtx makeCurrentContext]; -#elif defined(_WIN32) - return wglMakeCurrent(hDC, hRC) ? true : false; -#elif defined(HAVE_X11) && HAVE_X11 -#if defined(HAVE_WX) && (HAVE_WX) - Host_GetRenderWindowSize(GLWin.x, GLWin.y, - (int&)GLWin.width, (int&)GLWin.height); - XMoveResizeWindow(GLWin.dpy, GLWin.win, GLWin.x, GLWin.y, - GLWin.width, GLWin.height); -#endif - return glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); -#endif - return true; -} - -// Update window width, size and etc. Called from Render.cpp -void OpenGL_Update() -{ -#if defined(USE_WX) && USE_WX - int width, height; - - GLWin.panel->GetSize(&width, &height); - if (width == s_backbuffer_width && height == s_backbuffer_height) - return; - - GLWin.glCanvas->SetFocus(); - GLWin.glCanvas->SetSize(0, 0, width, height); - GLWin.glCtxt->SetCurrent(*GLWin.glCanvas); - s_backbuffer_width = width; - s_backbuffer_height = height; - -#elif defined(__APPLE__) - int width, height; - - width = [[GLWin.cocoaWin contentView] frame].size.width; - height = [[GLWin.cocoaWin contentView] frame].size.height; - if (width == s_backbuffer_width && height == s_backbuffer_height) - return; - - [GLWin.cocoaCtx setView: [GLWin.cocoaWin contentView]]; - [GLWin.cocoaCtx update]; - [GLWin.cocoaCtx makeCurrentContext]; - s_backbuffer_width = width; - s_backbuffer_height = height; - -#elif defined(_WIN32) - RECT rcWindow; - if (!EmuWindow::GetParentWnd()) - { - // We are not rendering to a child window - use client size. - GetClientRect(EmuWindow::GetWnd(), &rcWindow); - } - else - { - // We are rendering to a child window - use parent size. - GetWindowRect(EmuWindow::GetParentWnd(), &rcWindow); - } - - // Get the new window width and height - // See below for documentation - int width = rcWindow.right - rcWindow.left; - int height = rcWindow.bottom - rcWindow.top; - - // If we are rendering to a child window - if (EmuWindow::GetParentWnd() != 0 && - (s_backbuffer_width != width || s_backbuffer_height != height) && - width >= 4 && height >= 4) - { - ::MoveWindow(EmuWindow::GetWnd(), 0, 0, width, height, FALSE); - s_backbuffer_width = width; - s_backbuffer_height = height; - } -#endif -} - -// Close backend -void OpenGL_Shutdown() -{ -#if defined(USE_WX) && USE_WX - GLWin.glCanvas->Hide(); - // XXX GLWin.glCanvas->Destroy(); - // XXX delete GLWin.glCtxt; -#elif defined(__APPLE__) - [GLWin.cocoaWin close]; - [GLWin.cocoaCtx clearDrawable]; - [GLWin.cocoaCtx release]; -#elif defined(_WIN32) - if (hRC) - { - if (!wglMakeCurrent(NULL, NULL)) - NOTICE_LOG(VIDEO, "Could not release drawing context."); - - if (!wglDeleteContext(hRC)) - ERROR_LOG(VIDEO, "Release Rendering Context Failed."); - - hRC = NULL; - } - - if (hDC && !ReleaseDC(EmuWindow::GetWnd(), hDC)) - { - ERROR_LOG(VIDEO, "Release Device Context Failed."); - hDC = NULL; - } + // generate objects + GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); + GLuint programID = glCreateProgram(); + GLint Result = GL_FALSE; + char stringBuffer[1024]; + GLsizei stringBufferUsage = 0; -#elif defined(HAVE_X11) && HAVE_X11 - DestroyXWindow(); - if (GLWin.ctx && !glXMakeCurrent(GLWin.dpy, None, NULL)) - NOTICE_LOG(VIDEO, "Could not release drawing context."); - if (GLWin.ctx) - { - glXDestroyContext(GLWin.dpy, GLWin.ctx); - XCloseDisplay(GLWin.dpy); - XCloseDisplay(GLWin.evdpy); - GLWin.ctx = NULL; + // compile vertex shader + glShaderSource(vertexShaderID, 1, &vertexShader, NULL); + glCompileShader(vertexShaderID); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &Result); + glGetShaderInfoLog(vertexShaderID, 1024, &stringBufferUsage, stringBuffer); + if(Result && stringBufferUsage) { + ERROR_LOG(VIDEO, "GLSL vertex shader warnings:\n%s%s", stringBuffer, vertexShader); + } else if(!Result) { + ERROR_LOG(VIDEO, "GLSL vertex shader error:\n%s%s", stringBuffer, vertexShader); + } else { + DEBUG_LOG(VIDEO, "GLSL vertex shader compiled:\n%s", vertexShader); + } + bool shader_errors = !Result; +#endif + + // compile fragment shader + glShaderSource(fragmentShaderID, 1, &fragmentShader, NULL); + glCompileShader(fragmentShaderID); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &Result); + glGetShaderInfoLog(fragmentShaderID, 1024, &stringBufferUsage, stringBuffer); + if(Result && stringBufferUsage) { + ERROR_LOG(VIDEO, "GLSL fragment shader warnings:\n%s%s", stringBuffer, fragmentShader); + } else if(!Result) { + ERROR_LOG(VIDEO, "GLSL fragment shader error:\n%s%s", stringBuffer, fragmentShader); + } else { + DEBUG_LOG(VIDEO, "GLSL fragment shader compiled:\n%s", fragmentShader); + } + shader_errors |= !Result; +#endif + + // link them + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); +#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL) + glGetProgramiv(programID, GL_LINK_STATUS, &Result); + glGetProgramInfoLog(programID, 1024, &stringBufferUsage, stringBuffer); + if(Result && stringBufferUsage) { + ERROR_LOG(VIDEO, "GLSL linker warnings:\n%s%s%s", stringBuffer, vertexShader, fragmentShader); + } else if(!Result && !shader_errors) { + ERROR_LOG(VIDEO, "GLSL linker error:\n%s%s%s", stringBuffer, vertexShader, fragmentShader); } #endif + + // cleanup + glDeleteShader(vertexShaderID); + glDeleteShader(fragmentShaderID); + + return programID; } GLuint OpenGL_ReportGLError(const char *function, const char *file, int line) @@ -633,14 +132,15 @@ GLuint OpenGL_ReportGLError(const char *function, const char *file, int line) GLint err = glGetError(); if (err != GL_NO_ERROR) { - ERROR_LOG(VIDEO, "%s:%d: (%s) OpenGL error 0x%x - %s\n", - file, line, function, err, gluErrorString(err)); + ERROR_LOG(VIDEO, "%s:%d: (%s) OpenGL error 0x%x\n", + file, line, function, err); } return err; } void OpenGL_ReportARBProgramError() { +#ifndef USE_GLES const GLubyte* pstr = glGetString(GL_PROGRAM_ERROR_STRING_ARB); if (pstr != NULL && pstr[0] != 0) { @@ -650,10 +150,12 @@ void OpenGL_ReportARBProgramError() ERROR_LOG(VIDEO, "%s", (char*)pstr); ERROR_LOG(VIDEO, "\n"); } +#endif } bool OpenGL_ReportFBOError(const char *function, const char *file, int line) { +#ifndef USE_GLES unsigned int fbo_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if (fbo_status != GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -686,6 +188,7 @@ bool OpenGL_ReportFBOError(const char *function, const char *file, int line) file, line, function, error); return false; } +#endif return true; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h index 23c31a1bb7..ae83401f38 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h @@ -20,26 +20,7 @@ #include "VideoConfig.h" #include "MathUtil.h" -#include "Thread.h" - -#ifdef _WIN32 -#define GLEW_STATIC -#include -#include -#elif defined HAVE_X11 && HAVE_X11 -#include -#include -#include -#include -#elif defined __APPLE__ -#include -#import -#endif - -#if defined USE_WX && USE_WX -#include "wx/wx.h" -#include "wx/glcanvas.h" -#endif +#include "GLVideoInterface.h" #ifndef GL_DEPTH24_STENCIL8_EXT // allows FBOs to support stencils #define GL_DEPTH_STENCIL_EXT 0x84F9 @@ -52,49 +33,11 @@ #include -typedef struct { -#if defined(USE_WX) && USE_WX - wxGLCanvas *glCanvas; - wxGLContext *glCtxt; - wxPanel *panel; -#elif defined(__APPLE__) - NSWindow *cocoaWin; - NSOpenGLContext *cocoaCtx; -#elif defined(HAVE_X11) && HAVE_X11 - int screen; - Window win; - Window parent; - // dpy used for glx stuff, evdpy for window events etc. - // evdpy is to be used by XEventThread only - Display *dpy, *evdpy; - XVisualInfo *vi; - GLXContext ctx; - XSetWindowAttributes attr; - std::thread xEventThread; - int x, y; - unsigned int width, height; #endif -} GLWindow; +void InitInterface(); -extern GLWindow GLWin; - -#endif - -// Public OpenGL util - -// Initialization / upkeep -bool OpenGL_Create(void *&); -void OpenGL_Shutdown(); -void OpenGL_Update(); -bool OpenGL_MakeCurrent(); -void OpenGL_SwapBuffers(); - -// Get status -u32 OpenGL_GetBackbufferWidth(); -u32 OpenGL_GetBackbufferHeight(); - -// Set things -void OpenGL_SetWindowText(const char *text); +// Helpers +GLuint OpenGL_CompileProgram(const char *vertexShader, const char *fragmentShader); // Error reporting - use the convenient macros. void OpenGL_ReportARBProgramError(); @@ -126,4 +69,7 @@ extern CGprofile g_cgvProf, g_cgfProf; // use GLSL shaders across the whole pipeline. Yikes! //#define USE_DUAL_SOURCE_BLEND +// TODO: should be removed if we use glsl a lot +#define DEBUG_GLSL + #endif // _GLINIT_H_ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 77bb91d48b..2c43100b4c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -323,8 +323,8 @@ Renderer::Renderer() return; // TODO: fail // Decide frambuffer size - s_backbuffer_width = (int)OpenGL_GetBackbufferWidth(); - s_backbuffer_height = (int)OpenGL_GetBackbufferHeight(); + s_backbuffer_width = (int)GLInterface->GetBackBufferWidth(); + s_backbuffer_height = (int)GLInterface->GetBackBufferHeight(); // Handle VSync on/off #ifdef __APPLE__ @@ -521,7 +521,7 @@ Renderer::~Renderer() void Renderer::DrawDebugInfo() { // Reset viewport for drawing text - glViewport(0, 0, OpenGL_GetBackbufferWidth(), OpenGL_GetBackbufferHeight()); + glViewport(0, 0, GLInterface->GetBackBufferWidth(), GLInterface->GetBackBufferHeight()); // Draw various messages on the screen, like FPS, statistics, etc. char debugtext_buffer[8192]; char *p = debugtext_buffer; @@ -598,8 +598,8 @@ void Renderer::DrawDebugInfo() void Renderer::RenderText(const char *text, int left, int top, u32 color) { - const int nBackbufferWidth = (int)OpenGL_GetBackbufferWidth(); - const int nBackbufferHeight = (int)OpenGL_GetBackbufferHeight(); + const int nBackbufferWidth = (int)GLInterface->GetBackBufferWidth(); + const int nBackbufferHeight = (int)GLInterface->GetBackBufferHeight(); glColor4f(((color>>16) & 0xff)/255.0f, ((color>> 8) & 0xff)/255.0f, ((color>> 0) & 0xff)/255.0f, ((color>>24) & 0xFF)/255.0f); @@ -1294,7 +1294,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons SetWindowSize(fbWidth, fbHeight); - OpenGL_Update(); // just updates the render window position and the backbuffer size + GLInterface->Update(); // just updates the render window position and the backbuffer size bool xfbchanged = false; @@ -1308,8 +1308,8 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons } bool WindowResized = false; - int W = (int)OpenGL_GetBackbufferWidth(); - int H = (int)OpenGL_GetBackbufferHeight(); + int W = (int)GLInterface->GetBackBufferWidth(); + int H = (int)GLInterface->GetBackBufferHeight(); if (W != s_backbuffer_width || H != s_backbuffer_height || s_LastEFBScale != g_ActiveConfig.iEFBScale) { WindowResized = true; @@ -1354,7 +1354,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons GL_REPORT_ERRORD(); // Copy the rendered frame to the real window - OpenGL_SwapBuffers(); + GLInterface->SwapBuffers(); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index fb26ba2781..f52ec917e2 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -165,7 +165,8 @@ bool VideoBackend::Initialize(void *&window_handle) g_Config.VerifyValidity(); UpdateActiveConfig(); - if (!OpenGL_Create(window_handle)) + InitInterface(); + if (!GLInterface->CreateWindow(window_handle)) return false; s_BackendInitialized = true; @@ -177,7 +178,7 @@ bool VideoBackend::Initialize(void *&window_handle) // Run from the graphics thread void VideoBackend::Video_Prepare() { - OpenGL_MakeCurrent(); + GLInterface->MakeCurrent(); g_renderer = new Renderer; @@ -236,7 +237,7 @@ void VideoBackend::Shutdown() g_renderer = NULL; g_texture_cache = NULL; } - OpenGL_Shutdown(); + GLInterface->Shutdown(); } } diff --git a/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt b/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt index 0ba90d1537..15db15e654 100644 --- a/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt +++ b/Source/Plugins/Plugin_VideoSoftware/CMakeLists.txt @@ -26,13 +26,25 @@ if(wxWidgets_FOUND) endif(wxWidgets_FOUND) set(LIBS videocommon - GLEW SOIL common - ${OPENGL_LIBRARIES} ${X11_LIBRARIES} ${wxWidgets_LIBRARIES}) +if(USE_EGL) + set(LIBS ${LIBS} + EGL) +endif() +if(USE_GLES) + set(SRCS ${SRCS} + ../Plugin_VideoOGL/Src/GLUtil.cpp) + set(LIBS ${LIBS} + GLESv2) +else() + set(LIBS ${LIBS} + GLEW + ${OPENGL_LIBRARIES}) +endif() if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")) set(LIBS ${LIBS} clrun) endif() diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp index 50e6998a74..95566d0e26 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/EfbCopy.cpp @@ -25,7 +25,6 @@ #include "DebugUtil.h" #include "HwRasterizer.h" #include "SWCommandProcessor.h" -#include "../../Plugin_VideoOGL/Src/GLUtil.h" #include "HW/Memmap.h" #include "Core.h" @@ -33,7 +32,7 @@ namespace EfbCopy { void CopyToXfb() { - OpenGL_Update(); // just updates the render window position and the backbuffer size + GLInterface->Update(); // just updates the render window position and the backbuffer size if (!g_SWVideoConfig.bHwRasterizer) { diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp index 8736066524..a31fdaedd8 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp @@ -26,6 +26,17 @@ #include "DebugUtil.h" #define TEMP_SIZE (1024*1024*4) +#ifdef USE_GLES +#define PREC "highp" +#define TEX2D GL_TEXTURE_2D +#define TEXTYPE "sampler2D" +#define TEXFUNC "texture2D" +#else +#define PREC +#define TEX2D GL_TEXTURE_RECTANGLE_ARB +#define TEXTYPE "sampler2DRect" +#define TEXFUNC "texture2DRect" +#endif namespace HwRasterizer { @@ -35,6 +46,75 @@ namespace HwRasterizer u8 *temp; + // Programs + static GLuint colProg, texProg, clearProg; + + // Color + static GLint col_apos = -1, col_atex = -1; + // Tex + static GLint tex_apos = -1, tex_atex = -1, tex_utex = -1; + // Clear shader + static GLint clear_apos = -1, clear_ucol = -1; + + void CreateShaders() + { + // Color Vertices + static const char *fragcolText = + "varying " PREC " vec4 TexCoordOut;\n" + "void main() {\n" + " gl_FragColor = TexCoordOut;\n" + "}\n"; + // Texture Vertices + static const char *fragtexText = + "varying " PREC " vec4 TexCoordOut;\n" + "uniform " TEXTYPE " Texture;\n" + "void main() {\n" + " " PREC " vec4 tmpcolor;\n" + " tmpcolor = " TEXFUNC "(Texture, TexCoordOut.xy);\n" + " gl_FragColor = tmpcolor;\n" + "}\n"; + // Clear shader + static const char *fragclearText = + "uniform vec4 Color;\n" + "void main() {\n" + " gl_FragColor = Color;\n" + "}\n"; + // Generic passthrough vertice shaders + static const char *vertShaderText = + "attribute vec4 pos;\n" + "attribute vec4 TexCoordIn;\n " + "varying vec4 TexCoordOut;\n " + "void main() {\n" + " gl_Position = pos;\n" + " TexCoordOut = TexCoordIn;\n" + "}\n"; + static const char *vertclearText = + "attribute vec4 pos;\n" + "void main() {\n" + " gl_Position = pos;\n" + "}\n"; + + // Color Program + colProg = OpenGL_CompileProgram(vertShaderText, fragcolText); + + // Texture Program + texProg = OpenGL_CompileProgram(vertShaderText, fragtexText); + + // Clear Program + clearProg = OpenGL_CompileProgram(vertclearText, fragclearText); + + // Color attributes + col_apos = glGetAttribLocation(colProg, "pos"); + col_atex = glGetAttribLocation(colProg, "TexCoordIn"); + // Texture attributes + tex_apos = glGetAttribLocation(texProg, "pos"); + tex_atex = glGetAttribLocation(texProg, "TexCoordIn"); + tex_utex = glGetUniformLocation(texProg, "Texture"); + // Clear attributes + clear_apos = glGetAttribLocation(clearProg, "pos"); + clear_ucol = glGetUniformLocation(clearProg, "Color"); + } + void Init() { efbHalfWidth = EFB_WIDTH / 2.0f; @@ -42,23 +122,72 @@ namespace HwRasterizer temp = (u8*)AllocateMemoryPages(TEMP_SIZE); } + void Shutdown() + { + glDeleteProgram(colProg); + glDeleteProgram(texProg); + glDeleteProgram(clearProg); + } + void Prepare() + { + //legacy multitexturing: select texture channel only. + glActiveTexture(GL_TEXTURE0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment +#ifndef USE_GLES + glShadeModel(GL_SMOOTH); + glDisable(GL_BLEND); + glClearDepth(1.0f); + glEnable(GL_SCISSOR_TEST); + glDisable(GL_LIGHTING); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glClientActiveTexture(GL_TEXTURE0); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glEnable(GL_TEXTURE_RECTANGLE_ARB); + glStencilFunc(GL_ALWAYS, 0, 0); + glDisable(GL_STENCIL_TEST); +#endif + // used by hw rasterizer if it enables blending and depth test + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthFunc(GL_LEQUAL); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + CreateShaders(); + GL_REPORT_ERRORD(); + } + static float width, height; void LoadTexture() { FourTexUnits &texUnit = bpmem.tex[0]; u32 imageAddr = texUnit.texImage3[0].image_base; - + // Texture Rectangle uses pixel coordinates + // While GLES uses texture coordinates +#ifdef USE_GLES + width = texUnit.texImage0[0].width; + height = texUnit.texImage0[0].height; +#else + width = 1; + height = 1; +#endif TexCacheEntry &cacheEntry = textures[imageAddr]; cacheEntry.Update(); + GL_REPORT_ERRORD(); - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, cacheEntry.texture); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, texUnit.texMode0[0].mag_filter ? GL_LINEAR : GL_NEAREST); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, (texUnit.texMode0[0].min_filter >= 4) ? GL_LINEAR : GL_NEAREST); + glBindTexture(TEX2D, cacheEntry.texture); + glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, texUnit.texMode0[0].mag_filter ? GL_LINEAR : GL_NEAREST); + glTexParameteri(TEX2D, GL_TEXTURE_MIN_FILTER, (texUnit.texMode0[0].min_filter >= 4) ? GL_LINEAR : GL_NEAREST); + GL_REPORT_ERRORD(); } void BeginTriangles() { // disabling depth test sometimes allows more things to be visible + GL_REPORT_ERRORD(); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); @@ -66,51 +195,121 @@ namespace HwRasterizer if (hasTexture) LoadTexture(); + GL_REPORT_ERRORD(); } void EndTriangles() { - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); - + glBindTexture(TEX2D, 0); glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); } - void DrawColorVertex(OutputVertexData *v) + void DrawColorVertex(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) { - glColor3ub(v->color[0][OutputVertexData::RED_C], v->color[0][OutputVertexData::GRN_C], v->color[0][OutputVertexData::BLU_C]); - glVertex3f(v->screenPosition.x / efbHalfWidth - 1.0f, 1.0f - v->screenPosition.y / efbHalfHeight, v->screenPosition.z / (float)0x00ffffff); + float x0 = (v0->screenPosition.x / efbHalfWidth) - 1.0f; + float y0 = 1.0f - (v0->screenPosition.y / efbHalfHeight); + float z0 = v0->screenPosition.z / (float)0x00ffffff; + + float x1 = (v1->screenPosition.x / efbHalfWidth) - 1.0f; + float y1 = 1.0f - (v1->screenPosition.y / efbHalfHeight); + float z1 = v1->screenPosition.z / (float)0x00ffffff; + + float x2 = (v2->screenPosition.x / efbHalfWidth) - 1.0f; + float y2 = 1.0f - (v2->screenPosition.y / efbHalfHeight); + float z2 = v2->screenPosition.z / (float)0x00ffffff; + + float r0 = v0->color[0][OutputVertexData::RED_C] / 255.0f; + float g0 = v0->color[0][OutputVertexData::GRN_C] / 255.0f; + float b0 = v0->color[0][OutputVertexData::BLU_C] / 255.0f; + + float r1 = v1->color[0][OutputVertexData::RED_C] / 255.0f; + float g1 = v1->color[0][OutputVertexData::GRN_C] / 255.0f; + float b1 = v1->color[0][OutputVertexData::BLU_C] / 255.0f; + + float r2 = v2->color[0][OutputVertexData::RED_C] / 255.0f; + float g2 = v2->color[0][OutputVertexData::GRN_C] / 255.0f; + float b2 = v2->color[0][OutputVertexData::BLU_C] / 255.0f; + + static const GLfloat verts[3][3] = { + { x0, y0, z0 }, + { x1, y1, z1 }, + { x2, y2, z2 } + }; + static const GLfloat col[3][4] = { + { r0, g0, b0, 0.1f }, + { r1, g1, b1, 0.1f }, + { r2, g2, b2, 0.1f } + }; + { + glUseProgram(colProg); + glEnableVertexAttribArray(col_apos); + glEnableVertexAttribArray(col_atex); + + glVertexAttribPointer(col_apos, 3, GL_FLOAT, GL_FALSE, 0, verts); + glVertexAttribPointer(col_atex, 4, GL_FLOAT, GL_FALSE, 0, col); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableVertexAttribArray(col_atex); + glDisableVertexAttribArray(col_apos); + } + GL_REPORT_ERRORD(); } - void DrawTextureVertex(OutputVertexData *v) + void DrawTextureVertex(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) { - float s = v->texCoords[0].x; - float t = v->texCoords[0].y; - glTexCoord2f(s, t); + float x0 = (v0->screenPosition.x / efbHalfWidth) - 1.0f; + float y0 = 1.0f - (v0->screenPosition.y / efbHalfHeight); + float z0 = v0->screenPosition.z; - float x = (v->screenPosition.x / efbHalfWidth) - 1.0f; - float y = 1.0f - (v->screenPosition.y / efbHalfHeight); - float z = v->screenPosition.z; - glVertex3f(x, y, z); + float x1 = (v1->screenPosition.x / efbHalfWidth) - 1.0f; + float y1 = 1.0f - (v1->screenPosition.y / efbHalfHeight); + float z1 = v1->screenPosition.z; + + float x2 = (v2->screenPosition.x / efbHalfWidth) - 1.0f; + float y2 = 1.0f - (v2->screenPosition.y / efbHalfHeight); + float z2 = v2->screenPosition.z; + + float s0 = v0->texCoords[0].x / width; + float t0 = v0->texCoords[0].y / height; + + float s1 = v1->texCoords[0].x / width; + float t1 = v1->texCoords[0].y / height; + + float s2 = v2->texCoords[0].x / width; + float t2 = v2->texCoords[0].y / width; + + static const GLfloat verts[3][3] = { + { x0, y0, z0 }, + { x1, y1, z1 }, + { x2, y2, z2 } + }; + static const GLfloat tex[3][2] = { + { s0, t0 }, + { s1, t1 }, + { s2, t2 } + }; + { + glUseProgram(texProg); + glEnableVertexAttribArray(tex_apos); + glEnableVertexAttribArray(tex_atex); + + glVertexAttribPointer(tex_apos, 3, GL_FLOAT, GL_FALSE, 0, verts); + glVertexAttribPointer(tex_atex, 2, GL_FLOAT, GL_FALSE, 0, tex); + glUniform1i(tex_utex, 0); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableVertexAttribArray(tex_atex); + glDisableVertexAttribArray(tex_apos); + } + GL_REPORT_ERRORD(); } void DrawTriangleFrontFace(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) { - glBegin(GL_TRIANGLES); - if (hasTexture) - { - DrawTextureVertex(v0); - DrawTextureVertex(v1); - DrawTextureVertex(v2); - } - else - { - DrawColorVertex(v0); - DrawColorVertex(v1); - DrawColorVertex(v2); - } - glEnd(); - } + if (hasTexture) + DrawTextureVertex(v0, v1, v2); + else + DrawColorVertex(v0, v1, v2); + } void Clear() { @@ -124,17 +323,21 @@ namespace HwRasterizer GLfloat right = (GLfloat)(left + bpmem.copyTexSrcWH.x + 1) / efbHalfWidth - 1.0f; GLfloat bottom = 1.0f - (GLfloat)(top + bpmem.copyTexSrcWH.y + 1) / efbHalfHeight; GLfloat depth = (GLfloat)bpmem.clearZValue / (GLfloat)0x00ffffff; - - glBegin(GL_QUADS); - glColor4ub(r, g, b, a); - glVertex3f(left, top, depth); - glColor4ub(r, g, b, a); - glVertex3f(right, top, depth); - glColor4ub(r, g, b, a); - glVertex3f(right, bottom, depth); - glColor4ub(r, g, b, a); - glVertex3f(left, bottom, depth); - glEnd(); + static const GLfloat verts[4][3] = { + { left, top, depth }, + { right, top, depth }, + { right, bottom, depth }, + { left, bottom, depth } + }; + { + glUseProgram(clearProg); + glVertexAttribPointer(clear_apos, 3, GL_FLOAT, GL_FALSE, 0, verts); + glUniform4f(clear_ucol, r, g, b, a); + glEnableVertexAttribArray(col_apos); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(col_apos); + } + GL_REPORT_ERRORD(); } TexCacheEntry::TexCacheEntry() @@ -158,9 +361,14 @@ namespace HwRasterizer DebugUtil::GetTextureBGRA(temp, 0, 0, width, height); glGenTextures(1, (GLuint *)&texture); - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture); - glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_BGRA, GL_UNSIGNED_BYTE, temp); - } + glBindTexture(TEX2D, texture); +#ifdef USE_GLES + glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp); +#else + glTexImage2D(TEX2D, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_BGRA, GL_UNSIGNED_BYTE, temp); +#endif + GL_REPORT_ERRORD(); + } void TexCacheEntry::Destroy() { diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h index 568c313215..9f07a44b19 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h +++ b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.h @@ -28,6 +28,9 @@ struct OutputVertexData; namespace HwRasterizer { void Init(); + void Shutdown(); + + void Prepare(); void BeginTriangles(); void EndTriangles(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp index 3923ed0840..982a8f11da 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp @@ -16,17 +16,35 @@ // http://code.google.com/p/dolphin-emu/ #include "Common.h" +#include #include "../../Plugin_VideoOGL/Src/GLUtil.h" +#include "../../Plugin_VideoOGL/Src/RasterFont.h" #include "SWRenderer.h" #include "SWStatistics.h" -#include "../../Plugin_VideoOGL/Src/RasterFont.h" - -#define VSYNC_ENABLED 0 static GLuint s_RenderTarget = 0; +static GLint attr_pos = -1, attr_tex = -1; +static GLint uni_tex = -1; +static GLuint program; + +#ifdef USE_GLES +#define PREC "highp" +#define TEX2D GL_TEXTURE_2D +#define TEXTYPE "sampler2D" +#define TEXFUNC "texture2D" +#else +#define PREC +#define TEX2D GL_TEXTURE_RECTANGLE_ARB +#define TEXTYPE "sampler2DRect" +#define TEXFUNC "texture2DRect" +#endif + + +#ifndef USE_GLES RasterFont* s_pfont = NULL; +#endif void SWRenderer::Init() { @@ -34,79 +52,68 @@ void SWRenderer::Init() void SWRenderer::Shutdown() { + glDeleteProgram(program); glDeleteTextures(1, &s_RenderTarget); +#ifndef USE_GLES + delete s_pfont; + s_pfont = 0; +#endif +} - delete s_pfont; - s_pfont = 0; +void CreateShaders() +{ + static const char *fragShaderText = + "varying " PREC " vec2 TexCoordOut;\n" + "uniform " TEXTYPE " Texture;\n" + "void main() {\n" + " " PREC " vec4 tmpcolor;\n" + " tmpcolor = " TEXFUNC "(Texture, TexCoordOut);\n" + " gl_FragColor = tmpcolor;\n" + "}\n"; + static const char *vertShaderText = + "attribute vec4 pos;\n" + "attribute vec2 TexCoordIn;\n " + "varying vec2 TexCoordOut;\n " + "void main() {\n" + " gl_Position = pos;\n" + " TexCoordOut = TexCoordIn;\n" + "}\n"; + + program = OpenGL_CompileProgram(vertShaderText, fragShaderText); + + glUseProgram(program); + + uni_tex = glGetUniformLocation(program, "Texture"); + attr_pos = glGetAttribLocation(program, "pos"); + attr_tex = glGetAttribLocation(program, "TexCoordIn"); } void SWRenderer::Prepare() { - OpenGL_MakeCurrent(); - - // Init extension support. - if (glewInit() != GLEW_OK) { - ERROR_LOG(VIDEO, "glewInit() failed!Does your video card support OpenGL 2.x?"); - return; - } - - // Handle VSync on/off -#ifdef _WIN32 - if (WGLEW_EXT_swap_control) - wglSwapIntervalEXT(VSYNC_ENABLED); - else - ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)Does your video card support OpenGL 2.x?"); -#elif defined(HAVE_X11) && HAVE_X11 - if (glXSwapIntervalSGI) - glXSwapIntervalSGI(VSYNC_ENABLED); - else - ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)"); -#endif - - glStencilFunc(GL_ALWAYS, 0, 0); - // used by hw rasterizer if it enables blending and depth test - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDepthFunc(GL_LEQUAL); - - glShadeModel(GL_SMOOTH); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClearDepth(1.0f); - glEnable(GL_SCISSOR_TEST); - + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment - - glDisable(GL_LIGHTING); - glDisable(GL_BLEND); - glDisable(GL_STENCIL_TEST); - //glDisable(GL_SCISSOR_TEST); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - s_pfont = new RasterFont(); - - // legacy multitexturing: select texture channel only. - glActiveTexture(GL_TEXTURE0); - glClientActiveTexture(GL_TEXTURE0); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glGenTextures(1, &s_RenderTarget); + + CreateShaders(); +#ifndef USE_GLES + s_pfont = new RasterFont(); glEnable(GL_TEXTURE_RECTANGLE_ARB); +#endif + GL_REPORT_ERRORD(); } void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color) { - int nBackbufferWidth = (int)OpenGL_GetBackbufferWidth(); - int nBackbufferHeight = (int)OpenGL_GetBackbufferHeight(); + int nBackbufferWidth = (int)GLInterface->GetBackBufferWidth(); + int nBackbufferHeight = (int)GLInterface->GetBackBufferHeight(); +#ifndef USE_GLES glColor4f(((color>>16) & 0xff)/255.0f, ((color>> 8) & 0xff)/255.0f, ((color>> 0) & 0xff)/255.0f, ((color>>24) & 0xFF)/255.0f); - s_pfont->printMultilineText(pstr, - left * 2.0f / (float)nBackbufferWidth - 1, - 1 - top * 2.0f / (float)nBackbufferHeight, - 0, nBackbufferWidth, nBackbufferHeight); + s_pfont->printMultilineText(pstr, + left * 2.0f / (float)nBackbufferWidth - 1, + 1 - top * 2.0f / (float)nBackbufferHeight, + 0, nBackbufferWidth, nBackbufferHeight); +#endif } void SWRenderer::DrawDebugText() @@ -139,31 +146,56 @@ void SWRenderer::DrawDebugText() void SWRenderer::DrawTexture(u8 *texture, int width, int height) { - GLsizei glWidth = (GLsizei)OpenGL_GetBackbufferWidth(); - GLsizei glHeight = (GLsizei)OpenGL_GetBackbufferHeight(); + GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth(); + GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight(); // Update GLViewPort glViewport(0, 0, glWidth, glHeight); glScissor(0, 0, glWidth, glHeight); - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, s_RenderTarget); - glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindTexture(TEX2D, s_RenderTarget); - GL_REPORT_ERRORD(); + glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); + glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(TEX2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLfloat u_max = (GLfloat)width; GLfloat v_max = (GLfloat)glHeight; - - glBegin(GL_QUADS); - glTexCoord2f(0, v_max); glVertex2f(-1, -1); - glTexCoord2f(0, 0); glVertex2f(-1, 1); - glTexCoord2f(u_max, 0); glVertex2f( 1, 1); - glTexCoord2f(u_max, v_max); glVertex2f( 1, -1); - glEnd(); + + static const GLfloat verts[4][2] = { + { -1, -1}, // Left top + { -1, 1}, // left bottom + { 1, 1}, // right bottom + { 1, -1} // right top + }; + //Texture rectangle uses pixel coordinates +#ifndef USE_GLES + static const GLfloat texverts[4][2] = { + {0, v_max}, + {0, 0}, + {u_max, 0}, + {u_max, v_max} + }; +#else + static const GLfloat texverts[4][2] = { + {0, 1}, + {0, 0}, + {1, 0}, + {1, 1} + }; +#endif + glVertexAttribPointer(attr_pos, 2, GL_FLOAT, GL_FALSE, 0, verts); + glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, texverts); + glEnableVertexAttribArray(attr_pos); + glEnableVertexAttribArray(attr_tex); + glActiveTexture(GL_TEXTURE0); + glUniform1i(uni_tex, 0); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(attr_pos); + glDisableVertexAttribArray(attr_tex); - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0); + glBindTexture(TEX2D, 0); + GL_REPORT_ERRORD(); } void SWRenderer::SwapBuffer() @@ -172,15 +204,13 @@ void SWRenderer::SwapBuffer() glFlush(); - OpenGL_SwapBuffers(); + GLInterface->SwapBuffers(); - GL_REPORT_ERRORD(); - swstats.ResetFrame(); - // Clear framebuffer - glClearColor(0, 0, 0, 0); - glClearDepth(1.0); +#ifndef USE_GLES + glClearDepth(1.0f); +#endif glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp index 05a6cdddf2..7f7ef6b0f8 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWVideoConfig.cpp @@ -51,7 +51,7 @@ void SWVideoConfig::Load(const char* ini_file) iniFile.Get("Hardware", "Fullscreen", &bFullscreen, 0); // Hardware iniFile.Get("Hardware", "RenderToMainframe", &renderToMainframe, false); - iniFile.Get("Rendering", "HwRasterizer", &bHwRasterizer, false); + iniFile.Get("Rendering", "HwRasterizer", &bHwRasterizer, true); iniFile.Get("Info", "ShowStats", &bShowStats, false); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp index 3c6fdcca38..1c18b1c165 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp @@ -40,6 +40,8 @@ #include "VideoBackend.h" #include "Core.h" +#define VSYNC_ENABLED 0 + namespace SW { @@ -69,8 +71,9 @@ void VideoSoftware::ShowConfig(void *_hParent) bool VideoSoftware::Initialize(void *&window_handle) { g_SWVideoConfig.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_software.ini").c_str()); + InitInterface(); - if (!OpenGL_Create(window_handle)) + if (!GLInterface->CreateWindow(window_handle)) { INFO_LOG(VIDEO, "%s", "SWRenderer::Create failed\n"); return false; @@ -83,8 +86,10 @@ bool VideoSoftware::Initialize(void *&window_handle) OpcodeDecoder::Init(); Clipper::Init(); Rasterizer::Init(); - HwRasterizer::Init(); - SWRenderer::Init(); + if (g_SWVideoConfig.bHwRasterizer) + HwRasterizer::Init(); + else + SWRenderer::Init(); DebugUtil::Init(); return true; @@ -124,14 +129,44 @@ void VideoSoftware::EmuStateChange(EMUSTATE_CHANGE newState) void VideoSoftware::Shutdown() { - SWRenderer::Shutdown(); - OpenGL_Shutdown(); + if (g_SWVideoConfig.bHwRasterizer) + HwRasterizer::Shutdown(); + else + SWRenderer::Shutdown(); + GLInterface->Shutdown(); } // This is called after Video_Initialize() from the Core void VideoSoftware::Video_Prepare() -{ - SWRenderer::Prepare(); +{ + GLInterface->MakeCurrent(); + // Init extension support. + { +#ifndef USE_GLES + if (glewInit() != GLEW_OK) { + ERROR_LOG(VIDEO, "glewInit() failed!Does your video card support OpenGL 2.x?"); + return; + } + + // Handle VSync on/off +#ifdef _WIN32 + if (WGLEW_EXT_swap_control) + wglSwapIntervalEXT(VSYNC_ENABLED); + else + ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)Does your video card support OpenGL 2.x?"); +#elif defined(HAVE_X11) && HAVE_X11 + if (glXSwapIntervalSGI) + glXSwapIntervalSGI(VSYNC_ENABLED); + else + ERROR_LOG(VIDEO, "no support for SwapInterval (framerate clamped to monitor refresh rate)"); +#endif +#endif + } + + if (g_SWVideoConfig.bHwRasterizer) + HwRasterizer::Prepare(); + else + SWRenderer::Prepare(); INFO_LOG(VIDEO, "Video backend initialized."); } @@ -273,20 +308,7 @@ writeFn32 VideoSoftware::Video_PEWrite32() // Draw messages on top of the screen unsigned int VideoSoftware::PeekMessages() { -#ifdef _WIN32 - // TODO: peekmessage - MSG msg; - while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - return FALSE; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return TRUE; -#else - return false; -#endif + return GLInterface->PeekMessages(); } // Show the current FPS @@ -294,7 +316,7 @@ void VideoSoftware::UpdateFPSDisplay(const char *text) { char temp[100]; snprintf(temp, sizeof temp, "%s | Software | %s", scm_rev_str, text); - OpenGL_SetWindowText(temp); + GLInterface->UpdateFPSDisplay(temp); } } From 3cb5dffbc932cf0d9cde8ba9cf922eff17676cba Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 17 Dec 2012 15:01:52 -0600 Subject: [PATCH 02/20] Missed the video interface files. --- Source/Core/DolphinWX/Src/GLVideoInterface.h | 75 ++++ .../Core/DolphinWX/Src/VideoInterface/AGL.cpp | 123 ++++++ .../Core/DolphinWX/Src/VideoInterface/AGL.h | 37 ++ .../Core/DolphinWX/Src/VideoInterface/EGL.cpp | 383 ++++++++++++++++++ .../Core/DolphinWX/Src/VideoInterface/EGL.h | 43 ++ .../Core/DolphinWX/Src/VideoInterface/GLX.cpp | 342 ++++++++++++++++ .../Core/DolphinWX/Src/VideoInterface/GLX.h | 41 ++ .../Src/VideoInterface/InterfaceBase.h | 36 ++ .../Core/DolphinWX/Src/VideoInterface/WGL.cpp | 179 ++++++++ .../Core/DolphinWX/Src/VideoInterface/WGL.h | 41 ++ .../Core/DolphinWX/Src/VideoInterface/WX.cpp | 82 ++++ Source/Core/DolphinWX/Src/VideoInterface/WX.h | 41 ++ 12 files changed, 1423 insertions(+) create mode 100644 Source/Core/DolphinWX/Src/GLVideoInterface.h create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/AGL.h create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/EGL.h create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/GLX.h create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/WGL.h create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/WX.cpp create mode 100644 Source/Core/DolphinWX/Src/VideoInterface/WX.h diff --git a/Source/Core/DolphinWX/Src/GLVideoInterface.h b/Source/Core/DolphinWX/Src/GLVideoInterface.h new file mode 100644 index 0000000000..3469b1d3c1 --- /dev/null +++ b/Source/Core/DolphinWX/Src/GLVideoInterface.h @@ -0,0 +1,75 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _VIDEOINTERFACE_H_ +#define _VIDEOINTERFACE_H_ + +#include "Thread.h" + +#if defined(USE_EGL) && USE_EGL +#include "VideoInterface/EGL.h" +#elif defined(USE_WX) && USE_WX +#include "VideoInterface/WX.h" +#elif defined(__APPLE__) +#include "VideoInterface/AGL.h" +#elif defined(_WIN32) +#include "VideoInterface/GLW.h" +#elif defined(HAVE_X11) && HAVE_X11 +#include "VideoInterface/GLX.h" +#endif + +typedef struct { +#if defined(USE_EGL) && USE_EGL // This is currently a X11/EGL implementation for desktop + int screen; + Display *x_dpy; + Display *x_evdpy; + Window win; + Window parent; + EGLSurface egl_surf; + EGLContext egl_ctx; + EGLDisplay egl_dpy; + XVisualInfo *vi; + XSetWindowAttributes attr; + std::thread xEventThread; + int x, y; + unsigned int width, height; +#elif defined(USE_WX) && USE_WX + wxGLCanvas *glCanvas; + wxGLContext *glCtxt; + wxPanel *panel; +#elif defined(__APPLE__) + NSWindow *cocoaWin; + NSOpenGLContext *cocoaCtx; +#elif defined(HAVE_X11) && HAVE_X11 + int screen; + Window win; + Window parent; + // dpy used for glx stuff, evdpy for window events etc. + // evdpy is to be used by XEventThread only + Display *dpy, *evdpy; + XVisualInfo *vi; + GLXContext ctx; + XSetWindowAttributes attr; + std::thread xEventThread; + int x, y; + unsigned int width, height; +#endif +} GLWindow; + +extern cInterfaceBase *GLInterface; +extern GLWindow GLWin; + +#endif diff --git a/Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp b/Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp new file mode 100644 index 0000000000..465f77c972 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp @@ -0,0 +1,123 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "VideoConfig.h" +#include "Host.h" +#include "RenderBase.h" + +#include "VertexShaderManager.h" +#include "../GLVideoInterface.h" +#include "AGL.h" + +void cInterfaceAGL::SwapBuffers() +{ + [GLWin.cocoaCtx flushBuffer]; +} + +// Show the current FPS +void cInterfaceAGL::UpdateFPSDisplay(const char *text) +{ + [GLWin.cocoaWin setTitle: [NSString stringWithUTF8String: text]]; +} + +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +bool cInterfaceAGL::Create(void *&window_handle) +{ + int _tx, _ty, _twidth, _theight; + Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); + + // Control window size and picture scaling + s_backbuffer_width = _twidth; + s_backbuffer_height = _theight; + + NSRect size; + NSUInteger style = NSMiniaturizableWindowMask; + NSOpenGLPixelFormatAttribute attr[2] = { NSOpenGLPFADoubleBuffer, 0 }; + NSOpenGLPixelFormat *fmt = [[NSOpenGLPixelFormat alloc] + initWithAttributes: attr]; + if (fmt == nil) { + ERROR_LOG(VIDEO, "failed to create pixel format"); + return NULL; + } + + GLWin.cocoaCtx = [[NSOpenGLContext alloc] + initWithFormat: fmt shareContext: nil]; + [fmt release]; + if (GLWin.cocoaCtx == nil) { + ERROR_LOG(VIDEO, "failed to create context"); + return NULL; + } + + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen) { + size = [[NSScreen mainScreen] frame]; + style |= NSBorderlessWindowMask; + } else { + size = NSMakeRect(_tx, _ty, _twidth, _theight); + style |= NSResizableWindowMask | NSTitledWindowMask; + } + + GLWin.cocoaWin = [[NSWindow alloc] initWithContentRect: size + styleMask: style backing: NSBackingStoreBuffered defer: NO]; + if (GLWin.cocoaWin == nil) { + ERROR_LOG(VIDEO, "failed to create window"); + return NULL; + } + + if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFullscreen) { + CGDisplayCapture(CGMainDisplayID()); + [GLWin.cocoaWin setLevel: CGShieldingWindowLevel()]; + } + + [GLWin.cocoaCtx setView: [GLWin.cocoaWin contentView]]; + [GLWin.cocoaWin makeKeyAndOrderFront: nil]; + + return true; +} + +bool cInterfaceAGL::MakeCurrent() +{ + [GLWin.cocoaCtx makeCurrentContext]; + return true; +} + +// Update window width, size and etc. Called from Render.cpp +void cInterfaceAGL::Update() +{ + int width, height; + + width = [[GLWin.cocoaWin contentView] frame].size.width; + height = [[GLWin.cocoaWin contentView] frame].size.height; + if (width == s_backbuffer_width && height == s_backbuffer_height) + return; + + [GLWin.cocoaCtx setView: [GLWin.cocoaWin contentView]]; + [GLWin.cocoaCtx update]; + [GLWin.cocoaCtx makeCurrentContext]; + s_backbuffer_width = width; + s_backbuffer_height = height; +} + +// Close backend +void cInterfaceAGL::Shutdown() +{ + [GLWin.cocoaWin close]; + [GLWin.cocoaCtx clearDrawable]; + [GLWin.cocoaCtx release]; +} + + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/AGL.h b/Source/Core/DolphinWX/Src/VideoInterface/AGL.h new file mode 100644 index 0000000000..1e73f3c6b8 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/AGL.h @@ -0,0 +1,37 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _INTERFACEAGL_H_ +#define _INTERFACEAGL_H_ + +#ifdef __APPLE__ +#include +#import +#endif + +#include "InterfaceBase.h" + +class cInterfaceAGL : public cInterfaceBase +{ +public: + void SwapBuffers(); + void UpdateFPSDisplay(const char *Text); + bool CreateWindow(void *&window_handle); + bool MakeCurrent(); + void Shutdown(); +}; +#endif + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp b/Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp new file mode 100644 index 0000000000..bcf7acaff5 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp @@ -0,0 +1,383 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "VideoConfig.h" +#include "Host.h" +#include "RenderBase.h" + +#include "VertexShaderManager.h" +#include "../GLVideoInterface.h" +#include "EGL.h" + +void cInterfaceEGL::CreateXWindow(void) +{ + Atom wmProtocols[1]; + + // Setup window attributes + GLWin.attr.colormap = XCreateColormap(GLWin.x_evdpy, + GLWin.parent, GLWin.vi->visual, AllocNone); + GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; + GLWin.attr.background_pixel = BlackPixel(GLWin.x_evdpy, GLWin.screen); + GLWin.attr.border_pixel = 0; + + // Create the window + GLWin.win = XCreateWindow(GLWin.x_evdpy, GLWin.parent, + GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, + GLWin.vi->depth, InputOutput, GLWin.vi->visual, + CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); + wmProtocols[0] = XInternAtom(GLWin.x_evdpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols(GLWin.x_evdpy, GLWin.win, wmProtocols, 1); + XSetStandardProperties(GLWin.x_evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); + XMapRaised(GLWin.x_evdpy, GLWin.win); + XSync(GLWin.x_evdpy, True); + + GLWin.xEventThread = std::thread(&cInterfaceEGL::XEventThread, this); +} + +void cInterfaceEGL::DestroyXWindow(void) +{ + XUnmapWindow(GLWin.x_dpy, GLWin.win); + GLWin.win = 0; + if (GLWin.xEventThread.joinable()) + GLWin.xEventThread.join(); + XFreeColormap(GLWin.x_dpy, GLWin.attr.colormap); +} + +void cInterfaceEGL::XEventThread() +{ + // Free look variables + static bool mouseLookEnabled = false; + static bool mouseMoveEnabled = false; + static float lastMouse[2]; + while (GLWin.win) + { + XEvent event; + KeySym key; + for (int num_events = XPending(GLWin.x_evdpy); num_events > 0; num_events--) + { + XNextEvent(GLWin.x_evdpy, &event); + switch(event.type) { + case KeyPress: + key = XLookupKeysym((XKeyEvent*)&event, 0); + switch (key) + { + case XK_3: + OSDChoice = 1; + // Toggle native resolution + g_Config.iEFBScale = g_Config.iEFBScale + 1; + if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; + break; + case XK_4: + OSDChoice = 2; + // Toggle aspect ratio + g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; + break; + case XK_5: + OSDChoice = 3; + // Toggle EFB copy + if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) + { + g_Config.bEFBCopyEnable ^= true; + g_Config.bCopyEFBToTexture = false; + } + else + { + g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; + } + break; + case XK_6: + OSDChoice = 4; + g_Config.bDisableFog = !g_Config.bDisableFog; + break; + default: + break; + } + if (g_Config.bFreeLook) + { + static float debugSpeed = 1.0f; + switch (key) + { + case XK_parenleft: + debugSpeed /= 2.0f; + break; + case XK_parenright: + debugSpeed *= 2.0f; + break; + case XK_w: + VertexShaderManager::TranslateView(0.0f, debugSpeed); + break; + case XK_s: + VertexShaderManager::TranslateView(0.0f, -debugSpeed); + break; + case XK_a: + VertexShaderManager::TranslateView(debugSpeed, 0.0f); + break; + case XK_d: + VertexShaderManager::TranslateView(-debugSpeed, 0.0f); + break; + case XK_r: + VertexShaderManager::ResetView(); + break; + } + } + break; + case ButtonPress: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseMoveEnabled = true; + break; + case 3: // Right button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseLookEnabled = true; + break; + } + } + break; + case ButtonRelease: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + mouseMoveEnabled = false; + break; + case 3: // Right button + mouseLookEnabled = false; + break; + } + } + break; + case MotionNotify: + if (g_Config.bFreeLook) + { + if (mouseLookEnabled) + { + VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, + (event.xmotion.y - lastMouse[1]) / 200.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + + if (mouseMoveEnabled) + { + VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, + (event.xmotion.y - lastMouse[1]) / 50.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + } + break; + case ConfigureNotify: + Window winDummy; + unsigned int borderDummy, depthDummy; + XGetGeometry(GLWin.x_dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); + s_backbuffer_width = GLWin.width; + s_backbuffer_height = GLWin.height; + break; + case ClientMessage: + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.x_dpy, "WM_DELETE_WINDOW", False)) + Host_Message(WM_USER_STOP); + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.x_dpy, "RESIZE", False)) + XMoveResizeWindow(GLWin.x_dpy, GLWin.win, + event.xclient.data.l[1], event.xclient.data.l[2], + event.xclient.data.l[3], event.xclient.data.l[4]); + break; + default: + break; + } + } + Common::SleepCurrentThread(20); + } +} + +// Show the current FPS +void cInterfaceEGL::UpdateFPSDisplay(const char *text) +{ + XStoreName(GLWin.x_dpy, GLWin.win, text); +} +void cInterfaceEGL::SwapBuffers() +{ + eglSwapBuffers(GLWin.egl_dpy, GLWin.egl_surf); +} + +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +bool cInterfaceEGL::CreateWindow(void *&window_handle) +{ + int _tx, _ty, _twidth, _theight; + Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); + + // Control window size and picture scaling + s_backbuffer_width = _twidth; + s_backbuffer_height = _theight; + + const char *s; + EGLint egl_major, egl_minor; + + GLWin.x_dpy = XOpenDisplay(NULL); + + if (!GLWin.x_dpy) { + printf("Error: couldn't open display\n"); + return false; + } + + GLWin.egl_dpy = eglGetDisplay(GLWin.x_dpy); + if (!GLWin.egl_dpy) { + printf("Error: eglGetDisplay() failed\n"); + return false; + } + + if (!eglInitialize(GLWin.egl_dpy, &egl_major, &egl_minor)) { + printf("Error: eglInitialize() failed\n"); + return false; + } + + s = eglQueryString(GLWin.egl_dpy, EGL_VERSION); + printf("EGL_VERSION = %s\n", s); + + s = eglQueryString(GLWin.egl_dpy, EGL_VENDOR); + printf("EGL_VENDOR = %s\n", s); + + s = eglQueryString(GLWin.egl_dpy, EGL_EXTENSIONS); + printf("EGL_EXTENSIONS = %s\n", s); + + s = eglQueryString(GLWin.egl_dpy, EGL_CLIENT_APIS); + printf("EGL_CLIENT_APIS = %s\n", s); + + // attributes for a visual in RGBA format with at least + // 8 bits per color and a 24 bit depth buffer + int attribs[] = { + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_DEPTH_SIZE, 24, +#ifdef USE_GLES + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, +#else + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, +#endif + EGL_NONE }; + + static const EGLint ctx_attribs[] = { +#ifdef USE_GLES + EGL_CONTEXT_CLIENT_VERSION, 2, +#endif + EGL_NONE + }; + + GLWin.x_evdpy = XOpenDisplay(NULL); + GLWin.parent = (Window)window_handle; + GLWin.screen = DefaultScreen(GLWin.x_dpy); + if (GLWin.parent == 0) + GLWin.parent = RootWindow(GLWin.x_dpy, GLWin.screen); + + unsigned long mask; + XVisualInfo visTemplate; + int num_visuals; + EGLConfig config; + EGLint num_configs; + EGLint vid; + + if (!eglChooseConfig( GLWin.egl_dpy, attribs, &config, 1, &num_configs)) { + printf("Error: couldn't get an EGL visual config\n"); + exit(1); + } + + if (!eglGetConfigAttrib(GLWin.egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) { + printf("Error: eglGetConfigAttrib() failed\n"); + exit(1); + } + + /* The X window visual must match the EGL config */ + visTemplate.visualid = vid; + GLWin.vi = XGetVisualInfo(GLWin.x_dpy, VisualIDMask, &visTemplate, &num_visuals); + if (!GLWin.vi) { + printf("Error: couldn't get X visual\n"); + exit(1); + } + + GLWin.x = _tx; + GLWin.y = _ty; + GLWin.width = _twidth; + GLWin.height = _theight; + + CreateXWindow(); +#ifdef USE_GLES + eglBindAPI(EGL_OPENGL_ES_API); +#else + eglBindAPI(EGL_OPENGL_API); +#endif + GLWin.egl_ctx = eglCreateContext(GLWin.egl_dpy, config, EGL_NO_CONTEXT, ctx_attribs ); + if (!GLWin.egl_ctx) { + printf("Error: eglCreateContext failed\n"); + exit(1); + } + + GLWin.egl_surf = eglCreateWindowSurface(GLWin.egl_dpy, config, GLWin.win, NULL); + if (!GLWin.egl_surf) { + printf("Error: eglCreateWindowSurface failed\n"); + exit(1); + } + + if (!eglMakeCurrent(GLWin.egl_dpy, GLWin.egl_surf, GLWin.egl_surf, GLWin.egl_ctx)) { + + printf("Error: eglMakeCurrent() failed\n"); + return false; + } + + + printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + printf("GL_VERSION: %s\n", glGetString(GL_VERSION)); + printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS)); + /* Set initial projection/viewing transformation. + * We can't be sure we'll get a ConfigureNotify event when the window + * first appears. + */ + glViewport(0, 0, (GLint) _twidth, (GLint) _theight); + window_handle = (void *)GLWin.win; + return true; +} + +bool cInterfaceEGL::MakeCurrent() +{ + return eglMakeCurrent(GLWin.egl_dpy, GLWin.egl_surf, GLWin.egl_surf, GLWin.egl_ctx); +} +// Close backend +void cInterfaceEGL::Shutdown() +{ + DestroyXWindow(); + if (GLWin.egl_ctx && !eglMakeCurrent(GLWin.egl_dpy, GLWin.egl_surf, GLWin.egl_surf, GLWin.egl_ctx)) + NOTICE_LOG(VIDEO, "Could not release drawing context."); + if (GLWin.egl_ctx) + { + eglDestroyContext(GLWin.egl_dpy, GLWin.egl_ctx); + eglDestroySurface(GLWin.egl_dpy, GLWin.egl_surf); + eglTerminate(GLWin.egl_dpy); + GLWin.egl_ctx = NULL; + } +} + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/EGL.h b/Source/Core/DolphinWX/Src/VideoInterface/EGL.h new file mode 100644 index 0000000000..afb57b2ac2 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/EGL.h @@ -0,0 +1,43 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _INTERFACEGLX_H_ +#define _INTERFACEGLX_H_ + +#include +#ifdef USE_GLES +#include +#else +#include +#include +#endif +#include "InterfaceBase.h" + +class cInterfaceEGL : public cInterfaceBase +{ +private: + void CreateXWindow(); + void DestroyXWindow(); + void XEventThread(); +public: + void SwapBuffers(); + void UpdateFPSDisplay(const char *Text); + bool CreateWindow(void *&window_handle); + bool MakeCurrent(); + void Shutdown(); +}; +#endif + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp b/Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp new file mode 100644 index 0000000000..63458f7a4d --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp @@ -0,0 +1,342 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "VideoConfig.h" +#include "Host.h" +#include "RenderBase.h" + +#include "VertexShaderManager.h" +#include "../GLVideoInterface.h" +#include "GLX.h" + +void cInterfaceGLX::CreateXWindow(void) +{ + Atom wmProtocols[1]; + + // Setup window attributes + GLWin.attr.colormap = XCreateColormap(GLWin.evdpy, + GLWin.parent, GLWin.vi->visual, AllocNone); + GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; + GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen); + GLWin.attr.border_pixel = 0; + + // Create the window + GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent, + GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, + GLWin.vi->depth, InputOutput, GLWin.vi->visual, + CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); + wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1); + XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); + XMapRaised(GLWin.evdpy, GLWin.win); + XSync(GLWin.evdpy, True); + + GLWin.xEventThread = std::thread(&cInterfaceGLX::XEventThread, this); +} + +void cInterfaceGLX::DestroyXWindow(void) +{ + XUnmapWindow(GLWin.dpy, GLWin.win); + GLWin.win = 0; + if (GLWin.xEventThread.joinable()) + GLWin.xEventThread.join(); + XFreeColormap(GLWin.evdpy, GLWin.attr.colormap); +} + +void cInterfaceGLX::XEventThread() +{ + // Free look variables + static bool mouseLookEnabled = false; + static bool mouseMoveEnabled = false; + static float lastMouse[2]; + while (GLWin.win) + { + XEvent event; + KeySym key; + for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--) + { + XNextEvent(GLWin.evdpy, &event); + switch(event.type) { + case KeyPress: + key = XLookupKeysym((XKeyEvent*)&event, 0); + switch (key) + { + case XK_3: + OSDChoice = 1; + // Toggle native resolution + g_Config.iEFBScale = g_Config.iEFBScale + 1; + if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; + break; + case XK_4: + OSDChoice = 2; + // Toggle aspect ratio + g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; + break; + case XK_5: + OSDChoice = 3; + // Toggle EFB copy + if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) + { + g_Config.bEFBCopyEnable ^= true; + g_Config.bCopyEFBToTexture = false; + } + else + { + g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; + } + break; + case XK_6: + OSDChoice = 4; + g_Config.bDisableFog = !g_Config.bDisableFog; + break; + default: + break; + } + if (g_Config.bFreeLook) + { + static float debugSpeed = 1.0f; + switch (key) + { + case XK_parenleft: + debugSpeed /= 2.0f; + break; + case XK_parenright: + debugSpeed *= 2.0f; + break; + case XK_w: + VertexShaderManager::TranslateView(0.0f, debugSpeed); + break; + case XK_s: + VertexShaderManager::TranslateView(0.0f, -debugSpeed); + break; + case XK_a: + VertexShaderManager::TranslateView(debugSpeed, 0.0f); + break; + case XK_d: + VertexShaderManager::TranslateView(-debugSpeed, 0.0f); + break; + case XK_r: + VertexShaderManager::ResetView(); + break; + } + } + break; + case ButtonPress: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseMoveEnabled = true; + break; + case 3: // Right button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseLookEnabled = true; + break; + } + } + break; + case ButtonRelease: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + mouseMoveEnabled = false; + break; + case 3: // Right button + mouseLookEnabled = false; + break; + } + } + break; + case MotionNotify: + if (g_Config.bFreeLook) + { + if (mouseLookEnabled) + { + VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, + (event.xmotion.y - lastMouse[1]) / 200.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + + if (mouseMoveEnabled) + { + VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, + (event.xmotion.y - lastMouse[1]) / 50.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + } + break; + case ConfigureNotify: + Window winDummy; + unsigned int borderDummy, depthDummy; + XGetGeometry(GLWin.evdpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); + s_backbuffer_width = GLWin.width; + s_backbuffer_height = GLWin.height; + break; + case ClientMessage: + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False)) + Host_Message(WM_USER_STOP); + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.evdpy, "RESIZE", False)) + XMoveResizeWindow(GLWin.evdpy, GLWin.win, + event.xclient.data.l[1], event.xclient.data.l[2], + event.xclient.data.l[3], event.xclient.data.l[4]); + break; + default: + break; + } + } + Common::SleepCurrentThread(20); + } +} + +// Show the current FPS +void cInterfaceGLX::UpdateFPSDisplay(const char *text) +{ + XStoreName(GLWin.dpy, GLWin.win, text); +} +void cInterfaceGLX::SwapBuffers() +{ + glXSwapBuffers(GLWin.dpy, GLWin.win); +} + +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +bool cInterfaceGLX::CreateWindow(void *&window_handle) +{ + int _tx, _ty, _twidth, _theight; + Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); + + // Control window size and picture scaling + s_backbuffer_width = _twidth; + s_backbuffer_height = _theight; + + int glxMajorVersion, glxMinorVersion; + + // attributes for a single buffered visual in RGBA format with at least + // 8 bits per color and a 24 bit depth buffer + int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 24, + None}; + + // attributes for a double buffered visual in RGBA format with at least + // 8 bits per color and a 24 bit depth buffer + int attrListDbl[] = {GLX_RGBA, GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 24, + GLX_SAMPLE_BUFFERS_ARB, g_Config.iMultisampleMode != MULTISAMPLE_OFF?1:0, + GLX_SAMPLES_ARB, g_Config.iMultisampleMode != MULTISAMPLE_OFF?1:0, + None }; + + int attrListDefault[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_DEPTH_SIZE, 1, + None }; + + GLWin.dpy = XOpenDisplay(0); + GLWin.evdpy = XOpenDisplay(0); + GLWin.parent = (Window)window_handle; + GLWin.screen = DefaultScreen(GLWin.dpy); + if (GLWin.parent == 0) + GLWin.parent = RootWindow(GLWin.dpy, GLWin.screen); + + glXQueryVersion(GLWin.dpy, &glxMajorVersion, &glxMinorVersion); + NOTICE_LOG(VIDEO, "glX-Version %d.%d", glxMajorVersion, glxMinorVersion); + + // Get an appropriate visual + GLWin.vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDbl); + if (GLWin.vi == NULL) + { + GLWin.vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListSgl); + if (GLWin.vi != NULL) + { + ERROR_LOG(VIDEO, "Only single buffered visual!"); + } + else + { + GLWin.vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDefault); + if (GLWin.vi == NULL) + { + ERROR_LOG(VIDEO, "Could not choose visual (glXChooseVisual)"); + return false; + } + } + } + else + NOTICE_LOG(VIDEO, "Got double buffered visual!"); + + // Create a GLX context. + GLWin.ctx = glXCreateContext(GLWin.dpy, GLWin.vi, 0, GL_TRUE); + if (!GLWin.ctx) + { + PanicAlert("Unable to create GLX context."); + return false; + } + + GLWin.x = _tx; + GLWin.y = _ty; + GLWin.width = _twidth; + GLWin.height = _theight; + + CreateXWindow(); + window_handle = (void *)GLWin.win; + return true; +} + +bool cInterfaceGLX::MakeCurrent() +{ + // connect the glx-context to the window + #if defined(HAVE_WX) && (HAVE_WX) + Host_GetRenderWindowSize(GLWin.x, GLWin.y, + (int&)GLWin.width, (int&)GLWin.height); + XMoveResizeWindow(GLWin.dpy, GLWin.win, GLWin.x, GLWin.y, + GLWin.width, GLWin.height); + #endif + return glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx); +} +// Close backend +void cInterfaceGLX::Shutdown() +{ + DestroyXWindow(); + if (GLWin.ctx && !glXMakeCurrent(GLWin.dpy, None, NULL)) + NOTICE_LOG(VIDEO, "Could not release drawing context."); + if (GLWin.ctx) + { + glXDestroyContext(GLWin.dpy, GLWin.ctx); + XCloseDisplay(GLWin.dpy); + XCloseDisplay(GLWin.evdpy); + GLWin.ctx = NULL; + } +} + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/GLX.h b/Source/Core/DolphinWX/Src/VideoInterface/GLX.h new file mode 100644 index 0000000000..bea58cb862 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/GLX.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _INTERFACEGLX_H_ +#define _INTERFACEGLX_H_ + +#include +#include +#include +#include + +#include "InterfaceBase.h" + +class cInterfaceGLX : public cInterfaceBase +{ +private: + void CreateXWindow(); + void DestroyXWindow(); + void XEventThread(); +public: + void SwapBuffers(); + void UpdateFPSDisplay(const char *Text); + bool CreateWindow(void *&window_handle); + bool MakeCurrent(); + void Shutdown(); +}; +#endif + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h new file mode 100644 index 0000000000..8fa4cc1b12 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h @@ -0,0 +1,36 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +class cInterfaceBase +{ +protected: + // Window dimensions. + u32 s_backbuffer_width; + u32 s_backbuffer_height; +public: + virtual void SwapBuffers() = 0; + virtual void UpdateFPSDisplay(const char *Text) = 0; + virtual bool CreateWindow(void *&window_handle) = 0; + virtual bool MakeCurrent() = 0; + virtual void Shutdown() = 0; + + virtual u32 GetBackBufferWidth() { return s_backbuffer_width; } + virtual u32 GetBackBufferHeight() { return s_backbuffer_height; } + virtual void Update() { } + virtual bool PeekMessages() { return false; } +}; + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp b/Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp new file mode 100644 index 0000000000..9abcd52fc6 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp @@ -0,0 +1,179 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "VideoConfig.h" +#include "Host.h" +#include "RenderBase.h" + +#include "VertexShaderManager.h" +#include "../GLVideoInterface.h" +#include "WGL.h" + +#include "EmuWindow.h" +static HDC hDC = NULL; // Private GDI Device Context +static HGLRC hRC = NULL; // Permanent Rendering Context + +void cInterfaceWGL::SwapBuffers() +{ + SwapBuffers(hDC); +} + +// Draw messages on top of the screen +bool cInterfaceWGL::PeekMessages() +{ + // TODO: peekmessage + MSG msg; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + return FALSE; + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return TRUE; +} + +// Show the current FPS +void cInterfaceWGL::UpdateFPSDisplay(const char *text) +{ + TCHAR temp[512]; + swprintf_s(temp, sizeof(temp)/sizeof(TCHAR), _T("%hs"), text); + EmuWindow::SetWindowText(temp); +} + +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +bool cInterfaceWGL::CreateWindow(void *&window_handle) +{ + int _tx, _ty, _twidth, _theight; + Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); + + // Control window size and picture scaling + s_backbuffer_width = _twidth; + s_backbuffer_height = _theight; + + window_handle = (void*)EmuWindow::Create((HWND)window_handle, GetModuleHandle(0), _T("Please wait...")); + if (window_handle == NULL) + { + Host_SysMessage("failed to create window"); + return false; + } + + // Show the window + EmuWindow::Show(); + + PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be + { + sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor + 1, // Version Number + PFD_DRAW_TO_WINDOW | // Format Must Support Window + PFD_SUPPORT_OPENGL | // Format Must Support OpenGL + PFD_DOUBLEBUFFER, // Must Support Double Buffering + PFD_TYPE_RGBA, // Request An RGBA Format + 32, // Select Our Color Depth + 0, 0, 0, 0, 0, 0, // Color Bits Ignored + 0, // 8bit Alpha Buffer + 0, // Shift Bit Ignored + 0, // No Accumulation Buffer + 0, 0, 0, 0, // Accumulation Bits Ignored + 24, // 24Bit Z-Buffer (Depth Buffer) + 8, // 8bit Stencil Buffer + 0, // No Auxiliary Buffer + PFD_MAIN_PLANE, // Main Drawing Layer + 0, // Reserved + 0, 0, 0 // Layer Masks Ignored + }; + + GLuint PixelFormat; // Holds The Results After Searching For A Match + + if (!(hDC=GetDC(EmuWindow::GetWnd()))) { + PanicAlert("(1) Can't create an OpenGL Device context. Fail."); + return false; + } + if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd))) { + PanicAlert("(2) Can't find a suitable PixelFormat."); + return false; + } + if (!SetPixelFormat(hDC, PixelFormat, &pfd)) { + PanicAlert("(3) Can't set the PixelFormat."); + return false; + } + if (!(hRC = wglCreateContext(hDC))) { + PanicAlert("(4) Can't create an OpenGL rendering context."); + return false; + } + return true; +} + +bool cInterfaceWGL::MakeCurrent() +{ + return wglMakeCurrent(hDC, hRC) ? true : false; +} + +// Update window width, size and etc. Called from Render.cpp +void cInterfaceWGL::Update() +{ + RECT rcWindow; + if (!EmuWindow::GetParentWnd()) + { + // We are not rendering to a child window - use client size. + GetClientRect(EmuWindow::GetWnd(), &rcWindow); + } + else + { + // We are rendering to a child window - use parent size. + GetWindowRect(EmuWindow::GetParentWnd(), &rcWindow); + } + + // Get the new window width and height + // See below for documentation + int width = rcWindow.right - rcWindow.left; + int height = rcWindow.bottom - rcWindow.top; + + // If we are rendering to a child window + if (EmuWindow::GetParentWnd() != 0 && + (s_backbuffer_width != width || s_backbuffer_height != height) && + width >= 4 && height >= 4) + { + ::MoveWindow(EmuWindow::GetWnd(), 0, 0, width, height, FALSE); + s_backbuffer_width = width; + s_backbuffer_height = height; + } +} + +// Close backend +void cInterfaceWGL::Shutdown() +{ + if (hRC) + { + if (!wglMakeCurrent(NULL, NULL)) + NOTICE_LOG(VIDEO, "Could not release drawing context."); + + if (!wglDeleteContext(hRC)) + ERROR_LOG(VIDEO, "Release Rendering Context Failed."); + + hRC = NULL; + } + + if (hDC && !ReleaseDC(EmuWindow::GetWnd(), hDC)) + { + ERROR_LOG(VIDEO, "Release Device Context Failed."); + hDC = NULL; + } +} + + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WGL.h b/Source/Core/DolphinWX/Src/VideoInterface/WGL.h new file mode 100644 index 0000000000..4ef6943623 --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/WGL.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _INTERFACEWGL_H_ +#define _INTERFACEWGL_H_ + +#ifdef _WIN32 +#define GLEW_STATIC +#include +#include +#endif + +#include "InterfaceBase.h" + +class cInterfaceWGL : public cInterfaceBase +{ +public: + void SwapBuffers(); + void UpdateFPSDisplay(const char *Text); + bool CreateWindow(void *&window_handle); + bool MakeCurrent(); + void Shutdown(); + + void Update(); + bool PeekMessages(); +}; +#endif + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WX.cpp b/Source/Core/DolphinWX/Src/VideoInterface/WX.cpp new file mode 100644 index 0000000000..7126ccb8ba --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/WX.cpp @@ -0,0 +1,82 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "VideoConfig.h" +#include "Host.h" +#include "RenderBase.h" + +#include "VertexShaderManager.h" +#include "../GLVideoInterface.h" +#include "WX.h" + +void cInterfaceWX::SwapBuffers() +{ + GLWin.glCanvas->SwapBuffers(); +} + +void cInterfaceWX::UpdateFPSDisplay(const char *text) +{ + // Handled by Host_UpdateTitle() +} + +// Create rendering window. +// Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() +bool cInterfaceWX::CreateCreate(void *&window_handle) +{ + int _tx, _ty, _twidth, _theight; + Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); + + // Control window size and picture scaling + s_backbuffer_width = _twidth; + s_backbuffer_height = _theight; + + GLWin.panel = (wxPanel *)window_handle; + GLWin.glCanvas = new wxGLCanvas(GLWin.panel, wxID_ANY, NULL, + wxPoint(0, 0), wxSize(_twidth, _theight)); + GLWin.glCanvas->Show(true); + if (GLWin.glCtxt == NULL) // XXX dirty hack + GLWin.glCtxt = new wxGLContext(GLWin.glCanvas); +} + +bool cInterfaceWX::MakeCurrent() +{ + return GLWin.glCanvas->SetCurrent(*GLWin.glCtxt); +} + +// Update window width, size and etc. Called from Render.cpp +void cInterfaceWX::Update() +{ + int width, height; + + GLWin.panel->GetSize(&width, &height); + if (width == s_backbuffer_width && height == s_backbuffer_height) + return; + + GLWin.glCanvas->SetFocus(); + GLWin.glCanvas->SetSize(0, 0, width, height); + GLWin.glCtxt->SetCurrent(*GLWin.glCanvas); + s_backbuffer_width = width; + s_backbuffer_height = height; +} + +// Close backend +void cInterfaceWX::Shutdown() +{ + GLWin.glCanvas->Hide(); +} + + diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WX.h b/Source/Core/DolphinWX/Src/VideoInterface/WX.h new file mode 100644 index 0000000000..290b0262ed --- /dev/null +++ b/Source/Core/DolphinWX/Src/VideoInterface/WX.h @@ -0,0 +1,41 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _INTERFACEWX_H_ +#define _INTERFACEWX_H_ + +#include +#include +#if defined USE_WX && USE_WX +#include "wx/wx.h" +#include "wx/glcanvas.h" +#endif + +#include "InterfaceBase.h" + +class cInterfaceWX : public cInterfaceBase +{ +public: + void SwapBuffers(); + void UpdateFPSDisplay(const char *Text); + bool CreateWindow(void *&window_handle); + bool MakeCurrent(); + void Shutdown(); + + void Update(); +}; +#endif + From 8082323c4432951494729ff1f53a4e794bf781f2 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 17 Dec 2012 15:29:38 -0600 Subject: [PATCH 03/20] Should hopefully fix OSX --- Source/Core/DolphinWX/Src/VideoInterface/WX.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WX.h b/Source/Core/DolphinWX/Src/VideoInterface/WX.h index 290b0262ed..6b2cf90692 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/WX.h +++ b/Source/Core/DolphinWX/Src/VideoInterface/WX.h @@ -17,8 +17,14 @@ #ifndef _INTERFACEWX_H_ #define _INTERFACEWX_H_ +#ifdef HAVE_X11 && HAVE_X11 #include #include +#elif defined __APPLE__ +#include +#import +#endif + #if defined USE_WX && USE_WX #include "wx/wx.h" #include "wx/glcanvas.h" From 6099148541b1b8e6d238233c62a6bf530e1e5e74 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 17 Dec 2012 15:33:19 -0600 Subject: [PATCH 04/20] Blind coding fail --- Source/Core/DolphinWX/Src/VideoInterface/WX.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WX.h b/Source/Core/DolphinWX/Src/VideoInterface/WX.h index 6b2cf90692..d15044e503 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/WX.h +++ b/Source/Core/DolphinWX/Src/VideoInterface/WX.h @@ -17,7 +17,7 @@ #ifndef _INTERFACEWX_H_ #define _INTERFACEWX_H_ -#ifdef HAVE_X11 && HAVE_X11 +#if defined HAVE_X11 && HAVE_X11 #include #include #elif defined __APPLE__ From f2004b2474b007b693f3bb8a48437fb3876e69da Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 17 Dec 2012 16:19:55 -0600 Subject: [PATCH 05/20] Blindly add WGL.cpp file to the Windows project file. Just for Neo --- Source/Core/DolphinWX/Dolphin.vcxproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj index 72c40a3db4..d945e395f9 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ b/Source/Core/DolphinWX/Dolphin.vcxproj @@ -265,6 +265,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / + Create Create @@ -387,4 +388,4 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - \ No newline at end of file + From f6ef6fa0d949d911103566e1b49286849af8377c Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 17 Dec 2012 16:23:02 -0600 Subject: [PATCH 06/20] I had the wrong header for Windows in GLVideoInterface.h --- Source/Core/DolphinWX/Src/GLVideoInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Src/GLVideoInterface.h b/Source/Core/DolphinWX/Src/GLVideoInterface.h index 3469b1d3c1..d688335259 100644 --- a/Source/Core/DolphinWX/Src/GLVideoInterface.h +++ b/Source/Core/DolphinWX/Src/GLVideoInterface.h @@ -26,7 +26,7 @@ #elif defined(__APPLE__) #include "VideoInterface/AGL.h" #elif defined(_WIN32) -#include "VideoInterface/GLW.h" +#include "VideoInterface/WGL.h" #elif defined(HAVE_X11) && HAVE_X11 #include "VideoInterface/GLX.h" #endif From 296b9b1c16695d4c97e41a3992b3a95125ffd738 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 24 Dec 2012 09:37:12 -0600 Subject: [PATCH 07/20] Small bit of clean up in GLES-software. --- CMakeLists.txt | 3 +++ Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h | 13 ++++++++++++ .../Plugin_VideoSoftware/Src/HwRasterizer.cpp | 20 +++---------------- .../Plugin_VideoSoftware/Src/SWRenderer.cpp | 16 ++------------- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15cd489dd3..48788e835b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,11 +218,14 @@ if(FASTLOG) add_definitions(-DDEBUGFAST) endif() +# For now GLES and EGL are tied to each other. +# Enabling GLES also disables the OpenGL plugin. option(USE_GLES "Enables GLES, disables OGL" OFF) if(USE_GLES) message("GLES rendering enabled") add_definitions(-DUSE_GLES) add_definitions(-DUSE_EGL) + set(USE_EGL True) endif() add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h index ae83401f38..2c131fb937 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h @@ -29,6 +29,19 @@ #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 #endif +#ifdef USE_GLES +#define TEX2D GL_TEXTURE_2D +#define PREC "highp" +#define TEXTYPE "sampler2D" +#define TEXFUNC "texture2D" +#else +#define TEX2D GL_TEXTURE_RECTANGLE_ARB +#define PREC +#define TEXTYPE "sampler2DRect" +#define TEXFUNC "texture2DRect" +#endif + + #ifndef _WIN32 #include diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp index a31fdaedd8..83d9fa9b23 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp @@ -26,17 +26,6 @@ #include "DebugUtil.h" #define TEMP_SIZE (1024*1024*4) -#ifdef USE_GLES -#define PREC "highp" -#define TEX2D GL_TEXTURE_2D -#define TEXTYPE "sampler2D" -#define TEXFUNC "texture2D" -#else -#define PREC -#define TEX2D GL_TEXTURE_RECTANGLE_ARB -#define TEXTYPE "sampler2DRect" -#define TEXFUNC "texture2DRect" -#endif namespace HwRasterizer { @@ -176,7 +165,6 @@ namespace HwRasterizer #endif TexCacheEntry &cacheEntry = textures[imageAddr]; cacheEntry.Update(); - GL_REPORT_ERRORD(); glBindTexture(TEX2D, cacheEntry.texture); glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, texUnit.texMode0[0].mag_filter ? GL_LINEAR : GL_NEAREST); @@ -187,7 +175,6 @@ namespace HwRasterizer void BeginTriangles() { // disabling depth test sometimes allows more things to be visible - GL_REPORT_ERRORD(); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); @@ -195,7 +182,6 @@ namespace HwRasterizer if (hasTexture) LoadTexture(); - GL_REPORT_ERRORD(); } void EndTriangles() @@ -237,9 +223,9 @@ namespace HwRasterizer { x2, y2, z2 } }; static const GLfloat col[3][4] = { - { r0, g0, b0, 0.1f }, - { r1, g1, b1, 0.1f }, - { r2, g2, b2, 0.1f } + { r0, g0, b0, 1.0f }, + { r1, g1, b1, 1.0f }, + { r2, g2, b2, 1.0f } }; { glUseProgram(colProg); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp index 982a8f11da..c85a1029c9 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp @@ -29,19 +29,7 @@ static GLint attr_pos = -1, attr_tex = -1; static GLint uni_tex = -1; static GLuint program; -#ifdef USE_GLES -#define PREC "highp" -#define TEX2D GL_TEXTURE_2D -#define TEXTYPE "sampler2D" -#define TEXFUNC "texture2D" -#else -#define PREC -#define TEX2D GL_TEXTURE_RECTANGLE_ARB -#define TEXTYPE "sampler2DRect" -#define TEXFUNC "texture2DRect" -#endif - - +// Rasterfont isn't compatible with GLES #ifndef USE_GLES RasterFont* s_pfont = NULL; #endif @@ -104,9 +92,9 @@ void SWRenderer::Prepare() void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color) { +#ifndef USE_GLES int nBackbufferWidth = (int)GLInterface->GetBackBufferWidth(); int nBackbufferHeight = (int)GLInterface->GetBackBufferHeight(); -#ifndef USE_GLES glColor4f(((color>>16) & 0xff)/255.0f, ((color>> 8) & 0xff)/255.0f, ((color>> 0) & 0xff)/255.0f, ((color>>24) & 0xFF)/255.0f); s_pfont->printMultilineText(pstr, From 09b05c0f6c0f29c69e211085542f762731f9a231 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 24 Dec 2012 09:46:37 -0600 Subject: [PATCH 08/20] Add header guards to InterfaceBase.h --- Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h index 8fa4cc1b12..0c1c438cd0 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h @@ -14,7 +14,8 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ - +#ifndef _GLINTERFACEBASE_H_ +#define _GLINTERFACEBASE_H_ class cInterfaceBase { protected: @@ -33,4 +34,4 @@ public: virtual void Update() { } virtual bool PeekMessages() { return false; } }; - +#endif From 01953ff64a1f6b8d4a6236d45400f5b208c4b079 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 25 Dec 2012 19:08:24 -0600 Subject: [PATCH 09/20] Rename the interface files and hopefully fix OSX building. --- CMakeLists.txt | 4 ++++ Source/Core/Common/Src/Common.h | 5 ----- Source/Core/DolphinWX/CMakeLists.txt | 18 ++++++++++++------ .../Src/{GLVideoInterface.h => GLInterface.h} | 14 +++++++------- .../{VideoInterface => GLInterface}/AGL.cpp | 2 +- .../Src/{VideoInterface => GLInterface}/AGL.h | 0 .../{VideoInterface => GLInterface}/EGL.cpp | 3 +-- .../Src/{VideoInterface => GLInterface}/EGL.h | 0 .../{VideoInterface => GLInterface}/GLX.cpp | 2 +- .../Src/{VideoInterface => GLInterface}/GLX.h | 0 .../InterfaceBase.h | 0 .../{VideoInterface => GLInterface}/WGL.cpp | 2 +- .../Src/{VideoInterface => GLInterface}/WGL.h | 0 .../Src/{VideoInterface => GLInterface}/WX.cpp | 2 +- .../Src/{VideoInterface => GLInterface}/WX.h | 0 Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h | 2 +- 16 files changed, 29 insertions(+), 25 deletions(-) rename Source/Core/DolphinWX/Src/{GLVideoInterface.h => GLInterface.h} (89%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/AGL.cpp (99%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/AGL.h (100%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/EGL.cpp (99%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/EGL.h (100%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/GLX.cpp (99%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/GLX.h (100%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/InterfaceBase.h (100%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/WGL.cpp (99%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/WGL.h (100%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/WX.cpp (98%) rename Source/Core/DolphinWX/Src/{VideoInterface => GLInterface}/WX.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48788e835b..82f2b55d87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -178,6 +178,10 @@ if(APPLE) # page on x86_64 is 4GB in size. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-pagezero_size,0x1000") + if(NOT DISABLE_WX) + add_definitions(-DUSE_WX -DHAVE_WX) + set(USE_WX TRUE) + endif() find_library(APPKIT_LIBRARY AppKit) find_library(APPSERV_LIBRARY ApplicationServices) find_library(ATB_LIBRARY AudioToolbox) diff --git a/Source/Core/Common/Src/Common.h b/Source/Core/Common/Src/Common.h index 960bf75559..884a1e6c16 100644 --- a/Source/Core/Common/Src/Common.h +++ b/Source/Core/Common/Src/Common.h @@ -60,11 +60,6 @@ private: #undef STACKALIGN #define STACKALIGN __attribute__((__force_align_arg_pointer__)) #endif -// We use wxWidgets on OS X only if it is version 2.9+ with Cocoa support. -#ifdef __WXOSX_COCOA__ -#define HAVE_WX 1 -#define USE_WX 1 // Use wxGLCanvas -#endif #elif defined _WIN32 diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index fcc531029c..f54ff9f4e3 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -85,20 +85,26 @@ endif() if(USE_EGL) set(SRCS ${SRCS} - Src/VideoInterface/EGL.cpp + Src/GLInterface/EGL.cpp ) else() if(WIN32) set(SRCS ${SRCS} - Src/VideoInterface/GLW.cpp + Src/GLInterface/GLW.cpp ) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(SRCS ${SRCS} - Src/VideoInterface/AGL.cpp - ) + if(USE_WX) + set(SRCS ${SRCS} + Src/GLInterface/WX.cpp + ) + else() + set(SRCS ${SRCS} + Src/GLInterface/AGL.cpp + ) + endif() else() set(SRCS ${SRCS} - Src/VideoInterface/GLX.cpp + Src/GLInterface/GLX.cpp ) endif() endif() diff --git a/Source/Core/DolphinWX/Src/GLVideoInterface.h b/Source/Core/DolphinWX/Src/GLInterface.h similarity index 89% rename from Source/Core/DolphinWX/Src/GLVideoInterface.h rename to Source/Core/DolphinWX/Src/GLInterface.h index d688335259..a7c069df4e 100644 --- a/Source/Core/DolphinWX/Src/GLVideoInterface.h +++ b/Source/Core/DolphinWX/Src/GLInterface.h @@ -14,21 +14,21 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#ifndef _VIDEOINTERFACE_H_ -#define _VIDEOINTERFACE_H_ +#ifndef _GLINTERFACE_H_ +#define _GLINTERFACE_H_ #include "Thread.h" #if defined(USE_EGL) && USE_EGL -#include "VideoInterface/EGL.h" +#include "GLInterface/EGL.h" #elif defined(USE_WX) && USE_WX -#include "VideoInterface/WX.h" +#include "GLInterface/WX.h" #elif defined(__APPLE__) -#include "VideoInterface/AGL.h" +#include "GLInterface/AGL.h" #elif defined(_WIN32) -#include "VideoInterface/WGL.h" +#include "GLInterface/WGL.h" #elif defined(HAVE_X11) && HAVE_X11 -#include "VideoInterface/GLX.h" +#include "GLInterface/GLX.h" #endif typedef struct { diff --git a/Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp similarity index 99% rename from Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp rename to Source/Core/DolphinWX/Src/GLInterface/AGL.cpp index 465f77c972..65b4b269d6 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/AGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp @@ -20,7 +20,7 @@ #include "RenderBase.h" #include "VertexShaderManager.h" -#include "../GLVideoInterface.h" +#include "../GLInterface.h" #include "AGL.h" void cInterfaceAGL::SwapBuffers() diff --git a/Source/Core/DolphinWX/Src/VideoInterface/AGL.h b/Source/Core/DolphinWX/Src/GLInterface/AGL.h similarity index 100% rename from Source/Core/DolphinWX/Src/VideoInterface/AGL.h rename to Source/Core/DolphinWX/Src/GLInterface/AGL.h diff --git a/Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp similarity index 99% rename from Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp rename to Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index bcf7acaff5..00d16ba504 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -20,7 +20,7 @@ #include "RenderBase.h" #include "VertexShaderManager.h" -#include "../GLVideoInterface.h" +#include "../GLInterface.h" #include "EGL.h" void cInterfaceEGL::CreateXWindow(void) @@ -294,7 +294,6 @@ bool cInterfaceEGL::CreateWindow(void *&window_handle) if (GLWin.parent == 0) GLWin.parent = RootWindow(GLWin.x_dpy, GLWin.screen); - unsigned long mask; XVisualInfo visTemplate; int num_visuals; EGLConfig config; diff --git a/Source/Core/DolphinWX/Src/VideoInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h similarity index 100% rename from Source/Core/DolphinWX/Src/VideoInterface/EGL.h rename to Source/Core/DolphinWX/Src/GLInterface/EGL.h diff --git a/Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp similarity index 99% rename from Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp rename to Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index 63458f7a4d..cbe749845e 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -20,7 +20,7 @@ #include "RenderBase.h" #include "VertexShaderManager.h" -#include "../GLVideoInterface.h" +#include "../GLInterface.h" #include "GLX.h" void cInterfaceGLX::CreateXWindow(void) diff --git a/Source/Core/DolphinWX/Src/VideoInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h similarity index 100% rename from Source/Core/DolphinWX/Src/VideoInterface/GLX.h rename to Source/Core/DolphinWX/Src/GLInterface/GLX.h diff --git a/Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h similarity index 100% rename from Source/Core/DolphinWX/Src/VideoInterface/InterfaceBase.h rename to Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp similarity index 99% rename from Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp rename to Source/Core/DolphinWX/Src/GLInterface/WGL.cpp index 9abcd52fc6..99f861e019 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/WGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp @@ -20,7 +20,7 @@ #include "RenderBase.h" #include "VertexShaderManager.h" -#include "../GLVideoInterface.h" +#include "../GLInterface.h" #include "WGL.h" #include "EmuWindow.h" diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WGL.h b/Source/Core/DolphinWX/Src/GLInterface/WGL.h similarity index 100% rename from Source/Core/DolphinWX/Src/VideoInterface/WGL.h rename to Source/Core/DolphinWX/Src/GLInterface/WGL.h diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WX.cpp b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp similarity index 98% rename from Source/Core/DolphinWX/Src/VideoInterface/WX.cpp rename to Source/Core/DolphinWX/Src/GLInterface/WX.cpp index 7126ccb8ba..bf6b2abf33 100644 --- a/Source/Core/DolphinWX/Src/VideoInterface/WX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp @@ -20,7 +20,7 @@ #include "RenderBase.h" #include "VertexShaderManager.h" -#include "../GLVideoInterface.h" +#include "../GLInterface.h" #include "WX.h" void cInterfaceWX::SwapBuffers() diff --git a/Source/Core/DolphinWX/Src/VideoInterface/WX.h b/Source/Core/DolphinWX/Src/GLInterface/WX.h similarity index 100% rename from Source/Core/DolphinWX/Src/VideoInterface/WX.h rename to Source/Core/DolphinWX/Src/GLInterface/WX.h diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h index 2c131fb937..09d38bb731 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.h @@ -20,7 +20,7 @@ #include "VideoConfig.h" #include "MathUtil.h" -#include "GLVideoInterface.h" +#include "GLInterface.h" #ifndef GL_DEPTH24_STENCIL8_EXT // allows FBOs to support stencils #define GL_DEPTH_STENCIL_EXT 0x84F9 From c884dbf65457c665229e84adebf223b34aeee3c2 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 25 Dec 2012 19:18:03 -0600 Subject: [PATCH 10/20] Mistype in WX.cpp --- Source/Core/DolphinWX/Src/GLInterface/WX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp index bf6b2abf33..460d9357cb 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp @@ -35,7 +35,7 @@ void cInterfaceWX::UpdateFPSDisplay(const char *text) // Create rendering window. // Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool cInterfaceWX::CreateCreate(void *&window_handle) +bool cInterfaceWX::CreateWindow(void *&window_handle) { int _tx, _ty, _twidth, _theight; Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); From e9099459bb6d2e66eefb6686c2fee2a03bf19fd5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 25 Dec 2012 22:52:30 -0600 Subject: [PATCH 11/20] Maybe fix Windows compiling. --- Source/Core/DolphinWX/Dolphin.vcxproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj index d945e395f9..2c64ca4ee2 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ b/Source/Core/DolphinWX/Dolphin.vcxproj @@ -265,7 +265,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - + Create Create @@ -327,6 +327,9 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / + + + From f4e7a280a9cc968f9a20ef2f027ed3b3753d6940 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 00:07:43 -0600 Subject: [PATCH 12/20] Remove cg.lib from some files for Windows and renaming a function. --- Source/Core/DolphinWX/Src/GLInterface/AGL.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/EGL.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/EGL.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/GLX.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/GLX.h | 2 +- .../Core/DolphinWX/Src/GLInterface/InterfaceBase.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/WGL.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/WGL.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/WX.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/WX.h | 2 +- .../Plugin_VideoOGL/Plugin_VideoOGL.vcxproj | 14 +++++++------- Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 2 +- Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp | 2 +- Source/VSProps/Dolphin.Win32.props | 4 ++-- Source/VSProps/Dolphin.x64.props | 4 ++-- 15 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Source/Core/DolphinWX/Src/GLInterface/AGL.h b/Source/Core/DolphinWX/Src/GLInterface/AGL.h index 1e73f3c6b8..e6e4f9be27 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/AGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/AGL.h @@ -29,7 +29,7 @@ class cInterfaceAGL : public cInterfaceBase public: void SwapBuffers(); void UpdateFPSDisplay(const char *Text); - bool CreateWindow(void *&window_handle); + bool Create(void *&window_handle); bool MakeCurrent(); void Shutdown(); }; diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index 00d16ba504..155f59b093 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -225,7 +225,7 @@ void cInterfaceEGL::SwapBuffers() // Create rendering window. // Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool cInterfaceEGL::CreateWindow(void *&window_handle) +bool cInterfaceEGL::Create(void *&window_handle) { int _tx, _ty, _twidth, _theight; Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h index afb57b2ac2..e3b4ec40e8 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.h @@ -35,7 +35,7 @@ private: public: void SwapBuffers(); void UpdateFPSDisplay(const char *Text); - bool CreateWindow(void *&window_handle); + bool Create(void *&window_handle); bool MakeCurrent(); void Shutdown(); }; diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index cbe749845e..235e393040 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -225,7 +225,7 @@ void cInterfaceGLX::SwapBuffers() // Create rendering window. // Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool cInterfaceGLX::CreateWindow(void *&window_handle) +bool cInterfaceGLX::Create(void *&window_handle) { int _tx, _ty, _twidth, _theight; Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h index bea58cb862..9b6a3cb87d 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.h @@ -33,7 +33,7 @@ private: public: void SwapBuffers(); void UpdateFPSDisplay(const char *Text); - bool CreateWindow(void *&window_handle); + bool Create(void *&window_handle); bool MakeCurrent(); void Shutdown(); }; diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index 0c1c438cd0..dfe534c41a 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -25,7 +25,7 @@ protected: public: virtual void SwapBuffers() = 0; virtual void UpdateFPSDisplay(const char *Text) = 0; - virtual bool CreateWindow(void *&window_handle) = 0; + virtual bool Create(void *&window_handle) = 0; virtual bool MakeCurrent() = 0; virtual void Shutdown() = 0; diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp index 99f861e019..70f86a3ddf 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp @@ -57,7 +57,7 @@ void cInterfaceWGL::UpdateFPSDisplay(const char *text) // Create rendering window. // Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool cInterfaceWGL::CreateWindow(void *&window_handle) +bool cInterfaceWGL::Create(void *&window_handle) { int _tx, _ty, _twidth, _theight; Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.h b/Source/Core/DolphinWX/Src/GLInterface/WGL.h index 4ef6943623..e45d538a78 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.h @@ -30,7 +30,7 @@ class cInterfaceWGL : public cInterfaceBase public: void SwapBuffers(); void UpdateFPSDisplay(const char *Text); - bool CreateWindow(void *&window_handle); + bool Create(void *&window_handle); bool MakeCurrent(); void Shutdown(); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp index 460d9357cb..36e3e60fa5 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp @@ -35,7 +35,7 @@ void cInterfaceWX::UpdateFPSDisplay(const char *text) // Create rendering window. // Call browser: Core.cpp:EmuThread() > main.cpp:Video_Initialize() -bool cInterfaceWX::CreateWindow(void *&window_handle) +bool cInterfaceWX::Create(void *&window_handle) { int _tx, _ty, _twidth, _theight; Host_GetRenderWindowSize(_tx, _ty, _twidth, _theight); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.h b/Source/Core/DolphinWX/Src/GLInterface/WX.h index d15044e503..8f4af1c8d6 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.h @@ -37,7 +37,7 @@ class cInterfaceWX : public cInterfaceBase public: void SwapBuffers(); void UpdateFPSDisplay(const char *Text); - bool CreateWindow(void *&window_handle); + bool Create(void *&window_handle); bool MakeCurrent(); void Shutdown(); diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj index 18b8ac4d84..aa7f697772 100644 --- a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj +++ b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj @@ -121,7 +121,7 @@ true - opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -133,7 +133,7 @@ true - opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg64;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -147,7 +147,7 @@ true true true - opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -161,7 +161,7 @@ true true true - opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -175,7 +175,7 @@ true true true - opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg64;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -189,7 +189,7 @@ true true true - opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) + opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg64;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -247,4 +247,4 @@ - \ No newline at end of file + diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index f52ec917e2..e57e3e210a 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -166,7 +166,7 @@ bool VideoBackend::Initialize(void *&window_handle) UpdateActiveConfig(); InitInterface(); - if (!GLInterface->CreateWindow(window_handle)) + if (!GLInterface->Create(window_handle)) return false; s_BackendInitialized = true; diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp index 1c18b1c165..11f7f39b5c 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWmain.cpp @@ -73,7 +73,7 @@ bool VideoSoftware::Initialize(void *&window_handle) g_SWVideoConfig.Load((File::GetUserPath(D_CONFIG_IDX) + "gfx_software.ini").c_str()); InitInterface(); - if (!GLInterface->CreateWindow(window_handle)) + if (!GLInterface->Create(window_handle)) { INFO_LOG(VIDEO, "%s", "SWRenderer::Create failed\n"); return false; diff --git a/Source/VSProps/Dolphin.Win32.props b/Source/VSProps/Dolphin.Win32.props index 5adc4159e0..1cddeea4e5 100644 --- a/Source/VSProps/Dolphin.Win32.props +++ b/Source/VSProps/Dolphin.Win32.props @@ -8,8 +8,8 @@ ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) + portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) - \ No newline at end of file + diff --git a/Source/VSProps/Dolphin.x64.props b/Source/VSProps/Dolphin.x64.props index 557e6350e7..c6f3410026 100644 --- a/Source/VSProps/Dolphin.x64.props +++ b/Source/VSProps/Dolphin.x64.props @@ -9,8 +9,8 @@ ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg64;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) + portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) - \ No newline at end of file + From a35c5a7f226be9dcc992beab914618d529b55232 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 00:20:09 -0600 Subject: [PATCH 13/20] Add a include directory --- Source/Core/DolphinWX/Dolphin.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj index 2c64ca4ee2..c375208256 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ b/Source/Core/DolphinWX/Dolphin.vcxproj @@ -130,7 +130,7 @@ - ..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) From fa9abfdc4208d36f34392aa4385aacf9d6c483bb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 00:22:17 -0600 Subject: [PATCH 14/20] Add a include directory --- Source/Core/DolphinWX/Dolphin.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj index c375208256..08d6dff3e2 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ b/Source/Core/DolphinWX/Dolphin.vcxproj @@ -130,7 +130,7 @@ - ..\..\..\Externals\GLew;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) From c43a0dac2ea570aa7bc6628493767ffb6cb63e06 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 00:25:49 -0600 Subject: [PATCH 15/20] Add to more than 32bit debug --- Source/Core/DolphinWX/Dolphin.vcxproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Core/DolphinWX/Dolphin.vcxproj b/Source/Core/DolphinWX/Dolphin.vcxproj index 08d6dff3e2..789e6c21fe 100644 --- a/Source/Core/DolphinWX/Dolphin.vcxproj +++ b/Source/Core/DolphinWX/Dolphin.vcxproj @@ -144,7 +144,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - ..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) @@ -158,7 +158,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - ..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) @@ -174,7 +174,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - ..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) @@ -188,7 +188,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - ..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) @@ -204,7 +204,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e / - ..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) + ..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) From 9a58f9a3bb5f7111277832fa2d951559a1c6a9c6 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 00:34:09 -0600 Subject: [PATCH 16/20] Rename another function... --- Source/Core/DolphinWX/Src/GLInterface/AGL.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/AGL.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/EGL.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/EGL.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/GLX.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/GLX.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/WGL.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/WGL.h | 2 +- Source/Core/DolphinWX/Src/GLInterface/WX.cpp | 2 +- Source/Core/DolphinWX/Src/GLInterface/WX.h | 2 +- Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 2 +- Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp index 65b4b269d6..30ff4a31cf 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/AGL.cpp @@ -23,7 +23,7 @@ #include "../GLInterface.h" #include "AGL.h" -void cInterfaceAGL::SwapBuffers() +void cInterfaceAGL::Swap() { [GLWin.cocoaCtx flushBuffer]; } diff --git a/Source/Core/DolphinWX/Src/GLInterface/AGL.h b/Source/Core/DolphinWX/Src/GLInterface/AGL.h index e6e4f9be27..e03256ab4e 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/AGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/AGL.h @@ -27,7 +27,7 @@ class cInterfaceAGL : public cInterfaceBase { public: - void SwapBuffers(); + void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); bool MakeCurrent(); diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index 155f59b093..49a77636f8 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -218,7 +218,7 @@ void cInterfaceEGL::UpdateFPSDisplay(const char *text) { XStoreName(GLWin.x_dpy, GLWin.win, text); } -void cInterfaceEGL::SwapBuffers() +void cInterfaceEGL::Swap() { eglSwapBuffers(GLWin.egl_dpy, GLWin.egl_surf); } diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h index e3b4ec40e8..0e0adcd6d7 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.h @@ -33,7 +33,7 @@ private: void DestroyXWindow(); void XEventThread(); public: - void SwapBuffers(); + void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); bool MakeCurrent(); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index 235e393040..cb6d814db3 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -218,7 +218,7 @@ void cInterfaceGLX::UpdateFPSDisplay(const char *text) { XStoreName(GLWin.dpy, GLWin.win, text); } -void cInterfaceGLX::SwapBuffers() +void cInterfaceGLX::Swap() { glXSwapBuffers(GLWin.dpy, GLWin.win); } diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h index 9b6a3cb87d..5a37695f4e 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.h @@ -31,7 +31,7 @@ private: void DestroyXWindow(); void XEventThread(); public: - void SwapBuffers(); + void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); bool MakeCurrent(); diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index dfe534c41a..40b17e8083 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -23,7 +23,7 @@ protected: u32 s_backbuffer_width; u32 s_backbuffer_height; public: - virtual void SwapBuffers() = 0; + virtual void Swap() = 0; virtual void UpdateFPSDisplay(const char *Text) = 0; virtual bool Create(void *&window_handle) = 0; virtual bool MakeCurrent() = 0; diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp index 70f86a3ddf..c97cb48bdf 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.cpp @@ -27,7 +27,7 @@ static HDC hDC = NULL; // Private GDI Device Context static HGLRC hRC = NULL; // Permanent Rendering Context -void cInterfaceWGL::SwapBuffers() +void cInterfaceWGL::Swap() { SwapBuffers(hDC); } diff --git a/Source/Core/DolphinWX/Src/GLInterface/WGL.h b/Source/Core/DolphinWX/Src/GLInterface/WGL.h index e45d538a78..184ddd475f 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WGL.h @@ -28,7 +28,7 @@ class cInterfaceWGL : public cInterfaceBase { public: - void SwapBuffers(); + void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); bool MakeCurrent(); diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp index 36e3e60fa5..0db1f8d632 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.cpp @@ -23,7 +23,7 @@ #include "../GLInterface.h" #include "WX.h" -void cInterfaceWX::SwapBuffers() +void cInterfaceWX::Swap() { GLWin.glCanvas->SwapBuffers(); } diff --git a/Source/Core/DolphinWX/Src/GLInterface/WX.h b/Source/Core/DolphinWX/Src/GLInterface/WX.h index 8f4af1c8d6..7772f864e5 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/WX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/WX.h @@ -35,7 +35,7 @@ class cInterfaceWX : public cInterfaceBase { public: - void SwapBuffers(); + void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); bool MakeCurrent(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 2c43100b4c..57347ad4ec 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -1354,7 +1354,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons GL_REPORT_ERRORD(); // Copy the rendered frame to the real window - GLInterface->SwapBuffers(); + GLInterface->Swap(); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp index c85a1029c9..fceb19e0a9 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp @@ -192,7 +192,7 @@ void SWRenderer::SwapBuffer() glFlush(); - GLInterface->SwapBuffers(); + GLInterface->Swap(); swstats.ResetFrame(); From e2489196e4e93eacbe17af3c1d6eb53d9aabee59 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 00:41:25 -0600 Subject: [PATCH 17/20] Got overzealous. We aren't removing CG quite yet with this branch. --- .../Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj | 12 ++++++------ Source/VSProps/Dolphin.Win32.props | 2 +- Source/VSProps/Dolphin.x64.props | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj index aa7f697772..d74bc2edb5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj +++ b/Source/Plugins/Plugin_VideoOGL/Plugin_VideoOGL.vcxproj @@ -121,7 +121,7 @@ true - opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) + opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -133,7 +133,7 @@ true - opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) + opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg64;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -147,7 +147,7 @@ true true true - opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) + opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -161,7 +161,7 @@ true true true - opengl32.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) + opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew32s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -175,7 +175,7 @@ true true true - opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) + opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg64;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) @@ -189,7 +189,7 @@ true true true - opengl32.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) + opengl32.lib;cg.lib;cgGL.lib;glu32.lib;glew64s.lib;%(AdditionalDependencies) ..\..\..\Externals\GLew;..\..\..\Externals\Cg64;%(AdditionalLibraryDirectories) ..\..\..\Binary\$(PlatformName)\Plugins\$(TargetName)$(TargetExt) diff --git a/Source/VSProps/Dolphin.Win32.props b/Source/VSProps/Dolphin.Win32.props index 1cddeea4e5..5850450a5a 100644 --- a/Source/VSProps/Dolphin.Win32.props +++ b/Source/VSProps/Dolphin.Win32.props @@ -8,7 +8,7 @@ ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) + portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) diff --git a/Source/VSProps/Dolphin.x64.props b/Source/VSProps/Dolphin.x64.props index c6f3410026..754b4af53e 100644 --- a/Source/VSProps/Dolphin.x64.props +++ b/Source/VSProps/Dolphin.x64.props @@ -9,7 +9,7 @@ ..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg64;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName) - portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) + portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;%(AdditionalDependencies) From 2d4c3c7c918877c844babaa5ac4c23f8a441fb64 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 10:33:45 -0600 Subject: [PATCH 18/20] Beautify some tabs. --- .../Plugin_VideoSoftware/Src/HwRasterizer.cpp | 205 +++++++++--------- .../Plugin_VideoSoftware/Src/SWRenderer.cpp | 38 ++-- 2 files changed, 120 insertions(+), 123 deletions(-) diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp index 83d9fa9b23..dba6f7f12c 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/HwRasterizer.cpp @@ -29,15 +29,15 @@ namespace HwRasterizer { - float efbHalfWidth; - float efbHalfHeight; - bool hasTexture; + float efbHalfWidth; + float efbHalfHeight; + bool hasTexture; - u8 *temp; + u8 *temp; // Programs static GLuint colProg, texProg, clearProg; - + // Color static GLint col_apos = -1, col_atex = -1; // Tex @@ -58,9 +58,7 @@ namespace HwRasterizer "varying " PREC " vec4 TexCoordOut;\n" "uniform " TEXTYPE " Texture;\n" "void main() {\n" - " " PREC " vec4 tmpcolor;\n" - " tmpcolor = " TEXFUNC "(Texture, TexCoordOut.xy);\n" - " gl_FragColor = tmpcolor;\n" + " gl_FragColor = " TEXFUNC "(Texture, TexCoordOut.xy);\n" "}\n"; // Clear shader static const char *fragclearText = @@ -74,7 +72,7 @@ namespace HwRasterizer "attribute vec4 TexCoordIn;\n " "varying vec4 TexCoordOut;\n " "void main() {\n" - " gl_Position = pos;\n" + " gl_Position = pos;\n" " TexCoordOut = TexCoordIn;\n" "}\n"; static const char *vertclearText = @@ -104,13 +102,13 @@ namespace HwRasterizer clear_ucol = glGetUniformLocation(clearProg, "Color"); } - void Init() - { - efbHalfWidth = EFB_WIDTH / 2.0f; - efbHalfHeight = 480 / 2.0f; + void Init() + { + efbHalfWidth = EFB_WIDTH / 2.0f; + efbHalfHeight = 480 / 2.0f; - temp = (u8*)AllocateMemoryPages(TEMP_SIZE); - } + temp = (u8*)AllocateMemoryPages(TEMP_SIZE); + } void Shutdown() { glDeleteProgram(colProg); @@ -150,10 +148,10 @@ namespace HwRasterizer GL_REPORT_ERRORD(); } static float width, height; - void LoadTexture() - { - FourTexUnits &texUnit = bpmem.tex[0]; - u32 imageAddr = texUnit.texImage3[0].image_base; + void LoadTexture() + { + FourTexUnits &texUnit = bpmem.tex[0]; + u32 imageAddr = texUnit.texImage3[0].image_base; // Texture Rectangle uses pixel coordinates // While GLES uses texture coordinates #ifdef USE_GLES @@ -163,36 +161,36 @@ namespace HwRasterizer width = 1; height = 1; #endif - TexCacheEntry &cacheEntry = textures[imageAddr]; - cacheEntry.Update(); + TexCacheEntry &cacheEntry = textures[imageAddr]; + cacheEntry.Update(); glBindTexture(TEX2D, cacheEntry.texture); glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, texUnit.texMode0[0].mag_filter ? GL_LINEAR : GL_NEAREST); glTexParameteri(TEX2D, GL_TEXTURE_MIN_FILTER, (texUnit.texMode0[0].min_filter >= 4) ? GL_LINEAR : GL_NEAREST); GL_REPORT_ERRORD(); - } + } - void BeginTriangles() - { - // disabling depth test sometimes allows more things to be visible - glEnable(GL_DEPTH_TEST); - glEnable(GL_BLEND); + void BeginTriangles() + { + // disabling depth test sometimes allows more things to be visible + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); - hasTexture = bpmem.tevorders[0].enable0; + hasTexture = bpmem.tevorders[0].enable0; - if (hasTexture) - LoadTexture(); - } + if (hasTexture) + LoadTexture(); + } - void EndTriangles() - { - glBindTexture(TEX2D, 0); - glDisable(GL_DEPTH_TEST); - glDisable(GL_BLEND); - } + void EndTriangles() + { + glBindTexture(TEX2D, 0); + glDisable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + } - void DrawColorVertex(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) - { + void DrawColorVertex(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) + { float x0 = (v0->screenPosition.x / efbHalfWidth) - 1.0f; float y0 = 1.0f - (v0->screenPosition.y / efbHalfHeight); float z0 = v0->screenPosition.z / (float)0x00ffffff; @@ -200,11 +198,11 @@ namespace HwRasterizer float x1 = (v1->screenPosition.x / efbHalfWidth) - 1.0f; float y1 = 1.0f - (v1->screenPosition.y / efbHalfHeight); float z1 = v1->screenPosition.z / (float)0x00ffffff; - + float x2 = (v2->screenPosition.x / efbHalfWidth) - 1.0f; float y2 = 1.0f - (v2->screenPosition.y / efbHalfHeight); float z2 = v2->screenPosition.z / (float)0x00ffffff; - + float r0 = v0->color[0][OutputVertexData::RED_C] / 255.0f; float g0 = v0->color[0][OutputVertexData::GRN_C] / 255.0f; float b0 = v0->color[0][OutputVertexData::BLU_C] / 255.0f; @@ -223,9 +221,9 @@ namespace HwRasterizer { x2, y2, z2 } }; static const GLfloat col[3][4] = { - { r0, g0, b0, 1.0f }, - { r1, g1, b1, 1.0f }, - { r2, g2, b2, 1.0f } + { r0, g0, b0, 1.0f }, + { r1, g1, b1, 1.0f }, + { r2, g2, b2, 1.0f } }; { glUseProgram(colProg); @@ -239,10 +237,10 @@ namespace HwRasterizer glDisableVertexAttribArray(col_apos); } GL_REPORT_ERRORD(); - } + } - void DrawTextureVertex(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) - { + void DrawTextureVertex(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) + { float x0 = (v0->screenPosition.x / efbHalfWidth) - 1.0f; float y0 = 1.0f - (v0->screenPosition.y / efbHalfHeight); float z0 = v0->screenPosition.z; @@ -250,7 +248,7 @@ namespace HwRasterizer float x1 = (v1->screenPosition.x / efbHalfWidth) - 1.0f; float y1 = 1.0f - (v1->screenPosition.y / efbHalfHeight); float z1 = v1->screenPosition.z; - + float x2 = (v2->screenPosition.x / efbHalfWidth) - 1.0f; float y2 = 1.0f - (v2->screenPosition.y / efbHalfHeight); float z2 = v2->screenPosition.z; @@ -262,7 +260,7 @@ namespace HwRasterizer float t1 = v1->texCoords[0].y / height; float s2 = v2->texCoords[0].x / width; - float t2 = v2->texCoords[0].y / width; + float t2 = v2->texCoords[0].y / height; static const GLfloat verts[3][3] = { { x0, y0, z0 }, @@ -287,28 +285,28 @@ namespace HwRasterizer glDisableVertexAttribArray(tex_apos); } GL_REPORT_ERRORD(); - } + } - void DrawTriangleFrontFace(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) - { + void DrawTriangleFrontFace(OutputVertexData *v0, OutputVertexData *v1, OutputVertexData *v2) + { if (hasTexture) DrawTextureVertex(v0, v1, v2); else DrawColorVertex(v0, v1, v2); } - void Clear() - { - u8 r = (bpmem.clearcolorAR & 0x00ff); - u8 g = (bpmem.clearcolorGB & 0xff00) >> 8; - u8 b = (bpmem.clearcolorGB & 0x00ff); - u8 a = (bpmem.clearcolorAR & 0xff00) >> 8; + void Clear() + { + u8 r = (bpmem.clearcolorAR & 0x00ff); + u8 g = (bpmem.clearcolorGB & 0xff00) >> 8; + u8 b = (bpmem.clearcolorGB & 0x00ff); + u8 a = (bpmem.clearcolorAR & 0xff00) >> 8; - GLfloat left = (GLfloat)bpmem.copyTexSrcXY.x / efbHalfWidth - 1.0f; - GLfloat top = 1.0f - (GLfloat)bpmem.copyTexSrcXY.y / efbHalfHeight; - GLfloat right = (GLfloat)(left + bpmem.copyTexSrcWH.x + 1) / efbHalfWidth - 1.0f; - GLfloat bottom = 1.0f - (GLfloat)(top + bpmem.copyTexSrcWH.y + 1) / efbHalfHeight; - GLfloat depth = (GLfloat)bpmem.clearZValue / (GLfloat)0x00ffffff; + GLfloat left = (GLfloat)bpmem.copyTexSrcXY.x / efbHalfWidth - 1.0f; + GLfloat top = 1.0f - (GLfloat)bpmem.copyTexSrcXY.y / efbHalfHeight; + GLfloat right = (GLfloat)(left + bpmem.copyTexSrcWH.x + 1) / efbHalfWidth - 1.0f; + GLfloat bottom = 1.0f - (GLfloat)(top + bpmem.copyTexSrcWH.y + 1) / efbHalfHeight; + GLfloat depth = (GLfloat)bpmem.clearZValue / (GLfloat)0x00ffffff; static const GLfloat verts[4][3] = { { left, top, depth }, { right, top, depth }, @@ -324,62 +322,61 @@ namespace HwRasterizer glDisableVertexAttribArray(col_apos); } GL_REPORT_ERRORD(); - } + } - TexCacheEntry::TexCacheEntry() - { - Create(); - } + TexCacheEntry::TexCacheEntry() + { + Create(); + } - void TexCacheEntry::Create() - { - FourTexUnits &texUnit = bpmem.tex[0]; + void TexCacheEntry::Create() + { + FourTexUnits &texUnit = bpmem.tex[0]; - texImage0.hex = texUnit.texImage0[0].hex; - texImage1.hex = texUnit.texImage1[0].hex; - texImage2.hex = texUnit.texImage2[0].hex; - texImage3.hex = texUnit.texImage3[0].hex; - texTlut.hex = texUnit.texTlut[0].hex; + texImage0.hex = texUnit.texImage0[0].hex; + texImage1.hex = texUnit.texImage1[0].hex; + texImage2.hex = texUnit.texImage2[0].hex; + texImage3.hex = texUnit.texImage3[0].hex; + texTlut.hex = texUnit.texTlut[0].hex; - int width = texImage0.width; - int height = texImage0.height; + int width = texImage0.width; + int height = texImage0.height; - DebugUtil::GetTextureBGRA(temp, 0, 0, width, height); + DebugUtil::GetTextureBGRA(temp, 0, 0, width, height); - glGenTextures(1, (GLuint *)&texture); + glGenTextures(1, (GLuint *)&texture); glBindTexture(TEX2D, texture); #ifdef USE_GLES - glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp); + glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp); #else - glTexImage2D(TEX2D, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_BGRA, GL_UNSIGNED_BYTE, temp); + glTexImage2D(TEX2D, 0, GL_RGBA8, (GLsizei)width, (GLsizei)height, 0, GL_BGRA, GL_UNSIGNED_BYTE, temp); #endif GL_REPORT_ERRORD(); } - void TexCacheEntry::Destroy() - { - if (texture == 0) - return; + void TexCacheEntry::Destroy() + { + if (texture == 0) + return; - glDeleteTextures(1, &texture); - texture = 0; - } + glDeleteTextures(1, &texture); + texture = 0; + } - void TexCacheEntry::Update() - { - FourTexUnits &texUnit = bpmem.tex[0]; - - // extra checks cause textures to be reloaded much more - if (texUnit.texImage0[0].hex != texImage0.hex || - //texUnit.texImage1[0].hex != texImage1.hex || - //texUnit.texImage2[0].hex != texImage2.hex || - texUnit.texImage3[0].hex != texImage3.hex || - texUnit.texTlut[0].hex != texTlut.hex) - { - Destroy(); - Create(); - } - } + void TexCacheEntry::Update() + { + FourTexUnits &texUnit = bpmem.tex[0]; + // extra checks cause textures to be reloaded much more + if (texUnit.texImage0[0].hex != texImage0.hex || + //texUnit.texImage1[0].hex != texImage1.hex || + //texUnit.texImage2[0].hex != texImage2.hex || + texUnit.texImage3[0].hex != texImage3.hex || + texUnit.texTlut[0].hex != texTlut.hex) + { + Destroy(); + Create(); + } + } } diff --git a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp index fceb19e0a9..ba7dd73e6f 100644 --- a/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp +++ b/Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp @@ -41,7 +41,7 @@ void SWRenderer::Init() void SWRenderer::Shutdown() { glDeleteProgram(program); - glDeleteTextures(1, &s_RenderTarget); + glDeleteTextures(1, &s_RenderTarget); #ifndef USE_GLES delete s_pfont; s_pfont = 0; @@ -79,12 +79,12 @@ void CreateShaders() void SWRenderer::Prepare() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment - glGenTextures(1, &s_RenderTarget); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment + glGenTextures(1, &s_RenderTarget); CreateShaders(); #ifndef USE_GLES - s_pfont = new RasterFont(); + s_pfont = new RasterFont(); glEnable(GL_TEXTURE_RECTANGLE_ARB); #endif GL_REPORT_ERRORD(); @@ -106,7 +106,7 @@ void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color) void SWRenderer::DrawDebugText() { - char debugtext_buffer[8192]; + char debugtext_buffer[8192]; char *p = debugtext_buffer; p[0] = 0; @@ -134,21 +134,21 @@ void SWRenderer::DrawDebugText() void SWRenderer::DrawTexture(u8 *texture, int width, int height) { - GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth(); + GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth(); GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight(); // Update GLViewPort glViewport(0, 0, glWidth, glHeight); - glScissor(0, 0, glWidth, glHeight); + glScissor(0, 0, glWidth, glHeight); - glBindTexture(TEX2D, s_RenderTarget); + glBindTexture(TEX2D, s_RenderTarget); - glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); - glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(TEX2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture); + glTexParameteri(TEX2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(TEX2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - GLfloat u_max = (GLfloat)width; - GLfloat v_max = (GLfloat)glHeight; + GLfloat u_max = (GLfloat)width; + GLfloat v_max = (GLfloat)glHeight; static const GLfloat verts[4][2] = { { -1, -1}, // Left top @@ -174,30 +174,30 @@ void SWRenderer::DrawTexture(u8 *texture, int width, int height) #endif glVertexAttribPointer(attr_pos, 2, GL_FLOAT, GL_FALSE, 0, verts); glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, texverts); - glEnableVertexAttribArray(attr_pos); + glEnableVertexAttribArray(attr_pos); glEnableVertexAttribArray(attr_tex); glActiveTexture(GL_TEXTURE0); glUniform1i(uni_tex, 0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(attr_pos); + glDisableVertexAttribArray(attr_pos); glDisableVertexAttribArray(attr_tex); - glBindTexture(TEX2D, 0); + glBindTexture(TEX2D, 0); GL_REPORT_ERRORD(); } void SWRenderer::SwapBuffer() { - DrawDebugText(); + DrawDebugText(); - glFlush(); + glFlush(); GLInterface->Swap(); - swstats.ResetFrame(); + swstats.ResetFrame(); #ifndef USE_GLES - glClearDepth(1.0f); + glClearDepth(1.0f); #endif glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); From 93f72d84638bc8eabd29a19c8128cdb5f142c727 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 11:07:33 -0600 Subject: [PATCH 19/20] Don't add superfluous whitespace to the CMake file --- Source/Core/DolphinWX/CMakeLists.txt | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index f54ff9f4e3..6e21b81153 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -84,28 +84,18 @@ else() endif() if(USE_EGL) - set(SRCS ${SRCS} - Src/GLInterface/EGL.cpp - ) + set(SRCS ${SRCS} Src/GLInterface/EGL.cpp) else() if(WIN32) - set(SRCS ${SRCS} - Src/GLInterface/GLW.cpp - ) + set(SRCS ${SRCS} Src/GLInterface/GLW.cpp) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if(USE_WX) - set(SRCS ${SRCS} - Src/GLInterface/WX.cpp - ) + set(SRCS ${SRCS} Src/GLInterface/WX.cpp) else() - set(SRCS ${SRCS} - Src/GLInterface/AGL.cpp - ) + set(SRCS ${SRCS} Src/GLInterface/AGL.cpp) endif() else() - set(SRCS ${SRCS} - Src/GLInterface/GLX.cpp - ) + set(SRCS ${SRCS} Src/GLInterface/GLX.cpp) endif() endif() From 5169804a61841fdbce939538915f35d3df1acce1 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 26 Dec 2012 12:12:26 -0600 Subject: [PATCH 20/20] Remove duplicated X11 code. --- Source/Core/DolphinWX/CMakeLists.txt | 7 +- Source/Core/DolphinWX/Src/GLInterface.h | 4 +- Source/Core/DolphinWX/Src/GLInterface/EGL.cpp | 212 +---------------- Source/Core/DolphinWX/Src/GLInterface/EGL.h | 7 +- Source/Core/DolphinWX/Src/GLInterface/GLX.cpp | 197 +--------------- Source/Core/DolphinWX/Src/GLInterface/GLX.h | 6 +- .../DolphinWX/Src/GLInterface/InterfaceBase.h | 1 + .../DolphinWX/Src/GLInterface/X11_Util.cpp | 213 ++++++++++++++++++ .../Core/DolphinWX/Src/GLInterface/X11_Util.h | 31 +++ 9 files changed, 272 insertions(+), 406 deletions(-) create mode 100644 Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp create mode 100644 Source/Core/DolphinWX/Src/GLInterface/X11_Util.h diff --git a/Source/Core/DolphinWX/CMakeLists.txt b/Source/Core/DolphinWX/CMakeLists.txt index 6e21b81153..3e573f3379 100644 --- a/Source/Core/DolphinWX/CMakeLists.txt +++ b/Source/Core/DolphinWX/CMakeLists.txt @@ -84,7 +84,8 @@ else() endif() if(USE_EGL) - set(SRCS ${SRCS} Src/GLInterface/EGL.cpp) + set(SRCS ${SRCS} Src/GLInterface/EGL.cpp + Src/GLInterface/X11_Util.cpp) else() if(WIN32) set(SRCS ${SRCS} Src/GLInterface/GLW.cpp) @@ -95,7 +96,9 @@ else() set(SRCS ${SRCS} Src/GLInterface/AGL.cpp) endif() else() - set(SRCS ${SRCS} Src/GLInterface/GLX.cpp) + set(SRCS ${SRCS} Src/GLInterface/GLX.cpp + Src/GLInterface/X11_Util.cpp) + endif() endif() diff --git a/Source/Core/DolphinWX/Src/GLInterface.h b/Source/Core/DolphinWX/Src/GLInterface.h index a7c069df4e..a81f17104c 100644 --- a/Source/Core/DolphinWX/Src/GLInterface.h +++ b/Source/Core/DolphinWX/Src/GLInterface.h @@ -34,8 +34,8 @@ typedef struct { #if defined(USE_EGL) && USE_EGL // This is currently a X11/EGL implementation for desktop int screen; - Display *x_dpy; - Display *x_evdpy; + Display *dpy; + Display *evdpy; Window win; Window parent; EGLSurface egl_surf; diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp index 49a77636f8..b8716ab467 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.cpp @@ -15,208 +15,16 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "VideoConfig.h" #include "Host.h" #include "RenderBase.h" -#include "VertexShaderManager.h" #include "../GLInterface.h" #include "EGL.h" -void cInterfaceEGL::CreateXWindow(void) -{ - Atom wmProtocols[1]; - - // Setup window attributes - GLWin.attr.colormap = XCreateColormap(GLWin.x_evdpy, - GLWin.parent, GLWin.vi->visual, AllocNone); - GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; - GLWin.attr.background_pixel = BlackPixel(GLWin.x_evdpy, GLWin.screen); - GLWin.attr.border_pixel = 0; - - // Create the window - GLWin.win = XCreateWindow(GLWin.x_evdpy, GLWin.parent, - GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, - GLWin.vi->depth, InputOutput, GLWin.vi->visual, - CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); - wmProtocols[0] = XInternAtom(GLWin.x_evdpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols(GLWin.x_evdpy, GLWin.win, wmProtocols, 1); - XSetStandardProperties(GLWin.x_evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); - XMapRaised(GLWin.x_evdpy, GLWin.win); - XSync(GLWin.x_evdpy, True); - - GLWin.xEventThread = std::thread(&cInterfaceEGL::XEventThread, this); -} - -void cInterfaceEGL::DestroyXWindow(void) -{ - XUnmapWindow(GLWin.x_dpy, GLWin.win); - GLWin.win = 0; - if (GLWin.xEventThread.joinable()) - GLWin.xEventThread.join(); - XFreeColormap(GLWin.x_dpy, GLWin.attr.colormap); -} - -void cInterfaceEGL::XEventThread() -{ - // Free look variables - static bool mouseLookEnabled = false; - static bool mouseMoveEnabled = false; - static float lastMouse[2]; - while (GLWin.win) - { - XEvent event; - KeySym key; - for (int num_events = XPending(GLWin.x_evdpy); num_events > 0; num_events--) - { - XNextEvent(GLWin.x_evdpy, &event); - switch(event.type) { - case KeyPress: - key = XLookupKeysym((XKeyEvent*)&event, 0); - switch (key) - { - case XK_3: - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; - break; - case XK_4: - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case XK_5: - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case XK_6: - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - default: - break; - } - if (g_Config.bFreeLook) - { - static float debugSpeed = 1.0f; - switch (key) - { - case XK_parenleft: - debugSpeed /= 2.0f; - break; - case XK_parenright: - debugSpeed *= 2.0f; - break; - case XK_w: - VertexShaderManager::TranslateView(0.0f, debugSpeed); - break; - case XK_s: - VertexShaderManager::TranslateView(0.0f, -debugSpeed); - break; - case XK_a: - VertexShaderManager::TranslateView(debugSpeed, 0.0f); - break; - case XK_d: - VertexShaderManager::TranslateView(-debugSpeed, 0.0f); - break; - case XK_r: - VertexShaderManager::ResetView(); - break; - } - } - break; - case ButtonPress: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseMoveEnabled = true; - break; - case 3: // Right button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseLookEnabled = true; - break; - } - } - break; - case ButtonRelease: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - mouseMoveEnabled = false; - break; - case 3: // Right button - mouseLookEnabled = false; - break; - } - } - break; - case MotionNotify: - if (g_Config.bFreeLook) - { - if (mouseLookEnabled) - { - VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, - (event.xmotion.y - lastMouse[1]) / 200.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - - if (mouseMoveEnabled) - { - VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, - (event.xmotion.y - lastMouse[1]) / 50.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - } - break; - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy, depthDummy; - XGetGeometry(GLWin.x_dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); - s_backbuffer_width = GLWin.width; - s_backbuffer_height = GLWin.height; - break; - case ClientMessage: - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.x_dpy, "WM_DELETE_WINDOW", False)) - Host_Message(WM_USER_STOP); - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.x_dpy, "RESIZE", False)) - XMoveResizeWindow(GLWin.x_dpy, GLWin.win, - event.xclient.data.l[1], event.xclient.data.l[2], - event.xclient.data.l[3], event.xclient.data.l[4]); - break; - default: - break; - } - } - Common::SleepCurrentThread(20); - } -} - // Show the current FPS void cInterfaceEGL::UpdateFPSDisplay(const char *text) { - XStoreName(GLWin.x_dpy, GLWin.win, text); + XStoreName(GLWin.dpy, GLWin.win, text); } void cInterfaceEGL::Swap() { @@ -237,14 +45,14 @@ bool cInterfaceEGL::Create(void *&window_handle) const char *s; EGLint egl_major, egl_minor; - GLWin.x_dpy = XOpenDisplay(NULL); + GLWin.dpy = XOpenDisplay(NULL); - if (!GLWin.x_dpy) { + if (!GLWin.dpy) { printf("Error: couldn't open display\n"); return false; } - GLWin.egl_dpy = eglGetDisplay(GLWin.x_dpy); + GLWin.egl_dpy = eglGetDisplay(GLWin.dpy); if (!GLWin.egl_dpy) { printf("Error: eglGetDisplay() failed\n"); return false; @@ -288,11 +96,11 @@ bool cInterfaceEGL::Create(void *&window_handle) EGL_NONE }; - GLWin.x_evdpy = XOpenDisplay(NULL); + GLWin.evdpy = XOpenDisplay(NULL); GLWin.parent = (Window)window_handle; - GLWin.screen = DefaultScreen(GLWin.x_dpy); + GLWin.screen = DefaultScreen(GLWin.dpy); if (GLWin.parent == 0) - GLWin.parent = RootWindow(GLWin.x_dpy, GLWin.screen); + GLWin.parent = RootWindow(GLWin.dpy, GLWin.screen); XVisualInfo visTemplate; int num_visuals; @@ -312,7 +120,7 @@ bool cInterfaceEGL::Create(void *&window_handle) /* The X window visual must match the EGL config */ visTemplate.visualid = vid; - GLWin.vi = XGetVisualInfo(GLWin.x_dpy, VisualIDMask, &visTemplate, &num_visuals); + GLWin.vi = XGetVisualInfo(GLWin.dpy, VisualIDMask, &visTemplate, &num_visuals); if (!GLWin.vi) { printf("Error: couldn't get X visual\n"); exit(1); @@ -323,7 +131,7 @@ bool cInterfaceEGL::Create(void *&window_handle) GLWin.width = _twidth; GLWin.height = _theight; - CreateXWindow(); + XWindow.CreateXWindow(); #ifdef USE_GLES eglBindAPI(EGL_OPENGL_ES_API); #else @@ -368,7 +176,7 @@ bool cInterfaceEGL::MakeCurrent() // Close backend void cInterfaceEGL::Shutdown() { - DestroyXWindow(); + XWindow.DestroyXWindow(); if (GLWin.egl_ctx && !eglMakeCurrent(GLWin.egl_dpy, GLWin.egl_surf, GLWin.egl_surf, GLWin.egl_ctx)) NOTICE_LOG(VIDEO, "Could not release drawing context."); if (GLWin.egl_ctx) diff --git a/Source/Core/DolphinWX/Src/GLInterface/EGL.h b/Source/Core/DolphinWX/Src/GLInterface/EGL.h index 0e0adcd6d7..c4b6a00b6c 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/EGL.h +++ b/Source/Core/DolphinWX/Src/GLInterface/EGL.h @@ -24,15 +24,16 @@ #include #include #endif + +#include "X11_Util.h" #include "InterfaceBase.h" class cInterfaceEGL : public cInterfaceBase { private: - void CreateXWindow(); - void DestroyXWindow(); - void XEventThread(); + cX11Window XWindow; public: + friend class cX11Window; void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp index cb6d814db3..ef60873531 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.cpp @@ -15,204 +15,13 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "VideoConfig.h" #include "Host.h" #include "RenderBase.h" +#include "VideoConfig.h" -#include "VertexShaderManager.h" #include "../GLInterface.h" #include "GLX.h" -void cInterfaceGLX::CreateXWindow(void) -{ - Atom wmProtocols[1]; - - // Setup window attributes - GLWin.attr.colormap = XCreateColormap(GLWin.evdpy, - GLWin.parent, GLWin.vi->visual, AllocNone); - GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; - GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen); - GLWin.attr.border_pixel = 0; - - // Create the window - GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent, - GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, - GLWin.vi->depth, InputOutput, GLWin.vi->visual, - CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); - wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1); - XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); - XMapRaised(GLWin.evdpy, GLWin.win); - XSync(GLWin.evdpy, True); - - GLWin.xEventThread = std::thread(&cInterfaceGLX::XEventThread, this); -} - -void cInterfaceGLX::DestroyXWindow(void) -{ - XUnmapWindow(GLWin.dpy, GLWin.win); - GLWin.win = 0; - if (GLWin.xEventThread.joinable()) - GLWin.xEventThread.join(); - XFreeColormap(GLWin.evdpy, GLWin.attr.colormap); -} - -void cInterfaceGLX::XEventThread() -{ - // Free look variables - static bool mouseLookEnabled = false; - static bool mouseMoveEnabled = false; - static float lastMouse[2]; - while (GLWin.win) - { - XEvent event; - KeySym key; - for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--) - { - XNextEvent(GLWin.evdpy, &event); - switch(event.type) { - case KeyPress: - key = XLookupKeysym((XKeyEvent*)&event, 0); - switch (key) - { - case XK_3: - OSDChoice = 1; - // Toggle native resolution - g_Config.iEFBScale = g_Config.iEFBScale + 1; - if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; - break; - case XK_4: - OSDChoice = 2; - // Toggle aspect ratio - g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; - break; - case XK_5: - OSDChoice = 3; - // Toggle EFB copy - if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) - { - g_Config.bEFBCopyEnable ^= true; - g_Config.bCopyEFBToTexture = false; - } - else - { - g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; - } - break; - case XK_6: - OSDChoice = 4; - g_Config.bDisableFog = !g_Config.bDisableFog; - break; - default: - break; - } - if (g_Config.bFreeLook) - { - static float debugSpeed = 1.0f; - switch (key) - { - case XK_parenleft: - debugSpeed /= 2.0f; - break; - case XK_parenright: - debugSpeed *= 2.0f; - break; - case XK_w: - VertexShaderManager::TranslateView(0.0f, debugSpeed); - break; - case XK_s: - VertexShaderManager::TranslateView(0.0f, -debugSpeed); - break; - case XK_a: - VertexShaderManager::TranslateView(debugSpeed, 0.0f); - break; - case XK_d: - VertexShaderManager::TranslateView(-debugSpeed, 0.0f); - break; - case XK_r: - VertexShaderManager::ResetView(); - break; - } - } - break; - case ButtonPress: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseMoveEnabled = true; - break; - case 3: // Right button - lastMouse[0] = event.xbutton.x; - lastMouse[1] = event.xbutton.y; - mouseLookEnabled = true; - break; - } - } - break; - case ButtonRelease: - if (g_Config.bFreeLook) - { - switch (event.xbutton.button) - { - case 2: // Middle button - mouseMoveEnabled = false; - break; - case 3: // Right button - mouseLookEnabled = false; - break; - } - } - break; - case MotionNotify: - if (g_Config.bFreeLook) - { - if (mouseLookEnabled) - { - VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, - (event.xmotion.y - lastMouse[1]) / 200.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - - if (mouseMoveEnabled) - { - VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, - (event.xmotion.y - lastMouse[1]) / 50.0f); - lastMouse[0] = event.xmotion.x; - lastMouse[1] = event.xmotion.y; - } - } - break; - case ConfigureNotify: - Window winDummy; - unsigned int borderDummy, depthDummy; - XGetGeometry(GLWin.evdpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, - &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); - s_backbuffer_width = GLWin.width; - s_backbuffer_height = GLWin.height; - break; - case ClientMessage: - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False)) - Host_Message(WM_USER_STOP); - if ((unsigned long) event.xclient.data.l[0] == - XInternAtom(GLWin.evdpy, "RESIZE", False)) - XMoveResizeWindow(GLWin.evdpy, GLWin.win, - event.xclient.data.l[1], event.xclient.data.l[2], - event.xclient.data.l[3], event.xclient.data.l[4]); - break; - default: - break; - } - } - Common::SleepCurrentThread(20); - } -} - // Show the current FPS void cInterfaceGLX::UpdateFPSDisplay(const char *text) { @@ -309,7 +118,7 @@ bool cInterfaceGLX::Create(void *&window_handle) GLWin.width = _twidth; GLWin.height = _theight; - CreateXWindow(); + XWindow.CreateXWindow(); window_handle = (void *)GLWin.win; return true; } @@ -328,7 +137,7 @@ bool cInterfaceGLX::MakeCurrent() // Close backend void cInterfaceGLX::Shutdown() { - DestroyXWindow(); + XWindow.DestroyXWindow(); if (GLWin.ctx && !glXMakeCurrent(GLWin.dpy, None, NULL)) NOTICE_LOG(VIDEO, "Could not release drawing context."); if (GLWin.ctx) diff --git a/Source/Core/DolphinWX/Src/GLInterface/GLX.h b/Source/Core/DolphinWX/Src/GLInterface/GLX.h index 5a37695f4e..73a6690ec5 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/GLX.h +++ b/Source/Core/DolphinWX/Src/GLInterface/GLX.h @@ -22,15 +22,15 @@ #include #include +#include "X11_Util.h" #include "InterfaceBase.h" class cInterfaceGLX : public cInterfaceBase { private: - void CreateXWindow(); - void DestroyXWindow(); - void XEventThread(); + cX11Window XWindow; public: + friend class cX11Window; void Swap(); void UpdateFPSDisplay(const char *Text); bool Create(void *&window_handle); diff --git a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h index 40b17e8083..3e4f10fcd4 100644 --- a/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h +++ b/Source/Core/DolphinWX/Src/GLInterface/InterfaceBase.h @@ -31,6 +31,7 @@ public: virtual u32 GetBackBufferWidth() { return s_backbuffer_width; } virtual u32 GetBackBufferHeight() { return s_backbuffer_height; } + virtual void SetBackBufferDimensions(u32 W, u32 H) {s_backbuffer_width = W; s_backbuffer_height = H; } virtual void Update() { } virtual bool PeekMessages() { return false; } }; diff --git a/Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp new file mode 100644 index 0000000000..9372c4d644 --- /dev/null +++ b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.cpp @@ -0,0 +1,213 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Host.h" +#include "RenderBase.h" +#include "VideoConfig.h" +#include "../GLInterface.h" +#include "VertexShaderManager.h" + +void cX11Window::CreateXWindow(void) +{ + Atom wmProtocols[1]; + + // Setup window attributes + GLWin.attr.colormap = XCreateColormap(GLWin.evdpy, + GLWin.parent, GLWin.vi->visual, AllocNone); + GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask; + GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen); + GLWin.attr.border_pixel = 0; + + // Create the window + GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent, + GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0, + GLWin.vi->depth, InputOutput, GLWin.vi->visual, + CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr); + wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1); + XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL); + XMapRaised(GLWin.evdpy, GLWin.win); + XSync(GLWin.evdpy, True); + + GLWin.xEventThread = std::thread(&cX11Window::XEventThread, this); +} + +void cX11Window::DestroyXWindow(void) +{ + XUnmapWindow(GLWin.dpy, GLWin.win); + GLWin.win = 0; + if (GLWin.xEventThread.joinable()) + GLWin.xEventThread.join(); + XFreeColormap(GLWin.evdpy, GLWin.attr.colormap); +} + +void cX11Window::XEventThread() +{ + // Free look variables + static bool mouseLookEnabled = false; + static bool mouseMoveEnabled = false; + static float lastMouse[2]; + while (GLWin.win) + { + XEvent event; + KeySym key; + for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--) + { + XNextEvent(GLWin.evdpy, &event); + switch(event.type) { + case KeyPress: + key = XLookupKeysym((XKeyEvent*)&event, 0); + switch (key) + { + case XK_3: + OSDChoice = 1; + // Toggle native resolution + g_Config.iEFBScale = g_Config.iEFBScale + 1; + if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0; + break; + case XK_4: + OSDChoice = 2; + // Toggle aspect ratio + g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3; + break; + case XK_5: + OSDChoice = 3; + // Toggle EFB copy + if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture) + { + g_Config.bEFBCopyEnable ^= true; + g_Config.bCopyEFBToTexture = false; + } + else + { + g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture; + } + break; + case XK_6: + OSDChoice = 4; + g_Config.bDisableFog = !g_Config.bDisableFog; + break; + default: + break; + } + if (g_Config.bFreeLook) + { + static float debugSpeed = 1.0f; + switch (key) + { + case XK_parenleft: + debugSpeed /= 2.0f; + break; + case XK_parenright: + debugSpeed *= 2.0f; + break; + case XK_w: + VertexShaderManager::TranslateView(0.0f, debugSpeed); + break; + case XK_s: + VertexShaderManager::TranslateView(0.0f, -debugSpeed); + break; + case XK_a: + VertexShaderManager::TranslateView(debugSpeed, 0.0f); + break; + case XK_d: + VertexShaderManager::TranslateView(-debugSpeed, 0.0f); + break; + case XK_r: + VertexShaderManager::ResetView(); + break; + } + } + break; + case ButtonPress: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseMoveEnabled = true; + break; + case 3: // Right button + lastMouse[0] = event.xbutton.x; + lastMouse[1] = event.xbutton.y; + mouseLookEnabled = true; + break; + } + } + break; + case ButtonRelease: + if (g_Config.bFreeLook) + { + switch (event.xbutton.button) + { + case 2: // Middle button + mouseMoveEnabled = false; + break; + case 3: // Right button + mouseLookEnabled = false; + break; + } + } + break; + case MotionNotify: + if (g_Config.bFreeLook) + { + if (mouseLookEnabled) + { + VertexShaderManager::RotateView((event.xmotion.x - lastMouse[0]) / 200.0f, + (event.xmotion.y - lastMouse[1]) / 200.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + + if (mouseMoveEnabled) + { + VertexShaderManager::TranslateView((event.xmotion.x - lastMouse[0]) / 50.0f, + (event.xmotion.y - lastMouse[1]) / 50.0f); + lastMouse[0] = event.xmotion.x; + lastMouse[1] = event.xmotion.y; + } + } + break; + case ConfigureNotify: + Window winDummy; + unsigned int borderDummy, depthDummy; + XGetGeometry(GLWin.evdpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y, + &GLWin.width, &GLWin.height, &borderDummy, &depthDummy); + GLInterface->SetBackBufferDimensions(GLWin.width, GLWin.height); + break; + case ClientMessage: + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False)) + Host_Message(WM_USER_STOP); + if ((unsigned long) event.xclient.data.l[0] == + XInternAtom(GLWin.evdpy, "RESIZE", False)) + XMoveResizeWindow(GLWin.evdpy, GLWin.win, + event.xclient.data.l[1], event.xclient.data.l[2], + event.xclient.data.l[3], event.xclient.data.l[4]); + break; + default: + break; + } + } + Common::SleepCurrentThread(20); + } +} + + diff --git a/Source/Core/DolphinWX/Src/GLInterface/X11_Util.h b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.h new file mode 100644 index 0000000000..9e6f6d5e3c --- /dev/null +++ b/Source/Core/DolphinWX/Src/GLInterface/X11_Util.h @@ -0,0 +1,31 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _X11_UTIL_H_ +#define _X11_UTIL_H_ + +#include +#include + +class cX11Window +{ +private: + void XEventThread(); +public: + void CreateXWindow(void); + void DestroyXWindow(void); +}; +#endif