52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <XCEngine/RHI/RHIBuffer.h>
|
|
#include <XCEngine/RHI/RHIDevice.h>
|
|
#include <XCEngine/RHI/RHIResourceView.h>
|
|
#include <XCEngine/RHI/RHITexture.h>
|
|
#include <XCEngine/Resources/Mesh/Mesh.h>
|
|
#include <XCEngine/Resources/Texture/Texture.h>
|
|
|
|
#include <unordered_map>
|
|
|
|
namespace XCEngine {
|
|
namespace Rendering {
|
|
|
|
class RenderResourceCache {
|
|
public:
|
|
struct CachedMesh {
|
|
RHI::RHIBuffer* vertexBuffer = nullptr;
|
|
RHI::RHIResourceView* vertexBufferView = nullptr;
|
|
RHI::RHIBuffer* indexBuffer = nullptr;
|
|
RHI::RHIResourceView* indexBufferView = nullptr;
|
|
uint32_t vertexCount = 0;
|
|
uint32_t indexCount = 0;
|
|
uint32_t vertexStride = 0;
|
|
bool uses32BitIndices = false;
|
|
};
|
|
|
|
struct CachedTexture {
|
|
RHI::RHITexture* texture = nullptr;
|
|
RHI::RHIResourceView* shaderResourceView = nullptr;
|
|
uint32_t width = 0;
|
|
uint32_t height = 0;
|
|
};
|
|
|
|
~RenderResourceCache();
|
|
|
|
void Shutdown();
|
|
|
|
const CachedMesh* GetOrCreateMesh(RHI::RHIDevice* device, const Resources::Mesh* mesh);
|
|
const CachedTexture* GetOrCreateTexture(RHI::RHIDevice* device, const Resources::Texture* texture);
|
|
|
|
private:
|
|
bool UploadMesh(RHI::RHIDevice* device, const Resources::Mesh* mesh, CachedMesh& cachedMesh);
|
|
bool UploadTexture(RHI::RHIDevice* device, const Resources::Texture* texture, CachedTexture& cachedTexture);
|
|
|
|
std::unordered_map<const Resources::Mesh*, CachedMesh> m_meshCache;
|
|
std::unordered_map<const Resources::Texture*, CachedTexture> m_textureCache;
|
|
};
|
|
|
|
} // namespace Rendering
|
|
} // namespace XCEngine
|