mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Vulkan: Update shader cache format for geo shaders.
This commit is contained in:
parent
d16caa71af
commit
fbdb278168
2 changed files with 19 additions and 2 deletions
|
@ -544,6 +544,7 @@ struct StoredVulkanPipelineKey {
|
|||
VulkanPipelineRasterStateKey raster;
|
||||
VShaderID vShaderID;
|
||||
FShaderID fShaderID;
|
||||
GShaderID gShaderID;
|
||||
uint32_t vtxFmtId;
|
||||
uint32_t variants;
|
||||
bool useHWTransform; // TODO: Still needed?
|
||||
|
@ -609,6 +610,7 @@ void PipelineManagerVulkan::SaveCache(FILE *file, bool saveRawPipelineCache, Sha
|
|||
key.useHWTransform = pkey.useHWTransform;
|
||||
key.fShaderID = fshader->GetID();
|
||||
key.vShaderID = vshader->GetID();
|
||||
key.gShaderID = gshader ? gshader->GetID() : GShaderID();
|
||||
key.variants = value->GetVariantsBitmask();
|
||||
if (key.useHWTransform) {
|
||||
// NOTE: This is not a vtype, but a decoded vertex format.
|
||||
|
@ -713,6 +715,7 @@ bool PipelineManagerVulkan::LoadCache(FILE *file, bool loadRawPipelineCache, Sha
|
|||
}
|
||||
VulkanVertexShader *vs = shaderManager->GetVertexShaderFromID(key.vShaderID);
|
||||
VulkanFragmentShader *fs = shaderManager->GetFragmentShaderFromID(key.fShaderID);
|
||||
VulkanGeometryShader *gs = shaderManager->GetGeometryShaderFromID(key.gShaderID);
|
||||
if (!vs || !fs) {
|
||||
failed = true;
|
||||
ERROR_LOG(G3D, "Failed to find vs or fs in of pipeline %d in cache", (int)i);
|
||||
|
@ -721,7 +724,7 @@ bool PipelineManagerVulkan::LoadCache(FILE *file, bool loadRawPipelineCache, Sha
|
|||
|
||||
DecVtxFormat fmt;
|
||||
fmt.InitializeFromID(key.vtxFmtId);
|
||||
VulkanPipeline *pipeline = GetOrCreatePipeline(rm, layout, key.raster, key.useHWTransform ? &fmt : 0, vs, fs, nullptr, key.useHWTransform, key.variants);
|
||||
VulkanPipeline *pipeline = GetOrCreatePipeline(rm, layout, key.raster, key.useHWTransform ? &fmt : 0, vs, fs, gs, key.useHWTransform, key.variants);
|
||||
if (!pipeline) {
|
||||
pipelineCreateFailCount += 1;
|
||||
}
|
||||
|
|
|
@ -467,7 +467,7 @@ VulkanGeometryShader *ShaderManagerVulkan::GetGeometryShaderFromModule(VkShaderM
|
|||
// instantaneous.
|
||||
|
||||
#define CACHE_HEADER_MAGIC 0xff51f420
|
||||
#define CACHE_VERSION 28
|
||||
#define CACHE_VERSION 29
|
||||
struct VulkanCacheHeader {
|
||||
uint32_t magic;
|
||||
uint32_t version;
|
||||
|
@ -475,6 +475,7 @@ struct VulkanCacheHeader {
|
|||
uint32_t reserved;
|
||||
int numVertexShaders;
|
||||
int numFragmentShaders;
|
||||
int numGeometryShaders;
|
||||
};
|
||||
|
||||
bool ShaderManagerVulkan::LoadCache(FILE *f) {
|
||||
|
@ -522,6 +523,15 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) {
|
|||
fsCache_.Insert(id, fs);
|
||||
}
|
||||
|
||||
for (int i = 0; i < header.numGeometryShaders; i++) {
|
||||
GShaderID id;
|
||||
if (fread(&id, sizeof(id), 1, f) != 1) {
|
||||
ERROR_LOG(G3D, "Vulkan shader cache truncated");
|
||||
break;
|
||||
}
|
||||
// TODO: Actually generate geometry shaders.
|
||||
}
|
||||
|
||||
NOTICE_LOG(G3D, "Loaded %d vertex and %d fragment shaders", header.numVertexShaders, header.numFragmentShaders);
|
||||
return true;
|
||||
}
|
||||
|
@ -534,6 +544,7 @@ void ShaderManagerVulkan::SaveCache(FILE *f) {
|
|||
header.reserved = 0;
|
||||
header.numVertexShaders = (int)vsCache_.size();
|
||||
header.numFragmentShaders = (int)fsCache_.size();
|
||||
header.numGeometryShaders = (int)gsCache_.size();
|
||||
bool writeFailed = fwrite(&header, sizeof(header), 1, f) != 1;
|
||||
vsCache_.Iterate([&](const VShaderID &id, VulkanVertexShader *vs) {
|
||||
writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1;
|
||||
|
@ -541,6 +552,9 @@ void ShaderManagerVulkan::SaveCache(FILE *f) {
|
|||
fsCache_.Iterate([&](const FShaderID &id, VulkanFragmentShader *fs) {
|
||||
writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1;
|
||||
});
|
||||
gsCache_.Iterate([&](const GShaderID &id, VulkanGeometryShader *gs) {
|
||||
writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1;
|
||||
});
|
||||
if (writeFailed) {
|
||||
ERROR_LOG(G3D, "Failed to write Vulkan shader cache, disk full?");
|
||||
} else {
|
||||
|
|
Loading…
Add table
Reference in a new issue