mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Vulkan: Fix cache file error handling warnings.
This commit is contained in:
parent
f65481668c
commit
cddc7b5dc5
2 changed files with 41 additions and 20 deletions
|
@ -592,6 +592,7 @@ void PipelineManagerVulkan::SaveCache(FILE *file, bool saveRawPipelineCache, Sha
|
||||||
size_t seekPosOnFailure = ftell(file);
|
size_t seekPosOnFailure = ftell(file);
|
||||||
|
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
|
bool writeFailed = false;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
// Since we don't include the full pipeline key, there can be duplicates,
|
// Since we don't include the full pipeline key, there can be duplicates,
|
||||||
// caused by things like switching from buffered to non-buffered rendering.
|
// caused by things like switching from buffered to non-buffered rendering.
|
||||||
|
@ -630,11 +631,11 @@ void PipelineManagerVulkan::SaveCache(FILE *file, bool saveRawPipelineCache, Sha
|
||||||
|
|
||||||
// Write the number of pipelines.
|
// Write the number of pipelines.
|
||||||
size = (uint32_t)keys.size();
|
size = (uint32_t)keys.size();
|
||||||
fwrite(&size, sizeof(size), 1, file);
|
writeFailed = writeFailed || fwrite(&size, sizeof(size), 1, file) != 1;
|
||||||
|
|
||||||
// Write the pipelines.
|
// Write the pipelines.
|
||||||
for (auto &key : keys) {
|
for (auto &key : keys) {
|
||||||
fwrite(&key, sizeof(key), 1, file);
|
writeFailed = writeFailed || fwrite(&key, sizeof(key), 1, file) != 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (failed) {
|
if (failed) {
|
||||||
|
@ -642,11 +643,18 @@ void PipelineManagerVulkan::SaveCache(FILE *file, bool saveRawPipelineCache, Sha
|
||||||
// Write a zero in the right place so it doesn't try to load the pipelines next time.
|
// Write a zero in the right place so it doesn't try to load the pipelines next time.
|
||||||
size = 0;
|
size = 0;
|
||||||
fseek(file, (long)seekPosOnFailure, SEEK_SET);
|
fseek(file, (long)seekPosOnFailure, SEEK_SET);
|
||||||
fwrite(&size, sizeof(size), 1, file);
|
writeFailed = fwrite(&size, sizeof(size), 1, file) != 1;
|
||||||
|
if (writeFailed) {
|
||||||
|
ERROR_LOG(G3D, "Failed to write pipeline cache, disk full?");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (writeFailed) {
|
||||||
|
ERROR_LOG(G3D, "Failed to write pipeline cache, disk full?");
|
||||||
|
} else {
|
||||||
NOTICE_LOG(G3D, "Saved Vulkan pipeline ID cache (%d unique pipelines/%d).", (int)keys.size(), (int)pipelines_.size());
|
NOTICE_LOG(G3D, "Saved Vulkan pipeline ID cache (%d unique pipelines/%d).", (int)keys.size(), (int)pipelines_.size());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool PipelineManagerVulkan::LoadCache(FILE *file, bool loadRawPipelineCache, ShaderManagerVulkan *shaderManager, Draw::DrawContext *drawContext, VkPipelineLayout layout) {
|
bool PipelineManagerVulkan::LoadCache(FILE *file, bool loadRawPipelineCache, ShaderManagerVulkan *shaderManager, Draw::DrawContext *drawContext, VkPipelineLayout layout) {
|
||||||
VulkanRenderManager *rm = (VulkanRenderManager *)drawContext->GetNativeObject(Draw::NativeObject::RENDER_MANAGER);
|
VulkanRenderManager *rm = (VulkanRenderManager *)drawContext->GetNativeObject(Draw::NativeObject::RENDER_MANAGER);
|
||||||
|
@ -654,16 +662,16 @@ bool PipelineManagerVulkan::LoadCache(FILE *file, bool loadRawPipelineCache, Sha
|
||||||
|
|
||||||
uint32_t size = 0;
|
uint32_t size = 0;
|
||||||
if (loadRawPipelineCache) {
|
if (loadRawPipelineCache) {
|
||||||
fread(&size, sizeof(size), 1, file);
|
bool success = fread(&size, sizeof(size), 1, file) == 1;
|
||||||
if (!size) {
|
if (!size || !success) {
|
||||||
WARN_LOG(G3D, "Zero-sized Vulkan pipeline cache.");
|
WARN_LOG(G3D, "Zero-sized Vulkan pipeline cache.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
std::unique_ptr<uint8_t[]> buffer(new uint8_t[size]);
|
std::unique_ptr<uint8_t[]> buffer(new uint8_t[size]);
|
||||||
fread(buffer.get(), 1, size, file);
|
success = fread(buffer.get(), 1, size, file) == size;
|
||||||
// Verify header.
|
// Verify header.
|
||||||
VkPipelineCacheHeader *header = (VkPipelineCacheHeader *)buffer.get();
|
VkPipelineCacheHeader *header = (VkPipelineCacheHeader *)buffer.get();
|
||||||
if (header->version != VK_PIPELINE_CACHE_HEADER_VERSION_ONE) {
|
if (!success || header->version != VK_PIPELINE_CACHE_HEADER_VERSION_ONE) {
|
||||||
// Bad header, don't do anything.
|
// Bad header, don't do anything.
|
||||||
WARN_LOG(G3D, "Bad Vulkan pipeline cache header - ignoring");
|
WARN_LOG(G3D, "Bad Vulkan pipeline cache header - ignoring");
|
||||||
return false;
|
return false;
|
||||||
|
@ -697,16 +705,19 @@ bool PipelineManagerVulkan::LoadCache(FILE *file, bool loadRawPipelineCache, Sha
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the number of pipelines.
|
// Read the number of pipelines.
|
||||||
fread(&size, sizeof(size), 1, file);
|
bool failed = fread(&size, sizeof(size), 1, file) != 1;
|
||||||
|
|
||||||
NOTICE_LOG(G3D, "Creating %d pipelines...", size);
|
NOTICE_LOG(G3D, "Creating %d pipelines...", size);
|
||||||
bool failed = false;
|
|
||||||
for (uint32_t i = 0; i < size; i++) {
|
for (uint32_t i = 0; i < size; i++) {
|
||||||
if (failed) {
|
if (failed) {
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
StoredVulkanPipelineKey key;
|
StoredVulkanPipelineKey key;
|
||||||
fread(&key, sizeof(key), 1, file);
|
failed = failed || fread(&key, sizeof(key), 1, file) != 1;
|
||||||
|
if (failed) {
|
||||||
|
ERROR_LOG(G3D, "Truncated Vulkan pipeline cache file");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
VulkanVertexShader *vs = shaderManager->GetVertexShaderFromID(key.vShaderID);
|
VulkanVertexShader *vs = shaderManager->GetVertexShaderFromID(key.vShaderID);
|
||||||
VulkanFragmentShader *fs = shaderManager->GetFragmentShaderFromID(key.fShaderID);
|
VulkanFragmentShader *fs = shaderManager->GetFragmentShaderFromID(key.fShaderID);
|
||||||
if (!vs || !fs) {
|
if (!vs || !fs) {
|
||||||
|
|
|
@ -366,8 +366,8 @@ struct VulkanCacheHeader {
|
||||||
|
|
||||||
bool ShaderManagerVulkan::LoadCache(FILE *f) {
|
bool ShaderManagerVulkan::LoadCache(FILE *f) {
|
||||||
VulkanCacheHeader header{};
|
VulkanCacheHeader header{};
|
||||||
fread(&header, sizeof(header), 1, f);
|
bool success = fread(&header, sizeof(header), 1, f) == 1;
|
||||||
if (header.magic != CACHE_HEADER_MAGIC)
|
if (!success || header.magic != CACHE_HEADER_MAGIC)
|
||||||
return false;
|
return false;
|
||||||
if (header.version != CACHE_VERSION)
|
if (header.version != CACHE_VERSION)
|
||||||
return false;
|
return false;
|
||||||
|
@ -376,7 +376,10 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) {
|
||||||
|
|
||||||
for (int i = 0; i < header.numVertexShaders; i++) {
|
for (int i = 0; i < header.numVertexShaders; i++) {
|
||||||
VShaderID id;
|
VShaderID id;
|
||||||
fread(&id, sizeof(id), 1, f);
|
if (fread(&id, sizeof(id), 1, f) != 1) {
|
||||||
|
ERROR_LOG(G3D, "Vulkan shader cache truncated");
|
||||||
|
break;
|
||||||
|
}
|
||||||
bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM);
|
bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM);
|
||||||
GenerateVulkanGLSLVertexShader(id, codeBuffer_);
|
GenerateVulkanGLSLVertexShader(id, codeBuffer_);
|
||||||
VulkanVertexShader *vs = new VulkanVertexShader(vulkan_, id, codeBuffer_, useHWTransform);
|
VulkanVertexShader *vs = new VulkanVertexShader(vulkan_, id, codeBuffer_, useHWTransform);
|
||||||
|
@ -384,7 +387,10 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) {
|
||||||
}
|
}
|
||||||
for (int i = 0; i < header.numFragmentShaders; i++) {
|
for (int i = 0; i < header.numFragmentShaders; i++) {
|
||||||
FShaderID id;
|
FShaderID id;
|
||||||
fread(&id, sizeof(id), 1, f);
|
if (fread(&id, sizeof(id), 1, f) != 1) {
|
||||||
|
ERROR_LOG(G3D, "Vulkan shader cache truncated");
|
||||||
|
break;
|
||||||
|
}
|
||||||
GenerateVulkanGLSLFragmentShader(id, codeBuffer_);
|
GenerateVulkanGLSLFragmentShader(id, codeBuffer_);
|
||||||
VulkanFragmentShader *fs = new VulkanFragmentShader(vulkan_, id, codeBuffer_);
|
VulkanFragmentShader *fs = new VulkanFragmentShader(vulkan_, id, codeBuffer_);
|
||||||
fsCache_.Insert(id, fs);
|
fsCache_.Insert(id, fs);
|
||||||
|
@ -402,12 +408,16 @@ void ShaderManagerVulkan::SaveCache(FILE *f) {
|
||||||
header.reserved = 0;
|
header.reserved = 0;
|
||||||
header.numVertexShaders = (int)vsCache_.size();
|
header.numVertexShaders = (int)vsCache_.size();
|
||||||
header.numFragmentShaders = (int)fsCache_.size();
|
header.numFragmentShaders = (int)fsCache_.size();
|
||||||
fwrite(&header, sizeof(header), 1, f);
|
bool writeFailed = fwrite(&header, sizeof(header), 1, f) != 1;
|
||||||
vsCache_.Iterate([&](const VShaderID &id, VulkanVertexShader *vs) {
|
vsCache_.Iterate([&](const VShaderID &id, VulkanVertexShader *vs) {
|
||||||
fwrite(&id, sizeof(id), 1, f);
|
writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1;
|
||||||
});
|
});
|
||||||
fsCache_.Iterate([&](const FShaderID &id, VulkanFragmentShader *fs) {
|
fsCache_.Iterate([&](const FShaderID &id, VulkanFragmentShader *fs) {
|
||||||
fwrite(&id, sizeof(id), 1, f);
|
writeFailed = writeFailed || fwrite(&id, sizeof(id), 1, f) != 1;
|
||||||
});
|
});
|
||||||
|
if (writeFailed) {
|
||||||
|
ERROR_LOG(G3D, "Failed to write Vulkan shader cache, disk full?");
|
||||||
|
} else {
|
||||||
NOTICE_LOG(G3D, "Saved %d vertex and %d fragment shaders", header.numVertexShaders, header.numFragmentShaders);
|
NOTICE_LOG(G3D, "Saved %d vertex and %d fragment shaders", header.numVertexShaders, header.numFragmentShaders);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue