33#ifndef DVD_SHADER_PROGRAM_H_
34#define DVD_SHADER_PROGRAM_H_
99 static void Idle(
bool fast);
108 eastl::fixed_vector<ShaderProgram*, 4, true>
_parents;
121 static constexpr const char* UNIFORM_BLOCK_NAME =
"dvd_uniforms";
149 size_t _definesHash{ 0u };
151 string _uniformBlock{};
153 bool _compiled{
false };
160 U32 _queueDelayHighWaterMark{1u};
170 using ShaderQueue = eastl::stack<ShaderQueueEntry, vector<ShaderQueueEntry>>;
188 bool postLoad()
override;
193 bool skipped =
false;
194 return recompile( skipped );
197 bool recompile(
bool& skipped );
199 virtual ShaderResult validatePreBind(
bool rebind =
true );
205 static void InitStaticData();
206 static void DestroyStaticData();
209 [[nodiscard]]
static bool OnShutdown();
210 static void OnBeginFrame(
GFXDevice& gfx );
211 static void OnEndFrame(
GFXDevice& gfx );
214 static bool RecompileShaderProgram(
const std::string_view name );
216 static bool UnregisterShaderProgram(
ShaderProgram* shaderProgram );
218 static void RegisterShaderProgram(
ShaderProgram* shaderProgram );
220 static void RebuildAllShaders();
226 return s_shaderCount.load( std::memory_order_relaxed );
234 static void OnAtomChange( std::string_view atomName,
FileUpdateEvent evt );
237 [[nodiscard]]
static std::pair<DescriptorSetUsage, U8> GetDescriptorSlotForGLBinding(
U8 binding,
DescriptorSetBindingType type )
noexcept;
239 [[nodiscard]]
static BindingSetData& GetBindingSetData() noexcept;
255 static
bool SaveToCache(
LoadData::ShaderCacheType cache, const
LoadData& dataIn, const
eastl::set<
U64>& atomIDsIn );
280 U8& blockIndexInOut );
286 eastl::set<U64>& atomIDsInOut );
293 static void EraseAtom(
const U64 atomHash);
294 static void EraseAtomLocked(
const U64 atomHash);
296 static const string& ShaderFileRead(
const ResourcePath& filePath, std::string_view atomName,
bool recurse, eastl::set<U64>& foundAtomIDsInOut,
bool& wasParsed );
297 static const string& ShaderFileReadLocked(
const ResourcePath& filePath, std::string_view atomName,
bool recurse, eastl::set<U64>& foundAtomIDsInOut,
bool& wasParsed );
299 static void PreprocessIncludes( std::string_view name,
302 eastl::set<U64>& foundAtomIDsInOut,
305 template <
typename T>
306 friend class ImplResourceLoader;
312 static void OnThreadCreated(
const GFXDevice& gfx,
const std::thread::id& threadID,
bool isMainRenderThread );
331 static U64 shaderAtomExtensionHash[
to_base( ShaderType::COUNT ) + 1];
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
Utility class that adds basic GUID management to objects.
GFXDevice & context() const noexcept
virtual ~ShaderModule() override
PROPERTY_R(U64, lastUsedFrame, U64_MAX - MAX_FRAME_LIFETIME - 1u)
void deregisterParent(ShaderProgram *parent)
PROPERTY_R(Str< 256 >, name)
static constexpr U32 MAX_FRAME_LIFETIME
PROPERTY_R(bool, inUse, true)
static void Idle(bool fast)
eastl::fixed_vector< ShaderProgram *, 4, true > _parents
static void DestroyStaticData()
static ShaderModule * GetShader(const std::string_view name)
Returns a reference to an already loaded shader, null otherwise.
static void InitStaticData()
static ShaderModule * GetShaderLocked(const std::string_view name)
hashMap< U64, ShaderModule_uptr > ShaderMap
PROPERTY_R(bool, valid, false)
PROPERTY_R(U32, generation, 0u)
void registerParent(ShaderProgram *parent)
static std::atomic_bool s_modulesRemoved
Shader cache.
static SharedMutex s_shaderNameLock
static ShaderMap s_shaderNameMap
std::array< BindingsPerSetArray, to_base(DescriptorSetUsage::COUNT)> BindingSetData
static SharedMutex s_programLock
static U8 k_commandBufferID
std::array< bool, to_base(RTColourAttachmentSlot::COUNT)> RenderTargets
static std::atomic_int s_shaderCount
std::array< BindingsPerSet, MAX_BINDINGS_PER_DESCRIPTOR_SET > BindingsPerSetArray
static Mutex s_atomLock
Shaders loaded from files are kept as atoms.
eastl::stack< ShaderQueueEntry, vector< ShaderQueueEntry > > ShaderQueue
static LastRequestedShader s_lastRequestedShaderProgram
std::array< LoadData, to_base(ShaderType::COUNT)> ShaderLoadData
static AtomInclusionMap s_atomIncludes
std::array< bool, to_base(DescriptorSetUsage::COUNT)> SetUsageData
const ShaderProgramDescriptor _descriptor
hashMap< U64, string > AtomMap
static BindingSetData s_bindingsPerSet
hashMap< U64, eastl::set< U64 > > AtomInclusionMap
eastl::fixed_vector< ShaderProgram *, U16_MAX, true > ShaderProgramMap
static I64 s_shaderFileWatcherID
const ShaderProgramDescriptor & descriptor() const noexcept
static I32 ShaderProgramCount() noexcept
vector< UniformBlockUploader > _uniformBlockBuffers
eastl::set< U64 > _usedAtomIDs
constexpr U16 TARGET_FRAME_RATE
Application desired framerate for physics and input simulations.
eastl::set< UniformDeclaration, UniformCompare > UniformsSet
DescriptorSetUsage StringToDescriptorSetUsage(const string &name)
const char * DescriptorSetUsageToString(DescriptorSetUsage setUsage) noexcept
Handle console commands that start with a forward slash.
vector< ModuleDefine > ModuleDefines
std::shared_mutex SharedMutex
eastl::vector< Type > vector
hashAlg::unordered_map< K, V, HashFun, Predicate > hashMap
constexpr U8 INVALID_TEXTURE_BINDING
std::underlying_type_t< Type > BaseType
ShaderType
Available shader stages.
constexpr auto to_base(const Type value) -> Type
ShaderProgram::ShaderLoadData _loadData
vector< ShaderModuleDescriptor > _modules
Reflection::UniformsSet _uniforms
std::vector< SpvWord > _sourceCodeSpirV