Make the window invisible if dumping to stdout

Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
This commit is contained in:
David Oberhollenzer 2022-07-17 02:33:15 +02:00
parent 319b283868
commit f21ecc71c7
3 changed files with 51 additions and 28 deletions

View file

@ -223,26 +223,41 @@ int main(int argc, char **argv)
glBindTexture(GL_TEXTURE_2D, fbo_tex); glBindTexture(GL_TEXTURE_2D, fbo_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL); GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
fbo_tex, 0); fbo_tex, 0);
} else {
window_show(wnd);
} }
/******************** drawing loop ********************/ /******************** drawing loop ********************/
while (window_handle_events()) { while (to_stdout || window_handle_events()) {
/* render image to FBO */ /* render image to FBO */
if (to_stdout)
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
clock_gettime(CLOCK_MONOTONIC_RAW, &frame_start); clock_gettime(CLOCK_MONOTONIC_RAW, &frame_start);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
if (!to_stdout) if (to_stdout) {
glFlush();
} else {
window_swap_buffers(wnd); window_swap_buffers(wnd);
}
/* get image from FBO, dump to stdout */
if (to_stdout) {
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA,
GL_UNSIGNED_BYTE, fb32);
convert_for_ffmpeg(fb32, fb24, width, height);
if (write_retry(STDOUT_FILENO, fb24,
width * height * 3)) {
break;
}
}
/* update timers */
clock_gettime(CLOCK_MONOTONIC_RAW, &frame_end); clock_gettime(CLOCK_MONOTONIC_RAW, &frame_end);
iFrame += 1; iFrame += 1;
@ -252,23 +267,6 @@ int main(int argc, char **argv)
glUniform1f(u_iTimeDelta, iTimeDelta); glUniform1f(u_iTimeDelta, iTimeDelta);
glUniform1f(u_iTime, iTime); glUniform1f(u_iTime, iTime);
glUniform1ui(u_iFrame, iFrame); glUniform1ui(u_iFrame, iFrame);
if (to_stdout) {
/* get image from FBO */
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, fbo_tex);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA,
GL_UNSIGNED_BYTE, fb32);
glBindTexture(GL_TEXTURE_2D, 0);
/* convert to 24 bps and dump to stdout */
convert_for_ffmpeg(fb32, fb24, width, height);
if (write_retry(STDOUT_FILENO, fb24,
width * height * 3)) {
break;
}
}
} }
/******************** cleanup ********************/ /******************** cleanup ********************/

View file

@ -36,6 +36,10 @@ void window_set_vsync(window *wnd, int enable);
void window_destroy(window *wnd); void window_destroy(window *wnd);
void window_show(window *wnd);
void window_hide(window *wnd);
bool window_handle_events(void); bool window_handle_events(void);

View file

@ -194,12 +194,9 @@ window *window_create(unsigned int width, unsigned int height,
XSaveContext(x11_globals.dpy, this->wnd, XSaveContext(x11_globals.dpy, this->wnd,
x11_globals.xctx, (XPointer)this); x11_globals.xctx, (XPointer)this);
/* set the caption and make the window visible */ /* set the caption */
XStoreName(x11_globals.dpy, this->wnd, caption); XStoreName(x11_globals.dpy, this->wnd, caption);
XMapWindow(x11_globals.dpy, this->wnd); this->visible = false;
this->visible = true;
x11_globals.vis_wnd_count += 1;
/* flush any pending requests to the X Server */ /* flush any pending requests to the X Server */
XFlush(x11_globals.dpy); XFlush(x11_globals.dpy);
@ -251,6 +248,30 @@ void window_destroy(window *this)
free(this); free(this);
} }
void window_show(window *this)
{
if (this->visible)
return;
XMapWindow(x11_globals.dpy, this->wnd);
XFlush(x11_globals.dpy);
this->visible = true;
x11_globals.vis_wnd_count += 1;
}
void window_hide(window *this)
{
if (!this->visible)
return;
XUnmapWindow(x11_globals.dpy, this->wnd);
XFlush(x11_globals.dpy);
this->visible = false;
x11_globals.vis_wnd_count -= 1;
}
bool window_handle_events(void) bool window_handle_events(void)
{ {
window *wnd; window *wnd;