From: John Tsiombikas Date: Sun, 15 Jan 2023 00:22:18 +0000 (+0200) Subject: foo X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=vktest3;a=commitdiff_plain;h=51c70e21b25d107c4d86c6ae0c16eac7e0fff22a foo --- diff --git a/src/app.c b/src/app.c index 9a72309..ae0a1f1 100644 --- a/src/app.c +++ b/src/app.c @@ -1,9 +1,14 @@ #include #include +#include #include "app.h" #include "vk.h" -static VkSemaphore sem_getimg; +int win_width, win_height; + +static int rpass, pipeln, fb; +static VkSemaphore sem_getimg, sem_draw; +static VkQueue queue; int app_init(void) { @@ -13,6 +18,19 @@ int app_init(void) return -1; } + if(!(queue = vk_getq(VKQ_GFX | VKQ_PRESENT, 0))) { + return -1; + } + + rpass = vk_create_rpass(); + + fb = vk_create_fb(); + vk_fb_size(fb, win_width, win_height); + vk_fb_rpass(fb, rpass); + + pipeln = vk_create_pipeln(); + vk_pipeln_ + sem_getimg = vk_create_sem(); sem_draw = vk_create_sem(); return 0; @@ -35,13 +53,33 @@ void app_display(void) imgid = vk_next_image(sem_getimg); cmdbuf = vk_get_cmdbuf(imgid); - /* TODO record */ + { + VkCommandBufferBeginInfo cmdbegin = {0}; + VkRenderPassBeginInfo rpbegin = {0}; + VkClearValue clear; + + cmdbegin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdbegin.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; + + if(vkBeginCommandBuffer(cmdbuf, &cmdbegin) != 0) { + fprintf(stderr, "failed to begin command buffer recording\n"); + abort(); + } + + clear.color.float32[0] = 0.5f; + clear.color.float32[1] = 0.1f; + clear.color.float32[2] = 0.2f; + clear.color.float32[3] = 1.0f; + + rpbegin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + rpbegin.renderPass = + } /* submit the command buffer, wait for one semaphore, signal another */ - vk_submit(cmdbuf, sem_getimg, sem_draw); + vk_submit(queue, cmdbuf, sem_getimg, sem_draw); /* swap buffers after drawing is finished */ - vk_present(sem_draw); + vk_present(queue, imgid, sem_draw); } void app_reshape(int x, int y) diff --git a/src/app.h b/src/app.h index 4f891e7..07f92c2 100644 --- a/src/app.h +++ b/src/app.h @@ -7,6 +7,8 @@ enum { KEY_PGUP, KEY_PGDOWN }; +extern int win_width, win_height; + int app_init(void); void app_cleanup(void); diff --git a/src/main_x11.c b/src/main_x11.c index 6ff15b8..df884d0 100644 --- a/src/main_x11.c +++ b/src/main_x11.c @@ -14,7 +14,7 @@ static Window win, root_win; static int xscr; static Atom xa_wm_proto, xa_wm_del_win; static int reshape_pending, quit; -static int win_width, win_height, win_mapped; +static int win_mapped; int main(int argc, char **argv) { @@ -34,6 +34,9 @@ int main(int argc, char **argv) } vk_init_xwin(dpy, win); + win_width = 1280; + win_height = 800; + if(app_init() == -1) { goto end; } diff --git a/src/vk.c b/src/vk.c index ebc31ae..f5557b3 100644 --- a/src/vk.c +++ b/src/vk.c @@ -253,6 +253,45 @@ int vk_next_image(VkSemaphore sem) return (int)idx; } +int vk_submit(VkQueue q, VkCommandBuffer cmdbuf, VkSemaphore semwait, VkSemaphore semsig) +{ + /* TODO: investigate if we need to expose the wait stage */ + VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + VkSubmitInfo sinf = {0}; + sinf.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + sinf.waitSemaphoreCount = semwait ? 1 : 0; + sinf.pWaitSemaphores = &semwait; + sinf.pWaitDstStageMask = &wait_stage; + sinf.commandBufferCount = 1; + sinf.pCommandBuffers = &cmdbuf; + sinf.signalSemaphoreCount = semsig ? 1 : 0; + sinf.pSignalSemaphores = &semsig; + + if(vkQueueSubmit(q, 1, &sinf, 0) != 0) { + fprintf(stderr, "failed to submit command buffer\n"); + return -1; + } + return 0; +} + +int vk_present(VkQueue q, int imgid, VkSemaphore semwait) +{ + VkPresentInfoKHR pinf = {0}; + + pinf.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + pinf.waitSemaphoreCount = semwait ? 1 : 0; + pinf.pWaitSemaphores = &semwait; + pinf.swapchainCount = 1; + pinf.pSwapchains = &vksc; + pinf.pImageIndices = (unsigned int*)&imgid; + + if(vkQueuePresentKHR(q, &pinf) != 0) { + fprintf(stderr, "present failed\n"); + return -1; + } + return 0; +} + int vk_find_qfamily(unsigned int flags) { int i, famidx = -1; @@ -359,6 +398,16 @@ VkCommandBuffer vk_create_cmdbuf(unsigned int qflags, int level) return vk_create_cmdbuf_fam(qfam, level); } +VkCommandBuffer vk_get_cmdbuf(int imgid) +{ + if(imgid < 0 || imgid >= vksc_numimg) { + fprintf(stderr, "vk_get_cmdbuf: invalid id %d, swap chain has %d images\n", + imgid, vksc_numimg); + return 0; + } + return vksc_cmdbuf[imgid]; +} + int vk_create_rpass(void) { int i; @@ -499,7 +548,7 @@ int vk_create_fb(void) if(!framebufs) { framebufs = darr_alloc(0, sizeof *framebufs); - darr_push(framebufs, &framebuf); /* add dummy rpass */ + darr_push(framebufs, &framebuf); /* add dummy framebuffer */ } for(i=1; i