Added bad shader warning instead of hard fail
This commit is contained in:
@@ -1602,12 +1602,14 @@ bool RuntimeHost::ScanShaderPackages(std::string& error)
|
||||
{
|
||||
std::map<std::string, ShaderPackage> packagesById;
|
||||
std::vector<std::string> packageOrder;
|
||||
std::vector<ShaderPackageStatus> packageStatuses;
|
||||
ShaderPackageRegistry registry(mConfig.maxTemporalHistoryFrames);
|
||||
if (!registry.Scan(mShaderRoot, packagesById, packageOrder, error))
|
||||
if (!registry.Scan(mShaderRoot, packagesById, packageOrder, packageStatuses, error))
|
||||
return false;
|
||||
|
||||
mPackagesById.swap(packagesById);
|
||||
mPackageOrder.swap(packageOrder);
|
||||
mPackageStatuses.swap(packageStatuses);
|
||||
|
||||
for (auto it = mPersistentState.layers.begin(); it != mPersistentState.layers.end();)
|
||||
{
|
||||
@@ -1854,18 +1856,19 @@ JsonValue RuntimeHost::BuildStateValue() const
|
||||
root.set("performance", performance);
|
||||
|
||||
JsonValue shaderLibrary = JsonValue::MakeArray();
|
||||
for (const std::string& shaderId : mPackageOrder)
|
||||
for (const ShaderPackageStatus& status : mPackageStatuses)
|
||||
{
|
||||
auto shaderIt = mPackagesById.find(shaderId);
|
||||
if (shaderIt == mPackagesById.end())
|
||||
continue;
|
||||
|
||||
JsonValue shader = JsonValue::MakeObject();
|
||||
shader.set("id", JsonValue(shaderIt->second.id));
|
||||
shader.set("name", JsonValue(shaderIt->second.displayName));
|
||||
shader.set("description", JsonValue(shaderIt->second.description));
|
||||
shader.set("category", JsonValue(shaderIt->second.category));
|
||||
if (shaderIt->second.temporal.enabled)
|
||||
shader.set("id", JsonValue(status.id));
|
||||
shader.set("name", JsonValue(status.displayName));
|
||||
shader.set("description", JsonValue(status.description));
|
||||
shader.set("category", JsonValue(status.category));
|
||||
shader.set("available", JsonValue(status.available));
|
||||
if (!status.available)
|
||||
shader.set("error", JsonValue(status.error));
|
||||
|
||||
auto shaderIt = mPackagesById.find(status.id);
|
||||
if (status.available && shaderIt != mPackagesById.end() && shaderIt->second.temporal.enabled)
|
||||
{
|
||||
JsonValue temporal = JsonValue::MakeObject();
|
||||
temporal.set("enabled", JsonValue(true));
|
||||
|
||||
@@ -151,6 +151,7 @@ private:
|
||||
std::filesystem::path mPatchedGlslPath;
|
||||
std::map<std::string, ShaderPackage> mPackagesById;
|
||||
std::vector<std::string> mPackageOrder;
|
||||
std::vector<ShaderPackageStatus> mPackageStatuses;
|
||||
bool mReloadRequested;
|
||||
bool mCompileSucceeded;
|
||||
std::string mCompileMessage;
|
||||
|
||||
@@ -554,6 +554,36 @@ bool ParseParameterDefinitions(const JsonValue& manifestJson, ShaderPackage& sha
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string UniqueUnavailableShaderId(const std::filesystem::path& manifestPath, const std::string& parsedId)
|
||||
{
|
||||
const std::string fallbackId = manifestPath.parent_path().filename().string();
|
||||
const std::string baseId = parsedId.empty() ? fallbackId : parsedId;
|
||||
return baseId + "@invalid:" + fallbackId;
|
||||
}
|
||||
|
||||
ShaderPackageStatus BuildUnavailableStatus(const std::filesystem::path& manifestPath, const ShaderPackage& partialPackage, const std::string& packageError)
|
||||
{
|
||||
ShaderPackageStatus status;
|
||||
status.id = UniqueUnavailableShaderId(manifestPath, partialPackage.id);
|
||||
status.displayName = !partialPackage.displayName.empty() ? partialPackage.displayName : manifestPath.parent_path().filename().string();
|
||||
status.description = partialPackage.description;
|
||||
status.category = !partialPackage.category.empty() ? partialPackage.category : "Unavailable";
|
||||
status.available = false;
|
||||
status.error = packageError;
|
||||
return status;
|
||||
}
|
||||
|
||||
ShaderPackageStatus BuildAvailableStatus(const ShaderPackage& shaderPackage)
|
||||
{
|
||||
ShaderPackageStatus status;
|
||||
status.id = shaderPackage.id;
|
||||
status.displayName = shaderPackage.displayName;
|
||||
status.description = shaderPackage.description;
|
||||
status.category = shaderPackage.category;
|
||||
status.available = true;
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
ShaderPackageRegistry::ShaderPackageRegistry(unsigned maxTemporalHistoryFrames)
|
||||
@@ -561,10 +591,16 @@ ShaderPackageRegistry::ShaderPackageRegistry(unsigned maxTemporalHistoryFrames)
|
||||
{
|
||||
}
|
||||
|
||||
bool ShaderPackageRegistry::Scan(const std::filesystem::path& shaderRoot, std::map<std::string, ShaderPackage>& packagesById, std::vector<std::string>& packageOrder, std::string& error) const
|
||||
bool ShaderPackageRegistry::Scan(
|
||||
const std::filesystem::path& shaderRoot,
|
||||
std::map<std::string, ShaderPackage>& packagesById,
|
||||
std::vector<std::string>& packageOrder,
|
||||
std::vector<ShaderPackageStatus>& packageStatuses,
|
||||
std::string& error) const
|
||||
{
|
||||
packagesById.clear();
|
||||
packageOrder.clear();
|
||||
packageStatuses.clear();
|
||||
|
||||
if (!std::filesystem::exists(shaderRoot))
|
||||
{
|
||||
@@ -583,19 +619,27 @@ bool ShaderPackageRegistry::Scan(const std::filesystem::path& shaderRoot, std::m
|
||||
|
||||
ShaderPackage shaderPackage;
|
||||
if (!ParseManifest(manifestPath, shaderPackage, error))
|
||||
return false;
|
||||
{
|
||||
packageStatuses.push_back(BuildUnavailableStatus(manifestPath, shaderPackage, error));
|
||||
error.clear();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (packagesById.find(shaderPackage.id) != packagesById.end())
|
||||
{
|
||||
error = "Duplicate shader id found: " + shaderPackage.id;
|
||||
return false;
|
||||
packageStatuses.push_back(BuildUnavailableStatus(manifestPath, shaderPackage, "Duplicate shader id found: " + shaderPackage.id));
|
||||
continue;
|
||||
}
|
||||
|
||||
packageOrder.push_back(shaderPackage.id);
|
||||
packageStatuses.push_back(BuildAvailableStatus(shaderPackage));
|
||||
packagesById[shaderPackage.id] = shaderPackage;
|
||||
}
|
||||
|
||||
std::sort(packageOrder.begin(), packageOrder.end());
|
||||
std::sort(packageStatuses.begin(), packageStatuses.end(), [](const ShaderPackageStatus& left, const ShaderPackageStatus& right) {
|
||||
return left.displayName < right.displayName;
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,12 @@ class ShaderPackageRegistry
|
||||
public:
|
||||
explicit ShaderPackageRegistry(unsigned maxTemporalHistoryFrames);
|
||||
|
||||
bool Scan(const std::filesystem::path& shaderRoot, std::map<std::string, ShaderPackage>& packagesById, std::vector<std::string>& packageOrder, std::string& error) const;
|
||||
bool Scan(
|
||||
const std::filesystem::path& shaderRoot,
|
||||
std::map<std::string, ShaderPackage>& packagesById,
|
||||
std::vector<std::string>& packageOrder,
|
||||
std::vector<ShaderPackageStatus>& packageStatuses,
|
||||
std::string& error) const;
|
||||
bool ParseManifest(const std::filesystem::path& manifestPath, ShaderPackage& shaderPackage, std::string& error) const;
|
||||
|
||||
private:
|
||||
|
||||
@@ -93,6 +93,16 @@ struct ShaderPackage
|
||||
std::filesystem::file_time_type manifestWriteTime;
|
||||
};
|
||||
|
||||
struct ShaderPackageStatus
|
||||
{
|
||||
std::string id;
|
||||
std::string displayName;
|
||||
std::string description;
|
||||
std::string category;
|
||||
bool available = false;
|
||||
std::string error;
|
||||
};
|
||||
|
||||
struct RuntimeRenderState
|
||||
{
|
||||
std::string layerId;
|
||||
|
||||
Reference in New Issue
Block a user