// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Core/Types/BaseTypes.h" #include "Engine/Core/Types/String.h" #include "Config.h" /// /// The shader program metadata container. Contains description about resources used by the shader. /// struct FLAXENGINE_API ShaderBindings { uint32 InstructionsCount; uint32 UsedCBsMask; uint32 UsedSRsMask; uint32 UsedUAsMask; bool IsUsingCB(uint32 slotIndex) const { return (UsedCBsMask & (1u << slotIndex)) != 0u; } bool IsUsingSR(uint32 slotIndex) const { return (UsedSRsMask & (1u << slotIndex)) != 0u; } bool IsUsingUA(uint32 slotIndex) const { return (UsedUAsMask & (1u << slotIndex)) != 0u; } }; struct GPUShaderProgramInitializer { StringAnsi Name; ShaderBindings Bindings; ShaderFlags Flags; }; /// /// Mini program that can run on the GPU. /// class FLAXENGINE_API GPUShaderProgram { protected: StringAnsi _name; ShaderBindings _bindings; ShaderFlags _flags; void Init(const GPUShaderProgramInitializer& initializer) { _name = initializer.Name; _bindings = initializer.Bindings; _flags = initializer.Flags; } public: /// /// Finalizes an instance of the class. /// virtual ~GPUShaderProgram() { } public: /// /// Gets name of the shader program /// /// Name FORCE_INLINE const StringAnsi& GetName() const { return _name; } /// /// Gets the shader resource bindings. /// /// The bindings. FORCE_INLINE const ShaderBindings& GetBindings() const { return _bindings; } /// /// Gets the shader flags. /// /// The flags. FORCE_INLINE ShaderFlags GetFlags() const { return _flags; } public: /// /// Gets shader program stage type /// /// Shader Stage type virtual ShaderStage GetStage() const = 0; /// /// Gets buffer handle (platform dependent) /// /// Handle virtual void* GetBufferHandle() const = 0; /// /// Gets buffer size (in bytes) /// /// Size of the buffer in bytes virtual uint32 GetBufferSize() const = 0; }; /// /// Vertex Shader program. /// class GPUShaderProgramVS : public GPUShaderProgram { public: /// /// Gets input layout description handle (platform dependent) /// /// Input layout virtual void* GetInputLayout() const = 0; /// /// Gets input layout description size (in bytes) /// /// Input layout description size in bytes virtual byte GetInputLayoutSize() const = 0; public: // [GPUShaderProgram] ShaderStage GetStage() const override { return ShaderStage::Vertex; } }; /// /// Geometry Shader program. /// class GPUShaderProgramGS : public GPUShaderProgram { public: // [GPUShaderProgram] ShaderStage GetStage() const override { return ShaderStage::Geometry; } }; /// /// Hull Shader program. /// class GPUShaderProgramHS : public GPUShaderProgram { protected: int32 _controlPointsCount; public: /// /// Gets the input control points count (valid range: 1-32). /// FORCE_INLINE int32 GetControlPointsCount() const { return _controlPointsCount; } public: // [GPUShaderProgram] ShaderStage GetStage() const override { return ShaderStage::Hull; } }; /// /// Domain Shader program. /// class GPUShaderProgramDS : public GPUShaderProgram { public: // [GPUShaderProgram] ShaderStage GetStage() const override { return ShaderStage::Domain; } }; /// /// Pixel Shader program. /// class GPUShaderProgramPS : public GPUShaderProgram { public: // [GPUShaderProgram] ShaderStage GetStage() const override { return ShaderStage::Pixel; } }; /// /// Compute Shader program. /// class GPUShaderProgramCS : public GPUShaderProgram { public: // [GPUShaderProgram] ShaderStage GetStage() const override { return ShaderStage::Compute; } };