static void ReadInputSignatures(const uint32_t* pui32Tokens, ShaderInfo* psShaderInfo) { uint32_t i; InOutSignature* psSignatures; const uint32_t* pui32FirstSignatureToken = pui32Tokens; const uint32_t ui32ElementCount = *pui32Tokens++; const uint32_t ui32Key = *pui32Tokens++; psSignatures = malloc(sizeof(InOutSignature) * ui32ElementCount); psShaderInfo->psInputSignatures = psSignatures; psShaderInfo->ui32NumInputSignatures = ui32ElementCount; for(i=0; i<ui32ElementCount; ++i) { InOutSignature* psCurrentSignature = psSignatures + i; const uint32_t ui32SemanticNameOffset = *pui32Tokens++; psCurrentSignature->ui32SymanticIndex = *pui32Tokens++; psCurrentSignature->ui32SymanticValueType = *pui32Tokens++; psCurrentSignature->ui32ComponentType = *pui32Tokens++; psCurrentSignature->ui32Register = *pui32Tokens++; psCurrentSignature->ui32Mask = *pui32Tokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstSignatureToken+ui32SemanticNameOffset), psCurrentSignature->SymanticName); } }
//Read D3D11_SHADER_TYPE_DESC static void ReadShaderVariableType(const uint32_t ui32MajorVersion, const uint32_t* pui32FirstConstBufToken, const uint32_t* pui32tokens, ShaderVarType* varType) { const uint16_t* pui16Tokens = (const uint16_t*) pui32tokens; uint16_t ui32MemberCount; uint32_t ui32MemberOffset; const uint32_t* pui32MemberTokens; uint32_t i; varType->Class = (SHADER_VARIABLE_CLASS)pui16Tokens[0]; varType->Type = (SHADER_VARIABLE_TYPE)pui16Tokens[1]; varType->Rows = pui16Tokens[2]; varType->Columns = pui16Tokens[3]; varType->Elements = pui16Tokens[4]; varType->MemberCount = ui32MemberCount = pui16Tokens[5]; varType->Members = 0; if(varType->ParentCount) { ASSERT( (strlen(varType->Parent->FullName) + 1 + strlen(varType->Name) + 1 + 2) < MAX_REFLECT_STRING_LENGTH); strcpy(varType->FullName, varType->Parent->FullName); strcat(varType->FullName, "."); strcat(varType->FullName, varType->Name); } if(ui32MemberCount) { varType->Members = (ShaderVarType*)hlslcc_malloc(sizeof(ShaderVarType)*ui32MemberCount); ui32MemberOffset = pui32tokens[3]; pui32MemberTokens = (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32MemberOffset); for(i=0; i< ui32MemberCount; ++i) { uint32_t ui32NameOffset = *pui32MemberTokens++; uint32_t ui32MemberTypeOffset = *pui32MemberTokens++; varType->Members[i].Parent = varType; varType->Members[i].ParentCount = varType->ParentCount + 1; varType->Members[i].Offset = *pui32MemberTokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstConstBufToken+ui32NameOffset), varType->Members[i].Name); ReadShaderVariableType(ui32MajorVersion, pui32FirstConstBufToken, (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32MemberTypeOffset), &varType->Members[i]); } } }
static void ReadPatchConstantSignatures(const uint32_t* pui32Tokens, ShaderInfo* psShaderInfo, const int minPrec, const int streams) { uint32_t i; InOutSignature* psSignatures; const uint32_t* pui32FirstSignatureToken = pui32Tokens; const uint32_t ui32ElementCount = *pui32Tokens++; const uint32_t ui32Key = *pui32Tokens++; psSignatures = hlslcc_malloc(sizeof(InOutSignature) * ui32ElementCount); psShaderInfo->psPatchConstantSignatures = psSignatures; psShaderInfo->ui32NumPatchConstantSignatures = ui32ElementCount; for(i=0; i<ui32ElementCount; ++i) { uint32_t ui32ComponentMasks; InOutSignature* psCurrentSignature = psSignatures + i; uint32_t ui32SemanticNameOffset; psCurrentSignature->ui32Stream = 0; psCurrentSignature->eMinPrec = MIN_PRECISION_DEFAULT; if(streams) psCurrentSignature->ui32Stream = *pui32Tokens++; ui32SemanticNameOffset = *pui32Tokens++; psCurrentSignature->ui32SemanticIndex = *pui32Tokens++; psCurrentSignature->eSystemValueType = (SPECIAL_NAME)*pui32Tokens++; psCurrentSignature->eComponentType = (INOUT_COMPONENT_TYPE) *pui32Tokens++; psCurrentSignature->ui32Register = *pui32Tokens++; // Massage some special inputs/outputs to match the types of GLSL counterparts if (psCurrentSignature->eSystemValueType == NAME_RENDER_TARGET_ARRAY_INDEX) { psCurrentSignature->eComponentType = INOUT_COMPONENT_SINT32; } ui32ComponentMasks = *pui32Tokens++; psCurrentSignature->ui32Mask = ui32ComponentMasks & 0x7F; //Shows which components are NEVER written. psCurrentSignature->ui32ReadWriteMask = (ui32ComponentMasks & 0x7F00) >> 8; if(minPrec) psCurrentSignature->eMinPrec = *pui32Tokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstSignatureToken+ui32SemanticNameOffset), psCurrentSignature->SemanticName); } }
static const uint16_t* ReadClassInstance(const uint32_t* pui32FirstInterfaceToken, const uint16_t* pui16Tokens, ClassInstance* psClassInstance) { uint32_t ui32NameOffset = *pui16Tokens++ << 16; ui32NameOffset |= *pui16Tokens++; psClassInstance->ui16ID = *pui16Tokens++; psClassInstance->ui16ConstBuf = *pui16Tokens++; psClassInstance->ui16ConstBufOffset = *pui16Tokens++; psClassInstance->ui16Texture = *pui16Tokens++; psClassInstance->ui16Sampler = *pui16Tokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstInterfaceToken+ui32NameOffset), psClassInstance->Name); return pui16Tokens; }
static const uint16_t* ReadClassType(const uint32_t* pui32FirstInterfaceToken, const uint16_t* pui16Tokens, ClassType* psClassType) { const uint32_t* pui32Tokens = (const uint32_t*)pui16Tokens; uint32_t ui32NameOffset = *pui32Tokens; pui16Tokens+= 2; psClassType->ui16ID = *pui16Tokens++; psClassType->ui16ConstBufStride = *pui16Tokens++; psClassType->ui16Texture = *pui16Tokens++; psClassType->ui16Sampler = *pui16Tokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstInterfaceToken+ui32NameOffset), psClassType->Name); return pui16Tokens; }
static const uint32_t* ReadResourceBinding(const uint32_t* pui32FirstResourceToken, const uint32_t* pui32Tokens, ResourceBinding* psBinding) { uint32_t ui32NameOffset = *pui32Tokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstResourceToken+ui32NameOffset), psBinding->Name); psBinding->eType = *pui32Tokens++; psBinding->ui32ReturnType = *pui32Tokens++; psBinding->eDimension = (RESOURCE_DIMENSION)*pui32Tokens++; psBinding->ui32NumSamples = *pui32Tokens++; psBinding->ui32BindPoint = *pui32Tokens++; psBinding->ui32BindCount = *pui32Tokens++; psBinding->ui32Flags = *pui32Tokens++; return pui32Tokens; }
static void ReadInputSignatures(const uint32_t* pui32Tokens, ShaderInfo* psShaderInfo, const int extended) { uint32_t i; InOutSignature* psSignatures; const uint32_t* pui32FirstSignatureToken = pui32Tokens; const uint32_t ui32ElementCount = *pui32Tokens++; const uint32_t ui32Key = *pui32Tokens++; psSignatures = hlslcc_malloc(sizeof(InOutSignature) * ui32ElementCount); psShaderInfo->psInputSignatures = psSignatures; psShaderInfo->ui32NumInputSignatures = ui32ElementCount; for(i=0; i<ui32ElementCount; ++i) { uint32_t ui32ComponentMasks; InOutSignature* psCurrentSignature = psSignatures + i; uint32_t ui32SemanticNameOffset; psCurrentSignature->ui32Stream = 0; psCurrentSignature->eMinPrec = MIN_PRECISION_DEFAULT; if(extended) psCurrentSignature->ui32Stream = *pui32Tokens++; ui32SemanticNameOffset = *pui32Tokens++; psCurrentSignature->ui32SemanticIndex = *pui32Tokens++; psCurrentSignature->eSystemValueType = (SPECIAL_NAME) *pui32Tokens++; psCurrentSignature->eComponentType = (INOUT_COMPONENT_TYPE) *pui32Tokens++; psCurrentSignature->ui32Register = *pui32Tokens++; ui32ComponentMasks = *pui32Tokens++; psCurrentSignature->ui32Mask = ui32ComponentMasks & 0x7F; //Shows which components are read psCurrentSignature->ui32ReadWriteMask = (ui32ComponentMasks & 0x7F00) >> 8; if(extended) psCurrentSignature->eMinPrec = *pui32Tokens++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstSignatureToken+ui32SemanticNameOffset), psCurrentSignature->SemanticName); } }
static const uint32_t* ReadConstantBuffer(ShaderInfo* psShaderInfo, const uint32_t* pui32FirstConstBufToken, const uint32_t* pui32Tokens, ConstantBuffer* psBuffer) { uint32_t i; uint32_t ui32NameOffset = *pui32Tokens++; uint32_t ui32VarCount = *pui32Tokens++; uint32_t ui32VarOffset = *pui32Tokens++; const uint32_t* pui32VarToken = (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32VarOffset); ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstConstBufToken+ui32NameOffset), psBuffer->Name); FormatVariableName(psBuffer->Name); psBuffer->ui32NumVars = ui32VarCount; psBuffer->asVars = hlslcc_malloc(psBuffer->ui32NumVars * sizeof(ShaderVar)); for(i=0; i<ui32VarCount; ++i) { //D3D11_SHADER_VARIABLE_DESC ShaderVar * const psVar = &psBuffer->asVars[i]; uint32_t ui32Flags; uint32_t ui32TypeOffset; uint32_t ui32DefaultValueOffset; ui32NameOffset = *pui32VarToken++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstConstBufToken+ui32NameOffset), psVar->Name); FormatVariableName(psVar->Name); psVar->ui32StartOffset = *pui32VarToken++; psVar->ui32Size = *pui32VarToken++; ui32Flags = *pui32VarToken++; ui32TypeOffset = *pui32VarToken++; strcpy(psVar->sType.Name, psVar->Name); strcpy(psVar->sType.FullName, psVar->Name); psVar->sType.Parent = 0; psVar->sType.ParentCount = 0; psVar->sType.Offset = 0; ReadShaderVariableType(psShaderInfo->ui32MajorVersion, pui32FirstConstBufToken, (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32TypeOffset), &psVar->sType); ui32DefaultValueOffset = *pui32VarToken++; if (psShaderInfo->ui32MajorVersion >= 5) { uint32_t StartTexture = *pui32VarToken++; uint32_t TextureSize = *pui32VarToken++; uint32_t StartSampler = *pui32VarToken++; uint32_t SamplerSize = *pui32VarToken++; } psVar->haveDefaultValue = 0; if(ui32DefaultValueOffset) { uint32_t i = 0; const uint32_t ui32NumDefaultValues = psVar->ui32Size / 4; const uint32_t* pui32DefaultValToken = (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32DefaultValueOffset); //Always a sequence of 4-bytes at the moment. //bool const becomes 0 or 0xFFFFFFFF int, int & float are 4-bytes. ASSERT(psVar->ui32Size%4 == 0); psVar->haveDefaultValue = 1; psVar->pui32DefaultValues = hlslcc_malloc(psVar->ui32Size); for(i=0; i<ui32NumDefaultValues; ++i) { psVar->pui32DefaultValues[i] = pui32DefaultValToken[i]; } } } { uint32_t ui32Flags; uint32_t ui32BufferType; psBuffer->ui32TotalSizeInBytes = *pui32Tokens++; ui32Flags = *pui32Tokens++; ui32BufferType = *pui32Tokens++; } return pui32Tokens; }
static const uint32_t* ReadConstantBuffer(ShaderInfo* psShaderInfo, const uint32_t* pui32FirstConstBufToken, const uint32_t* pui32Tokens, ConstantBuffer* psBuffer) { uint32_t i; uint32_t ui32NameOffset = *pui32Tokens++; uint32_t ui32VarCount = *pui32Tokens++; uint32_t ui32VarOffset = *pui32Tokens++; const uint32_t* pui32VarToken = (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32VarOffset); ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstConstBufToken+ui32NameOffset), psBuffer->Name); psBuffer->ui32NumVars = ui32VarCount; for(i=0; i<ui32VarCount; ++i) { //D3D11_SHADER_VARIABLE_DESC ShaderVar * const psVar = &psBuffer->asVars[i]; uint32_t ui32Flags; uint32_t ui32TypeOffset; uint32_t ui32DefaultValueOffset; ui32NameOffset = *pui32VarToken++; ReadStringFromTokenStream((const uint32_t*)((const char*)pui32FirstConstBufToken+ui32NameOffset), psVar->Name); psVar->ui32StartOffset = *pui32VarToken++; psVar->ui32Size = *pui32VarToken++; ui32Flags = *pui32VarToken++; ui32TypeOffset = *pui32VarToken++; ui32DefaultValueOffset = *pui32VarToken++; if (psShaderInfo->ui32MajorVersion >= 5) { uint32_t StartTexture = *pui32VarToken++; uint32_t TextureSize = *pui32VarToken++; uint32_t StartSampler = *pui32VarToken++; uint32_t SamplerSize = *pui32VarToken++; } if(ui32DefaultValueOffset) { if(psVar->ui32Size == 4) { const uint32_t* pui32DefaultValToken = (const uint32_t*)((const char*)pui32FirstConstBufToken+ui32DefaultValueOffset); psVar->ui32DefaultValue = *pui32DefaultValToken; } } if(ui32TypeOffset) { //D3D11_SHADER_TYPE_DESC const uint16_t* pui16TypeToken = (const uint16_t*)((const char*)pui32FirstConstBufToken+ui32TypeOffset); uint16_t varClass = *pui16TypeToken++; uint16_t varType = *pui16TypeToken++; uint16_t varRows = *pui16TypeToken++; uint16_t varCols = *pui16TypeToken++; uint16_t varElemCount = *pui16TypeToken++; uint16_t varMemberCount = *pui16TypeToken++; uint32_t varMemberOffset = *pui16TypeToken++ << 16; varMemberOffset |= *pui16TypeToken++; } } { uint32_t ui32Flags; uint32_t ui32BufferType; psBuffer->ui32TotalSizeInBytes = *pui32Tokens++; ui32Flags = *pui32Tokens++; ui32BufferType = *pui32Tokens++; } return pui32Tokens; }