diff --git a/include/QF/Vulkan/render.h b/include/QF/Vulkan/render.h index ed0c0e6ab..51a51f33a 100644 --- a/include/QF/Vulkan/render.h +++ b/include/QF/Vulkan/render.h @@ -422,6 +422,7 @@ typedef struct qfv_renderctx_s { qfv_job_t *job; qfv_renderframeset_t frames; int64_t size_time; + struct imui_window_s *job_window; } qfv_renderctx_t; typedef struct qfv_taskctx_s { @@ -454,6 +455,10 @@ VkSampler QFV_Render_Sampler (struct vulkan_ctx_s *ctx, const char *name); qfv_step_t *QFV_GetStep (const exprval_t *param, qfv_job_t *job); qfv_step_t *QFV_FindStep (const char *step, qfv_job_t *job) __attribute__((pure)); +struct imui_ctx_s; +void QFV_Render_UI (struct vulkan_ctx_s *ctx, struct imui_ctx_s *imui_ctx); +void QFV_Render_UI_Shutdown (struct vulkan_ctx_s *ctx); + #endif//__QFCC__ #endif//__QF_Vulkan_render_h diff --git a/libs/video/renderer/Makemodule.am b/libs/video/renderer/Makemodule.am index ac47caab1..275ab5aaf 100644 --- a/libs/video/renderer/Makemodule.am +++ b/libs/video/renderer/Makemodule.am @@ -227,6 +227,7 @@ libs_video_renderer_librender_vulkan_la_SOURCES = \ libs/video/renderer/vulkan/projection.c \ libs/video/renderer/vulkan/render.c \ libs/video/renderer/vulkan/render_load.c \ + libs/video/renderer/vulkan/render_ui.c \ libs/video/renderer/vulkan/resource.c \ libs/video/renderer/vulkan/scrap.c \ libs/video/renderer/vulkan/shader.c \ diff --git a/libs/video/renderer/vid_render_vulkan.c b/libs/video/renderer/vid_render_vulkan.c index 3d67f2b67..68f7ee06d 100644 --- a/libs/video/renderer/vid_render_vulkan.c +++ b/libs/video/renderer/vid_render_vulkan.c @@ -68,7 +68,7 @@ #include "QF/Vulkan/render.h" #include "QF/Vulkan/staging.h" #include "QF/Vulkan/swapchain.h" -#include "QF/ui/view.h" +#include "QF/ui/imui.h" #include "QF/scene/entity.h" #include "QF/scene/scene.h" @@ -367,6 +367,16 @@ vulkan_capture_screen (capfunc_t callback, void *data) QFV_Capture_Screen (vulkan_ctx, callback, data); } +static void +vulkan_debug_ui (struct imui_ctx_s *imui_ctx) +{ +#define IMUI_context imui_ctx + UI_ExtendPanel ("Renderer##menu") { + QFV_Render_UI (vulkan_ctx, imui_ctx); + } +#undef IMUI_context +} + static void vulkan_Mod_LoadLighting (model_t *mod, bsp_t *bsp) { @@ -603,6 +613,8 @@ vid_render_funcs_t vulkan_vid_render_funcs = { .capture_screen = vulkan_capture_screen, + .debug_ui = vulkan_debug_ui, + .model_funcs = &model_funcs }; diff --git a/libs/video/renderer/vulkan/render.c b/libs/video/renderer/vulkan/render.c index fceb30807..f25624420 100644 --- a/libs/video/renderer/vulkan/render.c +++ b/libs/video/renderer/vulkan/render.c @@ -556,6 +556,9 @@ QFV_Render_Shutdown (vulkan_ctx_t *ctx) } } Hash_DelContext (rctx->hashctx); + + QFV_Render_UI_Shutdown (ctx); + free (rctx); } void diff --git a/libs/video/renderer/vulkan/render_ui.c b/libs/video/renderer/vulkan/render_ui.c new file mode 100644 index 000000000..76750068c --- /dev/null +++ b/libs/video/renderer/vulkan/render_ui.c @@ -0,0 +1,84 @@ +/* + render_ui.c + + Vulkan render manager UI + + Copyright (C) 2023 Bill Currie + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "QF/va.h" +#include "QF/ui/imui.h" + +#include "QF/Vulkan/render.h" +#include "vid_vulkan.h" + +#define IMUI_context imui_ctx + +static void +job_window (vulkan_ctx_t *ctx, imui_ctx_t *imui_ctx) +{ + auto rctx = ctx->render_context; + if (!rctx->job_window) { + rctx->job_window = malloc (sizeof (imui_window_t)); + *rctx->job_window = (imui_window_t) { + .name = nva ("Job##%p.window", rctx), + .xpos = 100, + .ypos = 50, + }; + } + UI_Window (rctx->job_window) { + if (rctx->job_window->is_collapsed) { + continue; + } + auto job = rctx->job; + for (uint32_t i = 0; i < job->num_steps; i++) { + auto step = &job->steps[i]; + UI_Horizontal { + UI_Labelf ("%s##%p.job.step.%d", step->label.name, rctx, i); + UI_FlexibleSpace (); + } + } + } +} + +void +QFV_Render_UI (vulkan_ctx_t *ctx, imui_ctx_t *imui_ctx) +{ + auto rctx = ctx->render_context; + if (UI_Button (va (ctx->va_ctx, "Job##%p", rctx))) { + rctx->job_window->is_open = true; + } + job_window (ctx, imui_ctx); +} + +void +QFV_Render_UI_Shutdown (vulkan_ctx_t *ctx) +{ + auto rctx = ctx->render_context; + if (rctx->job_window) { + free ((char *) rctx->job_window->name); + free (rctx->job_window); + } +}