mirror of
				https://github.com/dolphin-emu/dolphin.git
				synced 2025-10-27 02:19:46 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2016 Dolphin Emulator Project
 | |
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <array>
 | |
| #include <cstddef>
 | |
| #include <map>
 | |
| #include <memory>
 | |
| #include <string>
 | |
| #include <tuple>
 | |
| #include <unordered_map>
 | |
| 
 | |
| #include "Common/CommonTypes.h"
 | |
| #include "Common/LinearDiskCache.h"
 | |
| 
 | |
| #include "VideoBackends/Vulkan/Constants.h"
 | |
| 
 | |
| #include "VideoCommon/GeometryShaderGen.h"
 | |
| #include "VideoCommon/PixelShaderGen.h"
 | |
| #include "VideoCommon/RenderState.h"
 | |
| #include "VideoCommon/VertexShaderGen.h"
 | |
| 
 | |
| namespace Vulkan
 | |
| {
 | |
| class CommandBufferManager;
 | |
| class VertexFormat;
 | |
| class VKTexture;
 | |
| class StreamBuffer;
 | |
| 
 | |
| class ObjectCache
 | |
| {
 | |
| public:
 | |
|   ObjectCache();
 | |
|   ~ObjectCache();
 | |
| 
 | |
|   // Perform at startup, create descriptor layouts, compiles all static shaders.
 | |
|   bool Initialize();
 | |
|   void Shutdown();
 | |
| 
 | |
|   // Descriptor set layout accessor. Used for allocating descriptor sets.
 | |
|   VkDescriptorSetLayout GetDescriptorSetLayout(DESCRIPTOR_SET_LAYOUT layout) const
 | |
|   {
 | |
|     return m_descriptor_set_layouts[layout];
 | |
|   }
 | |
| 
 | |
|   // Pipeline layout accessor. Used to fill in required field in PipelineInfo.
 | |
|   VkPipelineLayout GetPipelineLayout(PIPELINE_LAYOUT layout) const
 | |
|   {
 | |
|     return m_pipeline_layouts[layout];
 | |
|   }
 | |
| 
 | |
|   // Staging buffer for textures.
 | |
|   StreamBuffer* GetTextureUploadBuffer() const { return m_texture_upload_buffer.get(); }
 | |
| 
 | |
|   // Static samplers
 | |
|   VkSampler GetPointSampler() const { return m_point_sampler; }
 | |
|   VkSampler GetLinearSampler() const { return m_linear_sampler; }
 | |
|   VkSampler GetSampler(const SamplerState& info);
 | |
| 
 | |
|   // Render pass cache.
 | |
|   VkRenderPass GetRenderPass(VkFormat color_format, VkFormat depth_format, u32 multisamples,
 | |
|                              VkAttachmentLoadOp load_op, u8 additional_attachment_count = 0);
 | |
| 
 | |
|   // Pipeline cache. Used when creating pipelines for drivers to store compiled programs.
 | |
|   VkPipelineCache GetPipelineCache() const { return m_pipeline_cache; }
 | |
| 
 | |
|   // Clear sampler cache, use when anisotropy mode changes
 | |
|   // WARNING: Ensure none of the objects from here are in use when calling
 | |
|   void ClearSamplerCache();
 | |
| 
 | |
|   // Saves the pipeline cache to disk. Call when shutting down.
 | |
|   void SavePipelineCache();
 | |
| 
 | |
|   // Reload pipeline cache. Call when host config changes.
 | |
|   void ReloadPipelineCache();
 | |
| 
 | |
| private:
 | |
|   bool CreateDescriptorSetLayouts();
 | |
|   void DestroyDescriptorSetLayouts();
 | |
|   bool CreatePipelineLayouts();
 | |
|   void DestroyPipelineLayouts();
 | |
|   bool CreateStaticSamplers();
 | |
|   void DestroySamplers();
 | |
|   void DestroyRenderPassCache();
 | |
|   bool CreatePipelineCache();
 | |
|   bool LoadPipelineCache();
 | |
|   bool ValidatePipelineCache(const u8* data, size_t data_length);
 | |
|   void DestroyPipelineCache();
 | |
| 
 | |
|   std::array<VkDescriptorSetLayout, NUM_DESCRIPTOR_SET_LAYOUTS> m_descriptor_set_layouts = {};
 | |
|   std::array<VkPipelineLayout, NUM_PIPELINE_LAYOUTS> m_pipeline_layouts = {};
 | |
| 
 | |
|   std::unique_ptr<StreamBuffer> m_texture_upload_buffer;
 | |
| 
 | |
|   VkSampler m_point_sampler = VK_NULL_HANDLE;
 | |
|   VkSampler m_linear_sampler = VK_NULL_HANDLE;
 | |
| 
 | |
|   std::map<SamplerState, VkSampler> m_sampler_cache;
 | |
| 
 | |
|   // Dummy image for samplers that are unbound
 | |
|   std::unique_ptr<VKTexture> m_dummy_texture;
 | |
| 
 | |
|   // Render pass cache
 | |
|   using RenderPassCacheKey = std::tuple<VkFormat, VkFormat, u32, VkAttachmentLoadOp, std::size_t>;
 | |
|   std::map<RenderPassCacheKey, VkRenderPass> m_render_pass_cache;
 | |
| 
 | |
|   // pipeline cache
 | |
|   VkPipelineCache m_pipeline_cache = VK_NULL_HANDLE;
 | |
|   std::string m_pipeline_cache_filename;
 | |
| };
 | |
| 
 | |
| extern std::unique_ptr<ObjectCache> g_object_cache;
 | |
| 
 | |
| }  // namespace Vulkan
 |