Changeset 246875 in webkit
- Timestamp:
- Jun 27, 2019 1:19:54 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r246869 r246875 1 2019-06-27 Saam Barati <sbarati@apple.com> 2 3 [WHLSL] Implement arrays and MakeArrayReference 4 https://bugs.webkit.org/show_bug.cgi?id=198414 5 6 Reviewed by Myles C. Maxfield. 7 8 * webgpu/whlsl-huge-array-expected.txt: Added. 9 * webgpu/whlsl-huge-array.html: Added. 10 * webgpu/whlsl-make-array-reference-expected.txt: Added. 11 * webgpu/whlsl-make-array-reference.html: Added. 12 * webgpu/whlsl-simple-arrays-expected.txt: Added. 13 * webgpu/whlsl-simple-arrays.html: Added. 14 * webgpu/whlsl-two-dimensional-array-expected.txt: Added. 15 * webgpu/whlsl-two-dimensional-array.html: Added. 16 1 17 2019-06-26 Simon Fraser <simon.fraser@apple.com> 2 18 -
trunk/Source/WebCore/ChangeLog
r246874 r246875 1 2019-06-27 Saam Barati <sbarati@apple.com> 2 3 [WHLSL] Implement arrays and MakeArrayReference 4 https://bugs.webkit.org/show_bug.cgi?id=198414 5 6 Reviewed by Myles C. Maxfield. 7 8 This patch implements WHLSL arrays. The main implementation detail is that 9 arrays get compiled to use Metal's array type. To make everything work, this 10 patch also fixes a few bugs: 11 - The checker now allows "operator.length" to be called on arrays. Prior to 12 this patch, it was just allowed on array references. 13 14 - The preserve variable lifetimes pass now looks at MakeArrayReference nodes. 15 Prior to this patch, it just looked at MakePointerExpression. 16 17 - We were producing the wrong type for ander arguments for indexed accesses 18 on array types. We were saying the argument that was produced was a reference 19 to an array instead of an array reference to the element type. 20 21 - The trie we compose for the reverse type hierarchy was inserting elements 22 into the wrong "children" vector. We were always inserting things into the 23 top level vector. This is wrong when we have a nesting of types > 1. 24 25 I also found a bug with having arrays of pointers when writing this patch. 26 Work on this will take place in a follow up: https://bugs.webkit.org/show_bug.cgi?id=199197 27 28 Tests: webgpu/whlsl-huge-array.html 29 webgpu/whlsl-make-array-reference.html 30 webgpu/whlsl-simple-arrays.html 31 webgpu/whlsl-two-dimensional-array.html 32 33 * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp: 34 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit): 35 * Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp: 36 (WebCore::WHLSL::Metal::writeNativeFunction): 37 * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp: 38 (WebCore::WHLSL::Metal::TypeNamer::insert): 39 (WebCore::WHLSL::Metal::TypeNamer::emitUnnamedTypeDefinition): 40 * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h: 41 * Modules/webgpu/WHLSL/WHLSLChecker.cpp: 42 (WebCore::WHLSL::resolveByInstantiation): 43 (WebCore::WHLSL::Checker::visit): 44 * Modules/webgpu/WHLSL/WHLSLPreserveVariableLifetimes.cpp: 45 (WebCore::WHLSL::EscapedVariableCollector::escapeVariableUse): 46 * Modules/webgpu/WHLSL/WHLSLPropertyResolver.cpp: 47 (WebCore::WHLSL::wrapAnderCallArgument): 48 (WebCore::WHLSL::anderCallArgument): 49 * Modules/webgpu/WHLSL/WHLSLStandardLibrary.txt: 50 1 51 2019-06-27 Fujii Hironori <Hironori.Fujii@sony.com> 2 52 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp
r246631 r246875 629 629 // FIXME: This needs to be made to work. It probably should be using the last leftValue too. 630 630 // https://bugs.webkit.org/show_bug.cgi?id=198838 631 auto lValue = takeLastValue();632 auto variableName = generateNextVariableName(); 631 auto variableName = generateNextVariableName(); 632 633 633 auto mangledTypeName = m_typeNamer.mangledNameForType(makeArrayReferenceExpression.resolvedType()); 634 if (is<AST::PointerType>(makeArrayReferenceExpression.resolvedType())) 634 if (is<AST::PointerType>(makeArrayReferenceExpression.leftValue().resolvedType())) { 635 auto ptrValue = takeLastValue(); 636 m_stringBuilder.append(makeString(mangledTypeName, ' ', variableName, ";\n")); 637 m_stringBuilder.append(makeString("if (", ptrValue, ") ", variableName, " = { ", ptrValue, ", 1};\n")); 638 m_stringBuilder.append(makeString("else ", variableName, " = { nullptr, 0 };\n")); 639 } else if (is<AST::ArrayType>(makeArrayReferenceExpression.leftValue().resolvedType())) { 640 auto lValue = takeLastLeftValue(); 641 auto& arrayType = downcast<AST::ArrayType>(makeArrayReferenceExpression.leftValue().resolvedType()); 642 m_stringBuilder.append(makeString(mangledTypeName, ' ', variableName, " = { ", lValue, "->data(), ", arrayType.numElements(), " };\n")); 643 } else { 644 auto lValue = takeLastLeftValue(); 635 645 m_stringBuilder.append(makeString(mangledTypeName, ' ', variableName, " = { ", lValue, ", 1 };\n")); 636 else if (is<AST::ArrayType>(makeArrayReferenceExpression.resolvedType())) { 637 auto& arrayType = downcast<AST::ArrayType>(makeArrayReferenceExpression.resolvedType()); 638 m_stringBuilder.append(makeString(mangledTypeName, ' ', variableName, " = { &(", lValue, "[0]), ", arrayType.numElements(), " };\n")); 639 } else 640 m_stringBuilder.append(makeString(mangledTypeName, ' ', variableName, " = { &", lValue, ", 1 };\n")); 646 } 641 647 appendRightValue(makeArrayReferenceExpression, variableName); 642 648 } -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp
r246643 r246875 175 175 if (is<AST::ArrayType>(unnamedParameterType)) { 176 176 auto& arrayParameterType = downcast<AST::ArrayType>(unnamedParameterType); 177 stringBuilder.append(makeString("uint ", outputFunctionName, '(', metalParameterName, " v) {\n"));178 stringBuilder.append(makeString(" return ", arrayParameterType.numElements(), " u;\n"));177 stringBuilder.append(makeString("uint ", outputFunctionName, '(', metalParameterName, ") {\n")); 178 stringBuilder.append(makeString(" return ", arrayParameterType.numElements(), ";\n")); 179 179 stringBuilder.append("}\n"); 180 180 return stringBuilder.toString(); … … 258 258 auto metalReturnName = typeNamer.mangledNameForType(nativeFunctionDeclaration.type()); 259 259 stringBuilder.append(makeString(metalReturnName, ' ', outputFunctionName, '(', metalParameter1Name, " v, ", metalParameter2Name, " n) {\n")); 260 ASSERT(is<AST::ArrayReferenceType>(*nativeFunctionDeclaration.parameters()[0]->type())); 260 261 stringBuilder.append(" if (n < v.length) return &(v.pointer[n]);\n"); 261 262 stringBuilder.append(" return nullptr;\n"); -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp
r246438 r246875 310 310 } 311 311 312 size_tTypeNamer::insert(AST::UnnamedType& unnamedType, Vector<UniqueRef<BaseTypeNameNode>>& types)312 BaseTypeNameNode* TypeNamer::insert(AST::UnnamedType& unnamedType, Vector<UniqueRef<BaseTypeNameNode>>& types) 313 313 { 314 314 Vector<UniqueRef<BaseTypeNameNode>>* vectorToInsertInto { nullptr }; … … 318 318 parent = nullptr; 319 319 } else if (is<AST::PointerType>(unnamedType)) { 320 auto& item = types[insert(downcast<AST::PointerType>(unnamedType).elementType(), types)]; 321 vectorToInsertInto = &item->children(); 322 parent = &item; 320 parent = insert(downcast<AST::PointerType>(unnamedType).elementType(), types); 321 vectorToInsertInto = &parent->children(); 323 322 } else if (is<AST::ArrayReferenceType>(unnamedType)) { 324 auto& item = types[insert(downcast<AST::ArrayReferenceType>(unnamedType).elementType(), types)]; 325 vectorToInsertInto = &item->children(); 326 parent = &item; 323 parent = insert(downcast<AST::ArrayReferenceType>(unnamedType).elementType(), types); 324 vectorToInsertInto = &parent->children(); 327 325 } else { 328 auto& item = types[insert(downcast<AST::ArrayType>(unnamedType).type(), types)]; 329 vectorToInsertInto = &item->children(); 330 parent = &item; 326 parent = insert(downcast<AST::ArrayType>(unnamedType).type(), types); 327 vectorToInsertInto = &parent->children(); 331 328 } 332 329 ASSERT(vectorToInsertInto); … … 340 337 } 341 338 vectorToInsertInto->append(WTFMove(result)); 342 return vectorToInsertInto->size() - 1;339 return &vectorToInsertInto->last().get(); 343 340 } 344 341 auto addResult = m_unnamedTypeMapping.add(&unnamedType, &*iterator); 345 342 ASSERT_UNUSED(addResult, addResult.isNewEntry); 346 return iterator - vectorToInsertInto->begin();343 return &*iterator; 347 344 } 348 345 … … 399 396 auto& arrayType = downcast<ArrayTypeNameNode>(baseTypeNameNode); 400 397 ASSERT(baseTypeNameNode.parent()); 401 stringBuilder.append(makeString("typedef Array<", arrayType.parent()->mangledName(), ", ", arrayType.numElements(), "> ", arrayType.mangledName(), ";\n"));398 stringBuilder.append(makeString("typedef array<", arrayType.parent()->mangledName(), ", ", arrayType.numElements(), "> ", arrayType.mangledName(), ";\n")); 402 399 } 403 400 emittedUnnamedTypes.add(&baseTypeNameNode); -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h
r243091 r246875 101 101 102 102 UniqueRef<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent); 103 size_tinsert(AST::UnnamedType&, Vector<UniqueRef<BaseTypeNameNode>>&);103 BaseTypeNameNode* insert(AST::UnnamedType&, Vector<UniqueRef<BaseTypeNameNode>>&); 104 104 105 105 Program& m_program; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp
r246631 r246875 184 184 } else if (name == "operator.length" && types.size() == 1) { 185 185 auto* firstArgumentReference = types[0].get().visit(WTF::makeVisitor([](UniqueRef<AST::UnnamedType>& unnamedType) -> AST::UnnamedType* { 186 if (is<AST::ArrayReferenceType>(static_cast<AST::UnnamedType&>(unnamedType)) )186 if (is<AST::ArrayReferenceType>(static_cast<AST::UnnamedType&>(unnamedType)) || is<AST::ArrayType>(static_cast<AST::UnnamedType&>(unnamedType))) 187 187 return &unnamedType; 188 188 return nullptr; … … 1133 1133 ASSERT(variableReference.variable()->type()); 1134 1134 1135 AST::TypeAnnotation typeAnnotation = AST::RightValue(); 1136 typeAnnotation = AST::LeftValue { AST::AddressSpace::Thread }; 1137 assignType(variableReference, variableReference.variable()->type()->clone(), WTFMove(typeAnnotation)); 1135 assignType(variableReference, variableReference.variable()->type()->clone(), AST::LeftValue { AST::AddressSpace::Thread }); 1138 1136 } 1139 1137 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPreserveVariableLifetimes.cpp
r246438 r246875 56 56 using Base = Visitor; 57 57 public: 58 void visit(AST::MakePointerExpression& makePointerExpression) override 59 { 60 if (!is<AST::VariableReference>(makePointerExpression.leftValue())) { 58 59 void escapeVariableUse(AST::Expression& expression) 60 { 61 if (!is<AST::VariableReference>(expression)) { 61 62 // FIXME: Are we missing any interesting productions here? 62 63 // https://bugs.webkit.org/show_bug.cgi?id=198311 63 Base::visit( makePointerExpression.leftValue());64 Base::visit(expression); 64 65 return; 65 66 } 66 67 67 auto& variableReference = downcast<AST::VariableReference>(makePointerExpression.leftValue()); 68 auto* variable = variableReference.variable(); 68 auto* variable = downcast<AST::VariableReference>(expression).variable(); 69 69 ASSERT(variable); 70 70 // FIXME: We could skip this if we mark all internal variables with a bit, since we … … 72 72 // https://bugs.webkit.org/show_bug.cgi?id=198383 73 73 m_escapedVariables.add(variable, makeString("_", variable->name(), "_", m_count++)); 74 } 75 76 void visit(AST::MakePointerExpression& makePointerExpression) override 77 { 78 escapeVariableUse(makePointerExpression.leftValue()); 79 } 80 81 void visit(AST::MakeArrayReferenceExpression& makeArrayReferenceExpression) override 82 { 83 escapeVariableUse(makeArrayReferenceExpression.leftValue()); 74 84 } 75 85 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPropertyResolver.cpp
r246649 r246875 96 96 97 97 template <typename ExpressionConstructor, typename TypeConstructor> 98 static Optional<AnderCallArgumentResult> wrapAnderCallArgument(UniqueRef<AST::Expression>& expression, bool anderFunction, bool threadAnderFunction)98 static Optional<AnderCallArgumentResult> wrapAnderCallArgument(UniqueRef<AST::Expression>& expression, UniqueRef<AST::UnnamedType> baseType, bool anderFunction, bool threadAnderFunction) 99 99 { 100 100 if (auto addressSpace = expression->typeAnnotation().leftAddressSpace()) { … … 102 102 return WTF::nullopt; 103 103 auto origin = expression->origin(); 104 auto baseType = expression->resolvedType().clone();105 104 auto makeArrayReference = makeUniqueRef<ExpressionConstructor>(Lexer::Token(origin), WTFMove(expression)); 106 105 makeArrayReference->setType(makeUniqueRef<TypeConstructor>(WTFMove(origin), *addressSpace, WTFMove(baseType))); … … 110 109 if (threadAnderFunction) { 111 110 auto origin = expression->origin(); 112 auto baseType = expression->resolvedType().clone();113 111 auto variableDeclaration = makeUniqueRef<AST::VariableDeclaration>(Lexer::Token(origin), AST::Qualifiers(), baseType->clone(), String(), WTF::nullopt, WTF::nullopt); 114 112 … … 152 150 return {{ WTFMove(expression), WTF::nullopt, WhichAnder::Ander }}; 153 151 if (is<AST::ArrayType>(unnamedType)) 154 return wrapAnderCallArgument<AST::MakeArrayReferenceExpression, AST::ArrayReferenceType>(expression, anderFunction, threadAnderFunction);155 } 156 return wrapAnderCallArgument<AST::MakePointerExpression, AST::PointerType>(expression, anderFunction, threadAnderFunction);152 return wrapAnderCallArgument<AST::MakeArrayReferenceExpression, AST::ArrayReferenceType>(expression, downcast<AST::ArrayType>(unnamedType).type().clone(), anderFunction, threadAnderFunction); 153 } 154 return wrapAnderCallArgument<AST::MakePointerExpression, AST::PointerType>(expression, expression->resolvedType().clone(), anderFunction, threadAnderFunction); 157 155 } 158 156 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLStandardLibrary.txt
r246681 r246875 791 791 } 792 792 int operator--(int value) { 793 return value - 1; 794 } 795 uint operator++(uint value) { 796 return value + 1; 797 } 798 uint operator--(uint value) { 793 799 return value - 1; 794 800 }
Note: See TracChangeset
for help on using the changeset viewer.