shaderc: Output Metal uniform reflection data.

This commit is contained in:
Branimir Karadžić 2016-10-31 20:33:14 -07:00
parent 8ea16b01bb
commit 1d0be51615
2 changed files with 69 additions and 8 deletions

View File

@ -113,14 +113,15 @@ namespace bgfx
NULL NULL
}; };
const char* s_uniformTypeName[UniformType::Count] = const char* s_uniformTypeName[] =
{ {
"int", "int", "int",
NULL, NULL, NULL,
"vec4", "vec4", "float4",
"mat3", "mat3", "float3x3",
"mat4", "mat4", "float4x4",
}; };
BX_STATIC_ASSERT(BX_COUNTOF(s_uniformTypeName) == UniformType::Count*2);
const char* interpolationDx11(const char* _glsl) const char* interpolationDx11(const char* _glsl)
{ {
@ -149,12 +150,12 @@ namespace bgfx
UniformType::Enum nameToUniformTypeEnum(const char* _name) UniformType::Enum nameToUniformTypeEnum(const char* _name)
{ {
for (uint32_t ii = 0; ii < UniformType::Count; ++ii) for (uint32_t ii = 0; ii < UniformType::Count*2; ++ii)
{ {
if (NULL != s_uniformTypeName[ii] if (NULL != s_uniformTypeName[ii]
&& 0 == strcmp(_name, s_uniformTypeName[ii]) ) && 0 == strcmp(_name, s_uniformTypeName[ii]) )
{ {
return UniformType::Enum(ii); return UniformType::Enum(ii/2);
} }
} }

View File

@ -91,6 +91,7 @@ namespace bgfx { namespace glsl
UniformArray uniforms; UniformArray uniforms;
if (target != kGlslTargetMetal)
{ {
const char* parse = optimizedShader; const char* parse = optimizedShader;
@ -181,6 +182,65 @@ namespace bgfx { namespace glsl
} }
} }
} }
else
{
const char* parse = strstr(optimizedShader, "struct xlatMtlShaderUniform {");
const char* end = parse;
if (NULL != parse)
{
parse += strlen("struct xlatMtlShaderUniform {");
end = strstr(parse, "};");
}
while ( parse < end
&& *parse != '\0')
{
parse = bx::strws(parse);
const char* eol = strchr(parse, ';');
if (NULL != eol)
{
const char* typen = parse;
char uniformType[256];
parse = bx::strword(parse);
bx::strlcpy(uniformType, typen, parse-typen+1);
const char* name = parse = bx::strws(parse);
char uniformName[256];
uint8_t num = 1;
const char* array = bx::strnstr(name, "[", eol-parse);
if (NULL != array)
{
bx::strlcpy(uniformName, name, array-name+1);
char arraySize[32];
const char* end = bx::strnstr(array, "]", eol-array);
bx::strlcpy(arraySize, array+1, end-array);
num = uint8_t(atoi(arraySize) );
}
else
{
bx::strlcpy(uniformName, name, eol-name+1);
}
Uniform un;
un.type = nameToUniformTypeEnum(uniformType);
if (UniformType::Count != un.type)
{
BX_TRACE("name: %s (type %d, num %d)", uniformName, un.type, num);
un.name = uniformName;
un.num = num;
un.regIndex = 0;
un.regCount = num;
uniforms.push_back(un);
}
parse = eol + 1;
}
}
}
uint16_t count = (uint16_t)uniforms.size(); uint16_t count = (uint16_t)uniforms.size();
bx::write(_writer, count); bx::write(_writer, count);