void Watch::decompilStrutUpdate(QTreeWidgetItem *parentItem, QString val) { QString memberBlock; int index=0; QStringList memberList = extractMember(val); for(int i=0; i<memberList.count();i++) { memberBlock = memberList.at(i); while(memberBlock.startsWith(" ")) memberBlock.remove(0,1); QTreeWidgetItem *child; child = parentItem->child(index); // quelques fois Gdb ajout un nouveau membre et comme il n'est // pas initialisé on plante d'iou le test suivant if(child == NULL ) return; switch(memberType(memberBlock)) { case 0: child->setText(3, "$ = " + memberBlock); decompilStrutUpdate(child, memberBlock); break; case 1 : isVariableChangedValue(child,"$ = " + formatMember(memberBlock).at(1)); child->setText(3, "$ = " + formatMember(memberBlock).at(1)); break; case 2: isVariableChangedValue(child,"$ = " + memberList.at(i).right(memberList.at(i).length() - memberList.at(i).indexOf(" = {") - 3)); child->setText(3, "$ = " + memberList.at(i).right(memberList.at(i).length() - memberList.at(i).indexOf(" = {") - 3)); decompilStrutUpdate(child, memberBlock); } // end switch index++; }// end for }
// recursive function void Watch::decompilStrut(QTreeWidgetItem *parentItem, QString val) { QString memberBlock; int indexTab=0; QStringList memberList = extractMember(val); for(int i=0; i<memberList.count();i++) { memberBlock = memberList.at(i); while(memberBlock.startsWith(" ")) memberBlock.remove(0,1); QTreeWidgetItem *child; child = new QTreeWidgetItem(parentItem); switch(memberType(memberBlock)) { case 0: child->setText(0, "[0x" + QString::number(indexTab++,16) +"]"); child->setText(3, "$ = " + memberBlock); decompilStrut(child, memberBlock); break; case 1 : child->setText(0, formatMember(memberBlock).at(0)); child->setText(3, "$ = " + formatMember(memberBlock).at(1)); break; case 2: child->setText(0, formatMember(memberBlock).at(0)); child->setText(3, "$ = " + memberList.at(i).right(memberList.at(i).length() - memberList.at(i).indexOf(" = {") - 3)); decompilStrut(child, memberBlock); } // end switch }// end for }
// Recursively figure out how many bytes of xfb buffer are used by the given type. // Return the size of type, in bytes. // Sets containsDouble to true if the type contains a double. // N.B. Caller must set containsDouble to false before calling. unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& containsDouble) const { // "...if applied to an aggregate containing a double, the offset must also be a multiple of 8, // and the space taken in the buffer will be a multiple of 8. // ...within the qualified entity, subsequent components are each // assigned, in order, to the next available offset aligned to a multiple of // that component's size. Aggregate types are flattened down to the component // level to get this sequence of components." if (type.isArray()) { // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness assert(type.isExplicitlySizedArray()); TType elementType(type, 0); return type.getOuterArraySize() * computeTypeXfbSize(elementType, containsDouble); } if (type.isStruct()) { unsigned int size = 0; bool structContainsDouble = false; for (int member = 0; member < (int)type.getStruct()->size(); ++member) { TType memberType(type, member); // "... if applied to // an aggregate containing a double, the offset must also be a multiple of 8, // and the space taken in the buffer will be a multiple of 8." bool memberContainsDouble = false; int memberSize = computeTypeXfbSize(memberType, memberContainsDouble); if (memberContainsDouble) { structContainsDouble = true; RoundToPow2(size, 8); } size += memberSize; } if (structContainsDouble) { containsDouble = true; RoundToPow2(size, 8); } return size; } int numComponents; if (type.isScalar()) numComponents = 1; else if (type.isVector()) numComponents = type.getVectorSize(); else if (type.isMatrix()) numComponents = type.getMatrixCols() * type.getMatrixRows(); else { assert(0); numComponents = 1; } if (type.getBasicType() == EbtDouble) { containsDouble = true; return 8 * numComponents; } else return 4 * numComponents; }
// Recursively figure out how many locations are used up by an input or output type. // Return the size of type, as measured by "locations". int TIntermediate::computeTypeLocationSize(const TType& type) const { // "If the declared input is an array of size n and each element takes m locations, it will be assigned m * n // consecutive locations..." if (type.isArray()) { // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness TType elementType(type, 0); if (type.isImplicitlySizedArray()) { // TODO: are there valid cases of having an implicitly-sized array with a location? If so, running this code too early. return computeTypeLocationSize(elementType); } else return type.getOuterArraySize() * computeTypeLocationSize(elementType); } // "The locations consumed by block and structure members are determined by applying the rules above // recursively..." if (type.isStruct()) { int size = 0; for (int member = 0; member < (int)type.getStruct()->size(); ++member) { TType memberType(type, member); size += computeTypeLocationSize(memberType); } return size; } // ES: "If a shader input is any scalar or vector type, it will consume a single location." // Desktop: "If a vertex shader input is any scalar or vector type, it will consume a single location. If a non-vertex // shader input is a scalar or vector type other than dvec3 or dvec4, it will consume a single location, while // types dvec3 or dvec4 will consume two consecutive locations. Inputs of type double and dvec2 will // consume only a single location, in all stages." if (type.isScalar()) return 1; if (type.isVector()) { if (language == EShLangVertex && type.getQualifier().isPipeInput()) return 1; if (type.getBasicType() == EbtDouble && type.getVectorSize() > 2) return 2; else return 1; } // "If the declared input is an n x m single- or double-precision matrix, ... // The number of locations assigned for each matrix will be the same as // for an n-element array of m-component vectors..." if (type.isMatrix()) { TType columnType(type, 0); return type.getMatrixCols() * computeTypeLocationSize(columnType); } assert(0); return 1; }