[Feat] (MG_Backend/DirectVulkan): ProgramManager - hash program object

This commit is contained in:
2026-02-09 16:18:50 +08:00
parent 18941f9e83
commit 22bc4fbbc9
6 changed files with 91 additions and 3 deletions
+1 -1
View File
@@ -213,7 +213,7 @@ set(SOURCE_FILES
MobileGL/MG_Backend/DirectVulkan/Renderer/PipelineManager.cpp
MobileGL/MG_Backend/DirectVulkan/Renderer/FrameContext.cpp
MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp
MobileGL/MG_Backend/DirectVulkan/Renderer/ProgramManager.cpp
MobileGL/MG_Backend/DirectVulkan/Managers/ProgramManager.cpp
MobileGL/MG_State/GLState/Core.cpp
MobileGL/MG_State/GLState/ErrorState/Error.cpp
-2
View File
@@ -106,8 +106,6 @@
#define TRACY_ZONECOLOR_BACKEND 0x00FF00
#endif
#include "xxhash.h"
// Post-includes for significant project headers
#include "MG_Util/Debug/Log.h"
#include "MG_Util/Types.h"
@@ -0,0 +1,50 @@
//
// Created by Swung0x48 on 2026/2/9.
//
#include "ProgramManager.h"
#include "MG_Backend/DirectVulkan/Renderer/VulkanContext.h"
namespace MobileGL::MG_Backend::DirectVulkan {
ProgramManager::ProgramManager(VulkanContext &ctx): m_ctx(ctx) {}
ProgramManager::~ProgramManager() {
Cleanup();
}
void ProgramManager::Cleanup() {
XXH64_freeState(m_hashState);
}
Vector<VkPipelineShaderStageCreateInfo> ProgramManager::CreatePipelineShaderStages() {
Vector<VkPipelineShaderStageCreateInfo> info;
return info;
}
ProgramManager::HashType ProgramManager::GetHash(ProgramObject *programObject) {
MOBILEGL_ASSERT(programObject && programObject->GetLinkStatus(), "program object is null or not successfully linked!");
MOBILEGL_ASSERT(m_hashState != nullptr, "Hash state should already be initialized");
XXH64_hash_t const seed = MG_Config::CacheVersion;
auto errc = XXH64_reset(m_hashState, seed);
MOBILEGL_ASSERT(errc == XXH_OK, "Hash state reset failed");
auto& shaders = programObject->GetAttachedShaders();
auto& spirvBinaries = programObject->GetGeneratedSpirv();
auto count = shaders.size();
for (auto i = 0; i < count; i++) {
auto& shader = shaders[i];
auto stage = shader->GetShaderStage();
errc = XXH64_update(m_hashState, &stage, sizeof(stage));
MOBILEGL_ASSERT(errc == XXH_OK, "Hash state update failed");
errc = XXH64_update(m_hashState, spirvBinaries[i].data(), spirvBinaries[i].size() * sizeof(unsigned));
MOBILEGL_ASSERT(errc == XXH_OK, "Hash state update failed");
}
HashType hash = XXH64_digest(m_hashState);
return hash;
}
} // namespace MobileGL::MG_Backend::DirectVulkan
@@ -0,0 +1,34 @@
// MobileGL - MobileGL/MG_Backend/DirectVulkan/Renderer/ProgramManager.h
// Copyright (c) 2025-2026 MobileGL-Dev
// Licensed under the GNU Lesser General Public License v3.0:
// https://www.gnu.org/licenses/gpl-3.0.txt
// https://www.gnu.org/licenses/lgpl-3.0.txt
// SPDX-License-Identifier: LGPL-3.0-only
// End of Source File Header
#pragma once
#include "Includes.h"
#include "MG_State/GLState/ProgramState/ProgramObject.h"
#include "Config.h"
#include "xxhash.h"
namespace MobileGL::MG_Backend::DirectVulkan {
class VulkanContext;
class ProgramManager {
public:
using HashType = XXH64_hash_t;
ProgramManager(VulkanContext& ctx);
~ProgramManager();
Vector<VkPipelineShaderStageCreateInfo> CreatePipelineShaderStages();
private:
using ProgramObject = MobileGL::MG_State::GLState::ProgramObject;
void Cleanup();
HashType GetHash(ProgramObject* programObject);
VulkanContext& m_ctx;
UnorderedMap<HashType, Vector<VkPipelineShaderStageCreateInfo>> m_shaderStageCreateInfo;
XXH64_state_t* const m_hashState = XXH64_createState();
};
} // namespace MobileGL::MG_Backend::DirectVulkan
@@ -110,6 +110,11 @@ namespace MobileGL {
AddDefaultFragmentShaderIfMissing();
}
std::sort(m_shaders.begin(), m_shaders.end(),
[](SharedPtr<ShaderObject>& a, SharedPtr<ShaderObject>& b) {
return a->GetShaderStage() < b->GetShaderStage();
});
for (SizeT i = 0; i < m_shaders.size(); i++) {
shaderTypes[i] = MG_Util::ConvertShaderStageToGLEnum(m_shaders[i]->GetShaderStage());
MGLOG_D("ProgramObject %u: Preparing shader[%zu] stage %s at %p", m_externalIndex, i,
@@ -17,6 +17,7 @@ namespace MobileGL {
Geometry,
Fragment,
Compute,
ShaderStageCount,
Unknown = -1
};