Files
XCEngine/engine/include/XCEngine/Rendering/Caches/RenderResourceCache.h
2026-04-05 22:07:49 +08:00

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