#pragma once #include "Rendering/Shader.h" #include #include namespace Donut { class VulkanShader : public Shader { public: VulkanShader(const std::string& filepath); VulkanShader(const std::string& name, const std::string& vertexSrc, const std::string& fragmentSrc); VulkanShader(const std::string& name, const std::string& computeSrc); virtual ~VulkanShader(); virtual void Bind() const override; virtual void Unbind() const override; virtual void SetInt(const std::string& name, int value) override; virtual void SetIntArray(const std::string& name, int* values, uint32_t count) override; virtual void SetFloat(const std::string& name, float value) override; virtual void SetFloat2(const std::string& name, const glm::vec2& value) override; virtual void SetFloat3(const std::string& name, const glm::vec3& value) override; virtual void SetFloat4(const std::string& name, const glm::vec4& value) override; virtual void SetMat4(const std::string& name, const glm::mat4& value) override; virtual void Dispatch(uint32_t x, uint32_t y = 1, uint32_t z = 1) override; virtual void DispatchIndirect(uint32_t offset = 0) override; virtual void MemoryBarrier(uint32_t barriers) override; virtual const std::string& GetName() const override { return m_Name; } void UploadUniformInt(const std::string& name, int value); void UploadUniformIntArray(const std::string& name, int* values, uint32_t count); void UploadUniformFloat(const std::string& name, float value); void UploadUniformFloat2(const std::string& name, const glm::vec2& value); void UploadUniformFloat3(const std::string& name, const glm::vec3& value); void UploadUniformFloat4(const std::string& name, const glm::vec4& value); void UploadUniformMat3(const std::string& name, const glm::mat3& matrix); void UploadUniformMat4(const std::string& name, const glm::mat4& matrix); private: std::string ReadFile(const std::string& filepath); std::unordered_map PreProcess(const std::string& source); void Compile(const std::unordered_map& shaderSources); uint32_t m_RendererID; std::string m_Name; }; };