UPLOAD
This commit is contained in:
		
							parent
							
								
									5cd703df01
								
							
						
					
					
						commit
						3e95395cb2
					
				
							
								
								
									
										24
									
								
								engine/3rdparty/co_context/include/co_context/io_context.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								engine/3rdparty/co_context/include/co_context/io_context.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -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 <thread> | ||||
| 
 | ||||
| namespace co_context { | ||||
| 
 | ||||
| } // namespace co_context
 | ||||
							
								
								
									
										8
									
								
								engine/3rdparty/co_context/src/co_context/io_context.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								engine/3rdparty/co_context/src/co_context/io_context.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| #pragma once | ||||
| #include <thread> | ||||
| 
 | ||||
| namespace co_context { | ||||
|     class [[nodiscard]] io_context final { | ||||
| 
 | ||||
|     }; | ||||
| } // namespace co_context
 | ||||
							
								
								
									
										5
									
								
								engine/3rdparty/co_context/xmake.lua
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								engine/3rdparty/co_context/xmake.lua
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| target("co_context") | ||||
|     set_kind("static") | ||||
|     add_includedirs("include") | ||||
|     add_files("src/**.cpp") | ||||
|     add_headerfiles("include/**.h") | ||||
| @ -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<VkAttachmentDescription> attachments = { depthAttachment }; | ||||
| 		std::vector<VkSubpassDescription> 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<VkAttachmentDescription> attachments = {positionAttachment , normalAttachment}; | ||||
| 		std::vector<VkSubpassDescription> subpasses = { subpass }; | ||||
| 		std::vector<VkSubpassDependency> dependencies; | ||||
| 		mPass = new RenderPass(device,"forward",attachments, subpasses, dependencies); | ||||
| 	} | ||||
| 	void ForwardPass::Record() | ||||
| 	{ | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| @ -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(); | ||||
| 	}; | ||||
| } | ||||
							
								
								
									
										19
									
								
								engine/src/engine/render/pass/gbuffer.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								engine/src/engine/render/pass/gbuffer.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -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)); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										15
									
								
								engine/src/engine/render/pass/gbuffer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								engine/src/engine/render/pass/gbuffer.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| #include "engine/vulkanapi/vulkan.h" | ||||
| #include <vector> | ||||
| namespace vulkanapi { | ||||
| 	class Image; | ||||
| 	struct GeometryBuffer { | ||||
| 	public: | ||||
| 		std::vector<Image*> positions; | ||||
| 		std::vector<Image*> normals; | ||||
| 		std::vector<Image*> diffuses; | ||||
| 		int width; | ||||
| 		int height; | ||||
| 	public: | ||||
| 		GeometryBuffer(VkDevice device,int frames, int width, int height); | ||||
| 	}; | ||||
| } | ||||
							
								
								
									
										23
									
								
								engine/src/engine/vulkanapi/cache/cache.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								engine/src/engine/vulkanapi/cache/cache.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -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; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										24
									
								
								engine/src/engine/vulkanapi/cache/cache.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								engine/src/engine/vulkanapi/cache/cache.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <map> | ||||
| #include "engine/vulkanapi/vulkan.h" | ||||
| namespace vulkanapi { | ||||
| 	class CacheValue { | ||||
| 	protected: | ||||
| 
 | ||||
| 	public: | ||||
| 
 | ||||
| 	}; | ||||
| 
 | ||||
| 	class CachePool { | ||||
| 	protected: | ||||
| 		std::map<uint32_t, CacheValue*> mData; | ||||
| 		bool mAsync = false; | ||||
| 		int mMaxAge = 100; | ||||
| 	protected: | ||||
| 		CacheValue* get(uint32_t id); | ||||
| 	public: | ||||
| 		CachePool(); | ||||
| 		CacheValue* Fetch(uint32_t id); | ||||
| 	}; | ||||
| }; | ||||
| @ -0,0 +1,4 @@ | ||||
| #include "thread_worker.h" | ||||
| namespace vulkanapi { | ||||
| 
 | ||||
| } | ||||
| @ -1,10 +1,15 @@ | ||||
| #pragma once | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <thread> | ||||
| #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) {}; | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
| @ -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) | ||||
| 	{ | ||||
| 
 | ||||
| 	} | ||||
|  | ||||
| @ -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; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										12
									
								
								engine/src/engine/vulkanapi/material/material.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								engine/src/engine/vulkanapi/material/material.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -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) | ||||
| 	{ | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										17
									
								
								engine/src/engine/vulkanapi/material/material.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								engine/src/engine/vulkanapi/material/material.h
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										0
									
								
								engine/src/engine/vulkanapi/pipeline/layout.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								engine/src/engine/vulkanapi/pipeline/layout.cpp
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								engine/src/engine/vulkanapi/pipeline/layout.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								engine/src/engine/vulkanapi/pipeline/layout.h
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
|  | ||||
| @ -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<VkImage> 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})); | ||||
| 		} | ||||
|  	} | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| #include <iostream> | ||||
| #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; | ||||
| } | ||||
|  | ||||
| @ -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") | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user