Add clean_func_name() to support overrides to function names.

This commit is contained in:
Bill Hollings 2017-01-07 22:15:58 -05:00
parent e6dab816b0
commit 4a6358bb9f
4 changed files with 27 additions and 6 deletions

View File

@ -2710,6 +2710,15 @@ string CompilerGLSL::to_function_args(uint32_t img, const SPIRType &, bool, bool
return farg_str; return farg_str;
} }
// Some languages may have additional standard library functions whose names conflict
// with a function defined in the body of the shader. Subclasses can override to rename
// the function name defined in the shader to avoid conflict with the language standard
// functions (eg. MSL includes saturate()).
string CompilerGLSL::clean_func_name(string func_name)
{
return func_name;
}
void CompilerGLSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args, uint32_t) void CompilerGLSL::emit_glsl_op(uint32_t result_type, uint32_t id, uint32_t eop, const uint32_t *args, uint32_t)
{ {
GLSLstd450 op = static_cast<GLSLstd450>(eop); GLSLstd450 op = static_cast<GLSLstd450>(eop);
@ -3638,7 +3647,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
string funexpr; string funexpr;
vector<string> arglist; vector<string> arglist;
funexpr += to_name(func) + "("; funexpr += clean_func_name(to_name(func)) + "(";
for (uint32_t i = 0; i < length; i++) for (uint32_t i = 0; i < length; i++)
{ {
// Do not pass in separate images or samplers if we're remapping // Do not pass in separate images or samplers if we're remapping
@ -5359,11 +5368,11 @@ void CompilerGLSL::emit_function_prototype(SPIRFunction &func, uint64_t return_f
if (func.self == entry_point) if (func.self == entry_point)
{ {
decl += "main"; decl += clean_func_name("main");
processing_entry_point = true; processing_entry_point = true;
} }
else else
decl += to_name(func.self); decl += clean_func_name(to_name(func.self));
decl += "("; decl += "(";
vector<string> arglist; vector<string> arglist;

View File

@ -168,6 +168,7 @@ protected:
uint32_t grad_x, uint32_t grad_y, uint32_t lod, uint32_t coffset, uint32_t grad_x, uint32_t grad_y, uint32_t lod, uint32_t coffset,
uint32_t offset, uint32_t bias, uint32_t comp, uint32_t sample, uint32_t offset, uint32_t bias, uint32_t comp, uint32_t sample,
bool *p_forward); bool *p_forward);
virtual std::string clean_func_name(std::string func_name);
std::unique_ptr<std::ostringstream> buffer; std::unique_ptr<std::ostringstream> buffer;

View File

@ -27,6 +27,15 @@ CompilerMSL::CompilerMSL(vector<uint32_t> spirv_)
: CompilerGLSL(move(spirv_)) : CompilerGLSL(move(spirv_))
{ {
options.vertex.fixup_clipspace = false; options.vertex.fixup_clipspace = false;
populate_func_name_overrides();
}
// Populate the collection of function names that need to be overridden
void CompilerMSL::populate_func_name_overrides()
{
func_name_overrides["main"] = "main0";
func_name_overrides["saturate"] = "saturate0";
} }
string CompilerMSL::compile(MSLConfiguration &msl_cfg, vector<MSLVertexAttr> *p_vtx_attrs, string CompilerMSL::compile(MSLConfiguration &msl_cfg, vector<MSLVertexAttr> *p_vtx_attrs,
@ -1203,8 +1212,8 @@ string CompilerMSL::func_type_decl(SPIRType &type)
// Ensures the function name is not "main", which is illegal in MSL // Ensures the function name is not "main", which is illegal in MSL
string CompilerMSL::clean_func_name(string func_name) string CompilerMSL::clean_func_name(string func_name)
{ {
static std::string _clean_msl_main_func_name = "mmain"; auto iter = func_name_overrides.find(func_name);
return (func_name == "main") ? _clean_msl_main_func_name : func_name; return (iter != func_name_overrides.end()) ? iter->second : func_name;
} }
// Returns a string containing a comma-delimited list of args for the entry point function // Returns a string containing a comma-delimited list of args for the entry point function

View File

@ -115,6 +115,7 @@ protected:
uint32_t coord, uint32_t coord_components, uint32_t dref, uint32_t grad_x, uint32_t coord, uint32_t coord_components, uint32_t dref, uint32_t grad_x,
uint32_t grad_y, uint32_t lod, uint32_t coffset, uint32_t offset, uint32_t bias, uint32_t grad_y, uint32_t lod, uint32_t coffset, uint32_t offset, uint32_t bias,
uint32_t comp, uint32_t sample, bool *p_forward) override; uint32_t comp, uint32_t sample, bool *p_forward) override;
std::string clean_func_name(std::string func_name) override;
void register_custom_functions(); void register_custom_functions();
void emit_custom_functions(); void emit_custom_functions();
@ -129,9 +130,9 @@ protected:
void emit_interface_block(uint32_t ib_var_id); void emit_interface_block(uint32_t ib_var_id);
void emit_function_prototype(SPIRFunction &func, bool is_decl); void emit_function_prototype(SPIRFunction &func, bool is_decl);
void emit_function_declarations(); void emit_function_declarations();
void populate_func_name_overrides();
std::string func_type_decl(SPIRType &type); std::string func_type_decl(SPIRType &type);
std::string clean_func_name(std::string func_name);
std::string entry_point_args(bool append_comma); std::string entry_point_args(bool append_comma);
std::string get_entry_point_name(); std::string get_entry_point_name();
std::string to_qualified_member_name(const SPIRType &type, uint32_t index); std::string to_qualified_member_name(const SPIRType &type, uint32_t index);
@ -148,6 +149,7 @@ protected:
std::string to_component_argument(uint32_t id); std::string to_component_argument(uint32_t id);
MSLConfiguration msl_config; MSLConfiguration msl_config;
std::unordered_map<std::string,std::string> func_name_overrides;
std::set<uint32_t> custom_function_ops; std::set<uint32_t> custom_function_ops;
std::unordered_map<uint32_t, MSLVertexAttr *> vtx_attrs_by_location; std::unordered_map<uint32_t, MSLVertexAttr *> vtx_attrs_by_location;
std::vector<MSLResourceBinding *> resource_bindings; std::vector<MSLResourceBinding *> resource_bindings;