#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)
{
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;
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)
KEY_PGUP, KEY_PGDOWN
};
+extern int win_width, win_height;
+
int app_init(void);
void app_cleanup(void);
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)
{
}
vk_init_xwin(dpy, win);
+ win_width = 1280;
+ win_height = 800;
+
if(app_init() == -1) {
goto end;
}
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;
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;
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++) {
/* 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);