From 3e95395cb2510c4ee0fbe3675c52cbc03e37687e Mon Sep 17 00:00:00 2001 From: ouczbs Date: Fri, 26 Jan 2024 17:32:46 +0800 Subject: [PATCH] UPLOAD --- .../include/co_context/io_context.h | 24 ++++++++++ .../co_context/src/co_context/io_context.cpp | 8 ++++ engine/3rdparty/co_context/xmake.lua | 5 ++ engine/src/engine/render/pass/forwardpass.cpp | 48 ++++++++++++++----- engine/src/engine/render/pass/forwardpass.h | 7 ++- engine/src/engine/render/pass/gbuffer.cpp | 19 ++++++++ engine/src/engine/render/pass/gbuffer.h | 15 ++++++ engine/src/engine/vulkanapi/cache/cache.cpp | 23 +++++++++ engine/src/engine/vulkanapi/cache/cache.h | 24 ++++++++++ .../vulkanapi/command/thread_worker.cpp | 4 ++ .../engine/vulkanapi/command/thread_worker.h | 7 ++- engine/src/engine/vulkanapi/image/image.cpp | 24 +++++++++- engine/src/engine/vulkanapi/image/image.h | 32 +++++++++++-- .../engine/vulkanapi/material/material.cpp | 12 +++++ .../src/engine/vulkanapi/material/material.h | 17 +++++++ .../src/engine/vulkanapi/pipeline/layout.cpp | 0 engine/src/engine/vulkanapi/pipeline/layout.h | 0 .../vulkanapi/renderpass/renderpass.cpp | 6 +-- .../engine/vulkanapi/swapchain/swapchain.cpp | 12 +++-- engine/src/main.cpp | 6 ++- engine/xmake.lua | 2 +- 21 files changed, 266 insertions(+), 29 deletions(-) create mode 100644 engine/3rdparty/co_context/include/co_context/io_context.h create mode 100644 engine/3rdparty/co_context/src/co_context/io_context.cpp create mode 100644 engine/3rdparty/co_context/xmake.lua create mode 100644 engine/src/engine/render/pass/gbuffer.cpp create mode 100644 engine/src/engine/render/pass/gbuffer.h create mode 100644 engine/src/engine/vulkanapi/cache/cache.cpp create mode 100644 engine/src/engine/vulkanapi/cache/cache.h create mode 100644 engine/src/engine/vulkanapi/material/material.cpp create mode 100644 engine/src/engine/vulkanapi/material/material.h create mode 100644 engine/src/engine/vulkanapi/pipeline/layout.cpp create mode 100644 engine/src/engine/vulkanapi/pipeline/layout.h diff --git a/engine/3rdparty/co_context/include/co_context/io_context.h b/engine/3rdparty/co_context/include/co_context/io_context.h new file mode 100644 index 0000000..8131ac8 --- /dev/null +++ b/engine/3rdparty/co_context/include/co_context/io_context.h @@ -0,0 +1,24 @@ +/* + * A coroutine framework aimed at high-concurrency io with reasonable latency, + * based on liburingcxx. + * + * Copyright 2022 Zifeng Deng + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once +#include + +namespace co_context { + +} // namespace co_context diff --git a/engine/3rdparty/co_context/src/co_context/io_context.cpp b/engine/3rdparty/co_context/src/co_context/io_context.cpp new file mode 100644 index 0000000..7a6af76 --- /dev/null +++ b/engine/3rdparty/co_context/src/co_context/io_context.cpp @@ -0,0 +1,8 @@ +#pragma once +#include + +namespace co_context { + class [[nodiscard]] io_context final { + + }; +} // namespace co_context diff --git a/engine/3rdparty/co_context/xmake.lua b/engine/3rdparty/co_context/xmake.lua new file mode 100644 index 0000000..a3f6c0b --- /dev/null +++ b/engine/3rdparty/co_context/xmake.lua @@ -0,0 +1,5 @@ +target("co_context") + set_kind("static") + add_includedirs("include") + add_files("src/**.cpp") + add_headerfiles("include/**.h") diff --git a/engine/src/engine/render/pass/forwardpass.cpp b/engine/src/engine/render/pass/forwardpass.cpp index dcd8ae7..e6b382a 100644 --- a/engine/src/engine/render/pass/forwardpass.cpp +++ b/engine/src/engine/render/pass/forwardpass.cpp @@ -1,22 +1,46 @@ #include "forwardpass.h" #include "engine/vulkanapi/renderpass/renderpass.h" +#include "engine/vulkanapi/image/image.h" namespace vulkanapi { - ForwardPass::ForwardPass(VkDevice device) + ForwardPass::ForwardPass(VkDevice device, GeometryBuffer& gBuffer) :mPass(nullptr) { - VkAttachmentDescription depthAttachment{}; - //depthAttachment.format = findDepthFormat(); - depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT; - depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + VkAttachmentDescription positionAttachment{}; + positionAttachment.samples = VK_SAMPLE_COUNT_1_BIT; + positionAttachment.format = gBuffer.positions[0]->Format(); + positionAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + positionAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + positionAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + positionAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + positionAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + positionAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - std::vector attachments = { depthAttachment }; - std::vector subpasses; + VkAttachmentDescription normalAttachment{}; + normalAttachment.samples = VK_SAMPLE_COUNT_1_BIT; + normalAttachment.format = gBuffer.normals[0]->Format(); + normalAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + normalAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + normalAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + normalAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + normalAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + normalAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + VkAttachmentReference colorAttachmentRef{}; + colorAttachmentRef.attachment = 0; + colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + VkSubpassDescription subpass{}; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.colorAttachmentCount = 1; + subpass.pColorAttachments = &colorAttachmentRef; + + std::vector attachments = {positionAttachment , normalAttachment}; + std::vector subpasses = { subpass }; std::vector dependencies; mPass = new RenderPass(device,"forward",attachments, subpasses, dependencies); } + void ForwardPass::Record() + { + + } } \ No newline at end of file diff --git a/engine/src/engine/render/pass/forwardpass.h b/engine/src/engine/render/pass/forwardpass.h index fb3e296..a96af50 100644 --- a/engine/src/engine/render/pass/forwardpass.h +++ b/engine/src/engine/render/pass/forwardpass.h @@ -1,10 +1,15 @@ #include "engine/vulkanapi/vulkan.h" +#include "gbuffer.h" namespace vulkanapi { class RenderPass; + class MaterialCache; class ForwardPass { protected: RenderPass* mPass; + MaterialCache* mMaterials; public: - ForwardPass(VkDevice device); + ForwardPass(VkDevice device, GeometryBuffer& gBuffer); + + void Record(); }; } \ No newline at end of file diff --git a/engine/src/engine/render/pass/gbuffer.cpp b/engine/src/engine/render/pass/gbuffer.cpp new file mode 100644 index 0000000..b53e561 --- /dev/null +++ b/engine/src/engine/render/pass/gbuffer.cpp @@ -0,0 +1,19 @@ +#include "gbuffer.h" +#include "engine/vulkanapi/image/image.h" +namespace vulkanapi { + GeometryBuffer::GeometryBuffer(VkDevice device,int frames, int width, int height) + :width(width), + height(height) + { + VkFormat positionFmt = VK_FORMAT_R32G32B32A32_SFLOAT; + VkFormat normalFmt = VK_FORMAT_R8G8B8A8_UNORM; + VkFormat diffuseFmt = VK_FORMAT_R8G8B8A8_UNORM; + + int usage = 1; + for (int i = 0; i < frames; i++) { + positions.push_back(new Image(device, "position", width , height, diffuseFmt, usage)); + normals.push_back(new Image(device, "normal", width, height, diffuseFmt, usage)); + diffuses.push_back(new Image(device, "diffuse", width, height, diffuseFmt, usage)); + } + } +} \ No newline at end of file diff --git a/engine/src/engine/render/pass/gbuffer.h b/engine/src/engine/render/pass/gbuffer.h new file mode 100644 index 0000000..0385379 --- /dev/null +++ b/engine/src/engine/render/pass/gbuffer.h @@ -0,0 +1,15 @@ +#include "engine/vulkanapi/vulkan.h" +#include +namespace vulkanapi { + class Image; + struct GeometryBuffer { + public: + std::vector positions; + std::vector normals; + std::vector diffuses; + int width; + int height; + public: + GeometryBuffer(VkDevice device,int frames, int width, int height); + }; +} \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/cache/cache.cpp b/engine/src/engine/vulkanapi/cache/cache.cpp new file mode 100644 index 0000000..7b806ec --- /dev/null +++ b/engine/src/engine/vulkanapi/cache/cache.cpp @@ -0,0 +1,23 @@ +#include "cache.h" + +namespace vulkanapi { + CachePool::CachePool() + { + + } + CacheValue* CachePool::Fetch(uint32_t id) + { + CacheValue* v = get(id); + if (v != nullptr) + return v; + + return nullptr; + } + CacheValue* CachePool::get(uint32_t id) + { + auto res = mData.find(id); + if(res == mData.end()) + return nullptr; + return res->second; + } +} diff --git a/engine/src/engine/vulkanapi/cache/cache.h b/engine/src/engine/vulkanapi/cache/cache.h new file mode 100644 index 0000000..73f10c3 --- /dev/null +++ b/engine/src/engine/vulkanapi/cache/cache.h @@ -0,0 +1,24 @@ +#pragma once +#include +#include +#include "engine/vulkanapi/vulkan.h" +namespace vulkanapi { + class CacheValue { + protected: + + public: + + }; + + class CachePool { + protected: + std::map mData; + bool mAsync = false; + int mMaxAge = 100; + protected: + CacheValue* get(uint32_t id); + public: + CachePool(); + CacheValue* Fetch(uint32_t id); + }; +}; \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/command/thread_worker.cpp b/engine/src/engine/vulkanapi/command/thread_worker.cpp index e69de29..bf254ec 100644 --- a/engine/src/engine/vulkanapi/command/thread_worker.cpp +++ b/engine/src/engine/vulkanapi/command/thread_worker.cpp @@ -0,0 +1,4 @@ +#include "thread_worker.h" +namespace vulkanapi { + +} diff --git a/engine/src/engine/vulkanapi/command/thread_worker.h b/engine/src/engine/vulkanapi/command/thread_worker.h index fc8b6cf..0622f64 100644 --- a/engine/src/engine/vulkanapi/command/thread_worker.h +++ b/engine/src/engine/vulkanapi/command/thread_worker.h @@ -1,10 +1,15 @@ #pragma once #include +#include +#include #include "pool.h" #include "engine/vulkanapi/vulkan.h" namespace vulkanapi { - class Device; + typedef void(*CommandWorker)(); class CommandThreadWorker { + protected: + CommandWorker* mWorkChanels; public: + CommandThreadWorker(const char* name, int buffer) {}; }; }; diff --git a/engine/src/engine/vulkanapi/image/image.cpp b/engine/src/engine/vulkanapi/image/image.cpp index d898fca..2de2993 100644 --- a/engine/src/engine/vulkanapi/image/image.cpp +++ b/engine/src/engine/vulkanapi/image/image.cpp @@ -1,7 +1,27 @@ #include "image.h" namespace vulkanapi { - Image::Image(VkImage img) - :mPtr(img) + Image::Image(VkDevice device, const char* name, int width, int height, VkFormat format, VkImageUsageFlags usage) + :Image(device, Args{ + 1, + "", + width,height, + 1,1,1, + format,usage, + 1,1,1,1}) + { + + } + Image::Image(VkDevice device, const Args& args) + : mArgs(args) + , mDevice(device) + , mPtr(nullptr) + { + + } + Image::Image(VkDevice device, VkImage ptr, const Args& args) + : mArgs(args) + , mDevice(device) + , mPtr(ptr) { } diff --git a/engine/src/engine/vulkanapi/image/image.h b/engine/src/engine/vulkanapi/image/image.h index 6bd3f2b..9d9d003 100644 --- a/engine/src/engine/vulkanapi/image/image.h +++ b/engine/src/engine/vulkanapi/image/image.h @@ -1,12 +1,36 @@ #pragma once #include "engine/vulkanapi/vulkan.h" - namespace vulkanapi { class Image { - protected: - VkImage mPtr; public: - Image(VkImage img); + struct Args { + int Type; + const char* Key; + int Width; + int Height; + int Depth; + int Layers; + int Levels; + VkFormat Format; + VkImageUsageFlags Usage; + int Tiling; + int Sharing; + int Layout; + int Memory; + }; + protected: + Args mArgs; + VkImage mPtr; + VkDevice mDevice; + + public: + Image(VkDevice device, const char* name, int width, int height, VkFormat format, VkImageUsageFlags usage); + Image(VkDevice device, const Args& args); + Image(VkDevice device, VkImage ptr, const Args& args); + + VkFormat Format() { + return mArgs.Format; + }; }; }; \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/material/material.cpp b/engine/src/engine/vulkanapi/material/material.cpp new file mode 100644 index 0000000..efb8d19 --- /dev/null +++ b/engine/src/engine/vulkanapi/material/material.cpp @@ -0,0 +1,12 @@ +#include "material.h" +#include "engine/vulkanapi/descriptor/pool.h" +namespace vulkanapi { + Material::Material(VkDevice device, const Args& args) { + + } + + void Material::Instantiate(DescriptorPool* pool) + { + + } +} \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/material/material.h b/engine/src/engine/vulkanapi/material/material.h new file mode 100644 index 0000000..5c756d9 --- /dev/null +++ b/engine/src/engine/vulkanapi/material/material.h @@ -0,0 +1,17 @@ +#pragma once + +#include "engine/vulkanapi/vulkan.h" +namespace vulkanapi { + class DescriptorPool; + class Material { + public: + struct Args { + + }; + protected: + + public: + Material(VkDevice device, const Args& args); + void Instantiate(DescriptorPool* pool); + }; +}; \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/pipeline/layout.cpp b/engine/src/engine/vulkanapi/pipeline/layout.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/engine/vulkanapi/pipeline/layout.h b/engine/src/engine/vulkanapi/pipeline/layout.h new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/engine/vulkanapi/renderpass/renderpass.cpp b/engine/src/engine/vulkanapi/renderpass/renderpass.cpp index 8190157..2703efd 100644 --- a/engine/src/engine/vulkanapi/renderpass/renderpass.cpp +++ b/engine/src/engine/vulkanapi/renderpass/renderpass.cpp @@ -10,11 +10,11 @@ namespace vulkanapi { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, - attachments.size(), + (uint32_t)attachments.size(), attachments.data(), - subpasses.size(), + (uint32_t)subpasses.size(), subpasses.data(), - dependencies.size(), + (uint32_t)dependencies.size(), dependencies.data() }; vkCreateRenderPass(device, &create_info, nullptr, &mPtr); diff --git a/engine/src/engine/vulkanapi/swapchain/swapchain.cpp b/engine/src/engine/vulkanapi/swapchain/swapchain.cpp index 4090a57..c1e8fe5 100644 --- a/engine/src/engine/vulkanapi/swapchain/swapchain.cpp +++ b/engine/src/engine/vulkanapi/swapchain/swapchain.cpp @@ -23,16 +23,22 @@ namespace vulkanapi { //调用设备接口,创建交换链 VkSwapchainKHR old_swapchain = VK_NULL_HANDLE; + VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; CreateSwapchain(device->Ptr(), presentation_surface, frames, { image_format, image_color_space }, image_size - , VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, - VK_PRESENT_MODE_FIFO_KHR, old_swapchain, mPtr); + , imageUsage, VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,VK_PRESENT_MODE_FIFO_KHR, old_swapchain, mPtr); std::vector swapchain_images; GetHandlesOfSwapchainImages(device->Ptr(), mPtr, swapchain_images); uint32_t image_count = swapchain_images.size(); for (auto img : swapchain_images) { - mImages.push_back(new Image(img)); + mImages.push_back(new Image(device->Ptr(), img, Image::Args{ + 1, + "", + width, height, + 1, 1, 1, + image_format, imageUsage, + 1, 1, 1, 1})); } } } diff --git a/engine/src/main.cpp b/engine/src/main.cpp index 3bd2613..305ae9d 100644 --- a/engine/src/main.cpp +++ b/engine/src/main.cpp @@ -1,7 +1,8 @@ #include #include "engine/vulkanapi/vulkan/backend.h" #include "engine/vulkanapi/vulkan/window.h" -#include "engine/vulkanapi/renderpass/renderpass.h" +#include "engine/vulkanapi/device/device.h" +#include "engine/render/pass/forwardpass.h" using namespace std; int main(int argc, char** argv) @@ -9,7 +10,8 @@ int main(int argc, char** argv) const char* name = "hello"; auto app = vulkanapi::Backend(name); auto wnd = vulkanapi::Window(&app, 3, 640, 720, name); - //auto pass = vulkanapi::RenderPass(); + auto gBuffer = vulkanapi::GeometryBuffer(app.GetDevice()->Ptr(), 3, 640, 720); + auto pass = vulkanapi::ForwardPass(app.GetDevice()->Ptr(), gBuffer); cout << name << endl; return 0; } diff --git a/engine/xmake.lua b/engine/xmake.lua index 2dfdbcf..23b5838 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -3,7 +3,7 @@ includes("test/**xmake.lua") target("zengine") set_kind("binary") - add_packages("vulkansdk","glfw","glm","tinyobjloader") + add_deps("co_context") add_includedirs("src") add_files("src/*.cpp", "src/**.cpp") add_headerfiles("src/**.h", "src/**.inl")