mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
shaderc: Remove reundant sampler reflection from HLSL.
This commit is contained in:
committed by
Branimir Karadžić
parent
241e9c3330
commit
d60e24c46c
@@ -278,113 +278,6 @@ namespace bgfx { namespace hlsl
|
||||
return false;
|
||||
}
|
||||
|
||||
bool getReflectionDataD3D9(ID3DBlob* _code, UniformArray& _uniforms, bx::WriterI* _messageWriter)
|
||||
{
|
||||
bx::ErrorAssert messageErr;
|
||||
|
||||
// see reference for magic values: https://msdn.microsoft.com/en-us/library/ff552891(VS.85).aspx
|
||||
const uint32_t D3DSIO_COMMENT = 0x0000FFFE;
|
||||
const uint32_t D3DSIO_END = 0x0000FFFF;
|
||||
const uint32_t D3DSI_OPCODE_MASK = 0x0000FFFF;
|
||||
const uint32_t D3DSI_COMMENTSIZE_MASK = 0x7FFF0000;
|
||||
const uint32_t CTAB_CONSTANT = BX_MAKEFOURCC('C', 'T', 'A', 'B');
|
||||
|
||||
// parse the shader blob for the constant table
|
||||
const size_t codeSize = _code->GetBufferSize();
|
||||
const uint32_t* ptr = (const uint32_t*)_code->GetBufferPointer();
|
||||
const uint32_t* end = (const uint32_t*)( (const uint8_t*)ptr + codeSize);
|
||||
const CTHeader* header = NULL;
|
||||
|
||||
ptr++; // first byte is shader type / version; skip it since we already know
|
||||
|
||||
while (ptr < end && *ptr != D3DSIO_END)
|
||||
{
|
||||
uint32_t cur = *ptr++;
|
||||
if ( (cur & D3DSI_OPCODE_MASK) != D3DSIO_COMMENT)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// try to find CTAB comment block
|
||||
uint32_t commentSize = (cur & D3DSI_COMMENTSIZE_MASK) >> 16;
|
||||
uint32_t fourcc = *ptr;
|
||||
if (fourcc == CTAB_CONSTANT)
|
||||
{
|
||||
// found the constant table data
|
||||
header = (const CTHeader*)(ptr + 1);
|
||||
uint32_t tableSize = (commentSize - 1) * 4;
|
||||
if (tableSize < sizeof(CTHeader) || header->Size != sizeof(CTHeader) )
|
||||
{
|
||||
bx::write(_messageWriter, &messageErr, "Error: Invalid constant table data\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// this is a different kind of comment section, so skip over it
|
||||
ptr += commentSize - 1;
|
||||
}
|
||||
|
||||
if (!header)
|
||||
{
|
||||
bx::write(_messageWriter, &messageErr, "Error: Could not find constant table data\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
const uint8_t* headerBytePtr = (const uint8_t*)header;
|
||||
const char* creator = (const char*)(headerBytePtr + header->Creator);
|
||||
BX_UNUSED(creator);
|
||||
|
||||
BX_TRACE("Creator: %s 0x%08x", creator, header->Version);
|
||||
BX_TRACE("Num constants: %d", header->Constants);
|
||||
BX_TRACE("# cl ty RxC S By Name");
|
||||
|
||||
const CTInfo* ctInfoArray = (const CTInfo*)(headerBytePtr + header->ConstantInfo);
|
||||
for (uint32_t ii = 0; ii < header->Constants; ++ii)
|
||||
{
|
||||
const CTInfo& ctInfo = ctInfoArray[ii];
|
||||
const CTType& ctType = *(const CTType*)(headerBytePtr + ctInfo.TypeInfo);
|
||||
const char* name = (const char*)(headerBytePtr + ctInfo.Name);
|
||||
|
||||
BX_TRACE("%3d %2d %2d [%dx%d] %d %s[%d] c%d (%d)"
|
||||
, ii
|
||||
, ctType.Class
|
||||
, ctType.Type
|
||||
, ctType.Rows
|
||||
, ctType.Columns
|
||||
, ctType.StructMembers
|
||||
, name
|
||||
, ctType.Elements
|
||||
, ctInfo.RegisterIndex
|
||||
, ctInfo.RegisterCount
|
||||
);
|
||||
|
||||
D3D11_SHADER_TYPE_DESC desc;
|
||||
desc.Class = (D3D_SHADER_VARIABLE_CLASS)ctType.Class;
|
||||
desc.Type = (D3D_SHADER_VARIABLE_TYPE)ctType.Type;
|
||||
desc.Rows = ctType.Rows;
|
||||
desc.Columns = ctType.Columns;
|
||||
|
||||
UniformType::Enum type = findUniformType(desc);
|
||||
if (UniformType::Count != type)
|
||||
{
|
||||
Uniform un;
|
||||
un.name = '$' == name[0] ? name + 1 : name;
|
||||
un.type = isSampler(desc.Type)
|
||||
? UniformType::Enum(kUniformSamplerBit | type)
|
||||
: type
|
||||
;
|
||||
un.num = (uint8_t)ctType.Elements;
|
||||
un.regIndex = ctInfo.RegisterIndex;
|
||||
un.regCount = ctInfo.RegisterCount;
|
||||
|
||||
_uniforms.push_back(un);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool getReflectionDataD3D11(ID3DBlob* _code, bool _vshader, UniformArray& _uniforms, uint8_t& _numAttrs, uint16_t* _attrs, uint16_t& _size, UniformNameList& unusedUniforms, bx::WriterI* _messageWriter)
|
||||
{
|
||||
bx::Error messageErr;
|
||||
@@ -520,7 +413,7 @@ namespace bgfx { namespace hlsl
|
||||
hr = reflect->GetResourceBindingDesc(ii, &bindDesc);
|
||||
if (SUCCEEDED(hr) )
|
||||
{
|
||||
if (D3D_SIT_SAMPLER == bindDesc.Type || D3D_SIT_TEXTURE == bindDesc.Type)
|
||||
if (D3D_SIT_SAMPLER == bindDesc.Type)
|
||||
{
|
||||
BX_TRACE("\t%s, %d, %d, %d"
|
||||
, bindDesc.Name
|
||||
@@ -530,8 +423,6 @@ namespace bgfx { namespace hlsl
|
||||
);
|
||||
|
||||
bx::StringView end = bx::strFind(bindDesc.Name, "Sampler");
|
||||
if (end.isEmpty())
|
||||
end = bx::strFind(bindDesc.Name, "Texture");
|
||||
|
||||
if (!end.isEmpty() )
|
||||
{
|
||||
@@ -544,10 +435,6 @@ namespace bgfx { namespace hlsl
|
||||
_uniforms.push_back(un);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BX_TRACE("\t%s, unknown bind data", bindDesc.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -678,15 +565,6 @@ namespace bgfx { namespace hlsl
|
||||
uint16_t attrs[bgfx::Attrib::Count];
|
||||
uint16_t size = 0;
|
||||
|
||||
if (_version < 400)
|
||||
{
|
||||
if (!getReflectionDataD3D9(code, uniforms, _messageWriter) )
|
||||
{
|
||||
bx::write(_messageWriter, &messageErr, "Error: Unable to get D3D9 reflection data.\n");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UniformNameList unusedUniforms;
|
||||
if (!getReflectionDataD3D11(code, profileAndType[0] == 'v', uniforms, numAttrs, attrs, size, unusedUniforms, _messageWriter) )
|
||||
|
||||
Reference in New Issue
Block a user