From dcc3e11287e3b0dabac2a9cfd286c26f72386b5f Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 3 Feb 2018 13:50:47 +0100 Subject: [PATCH] renderbuffer should work without OpenGL --- hyper.h | 17 +++++--- renderbuffer.cpp | 106 +++++++++++++++++++++++++++++++---------------- rug.cpp | 10 +++-- 3 files changed, 89 insertions(+), 44 deletions(-) diff --git a/hyper.h b/hyper.h index 0edf0f1d..52deb545 100644 --- a/hyper.h +++ b/hyper.h @@ -2515,20 +2515,27 @@ bool is_cell_removed(cell *c); void set_if_removed(cell*& c, cell *val); struct renderbuffer { - int x, y, tx, ty; + bool valid; + int x, y; + + #if CAP_GL + int tx, ty; GLuint FramebufferName; GLuint renderedTexture; GLuint depth_stencil_rb; - SDL_Surface *srf; Uint32 *expanded_data; - + void use_as_texture(); + #endif + #if CAP_SDL + SDL_Surface *srf; void make_surface(); + SDL_Surface *render(); + #endif + renderbuffer(int x, int y, bool gl); ~renderbuffer(); void enable(); void disable(); - SDL_Surface *render(); - void use_as_texture(); void clear(int col); }; diff --git a/renderbuffer.cpp b/renderbuffer.cpp index 24f86a00..f9a16f28 100644 --- a/renderbuffer.cpp +++ b/renderbuffer.cpp @@ -1,3 +1,4 @@ +#if CAP_GL #if !CAP_GLEW #if ISLINUX extern "C" { @@ -19,12 +20,21 @@ GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers) #define glFramebufferTexture glFramebufferTextureEXT #endif #endif +#endif renderbuffer::renderbuffer(int x, int y, bool gl) : x(x), y(y) { - FramebufferName = renderedTexture = depth_stencil_rb = 0; - srf = NULL; expanded_data = NULL; + valid = false; + + #if CAP_GL + FramebufferName = renderedTexture = depth_stencil_rb = 0; expanded_data = NULL; + #endif + + #if CAP_SDL + srf = NULL; + #endif + # if CAP_GL if(gl) { tx = next_p2(x); ty = next_p2(y); @@ -66,30 +76,65 @@ renderbuffer::renderbuffer(int x, int y, bool gl) : x(x), y(y) { if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) FramebufferName = renderedTexture = 0; + else + valid = true; } - - if(!FramebufferName) + #endif + + #if CAP_SDL + if(!valid) make_surface(); + #endif } +#if CAP_SDL void renderbuffer::make_surface() { if(!srf) srf = SDL_CreateRGBSurface(SDL_SWSURFACE, x, y, 32,0xff0000,0xff00,0xff,0xff000000); } - + +SDL_Surface *renderbuffer::render() { + make_surface(); + if(FramebufferName) { + glReadPixels(0, 0, vid.xres, vid.yres, GL_BGRA, GL_UNSIGNED_BYTE, srf->pixels); + for(int y=0; yw,s_screen->h); + return; + } + #endif + #if CAP_SDL + s = s_screen; + #endif + } + +#if CAP_GL void renderbuffer::use_as_texture() { if(!renderedTexture) { glGenTextures( 1, &renderedTexture); @@ -109,44 +154,33 @@ void renderbuffer::use_as_texture() { glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tx, ty, 0, GL_BGRA, GL_UNSIGNED_BYTE, expanded_data ); } } +#endif -void renderbuffer::disable() { - if(FramebufferName) { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glViewport(0,0,s_screen->w,s_screen->h); - } - else { - s = s_screen; - } - } - renderbuffer::~renderbuffer() { +#if CAP_GL if(renderedTexture) glDeleteTextures(1, &renderedTexture); if(FramebufferName) { glDeleteRenderbuffers(1, &depth_stencil_rb); glDeleteFramebuffers(1, &FramebufferName); } - if(srf) - SDL_FreeSurface(srf); if(expanded_data) delete[] expanded_data; - } - -SDL_Surface *renderbuffer::render() { - make_surface(); - if(FramebufferName) { - glReadPixels(0, 0, vid.xres, vid.yres, GL_BGRA, GL_UNSIGNED_BYTE, srf->pixels); - for(int y=0; y 100) scale = 1; glbuf = new renderbuffer(TEXTURESIZE, TEXTURESIZE, vid.usingGL && !rendernogl); + if(!glbuf->valid) { + addMessage(XLAT("Failed to enable")); + delete glbuf; + return; + } + rugged = true; if(renderonce) prepareTexture(); if(!rugged) return; @@ -1591,7 +1595,7 @@ void show() { #endif else if(uni == 's' && !rug::rugged) { texturesize *= 2; - if(texturesize == 8192) texturesize = 128; + if(texturesize == 8192) texturesize = 64; } else if(handlekeys(sym, uni)) ; else if(doexiton(sym, uni)) popScreen();