shadergen.h (3783B)
1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #pragma once 5 6 #include "gpu_device.h" 7 8 #include "common/small_string.h" 9 10 #include <sstream> 11 #include <string> 12 13 class ShaderGen 14 { 15 public: 16 ShaderGen(RenderAPI render_api, GPUShaderLanguage language, bool supports_dual_source_blend, 17 bool supports_framebuffer_fetch); 18 ~ShaderGen(); 19 20 static GPUShaderLanguage GetShaderLanguageForAPI(RenderAPI api); 21 static bool UseGLSLBindingLayout(); 22 23 #ifdef ENABLE_OPENGL 24 static u32 GetGLSLVersion(RenderAPI render_api); 25 static TinyString GetGLSLVersionString(RenderAPI render_api, u32 version); 26 #endif 27 28 ALWAYS_INLINE GPUShaderLanguage GetLanguage() const { return m_shader_language; } 29 30 std::string GenerateScreenQuadVertexShader(float z = 0.0f); 31 std::string GenerateUVQuadVertexShader(); 32 std::string GenerateFillFragmentShader(); 33 std::string GenerateCopyFragmentShader(); 34 35 std::string GenerateImGuiVertexShader(); 36 std::string GenerateImGuiFragmentShader(); 37 38 protected: 39 ALWAYS_INLINE bool IsVulkan() const { return (m_render_api == RenderAPI::Vulkan); } 40 ALWAYS_INLINE bool IsMetal() const { return (m_render_api == RenderAPI::Metal); } 41 42 const char* GetInterpolationQualifier(bool interface_block, bool centroid_interpolation, bool sample_interpolation, 43 bool is_out) const; 44 45 void DefineMacro(std::stringstream& ss, const char* name, bool enabled); 46 void DefineMacro(std::stringstream& ss, const char* name, s32 value); 47 void WriteHeader(std::stringstream& ss, bool enable_rov = false); 48 void WriteUniformBufferDeclaration(std::stringstream& ss, bool push_constant_on_vulkan); 49 void DeclareUniformBuffer(std::stringstream& ss, const std::initializer_list<const char*>& members, 50 bool push_constant_on_vulkan); 51 void DeclareTexture(std::stringstream& ss, const char* name, u32 index, bool multisampled = false, 52 bool is_int = false, bool is_unsigned = false); 53 void DeclareTextureBuffer(std::stringstream& ss, const char* name, u32 index, bool is_int, bool is_unsigned); 54 void DeclareImage(std::stringstream& ss, const char* name, u32 index, bool is_float = false, bool is_int = false, 55 bool is_unsigned = false); 56 void DeclareVertexEntryPoint(std::stringstream& ss, const std::initializer_list<const char*>& attributes, 57 u32 num_color_outputs, u32 num_texcoord_outputs, 58 const std::initializer_list<std::pair<const char*, const char*>>& additional_outputs, 59 bool declare_vertex_id = false, const char* output_block_suffix = "", bool msaa = false, 60 bool ssaa = false, bool noperspective_color = false); 61 void 62 DeclareFragmentEntryPoint(std::stringstream& ss, u32 num_color_inputs, u32 num_texcoord_inputs, 63 const std::initializer_list<std::pair<const char*, const char*>>& additional_inputs = {}, 64 bool declare_fragcoord = false, u32 num_color_outputs = 1, bool dual_source_output = false, 65 bool depth_output = false, bool msaa = false, bool ssaa = false, 66 bool declare_sample_id = false, bool noperspective_color = false, 67 bool feedback_loop = false, bool rov = false); 68 69 RenderAPI m_render_api; 70 GPUShaderLanguage m_shader_language; 71 bool m_glsl; 72 bool m_spirv; 73 bool m_supports_dual_source_blend; 74 bool m_supports_framebuffer_fetch; 75 bool m_use_glsl_interface_blocks = false; 76 bool m_use_glsl_binding_layout = false; 77 bool m_has_uniform_buffer = false; 78 79 TinyString m_glsl_version_string; 80 };