make work on win32 again using GLEW

This commit is contained in:
Eduardo Bart 2011-12-29 16:18:12 -02:00
parent d67442dc49
commit d597335135
15 changed files with 764 additions and 699 deletions

View File

@ -20,11 +20,10 @@ FIND_PACKAGE(Boost COMPONENTS system REQUIRED)
IF(USE_OPENGL_ES2) IF(USE_OPENGL_ES2)
FIND_PACKAGE(OpenGLES2 REQUIRED) FIND_PACKAGE(OpenGLES2 REQUIRED)
FIND_PACKAGE(EGL REQUIRED) FIND_PACKAGE(EGL REQUIRED)
SET(OPENGL_INCLUDE_DIR ${OPENGLES_INCLUDE_DIR} ${EGL_INCLUDE_DIR})
SET(OPENGL_LIBRARIES ${OPENGLES_LIBRARY} ${EGL_LIBRARY})
ADD_DEFINITIONS(-DOPENGL_ES2) ADD_DEFINITIONS(-DOPENGL_ES2)
ELSE(USE_OPENGL_ES2) ELSE(USE_OPENGL_ES2)
FIND_PACKAGE(OpenGL REQUIRED) FIND_PACKAGE(OpenGL REQUIRED)
FIND_PACKAGE(GLEW REQUIRED)
ENDIF(USE_OPENGL_ES2) ENDIF(USE_OPENGL_ES2)
FIND_PACKAGE(Lua REQUIRED) FIND_PACKAGE(Lua REQUIRED)
@ -66,7 +65,9 @@ IF(USE_GCC47)
ENDIF(USE_GCC47) ENDIF(USE_GCC47)
IF(WIN32) IF(WIN32)
SET(framework_SOURCES ${framework_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/platform/win32window.cpp) SET(framework_SOURCES ${framework_SOURCES}
${CMAKE_CURRENT_LIST_DIR}/platform/win32window.cpp
${CMAKE_CURRENT_LIST_DIR}/platform/win32crashhandler.cpp)
SET(ADDITIONAL_LIBRARIES ws2_32 mswsock) SET(ADDITIONAL_LIBRARIES ws2_32 mswsock)
IF(CMAKE_COMPILER_IS_GNUCXX) IF(CMAKE_COMPILER_IS_GNUCXX)
@ -89,13 +90,17 @@ ELSE(WIN32)
ADD_DEFINITIONS(-D_GLIBCXX__PTHREADS) ADD_DEFINITIONS(-D_GLIBCXX__PTHREADS)
ENDIF(USE_GCC47) ENDIF(USE_GCC47)
SET(ADDITIONAL_LIBRARIES X11 dl) SET(ADDITIONAL_LIBRARIES X11 dl)
SET(framework_SOURCES ${framework_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/platform/x11window.cpp) SET(framework_SOURCES ${framework_SOURCES}
${CMAKE_CURRENT_LIST_DIR}/platform/x11window.cpp
${CMAKE_CURRENT_LIST_DIR}/platform/unixcrashhandler.cpp)
ENDIF(WIN32) ENDIF(WIN32)
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
${Boost_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
${OPENGL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}
${EGL_INCLUDE_DIR}
${OPENGLES_INCLUDE_DIR}
${LUA_INCLUDE_DIR} ${LUA_INCLUDE_DIR}
${PHYSFS_INCLUDE_DIR} ${PHYSFS_INCLUDE_DIR}
${GMP_INCLUDE_DIR} ${GMP_INCLUDE_DIR}
@ -105,7 +110,9 @@ INCLUDE_DIRECTORIES(
SET(framework_LIBRARIES SET(framework_LIBRARIES
${Boost_LIBRARIES} ${Boost_LIBRARIES}
${GLEW_LIBRARY}
${OPENGL_LIBRARIES} ${OPENGL_LIBRARIES}
${OPENGLES_LIBRARY}
${LUA_LIBRARIES} ${LUA_LIBRARIES}
${PHYSFS_LIBRARY} ${PHYSFS_LIBRARY}
${GMP_LIBRARY} ${GMP_LIBRARY}

View File

@ -34,6 +34,7 @@
#include <framework/graphics/particlemanager.h> #include <framework/graphics/particlemanager.h>
#include <framework/graphics/painter.h> #include <framework/graphics/painter.h>
#include <framework/luascript/luainterface.h> #include <framework/luascript/luainterface.h>
#include <framework/platform/crashhandler.h>
Application *g_app = nullptr; Application *g_app = nullptr;
@ -72,6 +73,10 @@ void Application::init(const std::vector<std::string>& args, int appFlags)
signal(SIGTERM, exitSignalHandler); signal(SIGTERM, exitSignalHandler);
signal(SIGINT, exitSignalHandler); signal(SIGINT, exitSignalHandler);
#ifdef HANDLE_EXCEPTIONS
installCrashHandler();
#endif
// initialize lua // initialize lua
g_lua.init(); g_lua.init();
registerLuaFunctions(); registerLuaFunctions();

View File

@ -3,7 +3,7 @@
# EGL_INCLUDE_DIR - the EGL include directory # EGL_INCLUDE_DIR - the EGL include directory
# EGL_LIBRARY - the EGL library # EGL_LIBRARY - the EGL library
FIND_PATH(EGL_INCLUDE_DIR egl.h PATH_SUFFIXES EGL) FIND_PATH(EGL_INCLUDE_DIR NAMES EGL/egl.h)
FIND_LIBRARY(EGL_LIBRARY NAMES EGL) FIND_LIBRARY(EGL_LIBRARY NAMES EGL)
INCLUDE(FindPackageHandleStandardArgs) INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(EGL DEFAULT_MSG EGL_LIBRARY EGL_INCLUDE_DIR)

View File

@ -0,0 +1,10 @@
# Try to find the GLEW librairy
# GLEW_FOUND - system has GLEW
# GLEW_INCLUDE_DIR - the GLEW include directory
# GLEW_LIBRARY - the GLEW library
FIND_PATH(GLEW_INCLUDE_DIR NAMES GL/glew.h)
FIND_LIBRARY(GLEW_LIBRARY NAMES libGLEW.a libglew32.a GLEW glew32)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLEW DEFAULT_MSG GLEW_LIBRARY GLEW_INCLUDE_DIR)
MARK_AS_ADVANCED(GLEW_LIBRARY GLEW_INCLUDE_DIR)

View File

@ -3,7 +3,7 @@
# OPENGLES_INCLUDE_DIR - the OpenGLES include directory # OPENGLES_INCLUDE_DIR - the OpenGLES include directory
# OPENGLES_LIBRARY - the OpenGLES library # OPENGLES_LIBRARY - the OpenGLES library
FIND_PATH(OPENGLES_INCLUDE_DIR gl2.h PATH_SUFFIXES GLES2) FIND_PATH(OPENGLES_INCLUDE_DIR NAMES GLES2/gl2.h)
FIND_LIBRARY(OPENGLES_LIBRARY NAMES GLESv2) FIND_LIBRARY(OPENGLES_LIBRARY NAMES GLESv2)
INCLUDE(FindPackageHandleStandardArgs) INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenGLES DEFAULT_MSG OPENGLES_LIBRARY OPENGLES_INCLUDE_DIR) FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenGLES DEFAULT_MSG OPENGLES_LIBRARY OPENGLES_INCLUDE_DIR)

View File

@ -24,12 +24,13 @@
#ifndef GLUTIL_H #ifndef GLUTIL_H
#define GLUTIL_H #define GLUTIL_H
#define GL_GLEXT_PROTOTYPES
#ifndef OPENGL_ES2 #ifndef OPENGL_ES2
#include <GL/gl.h> #define GLEW_STATIC
#include <GL/glext.h> #include <GL/glew.h>
//#include <GL/gl.h>
//#include <GL/glext.h>
#else #else
#define GL_GLEXT_PROTOTYPES
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#include <GLES2/gl2ext.h> #include <GLES2/gl2ext.h>
#endif #endif

View File

@ -30,6 +30,18 @@ Graphics g_graphics;
void Graphics::init() void Graphics::init()
{ {
#ifndef OPENGL_ES2
// init GL extensions
GLenum err = glewInit();
if(err != GLEW_OK)
logFatal("Unable to init GLEW: ", glewGetErrorString(err));
if(!GLEW_ARB_vertex_program || !GLEW_ARB_vertex_shader ||
!GLEW_ARB_fragment_program || !GLEW_ARB_fragment_shader ||
!GLEW_ARB_framebuffer_object ||
!GLEW_ARB_multitexture)
logFatal("Your video driver is not supported");
#endif
glEnable(GL_BLEND); glEnable(GL_BLEND);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

View File

@ -0,0 +1,28 @@
/*
* Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef CRASHHANDLER_H
#define CRASHHANDLER_H
void installCrashHandler();
#endif

View File

@ -20,11 +20,10 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include "crashhandler.h"
#ifdef HANDLE_EXCEPTIONS #include <framework/global.h>
#include <csignal>
#include <execinfo.h> #include <execinfo.h>
#include <framework/application.h>
#define MAX_BACKTRACE_DEPTH 128 #define MAX_BACKTRACE_DEPTH 128
#define DEMANGLE_BACKTRACE_SYMBOLS #define DEMANGLE_BACKTRACE_SYMBOLS
@ -38,7 +37,7 @@ void crashHandler(int signum, siginfo_t* info, void* secret)
char fileName[128]; char fileName[128];
time(&tnow); time(&tnow);
tm *ts = localtime(&tnow); tm *ts = localtime(&tnow);
strftime(fileName, 128, (x11.appName + "-crash_-%d-%m-%Y_%H:%M:%S.txt").c_str(), ts); strftime(fileName, 128, (g_app->getAppName() + "-crash_-%d-%m-%Y_%H:%M:%S.txt").c_str(), ts);
std::stringstream ss; std::stringstream ss;
ss.flags(std::ios::hex | std::ios::showbase); ss.flags(std::ios::hex | std::ios::showbase);
@ -103,10 +102,9 @@ void crashHandler(int signum, siginfo_t* info, void* secret)
signal(SIGSEGV, SIG_DFL); signal(SIGSEGV, SIG_DFL);
signal(SIGFPE, SIG_DFL); signal(SIGFPE, SIG_DFL);
} }
#endif
void installCrashHandler()
#ifdef HANDLE_EXCEPTIONS {
struct sigaction sa; struct sigaction sa;
sa.sa_sigaction = &crashHandler; sa.sa_sigaction = &crashHandler;
sigemptyset (&sa.sa_mask); sigemptyset (&sa.sa_mask);
@ -115,4 +113,4 @@ void crashHandler(int signum, siginfo_t* info, void* secret)
sigaction(SIGILL, &sa, NULL); // illegal instruction sigaction(SIGILL, &sa, NULL); // illegal instruction
sigaction(SIGSEGV, &sa, NULL); // segmentation fault sigaction(SIGSEGV, &sa, NULL); // segmentation fault
sigaction(SIGFPE, &sa, NULL); // floating-point exception sigaction(SIGFPE, &sa, NULL); // floating-point exception
#endif }

View File

@ -0,0 +1,85 @@
/*
* Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "crashhandler.h"
#include <framework/global.h>
#include <windows.h>
#include <dbghelp.h>
#include <framework/application.h>
typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
LONG WINAPI crashHandler(EXCEPTION_POINTERS* exceptionPointers)
{
logError("Application crashed");
HMODULE hDbgHelp = LoadLibraryA("DBGHELP.DLL");
char fileName[128];
if(hDbgHelp) {
MINIDUMPWRITEDUMP minuDumpWriteDump = (MINIDUMPWRITEDUMP)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
SYSTEMTIME systemTime;
GetSystemTime(&systemTime);
snprintf(fileName, 128, "%s_%02u-%02u-%04u_%02u-%02u-%02u.mdmp", g_app->getAppName().c_str(),
systemTime.wDay, systemTime.wMonth, systemTime.wYear,
systemTime.wHour, systemTime.wMinute, systemTime.wSecond);
HANDLE hFile = CreateFileA(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile) {
MINIDUMP_EXCEPTION_INFORMATION exceptionInformation;
exceptionInformation.ClientPointers = FALSE;
exceptionInformation.ExceptionPointers = exceptionPointers;
exceptionInformation.ThreadId = GetCurrentThreadId();
HANDLE hProcess = GetCurrentProcess();
DWORD ProcessId = GetProcessId(hProcess);
MINIDUMP_TYPE flags = (MINIDUMP_TYPE)(MiniDumpNormal);
BOOL dumpResult = minuDumpWriteDump(hProcess, ProcessId, hFile, flags, &exceptionInformation, NULL, NULL);
if(!dumpResult){
logError("Cannot generate minidump: ", GetLastError());
CloseHandle(hFile);
DeleteFileA(fileName);
return EXCEPTION_CONTINUE_SEARCH;
} else {
logInfo("Crash minidump genarated on file ", fileName);
}
} else {
logError("Cannot create dump file: ", GetLastError());
}
} else {
logError("Cannot create dump file: dbghlp.dll not found");
}
return EXCEPTION_CONTINUE_SEARCH;
}
void installCrashHandler()
{
SetUnhandledExceptionFilter(crashHandler);
}

File diff suppressed because it is too large Load Diff

View File

@ -25,9 +25,61 @@
#include "platformwindow.h" #include "platformwindow.h"
#include <windows.h>
struct WindowProcProxy;
class WIN32Window : public PlatformWindow class WIN32Window : public PlatformWindow
{ {
//TODO void internalCreateWindow();
void internalRegisterWindowClass();
void internalChooseGLVisual();
void internalCreateGLContext();
void *getExtensionProcAddress(const char *ext);
bool isExtensionSupported(const char *ext);
LRESULT windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
friend class WindowProcProxy;
public:
WIN32Window();
void init();
void terminate();
void move(const Point& pos);
void resize(const Size& size);
void show();
void hide();
void maximize();
void poll();
void swapBuffers();
void showMouse();
void hideMouse();
void setTitle(const std::string& title);
void setMinimumSize(const Size& minimumSize);
void setFullscreen(bool fullscreen);
void setVerticalSync(bool enable);
void setIcon(const std::string& iconFile);
void setClipboardText(const std::string& text);
Size getDisplaySize();
std::string getClipboardText();
bool isMaximized() { return m_maximized; }
private:
HWND m_window;
HINSTANCE m_instance;
HDC m_deviceContext;
HGLRC m_glContext;
bool m_maximized;
Point m_lastWindowPos;
std::string m_clipboardText;
std::map<int, Fw::Key> m_keyMap;
}; };
#endif #endif

View File

@ -26,9 +26,25 @@
X11Window::X11Window() X11Window::X11Window()
{ {
m_cursor = None; m_display = 0;
m_visual = 0; m_visual = 0;
m_window = 0;
m_rootWindow = 0;
m_colormap = 0; m_colormap = 0;
m_cursor = 0;
m_xim = 0;
m_xic = 0;
m_screen = 0;
m_wmDelete = 0;
#ifndef OPENGL_ES2
m_glxContext = 0;
#else
m_eglConfig = 0;
m_eglContext = 0;
m_eglDisplay = 0;
m_eglSurface = 0;
#endif
m_keyMap[XK_Escape] = Fw::KeyEscape; m_keyMap[XK_Escape] = Fw::KeyEscape;
m_keyMap[XK_Tab] = Fw::KeyTab; m_keyMap[XK_Tab] = Fw::KeyTab;
@ -193,23 +209,37 @@ void X11Window::init()
void X11Window::terminate() void X11Window::terminate()
{ {
if(m_window) {
XDestroyWindow(m_display, m_window); XDestroyWindow(m_display, m_window);
m_window = 0;
}
if(m_colormap) if(m_colormap) {
XFreeColormap(m_display, m_colormap); XFreeColormap(m_display, m_colormap);
m_colormap = 0;
}
internalDestroyGLContext(); internalDestroyGLContext();
if(m_visual) if(m_visual) {
XFree(m_visual); XFree(m_visual);
m_visual = 0;
}
if(m_xic) if(m_xic) {
XDestroyIC(m_xic); XDestroyIC(m_xic);
m_xic = 0;
}
if(m_xim) if(m_xim) {
XCloseIM(m_xim); XCloseIM(m_xim);
m_xim = 0;
}
if(m_display) {
XCloseDisplay(m_display); XCloseDisplay(m_display);
m_display = 0;
}
m_visible = false; m_visible = false;
} }
@ -380,12 +410,24 @@ void X11Window::internalCreateGLContext()
void X11Window::internalDestroyGLContext() void X11Window::internalDestroyGLContext()
{ {
#ifndef OPENGL_ES2 #ifndef OPENGL_ES2
if(m_glxContext) {
glXMakeCurrent(m_display, None, NULL); glXMakeCurrent(m_display, None, NULL);
glXDestroyContext(m_display, m_glxContext); glXDestroyContext(m_display, m_glxContext);
m_glxContext = 0;
}
#else #else
if(m_eglDisplay) {
if(m_eglContext) {
eglDestroyContext(m_eglDisplay, m_eglContext); eglDestroyContext(m_eglDisplay, m_eglContext);
m_eglContext = 0;
}
if(m_eglSurface)
eglDestroySurface(m_eglDisplay, m_eglSurface); eglDestroySurface(m_eglDisplay, m_eglSurface);
m_eglSurface = 0;
}
eglTerminate(m_eglDisplay); eglTerminate(m_eglDisplay);
m_eglDisplay = 0;
}
#endif #endif
} }

View File

@ -27,11 +27,13 @@
#include "item.h" #include "item.h"
#include "missile.h" #include "missile.h"
#include "statictext.h" #include "statictext.h"
#include <framework/graphics/graphics.h> #include <framework/graphics/graphics.h>
#include <framework/graphics/framebuffer.h> #include <framework/graphics/framebuffer.h>
#include <framework/graphics/paintershaderprogram.h> #include <framework/graphics/paintershaderprogram.h>
#include <framework/graphics/paintershadersources.h> #include <framework/graphics/paintershadersources.h>
#include <framework/graphics/texture.h> #include <framework/graphics/texture.h>
Map g_map; Map g_map;
Map::Map() Map::Map()
@ -39,7 +41,6 @@ Map::Map()
setVisibleSize(Size(MAP_VISIBLE_WIDTH, MAP_VISIBLE_HEIGHT)); setVisibleSize(Size(MAP_VISIBLE_WIDTH, MAP_VISIBLE_HEIGHT));
} }
PainterShaderProgramPtr program;
void Map::draw(const Rect& rect) void Map::draw(const Rect& rect)
{ {
if(!m_framebuffer) { if(!m_framebuffer) {
@ -47,10 +48,10 @@ void Map::draw(const Rect& rect)
m_framebuffer = FrameBufferPtr(new FrameBuffer(fboSize)); m_framebuffer = FrameBufferPtr(new FrameBuffer(fboSize));
program = PainterShaderProgramPtr(new PainterShaderProgram); m_shaderProgram = PainterShaderProgramPtr(new PainterShaderProgram);
program->addShaderFromSourceCode(Shader::Vertex, glslMainWithTexCoordsVertexShader + glslPositionOnlyVertexShader); m_shaderProgram->addShaderFromSourceCode(Shader::Vertex, glslMainWithTexCoordsVertexShader + glslPositionOnlyVertexShader);
program->addShaderFromSourceFile(Shader::Fragment, "/game_shaders/map.frag"); m_shaderProgram->addShaderFromSourceFile(Shader::Fragment, "/game_shaders/map.frag");
assert(program->link()); assert(m_shaderProgram->link());
} }
g_painter.setColor(Fw::white); g_painter.setColor(Fw::white);
@ -95,7 +96,7 @@ void Map::draw(const Rect& rect)
m_framebuffer->release(); m_framebuffer->release();
g_painter.setCustomProgram(program); g_painter.setCustomProgram(m_shaderProgram);
g_painter.setColor(Fw::white); g_painter.setColor(Fw::white);
m_framebuffer->draw(rect); m_framebuffer->draw(rect);
g_painter.releaseCustomProgram(); g_painter.releaseCustomProgram();

View File

@ -87,6 +87,7 @@ private:
Point m_centralOffset, m_drawOffset; Point m_centralOffset, m_drawOffset;
FrameBufferPtr m_framebuffer; FrameBufferPtr m_framebuffer;
PainterShaderProgramPtr m_shaderProgram;
}; };
extern Map g_map; extern Map g_map;