/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2020 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #ifndef XENIA_GPU_VULKAN_VULKAN_SHARED_MEMORY_H_ #define XENIA_GPU_VULKAN_VULKAN_SHARED_MEMORY_H_ #include #include #include #include #include "xenia/gpu/shared_memory.h" #include "xenia/gpu/trace_writer.h" #include "xenia/memory.h" #include "xenia/ui/vulkan/vulkan_upload_buffer_pool.h" namespace xe { namespace gpu { namespace vulkan { class VulkanCommandProcessor; class VulkanSharedMemory : public SharedMemory { public: VulkanSharedMemory(VulkanCommandProcessor& command_processor, Memory& memory, TraceWriter& trace_writer, VkPipelineStageFlags guest_shader_pipeline_stages); ~VulkanSharedMemory() override; bool Initialize(); void Shutdown(bool from_destructor = false); void ClearCache() override; void CompletedSubmissionUpdated(); void EndSubmission(); enum class Usage { // Index buffer, vfetch, compute read, transfer source. kRead, // Index buffer, vfetch, memexport. kGuestDrawReadWrite, kComputeWrite, kTransferDestination, }; // Inserts a pipeline barrier for the target usage, also ensuring consecutive // read-write accesses are ordered with each other. void Use(Usage usage, std::pair written_range = {}); VkBuffer buffer() const { return buffer_; } // Returns true if any downloads were submitted to the command processor. bool InitializeTraceSubmitDownloads(); void InitializeTraceCompleteDownloads(); protected: bool AllocateSparseHostGpuMemoryRange(uint32_t offset_allocations, uint32_t length_allocations) override; bool UploadRanges(const std::pair* upload_page_ranges, uint32_t num_ranges) override; private: void GetUsageMasks(Usage usage, VkPipelineStageFlags& stage_mask, VkAccessFlags& access_mask) const; VulkanCommandProcessor& command_processor_; TraceWriter& trace_writer_; VkPipelineStageFlags guest_shader_pipeline_stages_; VkBuffer buffer_ = VK_NULL_HANDLE; uint32_t buffer_memory_type_; // Single for non-sparse, every allocation so far for sparse. std::vector buffer_memory_; Usage last_usage_; std::pair last_written_range_; std::unique_ptr upload_buffer_pool_; std::vector upload_regions_; // Created temporarily, only for downloading. VkBuffer trace_download_buffer_ = VK_NULL_HANDLE; VkDeviceMemory trace_download_buffer_memory_ = VK_NULL_HANDLE; void ResetTraceDownload(); }; } // namespace vulkan } // namespace gpu } // namespace xe #endif // XENIA_GPU_VULKAN_VULKAN_SHARED_MEMORY_H_