mirror of
				https://github.com/hedge-dev/UnleashedRecomp.git
				synced 2025-10-30 07:11:05 +00:00 
			
		
		
		
	Compare commits
	
		
			3 commits
		
	
	
		
			97cc5277c9
			...
			5f1e90af65
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5f1e90af65 | ||
|   | 9ace79a4d2 | ||
|   | a47d699295 | 
					 25 changed files with 44 additions and 11784 deletions
				
			
		
							
								
								
									
										15
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							|  | @ -16,21 +16,9 @@ | ||||||
| [submodule "thirdparty/vcpkg"] | [submodule "thirdparty/vcpkg"] | ||||||
| 	path = thirdparty/vcpkg | 	path = thirdparty/vcpkg | ||||||
| 	url = https://github.com/microsoft/vcpkg | 	url = https://github.com/microsoft/vcpkg | ||||||
| [submodule "thirdparty/volk"] |  | ||||||
| 	path = thirdparty/volk |  | ||||||
| 	url = https://github.com/zeux/volk |  | ||||||
| [submodule "thirdparty/SDL"] | [submodule "thirdparty/SDL"] | ||||||
| 	path = thirdparty/SDL | 	path = thirdparty/SDL | ||||||
| 	url = https://github.com/libsdl-org/SDL.git | 	url = https://github.com/libsdl-org/SDL.git | ||||||
| [submodule "thirdparty/Vulkan-Headers"] |  | ||||||
| 	path = thirdparty/Vulkan-Headers |  | ||||||
| 	url = https://github.com/KhronosGroup/Vulkan-Headers.git |  | ||||||
| [submodule "thirdparty/VulkanMemoryAllocator"] |  | ||||||
| 	path = thirdparty/VulkanMemoryAllocator |  | ||||||
| 	url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git |  | ||||||
| [submodule "thirdparty/D3D12MemoryAllocator"] |  | ||||||
| 	path = thirdparty/D3D12MemoryAllocator |  | ||||||
| 	url = https://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator.git |  | ||||||
| [submodule "thirdparty/stb"] | [submodule "thirdparty/stb"] | ||||||
| 	path = thirdparty/stb | 	path = thirdparty/stb | ||||||
| 	url = https://github.com/nothings/stb.git | 	url = https://github.com/nothings/stb.git | ||||||
|  | @ -67,3 +55,6 @@ | ||||||
| [submodule "thirdparty/MoltenVK/SPIRV-Cross"] | [submodule "thirdparty/MoltenVK/SPIRV-Cross"] | ||||||
| 	path = thirdparty/MoltenVK/SPIRV-Cross | 	path = thirdparty/MoltenVK/SPIRV-Cross | ||||||
| 	url = https://github.com/KhronosGroup/SPIRV-Cross.git | 	url = https://github.com/KhronosGroup/SPIRV-Cross.git | ||||||
|  | [submodule "thirdparty/plume"] | ||||||
|  | 	path = thirdparty/plume | ||||||
|  | 	url = https://github.com/renderbag/plume.git | ||||||
|  |  | ||||||
|  | @ -19,6 +19,14 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") | ||||||
| 
 | 
 | ||||||
| project("UnleashedRecomp-ALL") | project("UnleashedRecomp-ALL") | ||||||
| 
 | 
 | ||||||
|  | if (APPLE) | ||||||
|  |     enable_language(OBJC OBJCXX) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
|  | if (CMAKE_SYSTEM_NAME MATCHES "Linux") | ||||||
|  |     set(SDL_VULKAN_ENABLED ON CACHE BOOL "") | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
| if (CMAKE_OSX_ARCHITECTURES) | if (CMAKE_OSX_ARCHITECTURES) | ||||||
|     set(UNLEASHED_RECOMP_ARCHITECTURE ${CMAKE_OSX_ARCHITECTURES}) |     set(UNLEASHED_RECOMP_ARCHITECTURE ${CMAKE_OSX_ARCHITECTURES}) | ||||||
| elseif(CMAKE_SYSTEM_PROCESSOR) | elseif(CMAKE_SYSTEM_PROCESSOR) | ||||||
|  |  | ||||||
|  | @ -116,15 +116,8 @@ set(UNLEASHED_RECOMP_GPU_CXX_SOURCES | ||||||
|     "gpu/imgui/imgui_common.cpp" |     "gpu/imgui/imgui_common.cpp" | ||||||
|     "gpu/imgui/imgui_font_builder.cpp" |     "gpu/imgui/imgui_font_builder.cpp" | ||||||
|     "gpu/imgui/imgui_snapshot.cpp" |     "gpu/imgui/imgui_snapshot.cpp" | ||||||
|     "gpu/rhi/plume_vulkan.cpp" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| if (UNLEASHED_RECOMP_D3D12) |  | ||||||
|     list(APPEND UNLEASHED_RECOMP_GPU_CXX_SOURCES |  | ||||||
|         "gpu/rhi/plume_d3d12.cpp" |  | ||||||
|     ) |  | ||||||
| endif() |  | ||||||
| 
 |  | ||||||
| set(UNLEASHED_RECOMP_APU_CXX_SOURCES | set(UNLEASHED_RECOMP_APU_CXX_SOURCES | ||||||
|     "apu/audio.cpp" |     "apu/audio.cpp" | ||||||
|     "apu/embedded_player.cpp" |     "apu/embedded_player.cpp" | ||||||
|  | @ -221,18 +214,10 @@ set(UNLEASHED_RECOMP_THIRDPARTY_INCLUDES | ||||||
|     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/magic_enum/include" |     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/magic_enum/include" | ||||||
|     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/stb" |     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/stb" | ||||||
|     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/unordered_dense/include" |     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/unordered_dense/include" | ||||||
|     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/volk" |  | ||||||
|     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/Vulkan-Headers/include" |  | ||||||
|     "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/VulkanMemoryAllocator/include" |  | ||||||
|     "${UNLEASHED_RECOMP_TOOLS_ROOT}/bc_diff" |     "${UNLEASHED_RECOMP_TOOLS_ROOT}/bc_diff" | ||||||
|     "${UNLEASHED_RECOMP_TOOLS_ROOT}/XenosRecomp/thirdparty/smol-v/source" |     "${UNLEASHED_RECOMP_TOOLS_ROOT}/XenosRecomp/thirdparty/smol-v/source" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| if (UNLEASHED_RECOMP_D3D12) |  | ||||||
|     list(APPEND UNLEASHED_RECOMP_THIRDPARTY_INCLUDES "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/D3D12MemoryAllocator/include") |  | ||||||
|     list(APPEND UNLEASHED_RECOMP_THIRDPARTY_SOURCES "${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/D3D12MemoryAllocator/src/D3D12MemAlloc.cpp") |  | ||||||
| endif() |  | ||||||
| 
 |  | ||||||
| set_source_files_properties(${UNLEASHED_RECOMP_THIRDPARTY_SOURCES} PROPERTIES SKIP_PRECOMPILE_HEADERS ON) | set_source_files_properties(${UNLEASHED_RECOMP_THIRDPARTY_SOURCES} PROPERTIES SKIP_PRECOMPILE_HEADERS ON) | ||||||
| 
 | 
 | ||||||
| set(UNLEASHED_RECOMP_CXX_SOURCES | set(UNLEASHED_RECOMP_CXX_SOURCES | ||||||
|  | @ -377,7 +362,7 @@ if (UNLEASHED_RECOMP_D3D12) | ||||||
|     ) |     ) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| if (CMAKE_SYSTEM_NAME MATCHES "Linux") | if (SDL_VULKAN_ENABLED) | ||||||
|     target_compile_definitions(UnleashedRecomp PRIVATE SDL_VULKAN_ENABLED) |     target_compile_definitions(UnleashedRecomp PRIVATE SDL_VULKAN_ENABLED) | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | @ -428,6 +413,7 @@ target_link_libraries(UnleashedRecomp PRIVATE | ||||||
|     UnleashedRecompLib |     UnleashedRecompLib | ||||||
|     xxHash::xxhash |     xxHash::xxhash | ||||||
|     CURL::libcurl |     CURL::libcurl | ||||||
|  |     plume | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| target_include_directories(UnleashedRecomp PRIVATE | target_include_directories(UnleashedRecomp PRIVATE | ||||||
|  |  | ||||||
|  | @ -1,21 +0,0 @@ | ||||||
| MIT License |  | ||||||
| 
 |  | ||||||
| Copyright (c) 2024 renderbag and contributors |  | ||||||
| 
 |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
| of this software and associated documentation files (the "Software"), to deal |  | ||||||
| in the Software without restriction, including without limitation the rights |  | ||||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
| copies of the Software, and to permit persons to whom the Software is |  | ||||||
| furnished to do so, subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| The above copyright notice and this permission notice shall be included in all |  | ||||||
| copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |  | ||||||
| SOFTWARE. |  | ||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,481 +0,0 @@ | ||||||
| //
 |  | ||||||
| // plume
 |  | ||||||
| //
 |  | ||||||
| // Copyright (c) 2024 renderbag and contributors. All rights reserved.
 |  | ||||||
| // Licensed under the MIT license. See LICENSE file for details.
 |  | ||||||
| //
 |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include "plume_render_interface.h" |  | ||||||
| 
 |  | ||||||
| #include <map> |  | ||||||
| #include <mutex> |  | ||||||
| #include <unordered_map> |  | ||||||
| 
 |  | ||||||
| #include <directx/d3d12.h> |  | ||||||
| #include <dxgi1_4.h> |  | ||||||
| 
 |  | ||||||
| #include "D3D12MemAlloc.h" |  | ||||||
| 
 |  | ||||||
| namespace plume { |  | ||||||
|     struct D3D12Buffer; |  | ||||||
|     struct D3D12CommandQueue; |  | ||||||
|     struct D3D12Device; |  | ||||||
|     struct D3D12GraphicsPipeline; |  | ||||||
|     struct D3D12Interface; |  | ||||||
|     struct D3D12Pipeline; |  | ||||||
|     struct D3D12Pool; |  | ||||||
|     struct D3D12PipelineLayout; |  | ||||||
|     struct D3D12Texture; |  | ||||||
| 
 |  | ||||||
|     struct D3D12DescriptorHeapAllocator { |  | ||||||
|         enum : uint32_t { |  | ||||||
|             INVALID_OFFSET = 0xFFFFFFFFU |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         // Reference implementation http://diligentgraphics.com/diligent-engine/architecture/d3d12/variable-size-memory-allocations-manager/
 |  | ||||||
|         struct FreeBlock; |  | ||||||
| 
 |  | ||||||
|         typedef std::map<uint32_t, FreeBlock> OffsetFreeBlockMap; |  | ||||||
|         typedef std::multimap<uint32_t, OffsetFreeBlockMap::iterator> SizeFreeBlockMap; |  | ||||||
| 
 |  | ||||||
|         struct FreeBlock { |  | ||||||
|             uint32_t size; |  | ||||||
|             SizeFreeBlockMap::iterator sizeMapIterator; |  | ||||||
| 
 |  | ||||||
|             FreeBlock(uint32_t size) { |  | ||||||
|                 this->size = size; |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         ID3D12DescriptorHeap *heap = nullptr; |  | ||||||
|         uint32_t heapSize = 0; |  | ||||||
|         uint32_t freeSize = 0; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         D3D12_CPU_DESCRIPTOR_HANDLE cpuDescriptorHandle = {}; |  | ||||||
|         D3D12_GPU_DESCRIPTOR_HANDLE gpuDescriptorHandle = {}; |  | ||||||
|         UINT descriptorHandleIncrement = 0; |  | ||||||
|         OffsetFreeBlockMap offsetFreeBlockMap; |  | ||||||
|         SizeFreeBlockMap sizeFreeBlockMap; |  | ||||||
|         std::mutex allocationMutex; |  | ||||||
| 
 |  | ||||||
|         D3D12DescriptorHeapAllocator(D3D12Device *device, uint32_t heapSize, D3D12_DESCRIPTOR_HEAP_TYPE heapType); |  | ||||||
|         ~D3D12DescriptorHeapAllocator(); |  | ||||||
|         void addFreeBlock(uint32_t offset, uint32_t size); |  | ||||||
|         uint32_t allocate(uint32_t size); |  | ||||||
|         void free(uint32_t offset, uint32_t size); |  | ||||||
|         D3D12_CPU_DESCRIPTOR_HANDLE getCPUHandleAt(uint32_t index) const; |  | ||||||
|         D3D12_GPU_DESCRIPTOR_HANDLE getGPUHandleAt(uint32_t index) const; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12DescriptorSet : RenderDescriptorSet { |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         struct HeapAllocation { |  | ||||||
|             uint32_t offset = 0; |  | ||||||
|             uint32_t count = 0; |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         HeapAllocation viewAllocation; |  | ||||||
|         HeapAllocation samplerAllocation; |  | ||||||
|         std::vector<RenderDescriptorRangeType> descriptorTypes; |  | ||||||
|         std::vector<uint32_t> descriptorHeapIndices; |  | ||||||
|         uint32_t descriptorTypeMaxIndex = 0; |  | ||||||
| 
 |  | ||||||
|         D3D12DescriptorSet(D3D12Device *device, const RenderDescriptorSetDesc &desc); |  | ||||||
|         ~D3D12DescriptorSet() override; |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, uint64_t bufferSize, const RenderBufferStructuredView *bufferStructuredView, const RenderBufferFormattedView *bufferFormattedView) override; |  | ||||||
|         void setTexture(uint32_t descriptorIndex, const RenderTexture *texture, RenderTextureLayout textureLayout, const RenderTextureView *textureView) override; |  | ||||||
|         void setSampler(uint32_t descriptorIndex, const RenderSampler *sampler) override; |  | ||||||
|         void setAccelerationStructure(uint32_t descriptorIndex, const RenderAccelerationStructure *accelerationStructure) override; |  | ||||||
|         void setSRV(uint32_t descriptorIndex, ID3D12Resource *resource, const D3D12_SHADER_RESOURCE_VIEW_DESC *viewDesc); |  | ||||||
|         void setUAV(uint32_t descriptorIndex, ID3D12Resource *resource, const D3D12_UNORDERED_ACCESS_VIEW_DESC *viewDesc); |  | ||||||
|         void setCBV(uint32_t descriptorIndex, ID3D12Resource *resource, uint64_t bufferSize); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12SwapChain : RenderSwapChain { |  | ||||||
|         IDXGISwapChain3 *d3d = nullptr; |  | ||||||
|         HANDLE waitableObject = 0; |  | ||||||
|         D3D12CommandQueue *commandQueue = nullptr; |  | ||||||
|         RenderWindow renderWindow = {}; |  | ||||||
|         std::vector<D3D12Texture> textures; |  | ||||||
|         uint32_t textureCount = 0; |  | ||||||
|         RenderFormat format = RenderFormat::UNKNOWN; |  | ||||||
|         DXGI_FORMAT nativeFormat = DXGI_FORMAT_UNKNOWN; |  | ||||||
|         uint32_t width = 0; |  | ||||||
|         uint32_t height = 0; |  | ||||||
|         uint32_t refreshRate = 0; |  | ||||||
|         bool vsyncEnabled = true; |  | ||||||
|         uint32_t maxFrameLatency = 0; |  | ||||||
| 
 |  | ||||||
|         D3D12SwapChain(D3D12CommandQueue *commandQueue, RenderWindow renderWindow, uint32_t textureCount, RenderFormat format, uint32_t maxFrameLatency); |  | ||||||
|         ~D3D12SwapChain() override; |  | ||||||
|         bool present(uint32_t textureIndex, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount) override; |  | ||||||
|         void wait() override; |  | ||||||
|         bool resize() override; |  | ||||||
|         bool needsResize() const override; |  | ||||||
|         void setVsyncEnabled(bool vsyncEnabled) override; |  | ||||||
|         bool isVsyncEnabled() const override; |  | ||||||
|         uint32_t getWidth() const override; |  | ||||||
|         uint32_t getHeight() const override; |  | ||||||
|         RenderTexture *getTexture(uint32_t textureIndex) override; |  | ||||||
|         uint32_t getTextureCount() const override; |  | ||||||
|         bool acquireTexture(RenderCommandSemaphore *signalSemaphore, uint32_t *textureIndex) override; |  | ||||||
|         RenderWindow getWindow() const override; |  | ||||||
|         bool isEmpty() const override; |  | ||||||
|         uint32_t getRefreshRate() const override; |  | ||||||
|         void getWindowSize(uint32_t &dstWidth, uint32_t &dstHeight) const; |  | ||||||
|         void setTextures(); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Framebuffer : RenderFramebuffer { |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         uint32_t width = 0; |  | ||||||
|         uint32_t height = 0; |  | ||||||
|         std::vector<const D3D12Texture *> colorTargets; |  | ||||||
|         const D3D12Texture *depthTarget = nullptr; |  | ||||||
|         std::vector<D3D12_CPU_DESCRIPTOR_HANDLE> colorHandles; |  | ||||||
|         D3D12_CPU_DESCRIPTOR_HANDLE depthHandle = {}; |  | ||||||
| 
 |  | ||||||
|         D3D12Framebuffer(D3D12Device *device, const RenderFramebufferDesc &desc); |  | ||||||
|         ~D3D12Framebuffer() override; |  | ||||||
|         uint32_t getWidth() const override; |  | ||||||
|         uint32_t getHeight() const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12QueryPool : RenderQueryPool { |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         ID3D12QueryHeap *d3d = nullptr; |  | ||||||
|         std::vector<uint64_t> results; |  | ||||||
|         std::unique_ptr<RenderBuffer> readbackBuffer; |  | ||||||
| 
 |  | ||||||
|         D3D12QueryPool(D3D12Device *device, uint32_t queryCount); |  | ||||||
|         virtual ~D3D12QueryPool() override; |  | ||||||
|         virtual void queryResults() override; |  | ||||||
|         virtual const uint64_t *getResults() const override; |  | ||||||
|         virtual uint32_t getCount() const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12CommandList : RenderCommandList { |  | ||||||
|         ID3D12GraphicsCommandList9 *d3d = nullptr; |  | ||||||
|         ID3D12CommandAllocator *commandAllocator = nullptr; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         RenderCommandListType type = RenderCommandListType::UNKNOWN; |  | ||||||
|         const D3D12Framebuffer *targetFramebuffer = nullptr; |  | ||||||
|         bool targetFramebufferSamplePositionsSet = false; |  | ||||||
|         bool open = false; |  | ||||||
|         const D3D12PipelineLayout *activeComputePipelineLayout = nullptr; |  | ||||||
|         const D3D12PipelineLayout *activeGraphicsPipelineLayout = nullptr; |  | ||||||
|         const D3D12GraphicsPipeline *activeGraphicsPipeline = nullptr; |  | ||||||
|         bool descriptorHeapsSet = false; |  | ||||||
|         D3D12_PRIMITIVE_TOPOLOGY activeTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; |  | ||||||
|         bool activeSamplePositions = false; |  | ||||||
| 
 |  | ||||||
|         D3D12CommandList(D3D12Device *device, RenderCommandListType type); |  | ||||||
|         ~D3D12CommandList() override; |  | ||||||
|         void begin() override; |  | ||||||
|         void end() override; |  | ||||||
|         void barriers(RenderBarrierStages stages, const RenderBufferBarrier *bufferBarriers, uint32_t bufferBarriersCount, const RenderTextureBarrier *textureBarriers, uint32_t textureBarriersCount) override; |  | ||||||
|         void dispatch(uint32_t threadGroupCountX, uint32_t threadGroupCountY, uint32_t threadGroupCountZ) override; |  | ||||||
|         void traceRays(uint32_t width, uint32_t height, uint32_t depth, RenderBufferReference shaderBindingTable, const RenderShaderBindingGroupsInfo &shaderBindingGroupsInfo) override; |  | ||||||
|         void drawInstanced(uint32_t vertexCountPerInstance, uint32_t instanceCount, uint32_t startVertexLocation, uint32_t startInstanceLocation) override; |  | ||||||
|         void drawIndexedInstanced(uint32_t indexCountPerInstance, uint32_t instanceCount, uint32_t startIndexLocation, int32_t baseVertexLocation, uint32_t startInstanceLocation) override; |  | ||||||
|         void setPipeline(const RenderPipeline *pipeline) override; |  | ||||||
|         void setComputePipelineLayout(const RenderPipelineLayout *pipelineLayout) override; |  | ||||||
|         void setComputePushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) override; |  | ||||||
|         void setComputeDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) override; |  | ||||||
|         void setGraphicsPipelineLayout(const RenderPipelineLayout *pipelineLayout) override; |  | ||||||
|         void setGraphicsPushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) override; |  | ||||||
|         void setGraphicsDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) override; |  | ||||||
|         void setGraphicsRootDescriptor(RenderBufferReference bufferReference, uint32_t rootDescriptorIndex) override; |  | ||||||
|         void setRaytracingPipelineLayout(const RenderPipelineLayout *pipelineLayout) override; |  | ||||||
|         void setRaytracingPushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) override; |  | ||||||
|         void setRaytracingDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) override; |  | ||||||
|         void setIndexBuffer(const RenderIndexBufferView *view) override; |  | ||||||
|         void setVertexBuffers(uint32_t startSlot, const RenderVertexBufferView *views, uint32_t viewCount, const RenderInputSlot *inputSlots) override; |  | ||||||
|         void setViewports(const RenderViewport *viewports, uint32_t count) override; |  | ||||||
|         void setScissors(const RenderRect *scissorRects, uint32_t count) override; |  | ||||||
|         void setFramebuffer(const RenderFramebuffer *framebuffer) override; |  | ||||||
|         void setDepthBias(float depthBias, float depthBiasClamp, float slopeScaledDepthBias) override; |  | ||||||
|         void clearColor(uint32_t attachmentIndex, RenderColor colorValue, const RenderRect *clearRects, uint32_t clearRectsCount) override; |  | ||||||
|         void clearDepth(bool clearDepth, float depthValue, const RenderRect *clearRects, uint32_t clearRectsCount) override; |  | ||||||
|         void copyBufferRegion(RenderBufferReference dstBuffer, RenderBufferReference srcBuffer, uint64_t size) override; |  | ||||||
|         void copyTextureRegion(const RenderTextureCopyLocation &dstLocation, const RenderTextureCopyLocation &srcLocation, uint32_t dstX, uint32_t dstY, uint32_t dstZ, const RenderBox *srcBox) override; |  | ||||||
|         void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) override; |  | ||||||
|         void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override; |  | ||||||
|         void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override; |  | ||||||
|         void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) override; |  | ||||||
|         void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) override; |  | ||||||
|         void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) override; |  | ||||||
|         void discardTexture(const RenderTexture* texture) override; |  | ||||||
|         void resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) override; |  | ||||||
|         void writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) override; |  | ||||||
|         void checkDescriptorHeaps(); |  | ||||||
|         void notifyDescriptorHeapWasChangedExternally(); |  | ||||||
|         void checkTopology(); |  | ||||||
|         void checkFramebufferSamplePositions(); |  | ||||||
|         void setSamplePositions(const RenderTexture *texture); |  | ||||||
|         void resetSamplePositions(); |  | ||||||
|         void setDescriptorSet(const D3D12PipelineLayout *activePipelineLayout, RenderDescriptorSet *descriptorSet, uint32_t setIndex, bool setCompute); |  | ||||||
|         void setRootDescriptorTable(D3D12DescriptorHeapAllocator *heapAllocator, D3D12DescriptorSet::HeapAllocation &heapAllocation, uint32_t rootIndex, bool setCompute); |  | ||||||
|         void setRootDescriptor(const D3D12PipelineLayout *activePipelineLayout, RenderBufferReference bufferReference, uint32_t setIndex, bool setCompute); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12CommandFence : RenderCommandFence { |  | ||||||
|         ID3D12Fence *d3d = nullptr; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         HANDLE fenceEvent = 0; |  | ||||||
|         UINT64 fenceValue = 0; |  | ||||||
| 
 |  | ||||||
|         D3D12CommandFence(D3D12Device *device); |  | ||||||
|         ~D3D12CommandFence() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12CommandSemaphore : RenderCommandSemaphore { |  | ||||||
|         ID3D12Fence *d3d = nullptr; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         UINT64 semaphoreValue = 0; |  | ||||||
| 
 |  | ||||||
|         D3D12CommandSemaphore(D3D12Device *device); |  | ||||||
|         ~D3D12CommandSemaphore() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12CommandQueue : RenderCommandQueue { |  | ||||||
|         ID3D12CommandQueue *d3d = nullptr; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         RenderCommandListType type = RenderCommandListType::UNKNOWN; |  | ||||||
| 
 |  | ||||||
|         D3D12CommandQueue(D3D12Device *device, RenderCommandListType type); |  | ||||||
|         ~D3D12CommandQueue() override; |  | ||||||
|         std::unique_ptr<RenderSwapChain> createSwapChain(RenderWindow renderWindow, uint32_t textureCount, RenderFormat format, uint32_t newFrameLatency) override; |  | ||||||
|         void executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount, RenderCommandSemaphore **signalSemaphores, uint32_t signalSemaphoreCount, RenderCommandFence *signalFence) override; |  | ||||||
|         void waitForCommandFence(RenderCommandFence *fence) override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Buffer : RenderBuffer { |  | ||||||
|         ID3D12Resource *d3d = nullptr; |  | ||||||
|         D3D12_RESOURCE_STATES resourceStates = D3D12_RESOURCE_STATE_COMMON; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         D3D12MA::Allocation *allocation = nullptr; |  | ||||||
|         D3D12Pool *pool = nullptr; |  | ||||||
|         RenderBufferDesc desc; |  | ||||||
| 
 |  | ||||||
|         D3D12Buffer() = default; |  | ||||||
|         D3D12Buffer(D3D12Device *device, D3D12Pool *pool, const RenderBufferDesc &desc); |  | ||||||
|         ~D3D12Buffer() override; |  | ||||||
|         void *map(uint32_t subresource, const RenderRange *readRange) override; |  | ||||||
|         void unmap(uint32_t subresource, const RenderRange *writtenRange) override; |  | ||||||
|         std::unique_ptr<RenderBufferFormattedView> createBufferFormattedView(RenderFormat format) override; |  | ||||||
|         void setName(const std::string &name) override; |  | ||||||
|         uint64_t getDeviceAddress() const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12BufferFormattedView : RenderBufferFormattedView { |  | ||||||
|         RenderFormat format = RenderFormat::UNKNOWN; |  | ||||||
|         D3D12Buffer *buffer = nullptr; |  | ||||||
| 
 |  | ||||||
|         D3D12BufferFormattedView(D3D12Buffer *buffer, RenderFormat format); |  | ||||||
|         ~D3D12BufferFormattedView() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Texture : RenderTexture { |  | ||||||
|         ID3D12Resource *d3d = nullptr; |  | ||||||
|         D3D12_RESOURCE_STATES resourceStates = D3D12_RESOURCE_STATE_COMMON; |  | ||||||
|         RenderTextureLayout layout = RenderTextureLayout::UNKNOWN; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         D3D12MA::Allocation *allocation = nullptr; |  | ||||||
|         D3D12Pool *pool = nullptr; |  | ||||||
|         RenderTextureDesc desc; |  | ||||||
|         uint32_t targetAllocatorOffset = 0; |  | ||||||
|         uint32_t targetEntryCount = 0; |  | ||||||
|         bool targetHeapDepth = false; |  | ||||||
| 
 |  | ||||||
|         D3D12Texture() = default; |  | ||||||
|         D3D12Texture(D3D12Device *device, D3D12Pool *pool, const RenderTextureDesc &desc); |  | ||||||
|         ~D3D12Texture() override; |  | ||||||
|         std::unique_ptr<RenderTextureView> createTextureView(const RenderTextureViewDesc &desc) override; |  | ||||||
|         void setName(const std::string &name) override; |  | ||||||
|         void createRenderTargetHeap(); |  | ||||||
|         void createDepthStencilHeap(); |  | ||||||
|         void releaseTargetHeap(); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12TextureView : RenderTextureView { |  | ||||||
|         DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; |  | ||||||
|         D3D12Texture *texture = nullptr; |  | ||||||
|         RenderTextureViewDimension dimension = RenderTextureViewDimension::UNKNOWN; |  | ||||||
|         uint32_t mipLevels = 0; |  | ||||||
|         uint32_t mipSlice = 0; |  | ||||||
|         uint32_t shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; |  | ||||||
| 
 |  | ||||||
|         D3D12TextureView(D3D12Texture *texture, const RenderTextureViewDesc &desc); |  | ||||||
|         ~D3D12TextureView() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12AccelerationStructure :RenderAccelerationStructure { |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         const D3D12Buffer *buffer = nullptr; |  | ||||||
|         uint64_t offset = 0; |  | ||||||
|         uint64_t size = 0; |  | ||||||
|         RenderAccelerationStructureType type = RenderAccelerationStructureType::UNKNOWN; |  | ||||||
| 
 |  | ||||||
|         D3D12AccelerationStructure(D3D12Device *device, const RenderAccelerationStructureDesc &desc); |  | ||||||
|         ~D3D12AccelerationStructure() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Pool : RenderPool { |  | ||||||
|         D3D12MA::Pool *d3d = nullptr; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         RenderPoolDesc desc; |  | ||||||
| 
 |  | ||||||
|         D3D12Pool(D3D12Device *device, const RenderPoolDesc &desc, bool gpuUploadHeapFallback); |  | ||||||
|         ~D3D12Pool() override; |  | ||||||
|         std::unique_ptr<RenderBuffer> createBuffer(const RenderBufferDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Shader : RenderShader { |  | ||||||
|         const void* data = nullptr; |  | ||||||
|         uint64_t size = 0; |  | ||||||
|         std::string entryPointName; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         RenderShaderFormat format = RenderShaderFormat::UNKNOWN; |  | ||||||
| 
 |  | ||||||
|         D3D12Shader(D3D12Device *device, const void *data, uint64_t size, const char *entryPointName, RenderShaderFormat format); |  | ||||||
|         ~D3D12Shader() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Sampler : RenderSampler { |  | ||||||
|         D3D12_SAMPLER_DESC samplerDesc = {}; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         RenderBorderColor borderColor = RenderBorderColor::UNKNOWN; |  | ||||||
|         RenderShaderVisibility shaderVisibility = RenderShaderVisibility::UNKNOWN; |  | ||||||
| 
 |  | ||||||
|         D3D12Sampler(D3D12Device *device, const RenderSamplerDesc &desc); |  | ||||||
|         ~D3D12Sampler() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Pipeline : RenderPipeline { |  | ||||||
|         enum class Type { |  | ||||||
|             Unknown, |  | ||||||
|             Compute, |  | ||||||
|             Graphics, |  | ||||||
|             Raytracing |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         Type type = Type::Unknown; |  | ||||||
| 
 |  | ||||||
|         D3D12Pipeline(D3D12Device *device, Type type); |  | ||||||
|         virtual ~D3D12Pipeline() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12ComputePipeline : D3D12Pipeline { |  | ||||||
|         ID3D12PipelineState *d3d = nullptr; |  | ||||||
| 
 |  | ||||||
|         D3D12ComputePipeline(D3D12Device *device, const RenderComputePipelineDesc &desc); |  | ||||||
|         ~D3D12ComputePipeline() override; |  | ||||||
|         virtual void setName(const std::string& name) const override; |  | ||||||
|         virtual RenderPipelineProgram getProgram(const std::string &name) const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12GraphicsPipeline : D3D12Pipeline { |  | ||||||
|         ID3D12PipelineState *d3d = nullptr; |  | ||||||
|         std::vector<RenderInputSlot> inputSlots; |  | ||||||
|         D3D12_PRIMITIVE_TOPOLOGY topology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; |  | ||||||
| 
 |  | ||||||
|         D3D12GraphicsPipeline(D3D12Device *device, const RenderGraphicsPipelineDesc &desc); |  | ||||||
|         ~D3D12GraphicsPipeline() override; |  | ||||||
|         virtual void setName(const std::string& name) const override; |  | ||||||
|         virtual RenderPipelineProgram getProgram(const std::string &name) const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12RaytracingPipeline : D3D12Pipeline { |  | ||||||
|         ID3D12StateObject *stateObject = nullptr; |  | ||||||
|         ID3D12StateObjectProperties *stateObjectProperties = nullptr; |  | ||||||
|         std::vector<void *> programShaderIdentifiers; |  | ||||||
|         std::unordered_map<std::string, RenderPipelineProgram> nameProgramMap; |  | ||||||
|         const D3D12PipelineLayout *pipelineLayout = nullptr; |  | ||||||
| 
 |  | ||||||
|         D3D12RaytracingPipeline(D3D12Device *device, const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline); |  | ||||||
|         ~D3D12RaytracingPipeline() override; |  | ||||||
|         virtual void setName(const std::string& name) const override; |  | ||||||
|         virtual RenderPipelineProgram getProgram(const std::string &name) const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12PipelineLayout : RenderPipelineLayout { |  | ||||||
|         ID3D12RootSignature *rootSignature = nullptr; |  | ||||||
|         D3D12Device *device = nullptr; |  | ||||||
|         std::vector<RenderPushConstantRange> pushConstantRanges; |  | ||||||
|         std::vector<uint32_t> setViewRootIndices; |  | ||||||
|         std::vector<uint32_t> setSamplerRootIndices; |  | ||||||
|         std::vector<std::pair<uint32_t, RenderRootDescriptorType>> rootDescriptorRootIndicesAndTypes; |  | ||||||
|         uint32_t setCount = 0; |  | ||||||
|         uint32_t rootCount = 0; |  | ||||||
| 
 |  | ||||||
|         D3D12PipelineLayout(D3D12Device *device, const RenderPipelineLayoutDesc &desc); |  | ||||||
|         ~D3D12PipelineLayout() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Device : RenderDevice { |  | ||||||
|         ID3D12Device8 *d3d = nullptr; |  | ||||||
|         D3D12Interface *renderInterface = nullptr; |  | ||||||
|         IDXGIAdapter1 *adapter = nullptr; |  | ||||||
|         D3D12MA::Allocator *allocator = nullptr; |  | ||||||
|         D3D_SHADER_MODEL shaderModel = D3D_SHADER_MODEL(0); |  | ||||||
|         std::unique_ptr<RenderPipelineLayout> rtDummyGlobalPipelineLayout; |  | ||||||
|         std::unique_ptr<RenderPipelineLayout> rtDummyLocalPipelineLayout; |  | ||||||
|         std::unique_ptr<D3D12DescriptorHeapAllocator> viewHeapAllocator; |  | ||||||
|         std::unique_ptr<D3D12DescriptorHeapAllocator> samplerHeapAllocator; |  | ||||||
|         std::unique_ptr<D3D12DescriptorHeapAllocator> colorTargetHeapAllocator; |  | ||||||
|         std::unique_ptr<D3D12DescriptorHeapAllocator> depthTargetHeapAllocator; |  | ||||||
|         std::unique_ptr<D3D12Pool> customUploadPool; |  | ||||||
|         RenderDeviceCapabilities capabilities; |  | ||||||
|         RenderDeviceDescription description; |  | ||||||
|         uint64_t timestampFrequency = 1; |  | ||||||
|         bool gpuUploadHeapFallback = false; |  | ||||||
| 
 |  | ||||||
|         D3D12Device(D3D12Interface *renderInterface, const std::string &preferredDeviceName); |  | ||||||
|         ~D3D12Device() override; |  | ||||||
|         std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) override; |  | ||||||
|         std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderShader> createShader(const void *data, uint64_t size, const char *entryPointName, RenderShaderFormat format) override; |  | ||||||
|         std::unique_ptr<RenderSampler> createSampler(const RenderSamplerDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipeline> createComputePipeline(const RenderComputePipelineDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipeline> createGraphicsPipeline(const RenderGraphicsPipelineDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipeline> createRaytracingPipeline(const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline) override; |  | ||||||
|         std::unique_ptr<RenderCommandQueue> createCommandQueue(RenderCommandListType type) override; |  | ||||||
|         std::unique_ptr<RenderBuffer> createBuffer(const RenderBufferDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderAccelerationStructure> createAccelerationStructure(const RenderAccelerationStructureDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPool> createPool(const RenderPoolDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipelineLayout> createPipelineLayout(const RenderPipelineLayoutDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderCommandFence> createCommandFence() override; |  | ||||||
|         std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() override; |  | ||||||
|         std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderQueryPool> createQueryPool(uint32_t queryCount) override; |  | ||||||
|         void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) override; |  | ||||||
|         void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild, bool preferFastTrace) override; |  | ||||||
|         void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) override; |  | ||||||
|         const RenderDeviceCapabilities &getCapabilities() const override; |  | ||||||
|         const RenderDeviceDescription &getDescription() const override; |  | ||||||
|         RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; |  | ||||||
|         void waitIdle() const override; |  | ||||||
|         void release(); |  | ||||||
|         bool isValid() const; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct D3D12Interface : RenderInterface { |  | ||||||
|         IDXGIFactory4 *dxgiFactory = nullptr; |  | ||||||
|         RenderInterfaceCapabilities capabilities; |  | ||||||
|         std::vector<std::string> deviceNames; |  | ||||||
| 
 |  | ||||||
|         D3D12Interface(); |  | ||||||
|         ~D3D12Interface() override; |  | ||||||
|         std::unique_ptr<RenderDevice> createDevice(const std::string &preferredDeviceName) override; |  | ||||||
|         const RenderInterfaceCapabilities &getCapabilities() const override; |  | ||||||
|         const std::vector<std::string> &getDeviceNames() const override; |  | ||||||
|         bool isValid() const; |  | ||||||
|     }; |  | ||||||
| }; |  | ||||||
|  | @ -1,262 +0,0 @@ | ||||||
| //
 |  | ||||||
| // plume
 |  | ||||||
| //
 |  | ||||||
| // Copyright (c) 2024 renderbag and contributors. All rights reserved.
 |  | ||||||
| // Licensed under the MIT license. See LICENSE file for details.
 |  | ||||||
| //
 |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <climits> |  | ||||||
| 
 |  | ||||||
| #include "plume_render_interface_types.h" |  | ||||||
| 
 |  | ||||||
| namespace plume { |  | ||||||
|     // Interfaces.
 |  | ||||||
| 
 |  | ||||||
|     struct RenderBufferFormattedView { |  | ||||||
|         virtual ~RenderBufferFormattedView() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderBuffer { |  | ||||||
|         virtual ~RenderBuffer() { } |  | ||||||
|         virtual void *map(uint32_t subresource = 0, const RenderRange *readRange = nullptr) = 0; |  | ||||||
|         virtual void unmap(uint32_t subresource = 0, const RenderRange *writtenRange = nullptr) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderBufferFormattedView> createBufferFormattedView(RenderFormat format) = 0; |  | ||||||
|         virtual void setName(const std::string &name) = 0; |  | ||||||
|         virtual uint64_t getDeviceAddress() const = 0; |  | ||||||
| 
 |  | ||||||
|         // Concrete implementation shortcuts.
 |  | ||||||
|         inline RenderBufferReference at(uint64_t offset) const { |  | ||||||
|             return RenderBufferReference(this, offset); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderTextureView { |  | ||||||
|         virtual ~RenderTextureView() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderTexture { |  | ||||||
|         virtual ~RenderTexture() { } |  | ||||||
|         virtual std::unique_ptr<RenderTextureView> createTextureView(const RenderTextureViewDesc &desc) = 0; |  | ||||||
|         virtual void setName(const std::string &name) = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderAccelerationStructure { |  | ||||||
|         virtual ~RenderAccelerationStructure() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderShader { |  | ||||||
|         virtual ~RenderShader() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderSampler { |  | ||||||
|         virtual ~RenderSampler() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderPipeline { |  | ||||||
|         virtual ~RenderPipeline() { } |  | ||||||
|         virtual void setName(const std::string& name) const = 0; |  | ||||||
|         virtual RenderPipelineProgram getProgram(const std::string &name) const = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderPipelineLayout { |  | ||||||
|         virtual ~RenderPipelineLayout() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderCommandFence { |  | ||||||
|         virtual ~RenderCommandFence() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderCommandSemaphore { |  | ||||||
|         virtual ~RenderCommandSemaphore() { } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderDescriptorSet { |  | ||||||
|         // Descriptor indices correspond to the index assuming the descriptor set is one contiguous array. They DO NOT correspond to the bindings, which can be sparse.
 |  | ||||||
|         // User code should derive these indices on its own by looking at the order the bindings were assigned during set creation along with the descriptor count and
 |  | ||||||
|         // assume it was all allocated in one contiguous array. This allows efficient mapping between Vulkan and D3D12's descriptor models.
 |  | ||||||
| 
 |  | ||||||
|         virtual ~RenderDescriptorSet() { } |  | ||||||
|         virtual void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, uint64_t bufferSize = 0, const RenderBufferStructuredView *bufferStructuredView = nullptr, const RenderBufferFormattedView *bufferFormattedView = nullptr) = 0; |  | ||||||
|         virtual void setTexture(uint32_t descriptorIndex, const RenderTexture *texture, RenderTextureLayout textureLayout, const RenderTextureView *textureView = nullptr) = 0; |  | ||||||
|         virtual void setSampler(uint32_t descriptorIndex, const RenderSampler *sampler) = 0; |  | ||||||
|         virtual void setAccelerationStructure(uint32_t descriptorIndex, const RenderAccelerationStructure *accelerationStructure) = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderSwapChain { |  | ||||||
|         virtual ~RenderSwapChain() { } |  | ||||||
|         virtual bool present(uint32_t textureIndex, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount) = 0; |  | ||||||
|         virtual void wait() = 0; |  | ||||||
|         virtual bool resize() = 0; |  | ||||||
|         virtual bool needsResize() const = 0; |  | ||||||
|         virtual void setVsyncEnabled(bool vsyncEnabled) = 0; |  | ||||||
|         virtual bool isVsyncEnabled() const = 0; |  | ||||||
|         virtual uint32_t getWidth() const = 0; |  | ||||||
|         virtual uint32_t getHeight() const = 0; |  | ||||||
|         virtual RenderTexture *getTexture(uint32_t textureIndex) = 0; |  | ||||||
|         virtual uint32_t getTextureCount() const = 0; |  | ||||||
|         virtual bool acquireTexture(RenderCommandSemaphore *signalSemaphore, uint32_t *textureIndex) = 0; |  | ||||||
|         virtual RenderWindow getWindow() const = 0; |  | ||||||
|         virtual bool isEmpty() const = 0; |  | ||||||
| 
 |  | ||||||
|         // Only valid if displayTiming is enabled in capabilities.
 |  | ||||||
|         virtual uint32_t getRefreshRate() const = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderFramebuffer { |  | ||||||
|         virtual ~RenderFramebuffer() { } |  | ||||||
|         virtual uint32_t getWidth() const = 0; |  | ||||||
|         virtual uint32_t getHeight() const = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderCommandList { |  | ||||||
|         virtual ~RenderCommandList() { } |  | ||||||
|         virtual void begin() = 0; |  | ||||||
|         virtual void end() = 0; |  | ||||||
|         virtual void barriers(RenderBarrierStages stages, const RenderBufferBarrier *bufferBarriers, uint32_t bufferBarriersCount, const RenderTextureBarrier *textureBarriers, uint32_t textureBarriersCount) = 0; |  | ||||||
|         virtual void dispatch(uint32_t threadGroupCountX, uint32_t threadGroupCountY, uint32_t threadGroupCountZ) = 0; |  | ||||||
|         virtual void traceRays(uint32_t width, uint32_t height, uint32_t depth, RenderBufferReference shaderBindingTable, const RenderShaderBindingGroupsInfo &shaderBindingGroupsInfo) = 0; |  | ||||||
|         virtual void drawInstanced(uint32_t vertexCountPerInstance, uint32_t instanceCount, uint32_t startVertexLocation, uint32_t startInstanceLocation) = 0; |  | ||||||
|         virtual void drawIndexedInstanced(uint32_t indexCountPerInstance, uint32_t instanceCount, uint32_t startIndexLocation, int32_t baseVertexLocation, uint32_t startInstanceLocation) = 0; |  | ||||||
|         virtual void setPipeline(const RenderPipeline *pipeline) = 0; |  | ||||||
|         virtual void setComputePipelineLayout(const RenderPipelineLayout *pipelineLayout) = 0; |  | ||||||
|         virtual void setComputePushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) = 0; |  | ||||||
|         virtual void setComputeDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) = 0; |  | ||||||
|         virtual void setGraphicsPipelineLayout(const RenderPipelineLayout *pipelineLayout) = 0; |  | ||||||
|         virtual void setGraphicsPushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) = 0; |  | ||||||
|         virtual void setGraphicsDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) = 0; |  | ||||||
|         virtual void setGraphicsRootDescriptor(RenderBufferReference bufferReference, uint32_t rootDescriptorIndex) = 0; |  | ||||||
|         virtual void setRaytracingPipelineLayout(const RenderPipelineLayout *pipelineLayout) = 0; |  | ||||||
|         virtual void setRaytracingPushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) = 0; |  | ||||||
|         virtual void setRaytracingDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) = 0; |  | ||||||
|         virtual void setIndexBuffer(const RenderIndexBufferView *view) = 0; |  | ||||||
|         virtual void setVertexBuffers(uint32_t startSlot, const RenderVertexBufferView *views, uint32_t viewCount, const RenderInputSlot *inputSlots) = 0; |  | ||||||
|         virtual void setViewports(const RenderViewport *viewports, uint32_t count) = 0; |  | ||||||
|         virtual void setScissors(const RenderRect *scissorRects, uint32_t count) = 0; |  | ||||||
|         virtual void setFramebuffer(const RenderFramebuffer *framebuffer) = 0; |  | ||||||
|         virtual void setDepthBias(float depthBias, float depthBiasClamp, float slopeScaledDepthBias) = 0; |  | ||||||
|         virtual void clearColor(uint32_t attachmentIndex = 0, RenderColor colorValue = RenderColor(), const RenderRect *clearRects = nullptr, uint32_t clearRectsCount = 0) = 0; |  | ||||||
|         virtual void clearDepth(bool clearDepth = true, float depthValue = 1.0f, const RenderRect *clearRects = nullptr, uint32_t clearRectsCount = 0) = 0; |  | ||||||
|         virtual void copyBufferRegion(RenderBufferReference dstBuffer, RenderBufferReference srcBuffer, uint64_t size) = 0; |  | ||||||
|         virtual void copyTextureRegion(const RenderTextureCopyLocation &dstLocation, const RenderTextureCopyLocation &srcLocation, uint32_t dstX = 0, uint32_t dstY = 0, uint32_t dstZ = 0, const RenderBox *srcBox = nullptr) = 0; |  | ||||||
|         virtual void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) = 0; |  | ||||||
|         virtual void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) = 0; |  | ||||||
|         virtual void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) = 0; |  | ||||||
|         virtual void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect = nullptr, RenderResolveMode resolveMode = RenderResolveMode::AVERAGE) = 0; |  | ||||||
|         virtual void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) = 0; |  | ||||||
|         virtual void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) = 0; |  | ||||||
|         virtual void discardTexture(const RenderTexture* texture) = 0; // D3D12 only.
 |  | ||||||
|         virtual void resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) = 0; |  | ||||||
|         virtual void writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) = 0; |  | ||||||
| 
 |  | ||||||
|         // Concrete implementation shortcuts.
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const RenderBufferBarrier &barrier) { |  | ||||||
|             barriers(stages, &barrier, 1, nullptr, 0); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const RenderTextureBarrier &barrier) { |  | ||||||
|             barriers(stages, nullptr, 0, &barrier, 1); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const RenderBufferBarrier &bufferBarrier, const RenderTextureBarrier &textureBarrier) { |  | ||||||
|             barriers(stages, &bufferBarrier, 1, &textureBarrier, 1); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const RenderBufferBarrier *bufferBarriers, uint32_t bufferBarriersCount) { |  | ||||||
|             barriers(stages, bufferBarriers, bufferBarriersCount, nullptr, 0); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const std::vector<RenderBufferBarrier> &bufferBarriers) { |  | ||||||
|             barriers(stages, bufferBarriers.data(), uint32_t(bufferBarriers.size()), nullptr, 0); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const RenderTextureBarrier *textureBarriers, uint32_t textureBarriersCount) { |  | ||||||
|             barriers(stages, nullptr, 0, textureBarriers, textureBarriersCount); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const std::vector<RenderTextureBarrier> &textureBarriers) { |  | ||||||
|             barriers(stages, nullptr, 0, textureBarriers.data(), uint32_t(textureBarriers.size())); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void barriers(RenderBarrierStages stages, const std::vector<RenderBufferBarrier> &bufferBarriers, const std::vector<RenderTextureBarrier> &textureBarriers) { |  | ||||||
|             barriers(stages, bufferBarriers.data(), uint32_t(bufferBarriers.size()), textureBarriers.data(), uint32_t(textureBarriers.size())); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void setViewports(const RenderViewport &viewport) { |  | ||||||
|             setViewports(&viewport, 1); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         inline void setScissors(const RenderRect &scissorRect) { |  | ||||||
|             setScissors(&scissorRect, 1); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderCommandQueue { |  | ||||||
|         virtual ~RenderCommandQueue() { } |  | ||||||
|         virtual std::unique_ptr<RenderSwapChain> createSwapChain(RenderWindow renderWindow, uint32_t textureCount, RenderFormat format, uint32_t maxFrameLatency) = 0; |  | ||||||
|         virtual void executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores = nullptr, uint32_t waitSemaphoreCount = 0, RenderCommandSemaphore **signalSemaphores = nullptr, uint32_t signalSemaphoreCount = 0, RenderCommandFence *signalFence = nullptr) = 0; |  | ||||||
|         virtual void waitForCommandFence(RenderCommandFence *fence) = 0; |  | ||||||
| 
 |  | ||||||
|         // Concrete implementation shortcuts.
 |  | ||||||
|         inline void executeCommandLists(const RenderCommandList *commandList, RenderCommandFence *signalFence = nullptr) { |  | ||||||
|             executeCommandLists(commandList != nullptr ? &commandList : nullptr, commandList != nullptr ? 1 : 0, nullptr, 0, nullptr, 0, signalFence); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderPool { |  | ||||||
|         virtual ~RenderPool() { } |  | ||||||
|         virtual std::unique_ptr<RenderBuffer> createBuffer(const RenderBufferDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderQueryPool { |  | ||||||
|         virtual ~RenderQueryPool() { } |  | ||||||
|         virtual void queryResults() = 0; |  | ||||||
|         virtual const uint64_t *getResults() const = 0; |  | ||||||
|         virtual uint32_t getCount() const = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderDevice { |  | ||||||
|         virtual ~RenderDevice() { } |  | ||||||
|         virtual std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderShader> createShader(const void *data, uint64_t size, const char *entryPointName, RenderShaderFormat format) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderSampler> createSampler(const RenderSamplerDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderPipeline> createComputePipeline(const RenderComputePipelineDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderPipeline> createGraphicsPipeline(const RenderGraphicsPipelineDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderPipeline> createRaytracingPipeline(const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline = nullptr) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderCommandQueue> createCommandQueue(RenderCommandListType type) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderBuffer> createBuffer(const RenderBufferDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderAccelerationStructure> createAccelerationStructure(const RenderAccelerationStructureDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderPool> createPool(const RenderPoolDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderPipelineLayout> createPipelineLayout(const RenderPipelineLayoutDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderCommandFence> createCommandFence() = 0; |  | ||||||
|         virtual std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() = 0; |  | ||||||
|         virtual std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) = 0; |  | ||||||
|         virtual std::unique_ptr<RenderQueryPool> createQueryPool(uint32_t queryCount) = 0; |  | ||||||
|         virtual void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild = true, bool preferFastTrace = false) = 0; |  | ||||||
|         virtual void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild = true, bool preferFastTrace = false) = 0; |  | ||||||
|         virtual void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) = 0; |  | ||||||
|         virtual const RenderDeviceCapabilities &getCapabilities() const = 0; |  | ||||||
|         virtual const RenderDeviceDescription &getDescription() const = 0; |  | ||||||
|         virtual RenderSampleCounts getSampleCountsSupported(RenderFormat format) const = 0; |  | ||||||
|         virtual void waitIdle() const = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderInterface { |  | ||||||
|         virtual ~RenderInterface() { } |  | ||||||
|         virtual std::unique_ptr<RenderDevice> createDevice(const std::string &preferredDeviceName = "") = 0; |  | ||||||
|         virtual const std::vector<std::string> &getDeviceNames() const = 0; |  | ||||||
|         virtual const RenderInterfaceCapabilities &getCapabilities() const = 0; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     extern void RenderInterfaceTest(RenderInterface *renderInterface); |  | ||||||
|     extern void TestInitialize(RenderInterface* renderInterface, RenderWindow window); |  | ||||||
|     extern void TestDraw(); |  | ||||||
|     extern void TestResize(); |  | ||||||
|     extern void TestShutdown(); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #include "plume_render_interface_builders.h" |  | ||||||
|  | @ -1,281 +0,0 @@ | ||||||
| //
 |  | ||||||
| // plume
 |  | ||||||
| //
 |  | ||||||
| // Copyright (c) 2024 renderbag and contributors. All rights reserved.
 |  | ||||||
| // Licensed under the MIT license. See LICENSE file for details.
 |  | ||||||
| //
 |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <unordered_set> |  | ||||||
| 
 |  | ||||||
| namespace plume { |  | ||||||
|     struct RenderDescriptorSetBuilder { |  | ||||||
|         std::list<std::vector<const RenderSampler *>> samplerPointerVectorList; |  | ||||||
|         std::vector<RenderDescriptorRange> descriptorRanges; |  | ||||||
|         RenderDescriptorSetDesc descriptorSetDesc; |  | ||||||
|         bool open = false; |  | ||||||
|         uint32_t setIndex = 0; |  | ||||||
| 
 |  | ||||||
|         RenderDescriptorSetBuilder() = default; |  | ||||||
| 
 |  | ||||||
|         void begin() { |  | ||||||
|             assert(!open && "Builder must be closed."); |  | ||||||
| 
 |  | ||||||
|             descriptorSetDesc = RenderDescriptorSetDesc(); |  | ||||||
| 
 |  | ||||||
|             samplerPointerVectorList.clear(); |  | ||||||
|             descriptorRanges.clear(); |  | ||||||
| 
 |  | ||||||
|             open = true; |  | ||||||
|             setIndex = 0; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addConstantBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::CONSTANT_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addFormattedBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::FORMATTED_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addReadWriteFormattedBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::READ_WRITE_FORMATTED_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addTexture(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::TEXTURE, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addReadWriteTexture(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::READ_WRITE_TEXTURE, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addSampler(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::SAMPLER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addImmutableSampler(uint32_t binding, const RenderSampler *immutableSampler) { |  | ||||||
|             assert(immutableSampler != nullptr); |  | ||||||
| 
 |  | ||||||
|             return addImmutableSampler(binding, &immutableSampler); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addImmutableSampler(uint32_t binding, const RenderSampler **immutableSampler, uint32_t count = 1) { |  | ||||||
|             assert(immutableSampler != nullptr); |  | ||||||
| 
 |  | ||||||
|             samplerPointerVectorList.emplace_back(std::vector<const RenderSampler *>(immutableSampler, immutableSampler + count)); |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::SAMPLER, binding, count, samplerPointerVectorList.back().data())); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addStructuredBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::STRUCTURED_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addReadWriteStructuredBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::READ_WRITE_STRUCTURED_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addByteAddressBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::BYTE_ADDRESS_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addReadWriteByteAddressBuffer(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::READ_WRITE_BYTE_ADDRESS_BUFFER, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addAccelerationStructure(uint32_t binding, uint32_t count = 1) { |  | ||||||
|             return addRange(RenderDescriptorRange(RenderDescriptorRangeType::ACCELERATION_STRUCTURE, binding, count, nullptr)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         uint32_t addRange(const RenderDescriptorRange &range) { |  | ||||||
|             assert(open && "Builder must be open."); |  | ||||||
| 
 |  | ||||||
|             uint32_t returnValue = setIndex; |  | ||||||
|             descriptorRanges.emplace_back(range); |  | ||||||
|             descriptorSetDesc.descriptorRangesCount++; |  | ||||||
|             setIndex += range.count; |  | ||||||
|             return returnValue; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void end(bool lastRangeIsBoundless = false, uint32_t boundlessRangeSize = 0) { |  | ||||||
|             assert(open && "Builder must be open."); |  | ||||||
| 
 |  | ||||||
|             descriptorSetDesc.lastRangeIsBoundless = lastRangeIsBoundless; |  | ||||||
|             descriptorSetDesc.boundlessRangeSize = boundlessRangeSize; |  | ||||||
|             descriptorSetDesc.descriptorRanges = descriptorRanges.data(); |  | ||||||
|             open = false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         std::unique_ptr<RenderDescriptorSet> create(RenderDevice *device) const { |  | ||||||
|             assert(!open && "Builder must be closed."); |  | ||||||
| 
 |  | ||||||
|             return device->createDescriptorSet(descriptorSetDesc); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderDescriptorSetBase { |  | ||||||
|         RenderDescriptorSetBuilder builder; |  | ||||||
|         std::unique_ptr<RenderDescriptorSet> descriptorSet; |  | ||||||
| 
 |  | ||||||
|         void create(RenderDevice *device) { |  | ||||||
|             descriptorSet = builder.create(device); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         RenderDescriptorSet *get() const { |  | ||||||
|             return descriptorSet.get(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, uint64_t bufferSize = 0, const RenderBufferStructuredView *bufferStructuredView = nullptr, const RenderBufferFormattedView *bufferFormattedView = nullptr) { |  | ||||||
|             descriptorSet->setBuffer(descriptorIndex, buffer, bufferSize, bufferStructuredView, bufferFormattedView); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, uint64_t bufferSize, const RenderBufferStructuredView &bufferStructuredView) { |  | ||||||
|             descriptorSet->setBuffer(descriptorIndex, buffer, bufferSize, &bufferStructuredView); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, uint64_t bufferSize, const RenderBufferFormattedView *bufferFormattedView) { |  | ||||||
|             descriptorSet->setBuffer(descriptorIndex, buffer, bufferSize, nullptr, bufferFormattedView); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, const RenderBufferStructuredView &bufferStructuredView) { |  | ||||||
|             descriptorSet->setBuffer(descriptorIndex, buffer, 0, &bufferStructuredView); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, const RenderBufferFormattedView *bufferFormattedView) { |  | ||||||
|             descriptorSet->setBuffer(descriptorIndex, buffer, 0, nullptr, bufferFormattedView); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setTexture(uint32_t descriptorIndex, const RenderTexture *texture, const RenderTextureLayout textureLayout, const RenderTextureView *textureView = nullptr) { |  | ||||||
|             descriptorSet->setTexture(descriptorIndex, texture, textureLayout, textureView); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setSampler(uint32_t descriptorIndex, const RenderSampler *sampler) { |  | ||||||
|             descriptorSet->setSampler(descriptorIndex, sampler); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void setAccelerationStructure(uint32_t descriptorIndex, const RenderAccelerationStructure *accelerationStructure) { |  | ||||||
|             descriptorSet->setAccelerationStructure(descriptorIndex, accelerationStructure); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct RenderDescriptorSetInclusionFilter { |  | ||||||
|         const uint32_t *bindings = nullptr; |  | ||||||
|         uint32_t bindingsCount = 0; |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     struct RenderPipelineLayoutBuilder { |  | ||||||
|         std::vector<RenderPushConstantRange> pushConstantRanges; |  | ||||||
|         std::list<std::vector<const RenderSampler *>> samplerPointerVectorList; |  | ||||||
|         std::vector<RenderDescriptorRange> descriptorRanges; |  | ||||||
|         std::vector<RenderDescriptorSetDesc> descriptorSetDescs; |  | ||||||
|         std::vector<uint32_t> descriptorRangeIndexPerSet; |  | ||||||
|         std::vector<RenderRootDescriptorDesc> rootDescriptorDescs; |  | ||||||
|         RenderPipelineLayoutDesc layoutDesc; |  | ||||||
|         bool open = false; |  | ||||||
| 
 |  | ||||||
|         // Start filling the description.
 |  | ||||||
|         void begin(bool isLocal = false, bool allowInputLayout = false) { |  | ||||||
|             assert(!open && "Builder must be closed."); |  | ||||||
| 
 |  | ||||||
|             layoutDesc = RenderPipelineLayoutDesc(); |  | ||||||
|             layoutDesc.isLocal = isLocal; |  | ||||||
|             layoutDesc.allowInputLayout = allowInputLayout; |  | ||||||
| 
 |  | ||||||
|             pushConstantRanges.clear(); |  | ||||||
|             samplerPointerVectorList.clear(); |  | ||||||
|             descriptorRanges.clear(); |  | ||||||
|             descriptorSetDescs.clear(); |  | ||||||
|             descriptorRangeIndexPerSet.clear(); |  | ||||||
|             rootDescriptorDescs.clear(); |  | ||||||
| 
 |  | ||||||
|             open = true; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Returns push constant index.
 |  | ||||||
|         uint32_t addPushConstant(uint32_t binding, uint32_t set, uint32_t size, RenderShaderStageFlags stageFlags, uint32_t offset = 0) { |  | ||||||
|             assert(open && "Builder must be open."); |  | ||||||
| 
 |  | ||||||
|             uint32_t returnValue = layoutDesc.pushConstantRangesCount; |  | ||||||
|             pushConstantRanges.emplace_back(RenderPushConstantRange(binding, set, offset, size, stageFlags)); |  | ||||||
|             layoutDesc.pushConstantRangesCount++; |  | ||||||
|             return returnValue; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Returns set index.
 |  | ||||||
|         uint32_t addDescriptorSet(const RenderDescriptorSetDesc &descriptorSetDesc) { |  | ||||||
|             assert(open && "Builder must be open."); |  | ||||||
| 
 |  | ||||||
|             uint32_t returnValue = layoutDesc.descriptorSetDescsCount; |  | ||||||
|             descriptorRangeIndexPerSet.emplace_back(uint32_t(descriptorRanges.size())); |  | ||||||
|             descriptorSetDescs.emplace_back(descriptorSetDesc); |  | ||||||
| 
 |  | ||||||
|             for (uint32_t j = 0; j < descriptorSetDesc.descriptorRangesCount; j++) { |  | ||||||
|                 descriptorRanges.emplace_back(descriptorSetDesc.descriptorRanges[j]); |  | ||||||
| 
 |  | ||||||
|                 // Copy the immutable sampler pointers to a local vector list.
 |  | ||||||
|                 if (descriptorRanges.back().immutableSampler != nullptr) { |  | ||||||
|                     const RenderSampler **immutableSampler = descriptorRanges.back().immutableSampler; |  | ||||||
|                     samplerPointerVectorList.emplace_back(std::vector<const RenderSampler *>(immutableSampler, immutableSampler + descriptorRanges.back().count)); |  | ||||||
|                     descriptorRanges.back().immutableSampler = samplerPointerVectorList.back().data(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             layoutDesc.descriptorSetDescsCount++; |  | ||||||
| 
 |  | ||||||
|             return returnValue; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Returns set index.
 |  | ||||||
|         uint32_t addDescriptorSet(const RenderDescriptorSetBuilder &descriptorSetBuilder) { |  | ||||||
|             return addDescriptorSet(descriptorSetBuilder.descriptorSetDesc); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Returns set index.
 |  | ||||||
|         uint32_t addDescriptorSet(const RenderDescriptorSetBase &descriptorSetBase) { |  | ||||||
|             return addDescriptorSet(descriptorSetBase.builder); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Returns root descriptor index. D3D12 only.
 |  | ||||||
|         uint32_t addRootDescriptor(uint32_t shaderRegister, uint32_t registerSpace, RenderRootDescriptorType type) { |  | ||||||
|             assert(open && "Builder must be open."); |  | ||||||
| 
 |  | ||||||
|             uint32_t returnValue = layoutDesc.rootDescriptorDescsCount; |  | ||||||
|             rootDescriptorDescs.emplace_back(shaderRegister, registerSpace, type); |  | ||||||
|             ++layoutDesc.rootDescriptorDescsCount; |  | ||||||
| 
 |  | ||||||
|             return returnValue; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Finish the description.
 |  | ||||||
|         void end() { |  | ||||||
|             assert(open && "Builder must be open."); |  | ||||||
| 
 |  | ||||||
|             if (layoutDesc.pushConstantRangesCount > 0) { |  | ||||||
|                 layoutDesc.pushConstantRanges = pushConstantRanges.data(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (layoutDesc.descriptorSetDescsCount > 0) { |  | ||||||
|                 for (uint32_t i = 0; i < layoutDesc.descriptorSetDescsCount; i++) { |  | ||||||
|                     const uint32_t rangeIndex = descriptorRangeIndexPerSet[i]; |  | ||||||
|                     descriptorSetDescs[i].descriptorRanges = &descriptorRanges[rangeIndex]; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 layoutDesc.descriptorSetDescs = descriptorSetDescs.data(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (layoutDesc.rootDescriptorDescsCount > 0) { |  | ||||||
|                 layoutDesc.rootDescriptorDescs = rootDescriptorDescs.data(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             open = false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Create a pipeline layout with the final description.
 |  | ||||||
|         std::unique_ptr<RenderPipelineLayout> create(RenderDevice *device) const { |  | ||||||
|             assert(!open && "Builder must be closed."); |  | ||||||
| 
 |  | ||||||
|             return device->createPipelineLayout(layoutDesc); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| } |  | ||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,463 +0,0 @@ | ||||||
| //
 |  | ||||||
| // plume
 |  | ||||||
| //
 |  | ||||||
| // Copyright (c) 2024 renderbag and contributors. All rights reserved.
 |  | ||||||
| // Licensed under the MIT license. See LICENSE file for details.
 |  | ||||||
| //
 |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include "plume_render_interface.h" |  | ||||||
| 
 |  | ||||||
| #include <mutex> |  | ||||||
| #include <set> |  | ||||||
| #include <unordered_map> |  | ||||||
| #include <unordered_set> |  | ||||||
| 
 |  | ||||||
| #if defined(_WIN64) |  | ||||||
| #define VK_USE_PLATFORM_WIN32_KHR |  | ||||||
| #elif defined(__ANDROID__) |  | ||||||
| #define VK_USE_PLATFORM_ANDROID_KHR |  | ||||||
| #elif defined(__linux__) |  | ||||||
| #define VK_USE_PLATFORM_XLIB_KHR |  | ||||||
| #elif defined(__APPLE__) |  | ||||||
| #define VK_USE_PLATFORM_METAL_EXT |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| // For VK_KHR_portability_subset
 |  | ||||||
| #define VK_ENABLE_BETA_EXTENSIONS |  | ||||||
| 
 |  | ||||||
| #include <volk.h> |  | ||||||
| 
 |  | ||||||
| #ifdef __clang__ |  | ||||||
| #pragma clang diagnostic push |  | ||||||
| #pragma clang diagnostic ignored "-Wnullability-completeness" |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #include <vk_mem_alloc.h> |  | ||||||
| 
 |  | ||||||
| #ifdef __clang__ |  | ||||||
| #pragma clang diagnostic pop |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| namespace plume { |  | ||||||
|     struct VulkanCommandQueue; |  | ||||||
|     struct VulkanDevice; |  | ||||||
|     struct VulkanInterface; |  | ||||||
|     struct VulkanPool; |  | ||||||
|     struct VulkanQueue; |  | ||||||
| 
 |  | ||||||
|     struct VulkanBuffer : RenderBuffer { |  | ||||||
|         VkBuffer vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         VulkanPool *pool = nullptr; |  | ||||||
|         VmaAllocation allocation = VK_NULL_HANDLE; |  | ||||||
|         VmaAllocationInfo allocationInfo = {}; |  | ||||||
|         RenderBufferDesc desc; |  | ||||||
|         RenderBarrierStages barrierStages = RenderBarrierStage::NONE; |  | ||||||
| 
 |  | ||||||
|         VulkanBuffer() = default; |  | ||||||
|         VulkanBuffer(VulkanDevice *device, VulkanPool *pool, const RenderBufferDesc &desc); |  | ||||||
|         ~VulkanBuffer() override; |  | ||||||
|         void *map(uint32_t subresource, const RenderRange *readRange) override; |  | ||||||
|         void unmap(uint32_t subresource, const RenderRange *writtenRange) override; |  | ||||||
|         std::unique_ptr<RenderBufferFormattedView> createBufferFormattedView(RenderFormat format) override; |  | ||||||
|         void setName(const std::string &name) override; |  | ||||||
|         uint64_t getDeviceAddress() const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanBufferFormattedView : RenderBufferFormattedView { |  | ||||||
|         VkBufferView vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanBuffer *buffer = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanBufferFormattedView(VulkanBuffer *buffer, RenderFormat format); |  | ||||||
|         ~VulkanBufferFormattedView() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanTexture : RenderTexture { |  | ||||||
|         VkImage vk = VK_NULL_HANDLE; |  | ||||||
|         VkImageView imageView = VK_NULL_HANDLE; |  | ||||||
|         VkFormat imageFormat = VK_FORMAT_UNDEFINED; |  | ||||||
|         VkImageSubresourceRange imageSubresourceRange = {}; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         VulkanPool *pool = nullptr; |  | ||||||
|         VmaAllocation allocation = VK_NULL_HANDLE; |  | ||||||
|         VmaAllocationInfo allocationInfo = {}; |  | ||||||
|         RenderTextureLayout textureLayout = RenderTextureLayout::UNKNOWN; |  | ||||||
|         RenderBarrierStages barrierStages = RenderBarrierStage::NONE; |  | ||||||
|         bool ownership = false; |  | ||||||
|         RenderTextureDesc desc; |  | ||||||
| 
 |  | ||||||
|         VulkanTexture() = default; |  | ||||||
|         VulkanTexture(VulkanDevice *device, VulkanPool *pool, const RenderTextureDesc &desc); |  | ||||||
|         VulkanTexture(VulkanDevice *device, VkImage image); |  | ||||||
|         ~VulkanTexture() override; |  | ||||||
|         void createImageView(VkFormat format); |  | ||||||
|         std::unique_ptr<RenderTextureView> createTextureView(const RenderTextureViewDesc &desc) override; |  | ||||||
|         void setName(const std::string &name) override; |  | ||||||
|         void fillSubresourceRange(); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanTextureView : RenderTextureView { |  | ||||||
|         VkImageView vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanTexture *texture = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanTextureView(VulkanTexture *texture, const RenderTextureViewDesc &desc); |  | ||||||
|         ~VulkanTextureView() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanAccelerationStructure : RenderAccelerationStructure { |  | ||||||
|         VkAccelerationStructureKHR vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         RenderAccelerationStructureType type = RenderAccelerationStructureType::UNKNOWN; |  | ||||||
| 
 |  | ||||||
|         VulkanAccelerationStructure(VulkanDevice *device, const RenderAccelerationStructureDesc &desc); |  | ||||||
|         ~VulkanAccelerationStructure() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanDescriptorSetLayout { |  | ||||||
|         VkDescriptorSetLayout vk = VK_NULL_HANDLE; |  | ||||||
|         std::vector<VkDescriptorSetLayoutBinding> setBindings; |  | ||||||
|         std::vector<uint32_t> descriptorIndexBases; |  | ||||||
|         std::vector<uint32_t> descriptorBindingIndices; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanDescriptorSetLayout(VulkanDevice *device, const RenderDescriptorSetDesc &descriptorSetDesc); |  | ||||||
|         ~VulkanDescriptorSetLayout(); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanPipelineLayout : RenderPipelineLayout { |  | ||||||
|         VkPipelineLayout vk = VK_NULL_HANDLE; |  | ||||||
|         std::vector<VkPushConstantRange> pushConstantRanges; |  | ||||||
|         std::vector<VulkanDescriptorSetLayout *> descriptorSetLayouts; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanPipelineLayout(VulkanDevice *device, const RenderPipelineLayoutDesc &desc); |  | ||||||
|         ~VulkanPipelineLayout() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanShader : RenderShader { |  | ||||||
|         VkShaderModule vk = VK_NULL_HANDLE; |  | ||||||
|         std::string entryPointName; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         RenderShaderFormat format = RenderShaderFormat::UNKNOWN; |  | ||||||
| 
 |  | ||||||
|         VulkanShader(VulkanDevice *device, const void *data, uint64_t size, const char *entryPointName, RenderShaderFormat format); |  | ||||||
|         ~VulkanShader() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanSampler : RenderSampler { |  | ||||||
|         VkSampler vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanSampler(VulkanDevice *device, const RenderSamplerDesc &desc); |  | ||||||
|         ~VulkanSampler(); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanPipeline : RenderPipeline { |  | ||||||
|         enum class Type { |  | ||||||
|             Unknown, |  | ||||||
|             Compute, |  | ||||||
|             Graphics, |  | ||||||
|             Raytracing |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         Type type = Type::Unknown; |  | ||||||
| 
 |  | ||||||
|         VulkanPipeline(VulkanDevice *device, Type type); |  | ||||||
|         virtual ~VulkanPipeline() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanComputePipeline : VulkanPipeline { |  | ||||||
|         VkPipeline vk = VK_NULL_HANDLE; |  | ||||||
|         VkPipelineLayout pipelineLayout = VK_NULL_HANDLE; |  | ||||||
| 
 |  | ||||||
|         VulkanComputePipeline(VulkanDevice *device, const RenderComputePipelineDesc &desc); |  | ||||||
|         ~VulkanComputePipeline() override; |  | ||||||
|         void setName(const std::string& name) const override; |  | ||||||
|         RenderPipelineProgram getProgram(const std::string &name) const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanGraphicsPipeline : VulkanPipeline { |  | ||||||
|         VkPipeline vk = VK_NULL_HANDLE; |  | ||||||
|         VkRenderPass renderPass = VK_NULL_HANDLE; |  | ||||||
| 
 |  | ||||||
|         VulkanGraphicsPipeline(VulkanDevice *device, const RenderGraphicsPipelineDesc &desc); |  | ||||||
|         ~VulkanGraphicsPipeline() override; |  | ||||||
|         void setName(const std::string& name) const override; |  | ||||||
|         RenderPipelineProgram getProgram(const std::string &name) const override; |  | ||||||
|         static VkRenderPass createRenderPass(VulkanDevice *device, const VkFormat *renderTargetFormat, uint32_t renderTargetCount, VkFormat depthTargetFormat, VkSampleCountFlagBits sampleCount); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanRaytracingPipeline : VulkanPipeline { |  | ||||||
|         VkPipeline vk = VK_NULL_HANDLE; |  | ||||||
|         std::unordered_map<std::string, RenderPipelineProgram> nameProgramMap; |  | ||||||
|         uint32_t groupCount = 0; |  | ||||||
|         uint32_t descriptorSetCount = 0; |  | ||||||
| 
 |  | ||||||
|         VulkanRaytracingPipeline(VulkanDevice *device, const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline); |  | ||||||
|         ~VulkanRaytracingPipeline() override; |  | ||||||
|         void setName(const std::string& name) const override; |  | ||||||
|         RenderPipelineProgram getProgram(const std::string &name) const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanDescriptorSet : RenderDescriptorSet { |  | ||||||
|         VkDescriptorSet vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDescriptorSetLayout *setLayout = nullptr; |  | ||||||
|         VkDescriptorPool descriptorPool = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanDescriptorSet(VulkanDevice *device, const RenderDescriptorSetDesc &desc); |  | ||||||
|         ~VulkanDescriptorSet() override; |  | ||||||
|         void setBuffer(uint32_t descriptorIndex, const RenderBuffer *buffer, uint64_t bufferSize, const RenderBufferStructuredView *bufferStructuredView, const RenderBufferFormattedView *bufferFormattedView) override; |  | ||||||
|         void setTexture(uint32_t descriptorIndex, const RenderTexture *texture, RenderTextureLayout textureLayout, const RenderTextureView *textureView) override; |  | ||||||
|         void setSampler(uint32_t descriptorIndex, const RenderSampler *sampler) override; |  | ||||||
|         void setAccelerationStructure(uint32_t descriptorIndex, const RenderAccelerationStructure *accelerationStructure) override; |  | ||||||
|         void setDescriptor(uint32_t descriptorIndex, const VkDescriptorBufferInfo *bufferInfo, const VkDescriptorImageInfo *imageInfo, const VkBufferView *texelBufferView, void *pNext); |  | ||||||
|         static VkDescriptorPool createDescriptorPool(VulkanDevice *device, const std::unordered_map<VkDescriptorType, uint32_t> &typeCounts, bool lastRangeIsBoundless); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanSwapChain : RenderSwapChain { |  | ||||||
|         VkSwapchainKHR vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanCommandQueue *commandQueue = nullptr; |  | ||||||
|         VkSurfaceKHR surface = VK_NULL_HANDLE; |  | ||||||
|         RenderWindow renderWindow = {}; |  | ||||||
|         uint32_t textureCount = 0; |  | ||||||
|         uint64_t presentCount = 0; |  | ||||||
|         RenderFormat format = RenderFormat::UNKNOWN; |  | ||||||
|         uint32_t width = 0; |  | ||||||
|         uint32_t height = 0; |  | ||||||
|         VkSwapchainCreateInfoKHR createInfo = {}; |  | ||||||
|         VkSurfaceFormatKHR pickedSurfaceFormat = {}; |  | ||||||
|         VkPresentModeKHR createdPresentMode = VK_PRESENT_MODE_FIFO_KHR; |  | ||||||
|         VkPresentModeKHR requiredPresentMode = VK_PRESENT_MODE_FIFO_KHR; |  | ||||||
|         VkCompositeAlphaFlagBitsKHR pickedAlphaFlag = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; |  | ||||||
|         std::vector<VulkanTexture> textures; |  | ||||||
|         uint64_t currentPresentId = 0; |  | ||||||
|         bool immediatePresentModeSupported = false; |  | ||||||
|         uint32_t maxFrameLatency = 0; |  | ||||||
| 
 |  | ||||||
|         VulkanSwapChain(VulkanCommandQueue *commandQueue, RenderWindow renderWindow, uint32_t textureCount, RenderFormat format, uint32_t maxFrameLatency); |  | ||||||
|         ~VulkanSwapChain() override; |  | ||||||
|         bool present(uint32_t textureIndex, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount) override; |  | ||||||
|         void wait() override; |  | ||||||
|         bool resize() override; |  | ||||||
|         bool needsResize() const override; |  | ||||||
|         void setVsyncEnabled(bool vsyncEnabled) override; |  | ||||||
|         bool isVsyncEnabled() const override; |  | ||||||
|         uint32_t getWidth() const override; |  | ||||||
|         uint32_t getHeight() const override; |  | ||||||
|         RenderTexture *getTexture(uint32_t textureIndex) override; |  | ||||||
|         uint32_t getTextureCount() const override; |  | ||||||
|         bool acquireTexture(RenderCommandSemaphore *signalSemaphore, uint32_t *textureIndex) override; |  | ||||||
|         RenderWindow getWindow() const override; |  | ||||||
|         bool isEmpty() const override; |  | ||||||
|         uint32_t getRefreshRate() const override; |  | ||||||
|         void getWindowSize(uint32_t &dstWidth, uint32_t &dstHeight) const; |  | ||||||
|         void releaseSwapChain(); |  | ||||||
|         void releaseImageViews(); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanFramebuffer : RenderFramebuffer { |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         VkFramebuffer vk = VK_NULL_HANDLE; |  | ||||||
|         VkRenderPass renderPass = VK_NULL_HANDLE; |  | ||||||
|         std::vector<const VulkanTexture *> colorAttachments; |  | ||||||
|         const VulkanTexture *depthAttachment = nullptr; |  | ||||||
|         bool depthAttachmentReadOnly = false; |  | ||||||
|         uint32_t width = 0; |  | ||||||
|         uint32_t height = 0; |  | ||||||
| 
 |  | ||||||
|         VulkanFramebuffer(VulkanDevice *device, const RenderFramebufferDesc &desc); |  | ||||||
|         ~VulkanFramebuffer() override; |  | ||||||
|         uint32_t getWidth() const override; |  | ||||||
|         uint32_t getHeight() const override; |  | ||||||
|         bool contains(const VulkanTexture *attachment) const; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanQueryPool : RenderQueryPool { |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         std::vector<uint64_t> results; |  | ||||||
|         VkQueryPool vk = VK_NULL_HANDLE; |  | ||||||
| 
 |  | ||||||
|         VulkanQueryPool(VulkanDevice *device, uint32_t queryCount); |  | ||||||
|         virtual ~VulkanQueryPool() override; |  | ||||||
|         virtual void queryResults() override; |  | ||||||
|         virtual const uint64_t *getResults() const override; |  | ||||||
|         virtual uint32_t getCount() const override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanCommandList : RenderCommandList { |  | ||||||
|         VkCommandBuffer vk = VK_NULL_HANDLE; |  | ||||||
|         VkCommandPool commandPool = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         RenderCommandListType type = RenderCommandListType::UNKNOWN; |  | ||||||
|         const VulkanFramebuffer *targetFramebuffer = nullptr; |  | ||||||
|         const VulkanPipelineLayout *activeComputePipelineLayout = nullptr; |  | ||||||
|         const VulkanPipelineLayout *activeGraphicsPipelineLayout = nullptr; |  | ||||||
|         const VulkanPipelineLayout *activeRaytracingPipelineLayout = nullptr; |  | ||||||
|         VkRenderPass activeRenderPass = VK_NULL_HANDLE; |  | ||||||
| 
 |  | ||||||
|         VulkanCommandList(VulkanDevice *device, RenderCommandListType type); |  | ||||||
|         ~VulkanCommandList() override; |  | ||||||
|         void begin() override; |  | ||||||
|         void end() override; |  | ||||||
|         void barriers(RenderBarrierStages stages, const RenderBufferBarrier *bufferBarriers, uint32_t bufferBarriersCount, const RenderTextureBarrier *textureBarriers, uint32_t textureBarriersCount) override; |  | ||||||
|         void dispatch(uint32_t threadGroupCountX, uint32_t threadGroupCountY, uint32_t threadGroupCountZ) override; |  | ||||||
|         void traceRays(uint32_t width, uint32_t height, uint32_t depth, RenderBufferReference shaderBindingTable, const RenderShaderBindingGroupsInfo &shaderBindingGroupsInfo) override; |  | ||||||
|         void drawInstanced(uint32_t vertexCountPerInstance, uint32_t instanceCount, uint32_t startVertexLocation, uint32_t startInstanceLocation) override; |  | ||||||
|         void drawIndexedInstanced(uint32_t indexCountPerInstance, uint32_t instanceCount, uint32_t startIndexLocation, int32_t baseVertexLocation, uint32_t startInstanceLocation) override; |  | ||||||
|         void setPipeline(const RenderPipeline *pipeline) override; |  | ||||||
|         void setComputePipelineLayout(const RenderPipelineLayout *pipelineLayout) override; |  | ||||||
|         void setComputePushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) override; |  | ||||||
|         void setComputeDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) override; |  | ||||||
|         void setGraphicsPipelineLayout(const RenderPipelineLayout *pipelineLayout) override; |  | ||||||
|         void setGraphicsPushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) override; |  | ||||||
|         void setGraphicsDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) override; |  | ||||||
|         void setGraphicsRootDescriptor(RenderBufferReference bufferReference, uint32_t rootDescriptorIndex) override; |  | ||||||
|         void setRaytracingPipelineLayout(const RenderPipelineLayout *pipelineLayout) override; |  | ||||||
|         void setRaytracingPushConstants(uint32_t rangeIndex, const void *data, uint32_t offset = 0, uint32_t size = 0) override; |  | ||||||
|         void setRaytracingDescriptorSet(RenderDescriptorSet *descriptorSet, uint32_t setIndex) override; |  | ||||||
|         void setIndexBuffer(const RenderIndexBufferView *view) override; |  | ||||||
|         void setVertexBuffers(uint32_t startSlot, const RenderVertexBufferView *views, uint32_t viewCount, const RenderInputSlot *inputSlots) override; |  | ||||||
|         void setViewports(const RenderViewport *viewports, uint32_t count) override; |  | ||||||
|         void setScissors(const RenderRect *scissorRects, uint32_t count) override; |  | ||||||
|         void setFramebuffer(const RenderFramebuffer *framebuffer) override; |  | ||||||
|         void setDepthBias(float depthBias, float depthBiasClamp, float slopeScaledDepthBias) override; |  | ||||||
|         void clearColor(uint32_t attachmentIndex, RenderColor colorValue, const RenderRect *clearRects, uint32_t clearRectsCount) override; |  | ||||||
|         void clearDepth(bool clearDepth, float depthValue, const RenderRect *clearRects, uint32_t clearRectsCount) override; |  | ||||||
|         void copyBufferRegion(RenderBufferReference dstBuffer, RenderBufferReference srcBuffer, uint64_t size) override; |  | ||||||
|         void copyTextureRegion(const RenderTextureCopyLocation &dstLocation, const RenderTextureCopyLocation &srcLocation, uint32_t dstX, uint32_t dstY, uint32_t dstZ, const RenderBox *srcBox) override; |  | ||||||
|         void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) override; |  | ||||||
|         void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override; |  | ||||||
|         void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override; |  | ||||||
|         void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) override; |  | ||||||
|         void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) override; |  | ||||||
|         void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) override; |  | ||||||
|         void discardTexture(const RenderTexture* texture) override; |  | ||||||
|         void resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) override; |  | ||||||
|         void writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) override; |  | ||||||
|         void checkActiveRenderPass(); |  | ||||||
|         void endActiveRenderPass(); |  | ||||||
|         void setDescriptorSet(VkPipelineBindPoint bindPoint, const VulkanPipelineLayout *pipelineLayout, const RenderDescriptorSet *descriptorSet, uint32_t setIndex); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanCommandFence : RenderCommandFence { |  | ||||||
|         VkFence vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanCommandFence(VulkanDevice *device); |  | ||||||
|         ~VulkanCommandFence() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanCommandSemaphore : RenderCommandSemaphore { |  | ||||||
|         VkSemaphore vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanCommandSemaphore(VulkanDevice *device); |  | ||||||
|         ~VulkanCommandSemaphore() override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanCommandQueue : RenderCommandQueue { |  | ||||||
|         VulkanQueue *queue = nullptr; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
|         uint32_t familyIndex = 0; |  | ||||||
|         uint32_t queueIndex = 0; |  | ||||||
|         std::unordered_set<VulkanSwapChain *> swapChains; |  | ||||||
| 
 |  | ||||||
|         VulkanCommandQueue(VulkanDevice *device, RenderCommandListType commandListType); |  | ||||||
|         ~VulkanCommandQueue() override; |  | ||||||
|         std::unique_ptr<RenderSwapChain> createSwapChain(RenderWindow renderWindow, uint32_t bufferCount, RenderFormat format, uint32_t maxFrameLatency) override; |  | ||||||
|         void executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount, RenderCommandSemaphore **signalSemaphores, uint32_t signalSemaphoreCount, RenderCommandFence *signalFence) override; |  | ||||||
|         void waitForCommandFence(RenderCommandFence *fence) override; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanPool : RenderPool { |  | ||||||
|         VmaPool vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanDevice *device = nullptr; |  | ||||||
| 
 |  | ||||||
|         VulkanPool(VulkanDevice *device, const RenderPoolDesc &desc); |  | ||||||
|         ~VulkanPool() override; |  | ||||||
|         std::unique_ptr<RenderBuffer> createBuffer(const RenderBufferDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) override; |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     struct VulkanQueue { |  | ||||||
|         VkQueue vk; |  | ||||||
|         std::unique_ptr<std::mutex> mutex; |  | ||||||
|         std::unordered_set<const VulkanCommandQueue *> virtualQueues; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanQueueFamily { |  | ||||||
|         std::vector<VulkanQueue> queues; |  | ||||||
| 
 |  | ||||||
|         void add(VulkanCommandQueue *virtualQueue); |  | ||||||
|         void remove(VulkanCommandQueue *virtualQueue); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanDevice : RenderDevice { |  | ||||||
|         VkDevice vk = VK_NULL_HANDLE; |  | ||||||
|         VulkanInterface *renderInterface = nullptr; |  | ||||||
|         VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; |  | ||||||
|         VkPhysicalDeviceProperties physicalDeviceProperties = {}; |  | ||||||
|         VmaAllocator allocator = VK_NULL_HANDLE; |  | ||||||
|         uint32_t queueFamilyIndices[3] = {}; |  | ||||||
|         std::vector<VulkanQueueFamily> queueFamilies; |  | ||||||
|         RenderDeviceCapabilities capabilities; |  | ||||||
|         RenderDeviceDescription description; |  | ||||||
|         VkPhysicalDeviceRayTracingPipelinePropertiesKHR rtPipelineProperties = {}; |  | ||||||
|         VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationProperties = {}; |  | ||||||
|         std::unique_ptr<RenderBuffer> nullBuffer = nullptr; |  | ||||||
|         bool loadStoreOpNoneSupported = false; |  | ||||||
|         bool nullDescriptorSupported = false; |  | ||||||
| 
 |  | ||||||
|         VulkanDevice(VulkanInterface *renderInterface, const std::string &preferredDeviceName); |  | ||||||
|         ~VulkanDevice() override; |  | ||||||
|         std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) override; |  | ||||||
|         std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderShader> createShader(const void *data, uint64_t size, const char *entryPointName, RenderShaderFormat format) override; |  | ||||||
|         std::unique_ptr<RenderSampler> createSampler(const RenderSamplerDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipeline> createComputePipeline(const RenderComputePipelineDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipeline> createGraphicsPipeline(const RenderGraphicsPipelineDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipeline> createRaytracingPipeline(const RenderRaytracingPipelineDesc &desc, const RenderPipeline *previousPipeline) override; |  | ||||||
|         std::unique_ptr<RenderCommandQueue> createCommandQueue(RenderCommandListType type) override; |  | ||||||
|         std::unique_ptr<RenderBuffer> createBuffer(const RenderBufferDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderAccelerationStructure> createAccelerationStructure(const RenderAccelerationStructureDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPool> createPool(const RenderPoolDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderPipelineLayout> createPipelineLayout(const RenderPipelineLayoutDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderCommandFence> createCommandFence() override; |  | ||||||
|         std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() override; |  | ||||||
|         std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) override; |  | ||||||
|         std::unique_ptr<RenderQueryPool> createQueryPool(uint32_t queryCount) override; |  | ||||||
|         void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) override; |  | ||||||
|         void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild, bool preferFastTrace) override; |  | ||||||
|         void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) override; |  | ||||||
|         const RenderDeviceCapabilities &getCapabilities() const override; |  | ||||||
|         const RenderDeviceDescription &getDescription() const override; |  | ||||||
|         RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; |  | ||||||
|         void waitIdle() const override; |  | ||||||
|         void release(); |  | ||||||
|         bool isValid() const; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     struct VulkanInterface : RenderInterface { |  | ||||||
|         VkInstance instance = VK_NULL_HANDLE; |  | ||||||
|         VkApplicationInfo appInfo = {}; |  | ||||||
|         RenderInterfaceCapabilities capabilities; |  | ||||||
|         std::vector<std::string> deviceNames; |  | ||||||
| 
 |  | ||||||
| #   if SDL_VULKAN_ENABLED |  | ||||||
|         VulkanInterface(RenderWindow sdlWindow); |  | ||||||
| #   else |  | ||||||
|         VulkanInterface(); |  | ||||||
| #   endif |  | ||||||
| 
 |  | ||||||
|         ~VulkanInterface() override; |  | ||||||
|         std::unique_ptr<RenderDevice> createDevice(const std::string &preferredDeviceName) override; |  | ||||||
|         const RenderInterfaceCapabilities &getCapabilities() const override; |  | ||||||
|         const std::vector<std::string> &getDeviceNames() const override; |  | ||||||
|         bool isValid() const; |  | ||||||
|     }; |  | ||||||
| }; |  | ||||||
|  | @ -1838,7 +1838,7 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver, bool graphicsApiRetry) | ||||||
|     g_queue = g_device->createCommandQueue(RenderCommandListType::DIRECT); |     g_queue = g_device->createCommandQueue(RenderCommandListType::DIRECT); | ||||||
| 
 | 
 | ||||||
|     for (auto& commandList : g_commandLists) |     for (auto& commandList : g_commandLists) | ||||||
|         commandList = g_device->createCommandList(RenderCommandListType::DIRECT); |         commandList = g_queue->createCommandList(); | ||||||
| 
 | 
 | ||||||
|     for (auto& commandFence : g_commandFences) |     for (auto& commandFence : g_commandFences) | ||||||
|         commandFence = g_device->createCommandFence(); |         commandFence = g_device->createCommandFence(); | ||||||
|  | @ -1847,7 +1847,7 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver, bool graphicsApiRetry) | ||||||
|         queryPool = g_device->createQueryPool(NUM_QUERIES); |         queryPool = g_device->createQueryPool(NUM_QUERIES); | ||||||
| 
 | 
 | ||||||
|     g_copyQueue = g_device->createCommandQueue(RenderCommandListType::COPY); |     g_copyQueue = g_device->createCommandQueue(RenderCommandListType::COPY); | ||||||
|     g_copyCommandList = g_device->createCommandList(RenderCommandListType::COPY); |     g_copyCommandList = g_copyQueue->createCommandList(); | ||||||
|     g_copyCommandFence = g_device->createCommandFence(); |     g_copyCommandFence = g_device->createCommandFence(); | ||||||
| 
 | 
 | ||||||
|     uint32_t bufferCount = 2; |     uint32_t bufferCount = 2; | ||||||
|  | @ -2075,23 +2075,21 @@ void Video::WaitForGPU() | ||||||
| { | { | ||||||
|     g_waitForGPUCount++; |     g_waitForGPUCount++; | ||||||
| 
 | 
 | ||||||
|     if (g_vulkan) |     // Wait for all queued frames to finish.
 | ||||||
|  |     for (size_t i = 0; i < NUM_FRAMES; i++) | ||||||
|     { |     { | ||||||
|         g_device->waitIdle(); |         if (g_commandListStates[i]) | ||||||
|     } |  | ||||||
|     else  |  | ||||||
|     { |  | ||||||
|         for (size_t i = 0; i < NUM_FRAMES; i++) |  | ||||||
|         { |         { | ||||||
|             if (g_commandListStates[i]) |             g_queue->waitForCommandFence(g_commandFences[i].get()); | ||||||
|             { |             g_commandListStates[i] = false; | ||||||
|                 g_queue->waitForCommandFence(g_commandFences[i].get()); |  | ||||||
|                 g_commandListStates[i] = false; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         g_queue->executeCommandLists(nullptr, g_commandFences[0].get()); |  | ||||||
|         g_queue->waitForCommandFence(g_commandFences[0].get()); |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     // Execute an empty command list and wait for it to end to guarantee that any remaining presentation has finished.
 | ||||||
|  |     g_commandLists[0]->begin(); | ||||||
|  |     g_commandLists[0]->end(); | ||||||
|  |     g_queue->executeCommandLists(g_commandLists[0].get(), g_commandFences[0].get()); | ||||||
|  |     g_queue->waitForCommandFence(g_commandFences[0].get()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5, be<uint32_t>* a6) | static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5, be<uint32_t>* a6) | ||||||
|  | @ -5737,7 +5735,7 @@ static bool LoadTexture(GuestTexture& texture, const uint8_t* data, size_t dataS | ||||||
|                 auto copyTextureRegion = [&](Slice& slice, uint32_t subresourceIndex) |                 auto copyTextureRegion = [&](Slice& slice, uint32_t subresourceIndex) | ||||||
|                     { |                     { | ||||||
|                         g_copyCommandList->copyTextureRegion( |                         g_copyCommandList->copyTextureRegion( | ||||||
|                             RenderTextureCopyLocation::Subresource(texture.texture, subresourceIndex), |                             RenderTextureCopyLocation::Subresource(texture.texture, subresourceIndex % ddsDesc.numMips, subresourceIndex / ddsDesc.numMips), | ||||||
|                             RenderTextureCopyLocation::PlacedFootprint(uploadBuffer.get(), desc.format, slice.width, slice.height, slice.depth, (slice.dstRowPitch * 8) / ddsDesc.bitsPerPixelOrBlock * ddsDesc.blockWidth, slice.dstOffset)); |                             RenderTextureCopyLocation::PlacedFootprint(uploadBuffer.get(), desc.format, slice.width, slice.height, slice.depth, (slice.dstRowPitch * 8) / ddsDesc.bitsPerPixelOrBlock * ddsDesc.blockWidth, slice.dstOffset)); | ||||||
|                     }; |                     }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| /////////////////////////////////////////////////////////////////////#define PSO_CACHING
 | /////////////////////////////////////////////////////////////////////#define PSO_CACHING
 | ||||||
| //#define PSO_CACHING_CLEANUP
 | //#define PSO_CACHING_CLEANUP
 | ||||||
| 
 | 
 | ||||||
| #include "rhi/plume_render_interface.h" | #include <plume_render_interface.h> | ||||||
| 
 | 
 | ||||||
| #define D3DCLEAR_TARGET  0x1 | #define D3DCLEAR_TARGET  0x1 | ||||||
| #define D3DCLEAR_ZBUFFER 0x10 | #define D3DCLEAR_ZBUFFER 0x10 | ||||||
|  |  | ||||||
|  | @ -337,7 +337,14 @@ int main(int argc, char *argv[]) | ||||||
| 
 | 
 | ||||||
|         if (!InstallerWizard::Run(GetGamePath(), isGameInstalled && forceDLCInstaller)) |         if (!InstallerWizard::Run(GetGamePath(), isGameInstalled && forceDLCInstaller)) | ||||||
|         { |         { | ||||||
|             std::_Exit(0); |             if (!forceDLCInstaller) | ||||||
|  |             { | ||||||
|  |                 std::_Exit(0); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 InstallerWizard::s_returnToTitle = true; | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| #include <api/SWA.h> | #include <api/SWA.h> | ||||||
| #include <ui/game_window.h> | #include <ui/game_window.h> | ||||||
|  | #include <ui/installer_wizard.h> | ||||||
| #include <user/achievement_manager.h> | #include <user/achievement_manager.h> | ||||||
| #include <user/persistent_storage_manager.h> | #include <user/persistent_storage_manager.h> | ||||||
| #include <user/config.h> | #include <user/config.h> | ||||||
|  | @ -83,7 +84,7 @@ PPC_FUNC(sub_825197C0) | ||||||
| PPC_FUNC_IMPL(__imp__sub_82547DF0); | PPC_FUNC_IMPL(__imp__sub_82547DF0); | ||||||
| PPC_FUNC(sub_82547DF0) | PPC_FUNC(sub_82547DF0) | ||||||
| { | { | ||||||
|     if (Config::SkipIntroLogos) |     if (Config::SkipIntroLogos || InstallerWizard::s_returnToTitle) | ||||||
|     { |     { | ||||||
|         ctx.r4.u64 = 0; |         ctx.r4.u64 = 0; | ||||||
|         ctx.r5.u64 = 0; |         ctx.r5.u64 = 0; | ||||||
|  |  | ||||||
|  | @ -218,7 +218,7 @@ void GameWindow::Init(const char* sdlVideoDriver) | ||||||
| #elif defined(__linux__) | #elif defined(__linux__) | ||||||
|     s_renderWindow = { info.info.x11.display, info.info.x11.window }; |     s_renderWindow = { info.info.x11.display, info.info.x11.window }; | ||||||
| #elif defined(__APPLE__) | #elif defined(__APPLE__) | ||||||
|     s_renderWindow.window = s_pWindow; |     s_renderWindow.window = info.info.cocoa.window; | ||||||
|     s_renderWindow.view = SDL_Metal_GetLayer(SDL_Metal_CreateView(s_pWindow)); |     s_renderWindow.view = SDL_Metal_GetLayer(SDL_Metal_CreateView(s_pWindow)); | ||||||
| #else | #else | ||||||
|     static_assert(false, "Unknown platform."); |     static_assert(false, "Unknown platform."); | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <gpu/rhi/plume_render_interface_types.h> | #include <plume_render_interface_types.h> | ||||||
| #include <user/config.h> | #include <user/config.h> | ||||||
| #include <sdl_events.h> | #include <sdl_events.h> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| struct InstallerWizard | struct InstallerWizard | ||||||
| { | { | ||||||
|     static inline bool s_isVisible = false; |     static inline bool s_isVisible = false; | ||||||
|  |     static inline bool s_returnToTitle = false; | ||||||
| 
 | 
 | ||||||
|     static void Init(); |     static void Init(); | ||||||
|     static void Draw(); |     static void Draw(); | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								thirdparty/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								thirdparty/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -20,6 +20,7 @@ add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/nativefiledialog-extended" | ||||||
| add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/o1heap") | add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/o1heap") | ||||||
| add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL") | add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL") | ||||||
| add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL_mixer") | add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL_mixer") | ||||||
|  | add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/plume") | ||||||
| 
 | 
 | ||||||
| if (APPLE) | if (APPLE) | ||||||
|     add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/MoltenVK") |     add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/MoltenVK") | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								thirdparty/D3D12MemoryAllocator
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								thirdparty/D3D12MemoryAllocator
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| Subproject commit e00c4a7c85cf9c28c6f4a6cc75032736f416410f |  | ||||||
							
								
								
									
										2
									
								
								thirdparty/MoltenVK/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								thirdparty/MoltenVK/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -75,7 +75,7 @@ file(GLOB_RECURSE MVK_SOURCES CONFIGURE_DEPENDS | ||||||
| file(GLOB MVK_SRC_INCLUDES LIST_DIRECTORIES ON ${MVK_DIR}/MoltenVK/*) | file(GLOB MVK_SRC_INCLUDES LIST_DIRECTORIES ON ${MVK_DIR}/MoltenVK/*) | ||||||
| set(MVK_INCLUDES | set(MVK_INCLUDES | ||||||
|     ${MVK_SRC_INCLUDES} ${MVK_GENERATED_INCLUDES} ${MVK_DIR}/include |     ${MVK_SRC_INCLUDES} ${MVK_GENERATED_INCLUDES} ${MVK_DIR}/include | ||||||
|     ${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/Vulkan-Headers/include) |     ${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/plume/contrib/Vulkan-Headers/include) | ||||||
| 
 | 
 | ||||||
| add_library(MoltenVK SHARED ${MVK_SOURCES}) | add_library(MoltenVK SHARED ${MVK_SOURCES}) | ||||||
| target_include_directories(MoltenVK PRIVATE ${MVK_INCLUDES}) | target_include_directories(MoltenVK PRIVATE ${MVK_INCLUDES}) | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								thirdparty/Vulkan-Headers
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								thirdparty/Vulkan-Headers
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| Subproject commit 75ad707a587e1469fb53a901b9b68fe9f6fbc11f |  | ||||||
							
								
								
									
										1
									
								
								thirdparty/VulkanMemoryAllocator
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								thirdparty/VulkanMemoryAllocator
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| Subproject commit 1c35ba99ce775f8342d87a83a3f0f696f99c2a39 |  | ||||||
							
								
								
									
										1
									
								
								thirdparty/plume
									
										
									
									
										vendored
									
									
										Submodule
									
								
							
							
						
						
									
										1
									
								
								thirdparty/plume
									
										
									
									
										vendored
									
									
										Submodule
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | Subproject commit fffeb35f836d8c945697ec82b735e77db401e2de | ||||||
							
								
								
									
										1
									
								
								thirdparty/volk
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								thirdparty/volk
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| Subproject commit 447e21b5d92ed8d5271b0d39b071f938fcfa875f |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue