From b1d8346ed95f356842455fedb415f97d6c4cacb9 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 26 Jul 2024 05:21:47 +0200 Subject: Move glClear and glx/eglSwapBuffers from capture backends to main --- include/egl.h | 3 ++- src/capture/kms.c | 5 ----- src/capture/nvfbc.c | 5 ----- src/capture/portal.c | 5 ----- src/capture/xcomposite.c | 5 ----- src/egl.c | 9 ++++++++- src/main.cpp | 7 +++++-- 7 files changed, 15 insertions(+), 24 deletions(-) diff --git a/include/egl.h b/include/egl.h index c1e0aea..a2228f5 100644 --- a/include/egl.h +++ b/include/egl.h @@ -250,7 +250,6 @@ struct gsr_egl { void (*glTexImage2D)(unsigned int target, int level, int internalFormat, int width, int height, int border, unsigned int format, unsigned int type, const void *pixels); void (*glTexSubImage2D)(unsigned int target, int level, int xoffset, int yoffset, int width, int height, unsigned int format, unsigned int type, const void *pixels); void (*glCopyImageSubData)(unsigned int srcName, unsigned int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, unsigned int dstName, unsigned int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int srcWidth, int srcHeight, int srcDepth); - void (*glClearTexImage)(unsigned int texture, unsigned int level, unsigned int format, unsigned int type, const void *data); void (*glGetTexImage)(unsigned int target, int level, unsigned int format, unsigned int type, void *pixels); void (*glGenFramebuffers)(int n, unsigned int *framebuffers); void (*glBindFramebuffer)(unsigned int target, unsigned int framebuffer); @@ -298,5 +297,7 @@ bool gsr_egl_load(gsr_egl *self, Display *dpy, bool wayland, bool is_monitor_cap void gsr_egl_unload(gsr_egl *self); void gsr_egl_update(gsr_egl *self); +/* Does opengl swap with egl or glx, depending on which one is active */ +void gsr_egl_swap_buffers(gsr_egl *self); #endif /* GSR_EGL_H */ diff --git a/src/capture/kms.c b/src/capture/kms.c index b3b4be2..5d0aed3 100644 --- a/src/capture/kms.c +++ b/src/capture/kms.c @@ -275,9 +275,6 @@ static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_c gsr_capture_kms *self = cap->priv; const bool cursor_texture_id_is_external = self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_NVIDIA; - //egl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - self->params.egl->glClear(0); - gsr_capture_kms_cleanup_kms_fds(self); gsr_kms_response_item *drm_fd = NULL; @@ -457,8 +454,6 @@ static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_c self->params.egl->glDisable(GL_SCISSOR_TEST); } - self->params.egl->eglSwapBuffers(self->params.egl->egl_display, self->params.egl->egl_surface); - //self->params.egl->glFlush(); //self->params.egl->glFinish(); diff --git a/src/capture/nvfbc.c b/src/capture/nvfbc.c index 134480d..1944dcc 100644 --- a/src/capture/nvfbc.c +++ b/src/capture/nvfbc.c @@ -418,16 +418,11 @@ static int gsr_capture_nvfbc_capture(gsr_capture *cap, AVFrame *frame, gsr_color return 0; } - //cap_nvfbc->params.egl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - cap_nvfbc->params.egl->glClear(0); - gsr_color_conversion_draw(color_conversion, cap_nvfbc->setup_params.dwTextures[grab_params.dwTextureIndex], (vec2i){0, 0}, (vec2i){frame->width, frame->height}, (vec2i){0, 0}, (vec2i){frame->width, frame->height}, 0.0f, false); - cap_nvfbc->params.egl->glXSwapBuffers(cap_nvfbc->params.egl->x11.dpy, cap_nvfbc->params.egl->x11.window); - return 0; } diff --git a/src/capture/portal.c b/src/capture/portal.c index 092fd9f..a53f0a1 100644 --- a/src/capture/portal.c +++ b/src/capture/portal.c @@ -297,9 +297,6 @@ static int gsr_capture_portal_capture(gsr_capture *cap, AVFrame *frame, gsr_colo gsr_capture_portal_cleanup_plane_fds(self); - //egl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - self->params.egl->glClear(0); - /* TODO: Handle formats other than RGB(a) */ gsr_pipewire_region region = {0, 0, 0, 0}; gsr_pipewire_region cursor_region = {0, 0, 0, 0}; @@ -332,8 +329,6 @@ static int gsr_capture_portal_capture(gsr_capture *cap, AVFrame *frame, gsr_colo 0.0f, false); self->params.egl->glDisable(GL_SCISSOR_TEST); - self->params.egl->eglSwapBuffers(self->params.egl->egl_display, self->params.egl->egl_surface); - //self->params.egl->glFlush(); //self->params.egl->glFinish(); diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c index 7e78fb9..a81c19f 100644 --- a/src/capture/xcomposite.c +++ b/src/capture/xcomposite.c @@ -317,9 +317,6 @@ static int gsr_capture_xcomposite_capture(gsr_capture *cap, AVFrame *frame, gsr_ gsr_capture_xcomposite *self = cap->priv; (void)frame; - //self->params.egl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - self->params.egl->glClear(0); - if(self->clear_background) { self->clear_background = false; gsr_color_conversion_clear(color_conversion); @@ -352,8 +349,6 @@ static int gsr_capture_xcomposite_capture(gsr_capture *cap, AVFrame *frame, gsr_ self->params.egl->glDisable(GL_SCISSOR_TEST); } - self->params.egl->eglSwapBuffers(self->params.egl->egl_display, self->params.egl->egl_surface); - // TODO: Do video encoder specific conversion here //self->params.egl->glFlush(); diff --git a/src/egl.c b/src/egl.c index 3d4c5c7..da8dc9f 100644 --- a/src/egl.c +++ b/src/egl.c @@ -419,7 +419,6 @@ static bool gsr_egl_load_gl(gsr_egl *self, void *library) { { (void**)&self->glTexSubImage2D, "glTexSubImage2D" }, { (void**)&self->glCopyImageSubData, "glCopyImageSubData" }, { (void**)&self->glGetTexImage, "glGetTexImage" }, - { (void**)&self->glClearTexImage, "glClearTexImage" }, { (void**)&self->glGenFramebuffers, "glGenFramebuffers" }, { (void**)&self->glBindFramebuffer, "glBindFramebuffer" }, { (void**)&self->glDeleteFramebuffers, "glDeleteFramebuffers" }, @@ -651,3 +650,11 @@ void gsr_egl_update(gsr_egl *self) { // TODO: pselect on wl_display_get_fd before doing dispatch wl_display_dispatch(self->wayland.dpy); } + +void gsr_egl_swap_buffers(gsr_egl *self) { + if(self->egl_display) { + self->eglSwapBuffers(self->egl_display, self->egl_surface); + } else if(self->x11.window) { + self->glXSwapBuffers(self->x11.dpy, self->x11.window); + } +} diff --git a/src/main.cpp b/src/main.cpp index 2c6bced..48d94f2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1731,7 +1731,7 @@ static void list_supported_capture_options(gsr_egl *egl, bool wayland) { #endif } -static void list_command() { +static void info_command() { bool wayland = false; Display *dpy = XOpenDisplay(nullptr); if (!dpy) { @@ -2022,7 +2022,7 @@ int main(int argc, char **argv) { usage_full(); if(argc == 2 && strcmp(argv[1], "--info") == 0) { - list_command(); + info_command(); _exit(0); } @@ -3154,7 +3154,10 @@ int main(int argc, char **argv) { const int num_frames = framerate_mode == FramerateMode::CONSTANT ? std::max((int64_t)0LL, expected_frames - video_pts_counter) : 1; if(num_frames > 0 && !paused) { + egl.glClear(0); gsr_capture_capture(capture, video_frame, &color_conversion); + gsr_egl_swap_buffers(&egl); + gsr_video_encoder_copy_textures_to_frame(video_encoder, video_frame); if(hdr && !hdr_metadata_set && replay_buffer_size_secs == -1 && add_hdr_metadata_to_video_stream(capture, video_stream)) -- cgit v1.2.3