[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.
This commit is contained in:
Bill Currie 2022-03-26 00:29:34 +09:00
parent 25e6865fa5
commit f2bc5b560f
8 changed files with 45 additions and 31 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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) {

View file

@ -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
};

View file

@ -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
};

View file

@ -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
};

View file

@ -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
};