Files
FlaxEngine/Source/Engine/Graphics/Shaders/Cache/ShaderAssetBase.h
2022-06-14 20:17:00 +02:00

144 lines
3.8 KiB
C++

// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Core/Types/DataContainer.h"
#include "Engine/Content/BinaryAsset.h"
#include "ShaderStorage.h"
/// <summary>
/// Base class for assets that can contain shader.
/// </summary>
class FLAXENGINE_API ShaderAssetBase
{
protected:
ShaderStorage::Header _shaderHeader;
public:
static bool IsNullRenderer();
/// <summary>
/// Gets internal shader cache chunk index (for current GPU device shader profile).
/// </summary>
static int32 GetCacheChunkIndex();
/// <summary>
/// Gets internal shader cache chunk index.
/// </summary>
/// <param name="profile">Shader profile</param>
/// <returns>Chunk index</returns>
static int32 GetCacheChunkIndex(ShaderProfile profile);
#if USE_EDITOR
/// <summary>
/// Prepare shader compilation options
/// </summary>
/// <param name="options">Options</param>
virtual void InitCompilationOptions(struct ShaderCompilationOptions& options)
{
}
#endif
protected:
bool initBase(AssetInitData& initData);
/// <summary>
/// Gets the parent asset.
/// </summary>
virtual BinaryAsset* GetShaderAsset() const = 0;
#if USE_EDITOR
/// <summary>
/// Saves this shader asset to the storage container.
/// </summary>
/// <returns>True if failed, otherwise false.</returns>
bool Save();
#endif
/// <summary>
/// Shader cache loading result data container.
/// </summary>
struct ShaderCacheResult
{
/// <summary>
/// The shader cache data. Allocated or linked (if gathered from asset chunk).
/// </summary>
DataContainer<byte> Data;
#if COMPILE_WITH_SHADER_COMPILER
/// <summary>
/// The list of files included by the shader source (used by the given cache on the runtime graphics platform shader profile). Paths are absolute and unique.
/// </summary>
Array<String> Includes;
#endif
};
/// <summary>
/// Loads shader cache (it may call compilation or gather precached data).
/// </summary>
/// <param name="result">The output data.</param>
/// <returns>True if cannot load data, otherwise false.</returns>
bool LoadShaderCache(ShaderCacheResult& result);
#if COMPILE_WITH_SHADER_COMPILER
/// <summary>
/// Registers shader asset for the automated reloads on source includes changes.
/// </summary>
/// <param name="asset">The asset.</param>
/// <param name="shaderCache">The loaded shader cache.</param>
void RegisterForShaderReloads(Asset* asset, const ShaderCacheResult& shaderCache);
/// <summary>
/// Unregisters shader asset from the automated reloads on source includes changes.
/// </summary>
/// <param name="asset">The asset.</param>
void UnregisterForShaderReloads(Asset* asset);
#endif
};
/// <summary>
/// Base class for binary assets that can contain shader.
/// </summary>
template<typename BaseType>
class ShaderAssetTypeBase : public BaseType, public ShaderAssetBase
{
public:
static const uint32 ShadersSerializedVersion = ShaderStorage::Header::Version;
protected:
explicit ShaderAssetTypeBase(const ScriptingObjectSpawnParams& params, const AssetInfo* info)
: BaseType(params, info)
{
}
protected:
// [BaseType]
bool init(AssetInitData& initData) override
{
return initBase(initData);
}
AssetChunksFlag getChunksToPreload() const override
{
AssetChunksFlag result = 0;
const auto cachingMode = ShaderStorage::GetCachingMode();
if (cachingMode == ShaderStorage::CachingMode::AssetInternal && !IsNullRenderer())
result |= GET_CHUNK_FLAG(GetCacheChunkIndex());
return result;
}
// [ShaderAssetBase]
BinaryAsset* GetShaderAsset() const override
{
return (BinaryAsset*)this;
}
};