X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fscreen.cpp;h=16a3ab8aec29c55f9f059364d9d40faf5bbb4537;hp=223f4a3e6c29d7a5d20f83f244eba27503bba650;hb=f73ce73b9cec7f1e2c265b3cbcc7bca9c4011d11;hpb=6dd539966821debd18e0b86ed126742cd81d7fc9 diff --git a/src/screen.cpp b/src/screen.cpp index 223f4a3..16a3ab8 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -8,12 +8,15 @@ #include "bufferbuilder.h" #include "shaderprogram.h" + + #define BASICTEX_VERT "shaders/basictex_vert.glsl" #define BASICTEX_FRAG "shaders/basictex_frag.glsl" using namespace IPDF; using namespace std; +#ifndef __MINGW32__ static void opengl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* msg, const void *data) { // Don't print out gl Errors we generated. @@ -22,18 +25,23 @@ static void opengl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum // Spams this message on fglrx, disabling for now because it's damn annoying. // ERROR: opengl_debug_callback (screen.cpp:21) - OpenGL Error (1011): glObjectLabel failed because (depending on the operation) a referenced binding point is empty; a referenced name is not the name of an object; or the given name is otherwise not valid to this operation (GL_INVALID_VALUE) } +#endif - -Screen::Screen() +Screen::Screen(bool visible) { SDL_Init(SDL_INIT_VIDEO); + uint32_t flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; + if (!visible) + flags |= SDL_WINDOW_HIDDEN; + m_window = SDL_CreateWindow("IPDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); + 800, 600, flags); if (!m_window) { - Fatal("Couldn't create window!"); + Error("Couldn't create window!"); + return; } SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); @@ -46,9 +54,9 @@ Screen::Screen() ogl_LoadFunctions(); // Why is this so horribly broken? - if (ogl_IsVersionGEQ(3,0)) + if (ogl_IsVersionGEQ(3,2)) { - Fatal("We require OpenGL 3.1, but you have version %d.%d!",ogl_GetMajorVersion(), ogl_GetMinorVersion()); + Fatal("We require OpenGL 3.3, but you have version %d.%d!",ogl_GetMajorVersion(), ogl_GetMinorVersion()); } if (!SDL_GL_ExtensionSupported("GL_ARB_shading_language_420pack")) @@ -64,10 +72,12 @@ Screen::Screen() m_frame_begin_time = SDL_GetPerformanceCounter(); m_last_frame_time = 0; m_last_frame_gpu_timer = 0; + glGenQueries(1, &m_frame_gpu_timer); glBeginQuery(GL_TIME_ELAPSED, m_frame_gpu_timer); - + #ifndef __MINGW32__ glDebugMessageCallback(opengl_debug_callback, 0); + #endif GLuint default_vao; glGenVertexArrays(1, &default_vao); @@ -93,9 +103,12 @@ Screen::Screen() m_debug_font_atlas = 0; m_no_quit_requested = true; + m_show_debug_font = true; m_view = NULL; ResizeViewport(800, 600); + + Clear(); Present(); @@ -104,6 +117,8 @@ Screen::Screen() Screen::~Screen() { + if (!Valid()) + return; SDL_GL_DeleteContext(m_gl_context); SDL_DestroyWindow(m_window); SDL_Quit(); @@ -111,6 +126,8 @@ Screen::~Screen() void Screen::Clear(float r, float g, float b, float a) { + if (!Valid()) + return; glClearColor(r,g,b,a); glClear(GL_COLOR_BUFFER_BIT); DebugFontClear(); @@ -127,6 +144,9 @@ void Screen::ResizeViewport(int width, int height) bool Screen::PumpEvents() { + if (!Valid()) + return true; + SDL_Event evt; while (SDL_PollEvent(&evt)) @@ -205,6 +225,8 @@ void Screen::SetMouseCursor(Screen::MouseCursors cursor) void Screen::Present() { + if (!Valid()) + return; if (m_debug_font_atlas) DebugFontFlush(); m_last_frame_time = SDL_GetPerformanceCounter() - m_frame_begin_time; @@ -220,7 +242,7 @@ void Screen::Present() double Screen::GetLastFrameTimeGPU() const { - if (!m_last_frame_gpu_timer) + if (!Valid() || !m_last_frame_gpu_timer) return 0; uint64_t frame_time_ns; glGetQueryObjectui64v(m_last_frame_gpu_timer, GL_QUERY_RESULT, &frame_time_ns); @@ -271,6 +293,7 @@ void Screen::RenderPixels(int x, int y, int w, int h, uint8_t *pixels) const void Screen::ScreenShot(const char * filename) const { + if (!Valid()) return; Debug("Attempting to save BMP to file %s", filename); int w = ViewportWidth(); @@ -309,6 +332,7 @@ void Screen::ScreenShot(const char * filename) const */ void Screen::RenderBMP(const char * filename) const { + if (!Valid()) return; if (access(filename, R_OK) == -1) { Error("No such file \"%s\" - Nothing to render - You might have done this deliberately?", filename); @@ -377,6 +401,8 @@ void Screen::RenderBMP(const char * filename) const void Screen::DebugFontInit(const char *name, float font_size) { + if (!Valid()) return; + unsigned char font_atlas_data[1024*1024]; FILE *font_file = fopen(name, "rb"); fseek(font_file, 0, SEEK_END); @@ -408,6 +434,7 @@ void Screen::DebugFontInit(const char *name, float font_size) void Screen::DebugFontClear() { + if (!Valid()) return; m_debug_font_x = m_debug_font_y = 0; if (!m_debug_font_atlas) return; DebugFontPrint("\n"); @@ -415,6 +442,7 @@ void Screen::DebugFontClear() void Screen::DebugFontFlush() { + if (!Valid()) return; glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 40, -1, "Screen::DebugFontFlush()"); glEnable(GL_BLEND); @@ -454,7 +482,8 @@ struct fontvertex void Screen::DebugFontPrint(const char* str) { - if (!m_debug_font_atlas) return; + if (!Valid()) return; + if (!m_debug_font_atlas || !m_show_debug_font) return; glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 41, -1, "Screen::DebugFontPrint()");