dolphin/Source/Core/VideoBackends/Vulkan/ObjectCache.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

116 lines
3.4 KiB
C
Raw Normal View History

2016-08-13 12:57:50 +00:00
// Copyright 2016 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2016-08-13 12:57:50 +00:00
#pragma once
#include <array>
#include <cstddef>
2016-08-13 12:57:50 +00:00
#include <map>
#include <memory>
#include <string>
#include <tuple>
2016-08-13 12:57:50 +00:00
#include <unordered_map>
#include "Common/CommonTypes.h"
2016-08-13 12:57:50 +00:00
#include "Common/LinearDiskCache.h"
#include "VideoBackends/Vulkan/Constants.h"
#include "VideoCommon/GeometryShaderGen.h"
#include "VideoCommon/PixelShaderGen.h"
#include "VideoCommon/RenderState.h"
2016-08-13 12:57:50 +00:00
#include "VideoCommon/VertexShaderGen.h"
namespace Vulkan
{
class CommandBufferManager;
class VertexFormat;
class VKTexture;
2016-08-13 12:57:50 +00:00
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
2016-08-13 12:57:50 +00:00
{
return m_descriptor_set_layouts[layout];
2016-08-13 12:57:50 +00:00
}
// 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(); }
2016-08-13 12:57:50 +00:00
// 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; }
2016-08-13 12:57:50 +00:00
// 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();
2016-08-13 12:57:50 +00:00
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();
2016-08-13 12:57:50 +00:00
std::array<VkDescriptorSetLayout, NUM_DESCRIPTOR_SET_LAYOUTS> m_descriptor_set_layouts = {};
std::array<VkPipelineLayout, NUM_PIPELINE_LAYOUTS> m_pipeline_layouts = {};
2016-08-13 12:57:50 +00:00
std::unique_ptr<StreamBuffer> m_texture_upload_buffer;
2016-08-13 12:57:50 +00:00
VkSampler m_point_sampler = VK_NULL_HANDLE;
VkSampler m_linear_sampler = VK_NULL_HANDLE;
std::map<SamplerState, VkSampler> m_sampler_cache;
2017-07-20 05:25:35 +00:00
// 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;
2016-08-13 12:57:50 +00:00
};
extern std::unique_ptr<ObjectCache> g_object_cache;
} // namespace Vulkan