X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fscreen.cpp;h=16a3ab8aec29c55f9f059364d9d40faf5bbb4537;hp=c183bf63366602d03b974a11f36bd12df33cf2ee;hb=f28146cf72fc68c8d3690814b1f89d47b8c4e7b9;hpb=4f60a4a972fa76800580f8731aba54a8fe94e1fb diff --git a/src/screen.cpp b/src/screen.cpp index c183bf6..16a3ab8 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -8,28 +8,40 @@ #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) { - Error("OpenGL Error (%d): %s", id, msg); + // Don't print out gl Errors we generated. + if (source == GL_DEBUG_SOURCE_APPLICATION) return; + //Error("OpenGL Error (%d): %s", id, msg); + // 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); @@ -42,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")) @@ -60,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); @@ -88,10 +102,13 @@ Screen::Screen() m_viewport_ubo.SetType(GraphicsBuffer::BufferTypeUniform); m_debug_font_atlas = 0; - + m_no_quit_requested = true; + m_show_debug_font = true; m_view = NULL; ResizeViewport(800, 600); - + + + Clear(); Present(); @@ -100,6 +117,8 @@ Screen::Screen() Screen::~Screen() { + if (!Valid()) + return; SDL_GL_DeleteContext(m_gl_context); SDL_DestroyWindow(m_window); SDL_Quit(); @@ -107,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(); @@ -123,14 +144,17 @@ void Screen::ResizeViewport(int width, int height) bool Screen::PumpEvents() { + if (!Valid()) + return true; + SDL_Event evt; - bool no_quit_requested = true; + while (SDL_PollEvent(&evt)) { switch (evt.type) { case SDL_QUIT: - no_quit_requested = false; + m_no_quit_requested = false; break; case SDL_WINDOWEVENT: switch (evt.window.event) @@ -179,7 +203,7 @@ bool Screen::PumpEvents() break; } } - return no_quit_requested; + return m_no_quit_requested; } void Screen::SetMouseCursor(Screen::MouseCursors cursor) @@ -201,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; @@ -216,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); @@ -267,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(); @@ -305,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); @@ -373,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); @@ -404,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"); @@ -411,6 +442,7 @@ void Screen::DebugFontClear() void Screen::DebugFontFlush() { + if (!Valid()) return; glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 40, -1, "Screen::DebugFontFlush()"); glEnable(GL_BLEND); @@ -450,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()");