From f2bc5b560fcee63b8847323f2a89e8d9ade9cdb8 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 26 Mar 2022 00:29:34 +0900 Subject: [PATCH] [renderer] Clean up post processing While it's not where I want it to be, it at least now no longer messes with frame buffer binding or the view ports. This involved switching around buffers in D_WarpScreen so that the main buffer could be bound before post-processing. --- include/QF/plugin/vid_render.h | 2 ++ include/d_iface.h | 2 +- libs/video/renderer/r_screen.c | 15 +++++---------- libs/video/renderer/sw/d_scan.c | 14 +++++++------- libs/video/renderer/vid_render_gl.c | 6 ++++++ libs/video/renderer/vid_render_glsl.c | 16 +++++++++++----- libs/video/renderer/vid_render_sw.c | 15 +++++++-------- libs/video/renderer/vid_render_vulkan.c | 6 ++++++ 8 files changed, 45 insertions(+), 31 deletions(-) diff --git a/include/QF/plugin/vid_render.h b/include/QF/plugin/vid_render.h index 3cb8b46b1..e7027d07d 100644 --- a/include/QF/plugin/vid_render.h +++ b/include/QF/plugin/vid_render.h @@ -41,6 +41,7 @@ struct mod_alias_ctx_s; struct mod_sprite_ctx_s; struct entqueue_s; struct framebuffer_s; +struct vrect_s; /* All video plugins must export these functions @@ -120,6 +121,7 @@ typedef struct vid_render_funcs_s { struct framebuffer_s *(*create_cube_map) (int side); struct framebuffer_s *(*create_frame_buffer) (int width, int height); void (*bind_framebuffer) (struct framebuffer_s *framebuffer); + void (*set_viewport) (const struct vrect_s *view); vid_model_funcs_t *model_funcs; } vid_render_funcs_t; diff --git a/include/d_iface.h b/include/d_iface.h index 7f12523ac..77529dc55 100644 --- a/include/d_iface.h +++ b/include/d_iface.h @@ -159,7 +159,7 @@ void D_Init_Cvars (void); void D_ViewChanged (void); void D_SetupFrame (void); void D_TurnZOn (void); -void D_WarpScreen (void); +void D_WarpScreen (framebuffer_t *src); void D_FillRect (vrect_t *vrect, int color); void D_DrawRect (void); diff --git a/libs/video/renderer/r_screen.c b/libs/video/renderer/r_screen.c index cf098233f..4de6c3881 100644 --- a/libs/video/renderer/r_screen.c +++ b/libs/video/renderer/r_screen.c @@ -221,15 +221,6 @@ render_side (int side) memcpy (r_refdef.camera_inverse, camera_inverse, sizeof (camera_inverse)); } -/* - SCR_UpdateScreen - - This is called every frame, and can also be called explicitly to flush - text to the screen. - - WARNING: be very careful calling this from elsewhere, because the refresh - needs almost the entire 256k of stack space! -*/ void SCR_UpdateScreen (transform_t *camera, double realtime, SCR_Func *scr_funcs) { @@ -307,10 +298,14 @@ SCR_UpdateScreen (transform_t *camera, double realtime, SCR_Func *scr_funcs) default:render_side (BOX_FRONT); } r_funcs->bind_framebuffer (0); + r_funcs->set_viewport (&r_refdef.vrect); r_funcs->post_process (fisheye_cube_map); } else { render_scene (); - r_funcs->post_process (warp_buffer); + if (r_dowarp) { + r_funcs->bind_framebuffer (0); + r_funcs->post_process (warp_buffer); + } } r_funcs->set_2d (0); view_draw (r_data->scr_view); diff --git a/libs/video/renderer/sw/d_scan.c b/libs/video/renderer/sw/d_scan.c index 65eda134c..bb3151500 100644 --- a/libs/video/renderer/sw/d_scan.c +++ b/libs/video/renderer/sw/d_scan.c @@ -48,9 +48,9 @@ int r_turb_spancount; the sine warp, to keep the edges from wrapping */ void -D_WarpScreen (void) +D_WarpScreen (framebuffer_t *src) { - sw_framebuffer_t *_swfb = sw_ctx->framebuffer->buffer; + sw_framebuffer_t *buffer = src->buffer; int w, h; int u, v; int scr_x = vr_data.scr_view->xpos; @@ -61,8 +61,8 @@ D_WarpScreen (void) int *turb; int *col; byte **row; - byte *color = _swfb->color; - int rowbytes = _swfb->rowbytes; + byte *color = buffer->color; + int rowbytes = buffer->rowbytes; /* FIXME: allocate these arrays properly */ byte *rowptr[MAXHEIGHT + AMP2 * 2]; @@ -76,7 +76,7 @@ D_WarpScreen (void) hratio = h / (float) scr_h; for (v = 0; v < scr_h + AMP2 * 2; v++) { - rowptr[v] = d_viewbuffer + (0*r_refdef.vrect.y * d_rowbytes) + + rowptr[v] = color + (0*r_refdef.vrect.y * rowbytes) + (d_rowbytes * (int) ((float) v * hratio * h / (h + AMP2 * 2))); } @@ -86,9 +86,9 @@ D_WarpScreen (void) } turb = intsintable + ((int) (vr_data.realtime * SPEED) & (CYCLE - 1)); - dest = color + scr_y * rowbytes + scr_x; + dest = d_viewbuffer + scr_y * d_rowbytes + scr_x; - for (v = 0; v < scr_h; v++, dest += rowbytes) { + for (v = 0; v < scr_h; v++, dest += d_rowbytes) { col = &column[turb[v]]; row = &rowptr[v]; for (u = 0; u < scr_w; u += 4) { diff --git a/libs/video/renderer/vid_render_gl.c b/libs/video/renderer/vid_render_gl.c index 9647c01aa..798b3bac7 100644 --- a/libs/video/renderer/vid_render_gl.c +++ b/libs/video/renderer/vid_render_gl.c @@ -322,6 +322,11 @@ gl_bind_framebuffer (framebuffer_t *framebuffer) { } +static void +gl_set_viewport (const vrect_t *view) +{ +} + vid_render_funcs_t gl_vid_render_funcs = { gl_vid_render_init, gl_Draw_Character, @@ -366,6 +371,7 @@ vid_render_funcs_t gl_vid_render_funcs = { gl_create_cube_map, gl_create_frame_buffer, gl_bind_framebuffer, + gl_set_viewport, &model_funcs }; diff --git a/libs/video/renderer/vid_render_glsl.c b/libs/video/renderer/vid_render_glsl.c index aeb936d40..58f72e5ad 100644 --- a/libs/video/renderer/vid_render_glsl.c +++ b/libs/video/renderer/vid_render_glsl.c @@ -237,11 +237,6 @@ static void glsl_post_process (framebuffer_t *src) { glsl_bind_framebuffer (0); - float x = r_refdef.vrect.x; - float y = (vid.height - (r_refdef.vrect.y + r_refdef.vrect.height)); - float w = r_refdef.vrect.width; - float h = r_refdef.vrect.height; - qfeglViewport (x, y, w, h); if (scr_fisheye->int_val) { glsl_FisheyeScreen (src); } else if (r_dowarp) { @@ -377,6 +372,16 @@ glsl_bind_framebuffer (framebuffer_t *framebuffer) glsl_R_ViewChanged (); } +static void +glsl_set_viewport (const vrect_t *view) +{ + float x = view->x; + float y = vid.height - (view->y + view->height); + float w = view->width; + float h = view->height; + qfeglViewport (x, y, w, h); +} + vid_render_funcs_t glsl_vid_render_funcs = { glsl_vid_render_init, glsl_Draw_Character, @@ -421,6 +426,7 @@ vid_render_funcs_t glsl_vid_render_funcs = { glsl_create_cube_map, glsl_create_frame_buffer, glsl_bind_framebuffer, + glsl_set_viewport, &model_funcs }; diff --git a/libs/video/renderer/vid_render_sw.c b/libs/video/renderer/vid_render_sw.c index 8c31e703e..bfc881de6 100644 --- a/libs/video/renderer/vid_render_sw.c +++ b/libs/video/renderer/vid_render_sw.c @@ -159,17 +159,10 @@ sw_draw_transparent (void) static void sw_post_process (framebuffer_t *src) { - int bind = 0; - if (scr_fisheye->int_val) { R_RenderFisheye (src); - bind = 1; } else if (r_dowarp) { - D_WarpScreen (); - bind = 1; - } - if (bind) { - sw_bind_framebuffer (0); + D_WarpScreen (src); } } @@ -300,6 +293,11 @@ sw_bind_framebuffer (framebuffer_t *framebuffer) } } +static void +sw_set_viewport (const vrect_t *view) +{ +} + vid_render_funcs_t sw_vid_render_funcs = { sw_vid_render_init, Draw_Character, @@ -344,6 +342,7 @@ vid_render_funcs_t sw_vid_render_funcs = { sw_create_cube_map, sw_create_frame_buffer, sw_bind_framebuffer, + sw_set_viewport, &model_funcs }; diff --git a/libs/video/renderer/vid_render_vulkan.c b/libs/video/renderer/vid_render_vulkan.c index df86644dc..95fdb8642 100644 --- a/libs/video/renderer/vid_render_vulkan.c +++ b/libs/video/renderer/vid_render_vulkan.c @@ -440,6 +440,11 @@ vulkan_bind_framebuffer (framebuffer_t *framebuffer) { } +static void +vulkan_set_viewport (const vrect_t *view) +{ +} + static int is_bgr (VkFormat format) { @@ -723,6 +728,7 @@ vid_render_funcs_t vulkan_vid_render_funcs = { vulkan_create_cube_map, vulkan_create_frame_buffer, vulkan_bind_framebuffer, + vulkan_set_viewport, &model_funcs };