Major changes

Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
2025-07-02 12:26:20 +03:00
parent 4ec57bbd79
commit dd0d232c97
32 changed files with 997 additions and 182 deletions

144
main.c
View File

@@ -7,12 +7,6 @@
evstring PROJECT_NAME = evstr("evk");
float vertexPositions[] = {
0.f,-.5f,
.5f, .5f,
-.5f, .5f
};
int main(void)
{
u32 width = 1024;
@@ -20,10 +14,10 @@ int main(void)
evkInstance instance = evkCreateInstance((evkInstanceCreateInfo){
.applicationInfo = EV_DEFAULT(evkApplicationInfo),
.layers = svec_init(evstring, {
.layers = svec_init(evstring, {
evstr("VK_LAYER_KHRONOS_validation"),
}),
.extensions = svec_init(evstring, {
.extensions = svec_init(evstring, {
evstr("VK_KHR_surface"),
evstr("VK_KHR_win32_surface"),
}),
@@ -51,6 +45,7 @@ int main(void)
evstr("VK_KHR_synchronization2"),
evstr("VK_KHR_buffer_device_address"),
evstr("VK_EXT_descriptor_indexing"),
evstr("VK_EXT_descriptor_buffer"),
}),
});
@@ -85,6 +80,8 @@ int main(void)
puts("Surface creation failed.");
}
evkGPUAllocator allocator = evkGPUCreateAllocator(device);
evkSwapChain swapChain = evkCreateSwapChain((evkSwapChainCreateInfo){
.device = device,
.surface = surface,
@@ -99,7 +96,7 @@ int main(void)
.poolFlags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
});
vec(VkCommandBuffer) commandBuffers = evkAllocateCommandBuffers(device, commandPool, vec_len(&swapChain.images), true);
vec(evkCommandBuffer) commandBuffers = evkAllocateCommandBuffers(device, commandPool, vec_len(&swapChain.images), true);
evkShaderCompiler compiler = evkCreateShaderCompiler();
@@ -109,10 +106,25 @@ int main(void)
evkDestroyShaderCompiler(compiler);
evkColorAttachment colorAttachment0 = {
swapChain.surfaceFormat.format,
swapChain.surfaceFormat.format,
EV_DEFAULT(VkPipelineColorBlendAttachmentState)
};
// TODO Get this from shader reflection data
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayout(
// &device, svec_init(evkDescriptorBinding, {
// {
// .name = evstr("positions"),
// .binding = 0,
// .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
// .descriptorCount = 1,
// .stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS,
// },
// })
// );
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromBindings(&device, vertShader.reflect.bindings);
evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromShaders(&device, svec_init(evkShader, {vertShader, fragShader}));
evkPipelineCreateInfo pipelineCreateInfo = EV_DEFAULT(evkPipelineCreateInfo,
dynamicStates = svec_init(VkDynamicState, {
VK_DYNAMIC_STATE_VIEWPORT,
@@ -126,8 +138,64 @@ int main(void)
colorAttachment0,
}),
viewportCountOverride = 1,
vertexBufferLayouts = svec_init(evkVertexBufferLayout, {
{{ // VB #0
{ EVK_VERTEX_ATTRIBUTE_POSITION, EVK_FMT_FLOAT32, 2 },
}},
}),
setLayouts = svec_init(evkDescriptorSetLayout, {setLayout_0}),
);
evkDescriptorSet set_0 = evkCreateDescriptorSet(&(evkDescriptorSetCreateInfo){
.device = &device,
.allocator = &allocator,
.layout = &setLayout_0
});
// // if stageflags is 0, it's all graphics
// // if descriptor count is 0, it's 1
// // if
// evkDescriptorSetLayout set_0 = evkCreateDescriptorSetLayout(&device, svec_init(evkDescriptorBinding, {
// { "positions", VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER },
// })
// );
evkBuffer vertBuf = evkCreateBuffer(&device, (evkBufferCreateInfo) {
.queueFamilyIndices = svec_init(u32, {device.queueFamilies[VK_QUEUE_GRAPHICS_BIT].familyIndex}),
.sizeInBytes = 6 * 4,
.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
.allocationCreateInfo = {
.allocationFlags = EVK_GPU_ALLOCATION_CREATE_MAPPED_BIT | EVK_GPU_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
.allocator = allocator,
},
.exclusive = true,
});
evkBuffer uniBuf = evkCreateBuffer(&device, (evkBufferCreateInfo) {
.sizeInBytes = 12 * 4,
.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
.allocationCreateInfo = {
.allocationFlags = EVK_GPU_ALLOCATION_CREATE_MAPPED_BIT | EVK_GPU_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
.allocator = allocator,
},
.exclusive = true,
});
float* vert_arr = (float*)vertBuf.allocData.allocationInfo.vma.pMappedData;
vert_arr[0] = 0.0f; vert_arr[1] = -0.5f;
vert_arr[2] = 0.5f; vert_arr[3] = 0.5f;
vert_arr[4] = -0.5f; vert_arr[5] = 0.5f;
float* uni_arr = (float*)uniBuf.allocData.allocationInfo.vma.pMappedData;
uni_arr[0] = 0.0f; uni_arr[1] = -0.5f; uni_arr[2] = 0.0f; uni_arr[3] = 1.0f;
uni_arr[4] = 0.5f; uni_arr[5] = 0.5f; uni_arr[6] = 0.0f; uni_arr[7] = 1.0f;
uni_arr[8] = -0.5f; uni_arr[9] = 0.5f; uni_arr[10] = 0.0f; uni_arr[11] = 1.0f;
evkSetDescriptor(&set_0, evstr("vertexData"), &uniBuf);
VkViewport viewport = EV_DEFAULT(VkViewport, width=width, height=height);
VkRect2D scissor = EV_DEFAULT(VkRect2D,extent.width=width, extent.height=height);
@@ -142,7 +210,7 @@ int main(void)
u32 imageIdx;
vkAcquireNextImageKHR(device.vk, swapChain.vk, UInt64.MAX, imageAcquiredSemaphore, VK_NULL_HANDLE, &imageIdx);
VkCommandBuffer cmdbuf = commandBuffers[imageIdx];
evkCommandBuffer cmdbuf = commandBuffers[imageIdx];
VkRenderingAttachmentInfoKHR colorAttachment = EV_DEFAULT(VkRenderingAttachmentInfoKHR,
imageView = swapChain.imageViews[imageIdx].vk,
@@ -156,38 +224,43 @@ int main(void)
colorAttachmentCount = 1,
);
evkBeginPrimaryCommandBuffer(cmdbuf);
evkBeginPrimaryCommandBuffer(&cmdbuf);
{
VkDeviceSize offset = 0;
vkCmdBindVertexBuffers(cmdbuf.vk, 0, 1, &vertBuf.vk, &offset);
vkCmdSetScissor(cmdbuf, 0, 1, &scissor);
vkCmdSetViewport(cmdbuf, 0, 1, &viewport);
evkCmdBindDescriptorSets(&cmdbuf, &graphicsPipeline, svec_init(evkDescriptorSet, { set_0 }), svec_init(u32, { 0 }));
vkCmdBeginRenderingKHR(cmdbuf, &renderingInfo);
vkCmdSetScissor(cmdbuf.vk, 0, 1, &scissor);
vkCmdSetViewport(cmdbuf.vk, 0, 1, &viewport);
vkCmdBindPipeline(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline.vk);
vkCmdDraw(cmdbuf, 3, 1, 0, 0);
vkCmdBeginRenderingKHR(cmdbuf.vk, &renderingInfo);
vkCmdEndRenderingKHR(cmdbuf);
evkCmdBindPipeline(&cmdbuf, &graphicsPipeline);
vkCmdDraw(cmdbuf.vk, 3, 1, 0, 0);
VkImageMemoryBarrier imageMemoryBarrier = {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.image = swapChain.images[imageIdx].vk,
.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
.subresourceRange = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.layerCount = 1,
.levelCount = 1,
},
};
vkCmdEndRenderingKHR(cmdbuf.vk);
vkCmdPipelineBarrier(cmdbuf, 0, 0, 0, 0, NULL, 0, NULL, 1, &imageMemoryBarrier);
VkImageMemoryBarrier imageMemoryBarrier = {
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
.image = swapChain.images[imageIdx].vk,
.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
.subresourceRange = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.layerCount = 1,
.levelCount = 1,
},
};
evkEndCommandBuffer(cmdbuf);
vkCmdPipelineBarrier(cmdbuf.vk, 0, 0, 0, 0, NULL, 0, NULL, 1, &imageMemoryBarrier);
}
evkEndCommandBuffer(&cmdbuf);
VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT};
VkSubmitInfo submitInfo = {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.pCommandBuffers = &cmdbuf,
.pCommandBuffers = &cmdbuf, // TODO This won't work with more than a single cmdbuf
.commandBufferCount = 1,
.waitSemaphoreCount = 1,
.pWaitSemaphores = &imageAcquiredSemaphore,
@@ -210,7 +283,7 @@ int main(void)
};
vkQueuePresentKHR(graphicsQueue, &presentInfo);
vkResetCommandBuffer(cmdbuf,VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
vkResetCommandBuffer(cmdbuf.vk,VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
// Main Loop
glfwPollEvents();
@@ -224,15 +297,18 @@ int main(void)
evkDestroyPipeline(graphicsPipeline);
evkDestroyDescriptorSet(&device, &set_0);
evkDestroyDescriptorSetLayout(&device, &setLayout_0);
evkDestroyShader(device, vertShader);
evkDestroyShader(device, fragShader);
vkFreeCommandBuffers(device.vk, commandPool.vk, vec_len(&commandBuffers), commandBuffers);
evkFreeCommandBuffers(device, commandPool, commandBuffers);
evkDestroyCommandPool(device, commandPool);
evkDestroySwapChain(device, swapChain);
SwapchainCreationFailed:
// SwapchainCreationFailed:
vkDestroySurfaceKHR(instance.vk, swapChain.surface, NULL);
VKSurfaceCreationFailed: