From 426cbee7524fc6a7a64359b16541db2014ec6c4f Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Sat, 16 Sep 2023 13:45:39 +0800 Subject: [PATCH 1/2] Make flashpals work I hate this --- src/hardware/hw_main.c | 10 ++++++---- src/hardware/r_opengl/r_opengl.c | 32 +++++++++++++++++++++++--------- src/hardware/r_opengl/r_opengl.h | 2 +- src/st_stuff.c | 20 +++++++++----------- src/v_video.c | 15 ++++++++------- 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index e534e4e09..68241585a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -152,7 +152,7 @@ static void CV_grpaletteshader_OnChange(void) HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); gr_use_palette_shader = cv_grpaletteshader.value; //R_ClearColormaps(); - InitPalette(); + InitPalette(0); } } @@ -6156,8 +6156,6 @@ void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, pSurf->PolyColor.s.alpha = alpha; // put the alpha back after lighting - HWD.pfnSetShader(gr_use_palette_shader ? 10 : 2); // wall shader - if (blend & PF_Environment) blendmode |= PF_Occlude; // PF_Occlude must be used for solid objects @@ -6169,6 +6167,8 @@ void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, blendmode |= PF_Modulated; // No PF_Occlude means overlapping (incorrect) transparency + if (!fogwall) + HWD.pfnSetShader(gr_use_palette_shader ? 10 : 2); // wall shader HWD.pfnDrawPolygon(pSurf, wallVerts, 4, blendmode, false); #ifdef WALLSPLATS @@ -6200,7 +6200,7 @@ void HWR_DoPostProcessor(player_t *player) // Armageddon Blast Flash! // Could this even be considered postprocessor? - if (player->flashcount) + if (player->flashcount && !cv_grpaletteshader.value) { FOutVector v[4]; FSurfaceInfo Surf; @@ -6329,6 +6329,8 @@ void HWR_MakeScreenFinalTexture(void) void HWR_DrawScreenFinalTexture(int width, int height) { + if (gr_use_palette_shader) + HWD.pfnSetShader(11); //post processing HWD.pfnDrawScreenFinalTexture(width, height); } diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 49b9726dc..e75ac1e6d 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -751,6 +751,11 @@ static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS]; GLSL_SOFTWARE_PAL_MAIN \ "\0" +#define GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_POSTPROCESS \ + GLSL_SOFTWARE_PAL_UNIFORMS \ + GLSL_SOFTWARE_PAL_MAIN \ + "\0" + // // Water surface shader // @@ -869,6 +874,8 @@ static const char *fragment_shaders[] = { GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_WALLS, + GLSL_SOFTWARE_PAL_FRAGMENT_SHADER_POSTPROCESS, + NULL, }; @@ -1093,16 +1100,21 @@ EXPORT boolean HWRAPI(LoadShaders) (void) if (uniform != -1) \ function (uniform, a); +#define UNIFORM_2(uniform, a, b, function) \ + if (uniform != -1) \ + function (uniform, a, b); + pglUseProgram(shader->program); // texture unit numbers for the samplers used for palette rendering - UNIFORM_1(shader->uniforms[gluniform_palette], 2, pglUniform1i); + UNIFORM_2(shader->uniforms[gluniform_palette], 768, gl_palette, pglUniform1iv); UNIFORM_1(shader->uniforms[gluniform_color_lookup], 1, pglUniform1i); UNIFORM_1(shader->uniforms[gluniform_lighttable_tex], 2, pglUniform1i); pglUseProgram(0); #undef UNIFORM_1 +#undef UNIFORM_2 } #endif @@ -1143,9 +1155,9 @@ EXPORT void HWRAPI(InitCustomShaders) (void) KillShaders(); LoadShaders(); -if (gl_use_palette_shader) + if (gl_use_palette_shader) { - InitPalette(); + InitPalette(0); } #endif } @@ -1193,20 +1205,22 @@ GLuint palette_tex_num; // the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! // the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! -void InitPalette(void) +void InitPalette(int flashnum) { int i, r, g, b; // init the palette - for (i = 0; i < 256; i++) + int flashoffset = flashnum*256; + for (i = 0+flashoffset; i < 256+flashoffset; i++) { + int fi = i-flashoffset; // crush to 16-bit rgb565, like software currently does float fred = (float)(pLocalPalette[i].s.red >> 3); float fgreen = (float)(pLocalPalette[i].s.green >> 2); float fblue = (float)(pLocalPalette[i].s.blue >> 3); // restore to rgb888 - gl_palette[i*3] = (GLint)(fred / 31.0f * 255.0f); - gl_palette[i*3+1] = (GLint)(fgreen / 63.0f * 255.0f); - gl_palette[i*3+2] = (GLint)(fblue / 31.0f * 255.0f); + gl_palette[fi*3] = (GLint)(fred / 31.0f * 255.0f); + gl_palette[fi*3+1] = (GLint)(fgreen / 63.0f * 255.0f); + gl_palette[fi*3+2] = (GLint)(fblue / 31.0f * 255.0f); } // init the palette conversion lookup texture @@ -1593,7 +1607,7 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too if (!gl_palette_initialized) - InitPalette(); // just gonna put this here for now + InitPalette(0); // just gonna put this here for now } diff --git a/src/hardware/r_opengl/r_opengl.h b/src/hardware/r_opengl/r_opengl.h index f4a3f3849..e8ef58a2c 100644 --- a/src/hardware/r_opengl/r_opengl.h +++ b/src/hardware/r_opengl/r_opengl.h @@ -135,6 +135,6 @@ typedef enum // in order for custom playpals n shit to work properly extern boolean gl_palette_initialized; -void InitPalette(void); +void InitPalette(int flashnum); #endif diff --git a/src/st_stuff.c b/src/st_stuff.c index 966a0c9c6..2baa39c1a 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -232,18 +232,22 @@ void ST_doPaletteStuff(void) else palette = 0; + palette = min(max(palette, 0), 13); + #ifdef HWRENDER - if (rendermode == render_opengl) + if (rendermode == render_opengl && !cv_grpaletteshader.value) palette = 0; // No flashpals here in OpenGL #endif - palette = min(max(palette, 0), 13); - if (palette != st_palette) { st_palette = palette; - if (rendermode == render_soft) +#ifdef HWRENDER + if (rendermode != render_none && cv_grpaletteshader.value) +#else + if (rendermode != render_none) +#endif { //V_SetPaletteLump(GetPalette()); // Reset the palette -- is this needed? if (!splitscreen) @@ -2163,13 +2167,7 @@ void ST_Drawer(void) st_palette = -1; // Do red-/gold-shifts from damage/items -#ifdef HWRENDER - //25/08/99: Hurdler: palette changes is done for all players, - // not only player1! That's why this part - // of code is moved somewhere else. - if (rendermode == render_soft) -#endif - if (rendermode != render_none) ST_doPaletteStuff(); + if (rendermode != render_none) ST_doPaletteStuff(); if (st_overlay) { diff --git a/src/v_video.c b/src/v_video.c index 3be8fcf80..c6822e9fa 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -226,11 +226,11 @@ void V_SetPalette(INT32 palettenum) #ifdef HWRENDER if (rendermode != render_soft && rendermode != render_none) { - if (cv_grpaletteshader.value == 1){ - // reset our palette lookups n shit - gl_palette_initialized = false; - InitPalette();} + // reset our palette lookups n shit + gl_palette_initialized = false; + InitPalette(palettenum); + } HWR_SetPalette(&pLocalPalette[palettenum*256]); } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) @@ -247,9 +247,10 @@ void V_SetPaletteLump(const char *pal) #ifdef HWRENDER if (rendermode != render_soft && rendermode != render_none) { if (cv_grpaletteshader.value == 1){ - // reset our palette lookups n shit - gl_palette_initialized = false; - InitPalette();} + // reset our palette lookups n shit + gl_palette_initialized = false; + InitPalette(0); + } HWR_SetPalette(pLocalPalette); } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) -- 2.54.0 From 69237d6a3a8a1b6948ebb2711af17b17df82a574 Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Sun, 17 Sep 2023 07:23:09 +0800 Subject: [PATCH 2/2] Fix stuttering and gamma --- src/hardware/hw_cache.c | 1 - src/hardware/hw_main.c | 3 +- src/hardware/r_opengl/r_opengl.c | 51 ++++++++++++++++++++++---------- src/hardware/r_opengl/r_opengl.h | 2 +- src/v_video.c | 17 +++++++---- 5 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index c27e17a16..bfd5fa26d 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -576,7 +576,6 @@ void HWR_SetPalette(RGBA_t *palette) Z_FreeTags(PU_HWRCACHE_UNLOCKED, PU_HWRCACHE_UNLOCKED); } } - // -------------------------------------------------------------------------- // Make sure texture is downloaded and set it as the source // -------------------------------------------------------------------------- diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 68241585a..d07c3d4c0 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -151,8 +151,7 @@ static void CV_grpaletteshader_OnChange(void) { HWD.pfnSetSpecialState(HWD_SET_PALETTE_SHADER_ENABLED, cv_grpaletteshader.value); gr_use_palette_shader = cv_grpaletteshader.value; - //R_ClearColormaps(); - InitPalette(0); + V_SetPalette(0); } } diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index e75ac1e6d..67eec5058 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -1157,7 +1157,7 @@ EXPORT void HWRAPI(InitCustomShaders) (void) if (gl_use_palette_shader) { - InitPalette(0); + InitPalette(0, false); } #endif } @@ -1205,24 +1205,42 @@ GLuint palette_tex_num; // the +2 in the NearestColor call also needs to be adjusted if LUT_SIZE is changed! // the hardcoded values in the shader also need to be adjusted if LUT_SIZE is changed! -void InitPalette(int flashnum) +void InitPalette(int flashnum, boolean skiplut) { int i, r, g, b; + + //Hudler: 16/10/99: added for OpenGL gamma correction + RGBA_t gamma_correction = {0x7F7F7F7F}; + + //Hurdler 16/10/99: added for OpenGL gamma correction + gamma_correction.s.red = (UINT8)cv_grgammared.value; + gamma_correction.s.green = (UINT8)cv_grgammagreen.value; + gamma_correction.s.blue = (UINT8)cv_grgammablue.value; + // init the palette int flashoffset = flashnum*256; for (i = 0+flashoffset; i < 256+flashoffset; i++) { int fi = i-flashoffset; + + // gamma correction + int pr, pg, pb; + pr = (UINT8)MIN((pLocalPalette[i].s.red*gamma_correction.s.red)/127, 255); + pg = (UINT8)MIN((pLocalPalette[i].s.green*gamma_correction.s.green)/127, 255); + pb = (UINT8)MIN((pLocalPalette[i].s.blue*gamma_correction.s.blue)/127, 255); + // crush to 16-bit rgb565, like software currently does - float fred = (float)(pLocalPalette[i].s.red >> 3); - float fgreen = (float)(pLocalPalette[i].s.green >> 2); - float fblue = (float)(pLocalPalette[i].s.blue >> 3); + float fred = (float)(pr >> 3); + float fgreen = (float)(pg >> 2); + float fblue = (float)(pb >> 3); // restore to rgb888 gl_palette[fi*3] = (GLint)(fred / 31.0f * 255.0f); gl_palette[fi*3+1] = (GLint)(fgreen / 63.0f * 255.0f); gl_palette[fi*3+2] = (GLint)(fblue / 31.0f * 255.0f); } + if (!skiplut) + { // init the palette conversion lookup texture GLubyte *pal_lookup_tex = malloc(LUT_SIZE*LUT_SIZE*LUT_SIZE*sizeof(GLubyte)); @@ -1239,17 +1257,18 @@ void InitPalette(int flashnum) } } } -#undef STEP_SIZE - - pglGenTextures(1, &palette_tex_num); - pglBindTexture(GL_TEXTURE_3D, palette_tex_num); - pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - if (!pglTexImage3D) - I_Error("pglTexImage3D is NULL!"); - pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); - free(pal_lookup_tex); + pglGenTextures(1, &palette_tex_num); + pglBindTexture(GL_TEXTURE_3D, palette_tex_num); + pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + if (!pglTexImage3D) + I_Error("pglTexImage3D is NULL!"); + pglTexImage3D(GL_TEXTURE_3D, 0, GL_R8, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, pal_lookup_tex); + free(pal_lookup_tex); + } +#undef STEP_SIZE + pglUseProgram(gl_shaderprograms[8].program); pglUniform1i(gl_shaderprograms[8].uniforms[gluniform_color_lookup], 1); // bind sampler to second texture unit pglUniform1iv(gl_shaderprograms[8].uniforms[gluniform_palette], 768, gl_palette); @@ -1607,7 +1626,7 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask, pglEnableClientState(GL_TEXTURE_COORD_ARRAY); // And mostly this one, too if (!gl_palette_initialized) - InitPalette(0); // just gonna put this here for now + InitPalette(0, false); // just gonna put this here for now } diff --git a/src/hardware/r_opengl/r_opengl.h b/src/hardware/r_opengl/r_opengl.h index e8ef58a2c..8bce7d15b 100644 --- a/src/hardware/r_opengl/r_opengl.h +++ b/src/hardware/r_opengl/r_opengl.h @@ -135,6 +135,6 @@ typedef enum // in order for custom playpals n shit to work properly extern boolean gl_palette_initialized; -void InitPalette(int flashnum); +void InitPalette(int flashnum, boolean skiplut); #endif diff --git a/src/v_video.c b/src/v_video.c index c6822e9fa..dbe26a001 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -226,12 +226,15 @@ void V_SetPalette(INT32 palettenum) #ifdef HWRENDER if (rendermode != render_soft && rendermode != render_none) { - if (cv_grpaletteshader.value == 1){ + // in palette rendering mode, we already manage our palette ourselves + if (cv_grpaletteshader.value == 1) + { // reset our palette lookups n shit gl_palette_initialized = false; - InitPalette(palettenum); + InitPalette(palettenum, true); } - HWR_SetPalette(&pLocalPalette[palettenum*256]); + else + HWR_SetPalette(pLocalPalette); } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) else @@ -246,12 +249,14 @@ void V_SetPaletteLump(const char *pal) LoadPalette(pal); #ifdef HWRENDER if (rendermode != render_soft && rendermode != render_none) { - if (cv_grpaletteshader.value == 1){ + if (cv_grpaletteshader.value == 1) + { // reset our palette lookups n shit gl_palette_initialized = false; - InitPalette(0); + InitPalette(0, false); } - HWR_SetPalette(pLocalPalette); + else + HWR_SetPalette(pLocalPalette); } #if (defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL) else -- 2.54.0