mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-22 02:11:19 +00:00
[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:
parent
25e6865fa5
commit
f2bc5b560f
8 changed files with 45 additions and 31 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue