#define GLFW_INCLUDE_VULKAN #include #include #include #include #include #include #include #include #include "renderer/render_context.hpp" #include "renderer/render_graph.hpp" #include "renderer/scene_renderer.hpp" #include "resources/resource_registry.hpp" #include "vulkan/buffer.hpp" #include "vulkan/device.hpp" #include "vulkan/shader.hpp" #include "window.hpp" constexpr uint32_t WIDTH = 1280; constexpr uint32_t HEIGHT = 720; constexpr const char* NAME = "sandbox"; void immediate_submit(sophia::Device& device, std::function&& function) { auto command = device.beginSingleTimeCommands(); function(command); device.endSingleTimeCommands(command); } #include "material.hpp" int main() { sophia::Window window{WIDTH, HEIGHT, NAME}; sophia::Device device{&window}; sophia::RenderContext renderContext{window, device}; sophia::ResourceRegistry resourceRegistry{device, renderContext.getImageFormat()}; sophia::SceneRegistry sceneRegistry; sophia::SceneRenderer sceneRenderer{sceneRegistry, resourceRegistry, device, renderContext.getImageFormat()}; sophia::SceneHandle sceneHandle = sceneRegistry.create(); sophia::Scene& scene = sceneRegistry.get(sceneHandle); sophia::Entity camera = scene.createCamera(); // { // auto& transform = camera.getComponent(); // transform.position.z += 60; // } sophia::SceneView view; view.scene = sceneHandle; view.clearColor = {0.01f, 0.01f, 0.02f, 1.0f}; view.camera = camera; auto vertexShader = sophia::Shader::Builder() .fromGLSL(SANDBOX_SHADER_DIR "/triangle.vert") .setStage(sophia::ShaderStage::VERTEX) .build(); auto fragmentShader = sophia::Shader::Builder() .fromGLSL(SANDBOX_SHADER_DIR "/triangle.frag") .setStage(sophia::ShaderStage::FRAGMENT) .build(); vk::Format depthFormat = resourceRegistry.renderTargetPool.getDepthFormat(); sophia::Material material{device, std::move(vertexShader), std::move(fragmentShader), renderContext.getImageFormat(), depthFormat}; struct TriangleVertex { sophia::vec4 vertex; sophia::vec4 color; }; TriangleVertex verticies[] = { {{-1.f, 1.f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.0f}}, {{1.f, 1.f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.0f}}, {{0.f, -1.f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 0.0f}}}; sophia::u32 triangleVerticiesCount = 3; sophia::Buffer triangleBuffer{device, sizeof(TriangleVertex), triangleVerticiesCount, vk::BufferUsageFlagBits::eShaderDeviceAddress, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent}; triangleBuffer.map(); triangleBuffer.writeToBuffer(verticies); vk::DeviceAddress address = device.get()->getBufferAddress({triangleBuffer.getBuffer()}); while (!window.shouldClose()) { glfwPollEvents(); vk::CommandBuffer commandBuffer = renderContext.beginFrame(); if (!commandBuffer) { continue; } sceneRenderer.beginFrame(renderContext.getFrameIndex()); sophia::RenderGraph graph{renderContext.getTracyContext()}; sophia::ImageRef color = graph.importImage(renderContext.getCurrentImage(), sophia::Access::Present); sophia::ImageRef depth = graph.importImage( renderContext.getCurrentDepthImage(), sophia::Access::DepthWrite); graph.addPass( "sandbox", [&](sophia::RenderGraph::PassBuilder& pass) { const sophia::vec4& c = view.clearColor; pass.writeColor(color, vk::AttachmentLoadOp::eClear, {c.r, c.g, c.b, c.a}); pass.writeDepth(depth, vk::AttachmentLoadOp::eClear); }, [&](vk::CommandBuffer commandBuffer) { ZoneScopedN("main sandbox pass"); material.bind(commandBuffer); sophia::Material::PushConstants push; push.data0 = address; commandBuffer.pushConstants( material.getLayout(), vk::ShaderStageFlagBits::eVertex, 0, sizeof(sophia::Material::PushConstants), &push); commandBuffer.draw(3, 1, 0, 0); }); /* graph.addPass( "scene", [&](sophia::RenderGraph::PassBuilder& pass) { const sophia::vec4& c = view.clearColor; pass.writeColor(color, vk::AttachmentLoadOp::eClear, {c.r, c.g, c.b, c.a}); pass.writeDepth(depth, vk::AttachmentLoadOp::eClear); }, [&](vk::CommandBuffer commandBuffer) { ZoneScopedN("scene pass"); sceneRenderer.render(commandBuffer, view, view.camera, renderContext.getExtent()); }); */ graph.execute(commandBuffer); renderContext.endFrame(); FrameMark; } device.waitIdle(); return EXIT_SUCCESS; }