duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 };