TString UniformHLSL::interfaceBlockMembersString(const TInterfaceBlock &interfaceBlock, TLayoutBlockStorage blockStorage) { TString hlsl; Std140PaddingHelper padHelper = mStructureHLSL->getPaddingHelper(); for (unsigned int typeIndex = 0; typeIndex < interfaceBlock.fields().size(); typeIndex++) { const TField &field = *interfaceBlock.fields()[typeIndex]; const TType &fieldType = *field.type(); if (blockStorage == EbsStd140) { // 2 and 3 component vector types in some cases need pre-padding hlsl += padHelper.prePaddingString(fieldType); } hlsl += " " + InterfaceBlockFieldTypeString(field, blockStorage) + " " + Decorate(field.name()) + ArrayString(fieldType) + ";\n"; // must pad out after matrices and arrays, where HLSL usually allows itself room to pack stuff if (blockStorage == EbsStd140) { const bool useHLSLRowMajorPacking = (fieldType.getLayoutQualifier().matrixPacking == EmpColumnMajor); hlsl += padHelper.postPaddingString(fieldType, useHLSLRowMajorPacking); } } return hlsl; }
TString UniformHLSL::uniformBlockString(const TInterfaceBlock &interfaceBlock, unsigned int registerIndex, unsigned int arrayIndex) { const TString &arrayIndexString = (arrayIndex != GL_INVALID_INDEX ? Decorate(str(arrayIndex)) : ""); const TString &blockName = interfaceBlock.name() + arrayIndexString; TString hlsl; hlsl += "cbuffer " + blockName + " : register(b" + str(registerIndex) + ")\n" "{\n"; if (interfaceBlock.hasInstanceName()) { hlsl += " " + InterfaceBlockStructName(interfaceBlock) + " " + uniformBlockInstanceString(interfaceBlock, arrayIndex) + ";\n"; } else { const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); hlsl += uniformBlockMembersString(interfaceBlock, blockStorage); } hlsl += "};\n\n"; return hlsl; }
static TString InterfaceBlockFieldName(const TInterfaceBlock &interfaceBlock, const TField &field) { if (interfaceBlock.hasInstanceName()) { return interfaceBlock.name() + "." + field.name(); } else { return field.name(); } }
TString UniformHLSL::interfaceBlockInstanceString(const TInterfaceBlock& interfaceBlock, unsigned int arrayIndex) { if (!interfaceBlock.hasInstanceName()) { return ""; } else if (interfaceBlock.isArray()) { return DecoratePrivate(interfaceBlock.instanceName()) + "_" + str(arrayIndex); } else { return Decorate(interfaceBlock.instanceName()); } }
TString UniformHLSL::interfaceBlockStructString(const TInterfaceBlock &interfaceBlock) { const TLayoutBlockStorage blockStorage = interfaceBlock.blockStorage(); return "struct " + InterfaceBlockStructName(interfaceBlock) + "\n" "{\n" + interfaceBlockMembersString(interfaceBlock, blockStorage) + "};\n\n"; }
static TString InterfaceBlockStructName(const TInterfaceBlock &interfaceBlock) { return DecoratePrivate(interfaceBlock.name()) + "_type"; }