foo
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 15 Jan 2023 00:22:18 +0000 (02:22 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 15 Jan 2023 00:22:18 +0000 (02:22 +0200)
src/app.c
src/app.h
src/main_x11.c
src/vk.c
src/vk.h

index 9a72309..ae0a1f1 100644 (file)
--- a/src/app.c
+++ b/src/app.c
@@ -1,9 +1,14 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #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)
index 4f891e7..07f92c2 100644 (file)
--- 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);
 
index 6ff15b8..df884d0 100644 (file)
@@ -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;
        }
index ebc31ae..f5557b3 100644 (file)
--- 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<darr_size(framebufs); i++) {
index cc58948..301474c 100644 (file)
--- a/src/vk.h
+++ b/src/vk.h
@@ -60,12 +60,17 @@ int vk_reshape(int xsz, int ysz);
 /* returns the image index, or -1 on failure. Pass optional semaphore to signal */
 int vk_next_image(VkSemaphore sem);
 
+int vk_submit(VkQueue q, VkCommandBuffer cmdbuf, VkSemaphore semwait, VkSemaphore semsig);
+int vk_present(VkQueue q, int imgid, VkSemaphore semwait);
+
 int vk_find_qfamily(unsigned int flags);
 VkQueue vk_getq_fam(int fam, int n);
 VkQueue vk_getq(unsigned int flags, int n);
 
 VkCommandBuffer vk_create_cmdbuf_fam(int qfam, int level);
 VkCommandBuffer vk_create_cmdbuf(unsigned int qflags, int level);
+/* return one of the swap-chain command buffers */
+VkCommandBuffer vk_get_cmdbuf(int imgid);
 
 int vk_create_rpass(void);
 void vk_free_rpass(int rp);