mirror of https://github.com/bkaradzic/bgfx
shaderc: Output Metal uniform reflection data.
This commit is contained in:
parent
8ea16b01bb
commit
1d0be51615
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue