Add overload compile method for hlsl with vertex attribute remap.

This adds remap to semantic and semantic_index as HLSL instead of always binding to TEXCOORD + binding_number.
This commit is contained in:
Amer Koleci 2017-11-06 20:10:04 +01:00 коммит произвёл Hans-Kristian Arntzen
Родитель 997be5cb23
Коммит 7216d13620
2 изменённых файлов: 40 добавлений и 2 удалений

Просмотреть файл

@ -666,6 +666,23 @@ void CompilerHLSL::emit_interface_block_in_struct(const SPIRVariable &var, unord
else else
binding_number = get_vacant_location(); binding_number = get_vacant_location();
// Allow semantic remap if specified.
string semantic = "TEXCOORD";
uint32_t semantic_index = binding_number;
if (vertex_attributes.size())
{
for (auto &attribute : vertex_attributes)
{
if (attribute.name == name)
{
semantic = attribute.semantic;
semantic_index = attribute.semantic_index;
break;
}
}
}
if (need_matrix_unroll && type.columns > 1) if (need_matrix_unroll && type.columns > 1)
{ {
if (!type.array.empty()) if (!type.array.empty())
@ -677,14 +694,14 @@ void CompilerHLSL::emit_interface_block_in_struct(const SPIRVariable &var, unord
SPIRType newtype = type; SPIRType newtype = type;
newtype.columns = 1; newtype.columns = 1;
statement(to_interpolation_qualifiers(get_decoration_mask(var.self)), statement(to_interpolation_qualifiers(get_decoration_mask(var.self)),
variable_decl(newtype, join(name, "_", i)), " : TEXCOORD", binding_number, ";"); variable_decl(newtype, join(name, "_", i)), " : ", semantic, semantic_index, binding_number, ";");
active_locations.insert(binding_number++); active_locations.insert(binding_number++);
} }
} }
else else
{ {
statement(to_interpolation_qualifiers(get_decoration_mask(var.self)), variable_decl(type, name), statement(to_interpolation_qualifiers(get_decoration_mask(var.self)), variable_decl(type, name),
" : TEXCOORD", binding_number, ";"); " : ", semantic, semantic_index, binding_number, ";");
// Structs and arrays should consume more locations. // Structs and arrays should consume more locations.
uint32_t consumed_locations = type_to_consumed_locations(type); uint32_t consumed_locations = type_to_consumed_locations(type);
@ -3144,6 +3161,18 @@ void CompilerHLSL::require_texture_query_variant(const SPIRType &type)
} }
} }
string CompilerHLSL::compile(std::vector<HLSLVertexAttr> *p_vertex_attributes)
{
if (p_vertex_attributes)
{
vertex_attributes.clear();
for (auto &va : *p_vertex_attributes)
vertex_attributes.emplace_back(va);
}
return compile();
}
string CompilerHLSL::compile() string CompilerHLSL::compile()
{ {
// Do not deal with ES-isms like precision, older extensions and such. // Do not deal with ES-isms like precision, older extensions and such.

Просмотреть файл

@ -23,6 +23,13 @@
namespace spirv_cross namespace spirv_cross
{ {
struct HLSLVertexAttr
{
std::string name;
std::string semantic;
uint32_t semantic_index;
};
class CompilerHLSL : public CompilerGLSL class CompilerHLSL : public CompilerGLSL
{ {
public: public:
@ -54,6 +61,7 @@ public:
options = opts; options = opts;
} }
std::string compile(std::vector<HLSLVertexAttr> *p_vertex_attributes);
std::string compile() override; std::string compile() override;
private: private:
@ -133,6 +141,7 @@ private:
void emit_builtin_variables(); void emit_builtin_variables();
bool require_output = false; bool require_output = false;
bool require_input = false; bool require_input = false;
std::vector<HLSLVertexAttr> vertex_attributes;
uint32_t type_to_consumed_locations(const SPIRType &type) const; uint32_t type_to_consumed_locations(const SPIRType &type) const;