circles, man!

This commit is contained in:
vfs committed 2026-02-20 02:49:55 +01:00
1 parent bfaf4653f0
commit b83207e652
6 files changed
+94 -105

No files matched your search

+39 -15
View File
@@ -3,11 +3,17 @@
//
#include "renderer.h"
#include <print>
#include "init.h"
#include "sprite.h"
#include <vma/vk_mem_alloc.h>
#include <slang/slang.h>
extern int32_t window_width;
extern int32_t window_height;
bool SortKey::operator<(const SortKey& b) const {
if (depth != b.depth) return depth < b.depth;
if (pipeline != b.pipeline) return pipeline < b.pipeline;
@@ -37,7 +43,7 @@ void Renderer::flush() {
}
void Renderer::submit_quad(glm::vec2 pos) {
void Renderer::submit_quad(glm::vec2 pos, glm::vec2 scale) {
RenderCommand cmd {};
cmd.pipeline = PipelineType::ColoredQuad;
cmd.key = {
@@ -48,7 +54,7 @@ void Renderer::submit_quad(glm::vec2 pos) {
cmd.colored_quad = {
.pos = pos,
.scale = {0.25, 0.25},
.scale = scale,
.color = {0, 1, 1, 1},
};
@@ -133,11 +139,10 @@ void Renderer::create_pipeline_layout() {
vkCreateDescriptorSetLayout(device, &dslci, nullptr, &descriptor_set_layout);
// 2. Create the Shared Pipeline Layout
VkPushConstantRange push_constant{
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
.offset = 0,
.size = sizeof(glm::mat4) // Camera Projection
.size = sizeof(glm::mat4),
};
VkPipelineLayoutCreateInfo plci{
@@ -574,7 +579,7 @@ void Renderer::end_frame() {
// float v1 = q.uvMax.y;
// Define the 4 corners of the quad
vertex_p2_s2_st2_col4_a1_u32 vTL = { q.pos, q.scale, {0, 0}, q.color, 1, 0 };
vertex_p2_s2_st2_col4_a1_u32 vTL = { q.pos, q.scale, {0, 0}, {1, 0, 0, 0}, 1, 0 };
vertex_p2_s2_st2_col4_a1_u32 vTR = { q.pos, q.scale, {0, 0}, q.color, 1, 0 };
vertex_p2_s2_st2_col4_a1_u32 vBL = { q.pos, q.scale, {0, 0}, q.color, 1, 0 };
vertex_p2_s2_st2_col4_a1_u32 vBR = { q.pos, q.scale, {0, 0}, q.color, 1, 0 };
@@ -709,7 +714,7 @@ void Renderer::recordCommandBuffer(
toColor.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
toColor.dstStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
toColor.dstAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT;
toColor.oldLayout = oldLayout;
toColor.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
toColor.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
toColor.image = image;
toColor.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
@@ -753,6 +758,17 @@ void Renderer::recordCommandBuffer(
VkDeviceSize vOffset{ 0 };
vkCmdBindVertexBuffers(cmd, 0, 1, &frame.vertexBuffer.buffer, &vOffset);
glm::mat4 projection = glm::ortho(0.0f, (float)window_width, 0.0f, (float)window_height, -1.0f, 1.0f);
vkCmdPushConstants(
cmd,
pipelineLayout,
VK_SHADER_STAGE_VERTEX_BIT,
0,
sizeof(glm::mat4),
&projection
);
PipelineType lastPipeline = PipelineType::None; // Track current state
// uint32_t vertexOffset = currentFrame * MAX_VERTICES_PER_BATCH;
uint32_t currentBatchVertices = 0;
@@ -783,16 +799,24 @@ void Renderer::recordCommandBuffer(
// 3. Transition back to Present
{
VkImageMemoryBarrier2 toPresent{ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
toPresent.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
toPresent.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT;
toPresent.dstStageMask = VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT;
toPresent.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
toPresent.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
toPresent.image = image;
toPresent.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
VkImageMemoryBarrier2 toPresent{
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
.srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,
.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
.dstAccessMask = 0,
.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
.image = image,
.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
};
VkDependencyInfo dep{ .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, .imageMemoryBarrierCount = 1, .pImageMemoryBarriers = &toPresent };
VkDependencyInfo dep{
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &toPresent
};
vkCmdPipelineBarrier2(cmd, &dep);
}
+6 -1
View File
@@ -8,7 +8,12 @@
#include "init.h"
#include <volk/volk.h>
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/ext/matrix_clip_space.hpp>
#include "glm/gtx/string_cast.hpp"
#include <vma/vk_mem_alloc.h>
#include "sprite.h"
#include "texture.h"
@@ -173,7 +178,7 @@ struct Renderer {
void flush();
void submit_sprite(glm::vec2 pos, const sprite_t &sprite);
void submit_quad(glm::vec2 pos);
void submit_quad(glm::vec2 pos, glm::vec2 scale);
explicit Renderer(GLFWwindow *window);
void create_pipeline_layout();