Changeset 248307 in webkit
- Timestamp:
- Aug 6, 2019, 12:04:00 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 18 edited
-
ChangeLog (modified) (1 diff)
-
Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h (modified) (1 diff)
-
Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h (modified) (1 diff)
-
Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h (modified) (1 diff)
-
Modules/webgpu/WHLSL/AST/WHLSLPointerType.h (modified) (2 diffs)
-
Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h (modified) (1 diff)
-
Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp (modified) (16 diffs)
-
Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h (modified) (5 diffs)
-
Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp (modified) (16 diffs)
-
Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h (modified) (1 diff)
-
Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp (modified) (2 diffs)
-
Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h (modified) (3 diffs)
-
Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp (modified) (6 diffs)
-
Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h (modified) (2 diffs)
-
Modules/webgpu/WHLSL/WHLSLParser.cpp (modified) (1 diff)
-
Modules/webgpu/WHLSL/WHLSLPrepare.h (modified) (3 diffs)
-
platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm (modified) (1 diff)
-
platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r248303 r248307 1 2019-08-06 Sam Weinig <weinig@apple.com> 2 3 WHLSL Metal code generation unnecessarily does string copies by passing partial results as Strings 4 https://bugs.webkit.org/show_bug.cgi?id=200471 5 6 Reviewed by Saam Barati. 7 8 Avoid string copies by passing a single StringBuilder all the way through Metal code 9 generation and only converting to a String when passing the constructed shader to Metal 10 API. 11 12 Where possible, use StringView in lieu of String for temporary strings being passed to 13 the StringBuilder to avoid the allocation overhead of StringImpl. 14 15 * Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h: 16 (WebCore::WHLSL::AST::toString): 17 Switch to StringView. 18 19 * Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h: 20 (WebCore::WHLSL::AST::BuiltInSemantic::toString const): 21 Switch to StringView. 22 23 * Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h: 24 (WebCore::WHLSL::AST::toString): 25 Switch to StringView. 26 27 * Modules/webgpu/WHLSL/AST/WHLSLPointerType.h: 28 Remove unnecessary "private:". 29 30 * Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h: 31 (WebCore::WHLSL::AST::ResourceSemantic::toString): 32 Switch to StringView. 33 34 * Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp: 35 (WebCore::WHLSL::Metal::EntryPointScaffolding::emitResourceHelperTypes): 36 (WebCore::WHLSL::Metal::EntryPointScaffolding::emitResourceSignature): 37 (WebCore::WHLSL::Metal::EntryPointScaffolding::emitBuiltInsSignature): 38 (WebCore::WHLSL::Metal::EntryPointScaffolding::emitMangledInputPath): 39 (WebCore::WHLSL::Metal::EntryPointScaffolding::emitMangledOutputPath): 40 (WebCore::WHLSL::Metal::EntryPointScaffolding::emitUnpackResourcesAndNamedBuiltIns): 41 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitHelperTypes): 42 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitSignature): 43 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitUnpack): 44 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitPack): 45 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitHelperTypes): 46 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitSignature): 47 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitUnpack): 48 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitPack): 49 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitHelperTypes): 50 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitSignature): 51 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitUnpack): 52 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitPack): 53 (WebCore::WHLSL::Metal::EntryPointScaffolding::resourceHelperTypes): Deleted. 54 (WebCore::WHLSL::Metal::EntryPointScaffolding::resourceSignature): Deleted. 55 (WebCore::WHLSL::Metal::EntryPointScaffolding::builtInsSignature): Deleted. 56 (WebCore::WHLSL::Metal::EntryPointScaffolding::mangledInputPath): Deleted. 57 (WebCore::WHLSL::Metal::EntryPointScaffolding::mangledOutputPath): Deleted. 58 (WebCore::WHLSL::Metal::EntryPointScaffolding::unpackResourcesAndNamedBuiltIns): Deleted. 59 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::helperTypes): Deleted. 60 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::signature): Deleted. 61 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::unpack): Deleted. 62 (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::pack): Deleted. 63 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::helperTypes): Deleted. 64 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::signature): Deleted. 65 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::unpack): Deleted. 66 (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::pack): Deleted. 67 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::helperTypes): Deleted. 68 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::signature): Deleted. 69 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::unpack): Deleted. 70 (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::pack): Deleted. 71 * Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h: 72 Rather than have scaffolding return strings, pass in StringBuilders everywhere. 73 74 * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp: 75 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::FunctionDefinitionWriter): 76 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit): 77 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::emitConstantExpressionString): 78 (WebCore::WHLSL::Metal::generateMetalFunctionsMapping): 79 (WebCore::WHLSL::Metal::emitSharedMetalFunctions): 80 (WebCore::WHLSL::Metal::emitMetalFunctions): 81 (WebCore::WHLSL::Metal::FunctionDeclarationWriter::FunctionDeclarationWriter): Deleted. 82 (WebCore::WHLSL::Metal::FunctionDeclarationWriter::toString): Deleted. 83 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::toString): Deleted. 84 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::constantExpressionString): Deleted. 85 (WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::RenderFunctionDefinitionWriter): Deleted. 86 (WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::ComputeFunctionDefinitionWriter): Deleted. 87 (WebCore::WHLSL::Metal::sharedMetalFunctions): Deleted. 88 (WebCore::WHLSL::Metal::metalFunctions): Deleted. 89 * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h: 90 Rather than returning Strings from function generation functions, pass in StringBuilders everywhere. 91 92 * Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp: 93 (WebCore::WHLSL::Metal::metalCodeProlog): 94 (WebCore::WHLSL::Metal::dumpMetalCodeIfNeeded): 95 (WebCore::WHLSL::Metal::generateMetalCode): 96 (WebCore::WHLSL::Metal::generateMetalCodeShared): Deleted. 97 * Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h: 98 Switch RenderMetalCode and ComputeMetalCode to contain StringBuilders to allow 99 delaying conversion to String to the latest point possible. 100 101 * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp: 102 (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDeclarations): 103 (WebCore::WHLSL::Metal::TypeNamer::emitUnnamedTypeDefinition): 104 (WebCore::WHLSL::Metal::TypeNamer::emitNamedTypeDefinition): 105 (WebCore::WHLSL::Metal::TypeNamer::emitAllUnnamedTypeDefinitions): 106 (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDefinitions): 107 (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypes): 108 (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::MetalTypeDeclarationWriter): Deleted. 109 (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::toString): Deleted. 110 (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::visit): Deleted. 111 (WebCore::WHLSL::Metal::TypeNamer::metalTypeDeclarations): Deleted. 112 (WebCore::WHLSL::Metal::TypeNamer::metalTypeDefinitions): Deleted. 113 (WebCore::WHLSL::Metal::TypeNamer::metalTypes): Deleted. 114 * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h: 115 Rather than returning Strings from function generation functions, pass in StringBuilders everywhere. 116 117 * Modules/webgpu/WHLSL/WHLSLParser.cpp: 118 (WebCore::WHLSL::Parser::parseResourceSemantic): 119 Remove use of _str, which allocates a String, and just use a StringView directly. 120 121 * Modules/webgpu/WHLSL/WHLSLPrepare.h: 122 Switch RenderPrepareResult and ComputePrepareResult to contain StringBuilders to allow 123 delaying conversion to String to the latest point possible. 124 125 * platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm: 126 (WebCore::trySetFunctions): 127 * platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm: 128 (WebCore::trySetFunctions): 129 Convert StringBuilders to String at the last moment necessary. Adds a FIXME to improve 130 in the future by adding direct conversion from StringBuilder to NSString to avoid another 131 copy. 132 1 133 2019-08-06 Saam Barati <sbarati@apple.com> 2 134 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h
r248021 r248307 45 45 }; 46 46 47 ALWAYS_INLINE String toString(AddressSpace addressSpace)47 ALWAYS_INLINE StringView toString(AddressSpace addressSpace) 48 48 { 49 49 switch (addressSpace) { 50 50 case AddressSpace::Constant: 51 return "constant" _str;51 return "constant"; 52 52 case AddressSpace::Device: 53 return "device" _str;53 return "device"; 54 54 case AddressSpace::Threadgroup: 55 return "threadgroup" _str;55 return "threadgroup"; 56 56 default: 57 57 ASSERT(addressSpace == AddressSpace::Thread); 58 return "thread" _str;58 return "thread"; 59 59 } 60 60 } -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h
r247834 r248307 84 84 } 85 85 86 String toString() const86 StringView toString() const 87 87 { 88 88 switch (m_variable) { -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h
r246385 r248307 42 42 }; 43 43 44 ALWAYS_INLINE String toString(EntryPointType type)44 ALWAYS_INLINE StringView toString(EntryPointType type) 45 45 { 46 46 switch (type) { -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLPointerType.h
r248083 r248307 50 50 { 51 51 } 52 52 53 public: 53 54 54 static Ref<PointerType> create(CodeLocation location, AddressSpace addressSpace, Ref<UnnamedType> elementType) 55 55 { … … 79 79 return makeString(elementType().toString(), '*'); 80 80 } 81 82 private:83 81 }; 84 82 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h
r247834 r248307 61 61 ResourceSemantic(ResourceSemantic&&) = default; 62 62 63 String toString()63 StringView toString() 64 64 { 65 65 switch (m_mode) { -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp
r248266 r248307 140 140 } 141 141 142 String EntryPointScaffolding::resourceHelperTypes() 143 { 144 StringBuilder stringBuilder; 142 void EntryPointScaffolding::emitResourceHelperTypes(StringBuilder& stringBuilder) 143 { 145 144 for (size_t i = 0; i < m_layout.size(); ++i) { 146 145 stringBuilder.flexibleAppend("struct ", m_namedBindGroups[i].structName, " {\n"); … … 175 174 stringBuilder.append("};\n\n"); 176 175 } 177 return stringBuilder.toString(); 178 } 179 180 Optional<String> EntryPointScaffolding::resourceSignature() 176 } 177 178 bool EntryPointScaffolding::emitResourceSignature(StringBuilder& stringBuilder, IncludePrecedingComma includePrecedingComma) 181 179 { 182 180 if (!m_layout.size()) 183 return WTF::nullopt; 184 185 StringBuilder stringBuilder; 181 return false; 182 183 if (includePrecedingComma == IncludePrecedingComma::Yes) 184 stringBuilder.append(", "); 185 186 186 for (size_t i = 0; i < m_layout.size(); ++i) { 187 187 if (i) … … 190 190 stringBuilder.flexibleAppend("device ", namedBindGroup.structName, "& ", namedBindGroup.variableName, " [[buffer(", namedBindGroup.argumentBufferIndex, ")]]"); 191 191 } 192 return stringBuilder.toString();192 return true; 193 193 } 194 194 … … 228 228 } 229 229 230 Optional<String> EntryPointScaffolding::builtInsSignature()230 bool EntryPointScaffolding::emitBuiltInsSignature(StringBuilder& stringBuilder, IncludePrecedingComma includePrecedingComma) 231 231 { 232 232 if (!m_namedBuiltIns.size()) 233 return WTF::nullopt; 234 235 StringBuilder stringBuilder; 233 return false; 234 235 if (includePrecedingComma == IncludePrecedingComma::Yes) 236 stringBuilder.append(", "); 237 236 238 for (size_t i = 0; i < m_namedBuiltIns.size(); ++i) { 237 239 if (i) … … 247 249 stringBuilder.flexibleAppend(' ', namedBuiltIn.variableName, ' ', attributeForSemantic(builtInSemantic)); 248 250 } 249 return stringBuilder.toString();250 } 251 252 String EntryPointScaffolding::mangledInputPath(Vector<String>& path)251 return true; 252 } 253 254 void EntryPointScaffolding::emitMangledInputPath(StringBuilder& stringBuilder, Vector<String>& path) 253 255 { 254 256 ASSERT(!path.isEmpty()); 255 StringBuilder stringBuilder;256 257 bool found = false; 257 258 AST::StructureDefinition* structureDefinition = nullptr; … … 283 284 } 284 285 } 285 286 return stringBuilder.toString(); 287 } 288 289 String EntryPointScaffolding::mangledOutputPath(Vector<String>& path) 290 { 291 StringBuilder stringBuilder; 292 286 } 287 288 void EntryPointScaffolding::emitMangledOutputPath(StringBuilder& stringBuilder, Vector<String>& path) 289 { 293 290 AST::StructureDefinition* structureDefinition = nullptr; 294 291 auto& unifyNode = m_functionDefinition.type().unifyNode(); … … 307 304 } 308 305 } 309 310 return stringBuilder.toString(); 311 } 312 313 String EntryPointScaffolding::unpackResourcesAndNamedBuiltIns() 314 { 315 StringBuilder stringBuilder; 306 } 307 308 void EntryPointScaffolding::emitUnpackResourcesAndNamedBuiltIns(StringBuilder& stringBuilder) 309 { 316 310 for (size_t i = 0; i < m_functionDefinition.parameters().size(); ++i) 317 311 stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*m_functionDefinition.parameters()[i]->type()), ' ', m_parameterVariables[i], ";\n"); … … 337 331 lengthTemporaryName, " = ", lengthTemporaryName, " | ", variableName, '.', lengthElementName, ".x;\n", 338 332 lengthTemporaryName, " = ", lengthTemporaryName, " / sizeof(", mangledTypeName, ");\n", 339 "if (", lengthTemporaryName, " > 0xFFFFFFFF) ", lengthTemporaryName, " = 0xFFFFFFFF;\n", 340 mangledInputPath(path), " = { ", variableName, '.', elementName, ", static_cast<uint32_t>(", lengthTemporaryName, ") };\n" 333 "if (", lengthTemporaryName, " > 0xFFFFFFFF) ", lengthTemporaryName, " = 0xFFFFFFFF;\n" 334 ); 335 336 emitMangledInputPath(stringBuilder, path); 337 stringBuilder.flexibleAppend( 338 " = { ", variableName, '.', elementName, ", static_cast<uint32_t>(", lengthTemporaryName, ") };\n" 341 339 ); 342 340 } else { 343 341 auto& path = m_entryPointItems.inputs[iterator->value].path; 344 342 auto elementName = m_namedBindGroups[i].namedBindings[j].elementName; 345 stringBuilder.flexibleAppend(mangledInputPath(path), " = ", variableName, '.', elementName, ";\n"); 343 344 emitMangledInputPath(stringBuilder, path); 345 stringBuilder.flexibleAppend(" = ", variableName, '.', elementName, ";\n"); 346 346 } 347 347 } … … 353 353 auto& variableName = namedBuiltIn.variableName; 354 354 auto mangledTypeName = m_typeNamer.mangledNameForType(*item.unnamedType); 355 stringBuilder.flexibleAppend(mangledInputPath(path), " = ", mangledTypeName, '(', variableName, ");\n"); 356 } 357 return stringBuilder.toString(); 355 356 emitMangledInputPath(stringBuilder, path); 357 stringBuilder.flexibleAppend(" = ", mangledTypeName, '(', variableName, ");\n"); 358 } 358 359 } 359 360 … … 390 391 } 391 392 392 String VertexEntryPointScaffolding::helperTypes() 393 { 394 StringBuilder stringBuilder; 395 393 void VertexEntryPointScaffolding::emitHelperTypes(StringBuilder& stringBuilder) 394 { 396 395 stringBuilder.flexibleAppend("struct ", m_stageInStructName, " {\n"); 397 396 for (auto& namedStageIn : m_namedStageIns) { … … 412 411 stringBuilder.flexibleAppend(" ", internalTypeName, ' ', elementName, ' ', attribute, ";\n"); 413 412 } 414 stringBuilder.flexibleAppend( 415 "};\n\n", 416 resourceHelperTypes() 413 stringBuilder.append( 414 "};\n\n" 417 415 ); 418 419 return stringBuilder.toString(); 420 } 421 422 String VertexEntryPointScaffolding::signature(MangledFunctionName functionName) 423 { 424 StringBuilder stringBuilder; 425 416 417 emitResourceHelperTypes(stringBuilder); 418 } 419 420 void VertexEntryPointScaffolding::emitSignature(StringBuilder& stringBuilder, MangledFunctionName functionName) 421 { 426 422 stringBuilder.flexibleAppend("vertex ", m_returnStructName, ' ', functionName, '(', m_stageInStructName, ' ', m_stageInParameterName, " [[stage_in]]"); 427 if (auto resourceSignature = this->resourceSignature()) 428 stringBuilder.flexibleAppend(", ", *resourceSignature); 429 if (auto builtInsSignature = this->builtInsSignature()) 430 stringBuilder.flexibleAppend(", ", *builtInsSignature); 423 emitResourceSignature(stringBuilder, IncludePrecedingComma::Yes); 424 emitBuiltInsSignature(stringBuilder, IncludePrecedingComma::Yes); 431 425 stringBuilder.append(')'); 432 433 return stringBuilder.toString(); 434 } 435 436 String VertexEntryPointScaffolding::unpack() 437 { 438 StringBuilder stringBuilder; 439 440 stringBuilder.append(unpackResourcesAndNamedBuiltIns()); 426 } 427 428 void VertexEntryPointScaffolding::emitUnpack(StringBuilder& stringBuilder) 429 { 430 emitUnpackResourcesAndNamedBuiltIns(stringBuilder); 441 431 442 432 for (auto& namedStageIn : m_namedStageIns) { 443 433 auto& path = m_entryPointItems.inputs[namedStageIn.indexInEntryPointItems].path; 444 434 auto& elementName = namedStageIn.elementName; 445 stringBuilder.flexibleAppend(mangledInputPath(path), " = ", m_stageInParameterName, '.', elementName, ";\n"); 446 } 447 448 return stringBuilder.toString(); 449 } 450 451 String VertexEntryPointScaffolding::pack(MangledVariableName inputVariableName, MangledVariableName outputVariableName) 452 { 453 StringBuilder stringBuilder; 454 435 emitMangledInputPath(stringBuilder, path); 436 stringBuilder.flexibleAppend(" = ", m_stageInParameterName, '.', elementName, ";\n"); 437 } 438 } 439 440 void VertexEntryPointScaffolding::emitPack(StringBuilder& stringBuilder, MangledVariableName inputVariableName, MangledVariableName outputVariableName) 441 { 455 442 stringBuilder.flexibleAppend(m_returnStructName, ' ', outputVariableName, ";\n"); 456 443 if (m_entryPointItems.outputs.size() == 1 && !m_entryPointItems.outputs[0].path.size()) { 457 444 auto& elementName = m_namedOutputs[0].elementName; 458 445 stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", inputVariableName, ";\n"); 459 return stringBuilder.toString();446 return; 460 447 } 461 448 for (size_t i = 0; i < m_entryPointItems.outputs.size(); ++i) { … … 463 450 auto& internalTypeName = m_namedOutputs[i].internalTypeName; 464 451 auto& path = m_entryPointItems.outputs[i].path; 465 stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName, mangledOutputPath(path), ");\n"); 466 } 467 return stringBuilder.toString(); 452 stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName); 453 emitMangledOutputPath(stringBuilder, path); 454 stringBuilder.flexibleAppend(");\n"); 455 } 468 456 } 469 457 … … 502 490 } 503 491 504 String FragmentEntryPointScaffolding::helperTypes() 505 { 506 StringBuilder stringBuilder; 507 492 void FragmentEntryPointScaffolding::emitHelperTypes(StringBuilder& stringBuilder) 493 { 508 494 stringBuilder.flexibleAppend("struct ", m_stageInStructName, " {\n"); 509 495 for (auto& namedStageIn : m_namedStageIns) { … … 524 510 stringBuilder.flexibleAppend(" ", internalTypeName, ' ', elementName, ' ', attribute, ";\n"); 525 511 } 526 stringBuilder.flexibleAppend( 527 "};\n\n", 528 resourceHelperTypes() 512 stringBuilder.append( 513 "};\n\n" 529 514 ); 530 515 531 return stringBuilder.toString(); 532 } 533 534 String FragmentEntryPointScaffolding::signature(MangledFunctionName functionName) 535 { 536 StringBuilder stringBuilder; 537 516 emitResourceHelperTypes(stringBuilder); 517 } 518 519 void FragmentEntryPointScaffolding::emitSignature(StringBuilder& stringBuilder, MangledFunctionName functionName) 520 { 538 521 stringBuilder.flexibleAppend("fragment ", m_returnStructName, ' ', functionName, '(', m_stageInStructName, ' ', m_stageInParameterName, " [[stage_in]]"); 539 if (auto resourceSignature = this->resourceSignature()) 540 stringBuilder.flexibleAppend(", ", *resourceSignature); 541 if (auto builtInsSignature = this->builtInsSignature()) 542 stringBuilder.flexibleAppend(", ", *builtInsSignature); 522 emitResourceSignature(stringBuilder, IncludePrecedingComma::Yes); 523 emitBuiltInsSignature(stringBuilder, IncludePrecedingComma::Yes); 543 524 stringBuilder.append(')'); 544 545 return stringBuilder.toString(); 546 } 547 548 String FragmentEntryPointScaffolding::unpack() 549 { 550 StringBuilder stringBuilder; 551 552 stringBuilder.append(unpackResourcesAndNamedBuiltIns()); 525 } 526 527 void FragmentEntryPointScaffolding::emitUnpack(StringBuilder& stringBuilder) 528 { 529 emitUnpackResourcesAndNamedBuiltIns(stringBuilder); 553 530 554 531 for (auto& namedStageIn : m_namedStageIns) { 555 532 auto& path = m_entryPointItems.inputs[namedStageIn.indexInEntryPointItems].path; 556 533 auto& elementName = namedStageIn.elementName; 557 stringBuilder.flexibleAppend(mangledInputPath(path), " = ", m_stageInParameterName, '.', elementName, ";\n"); 558 } 559 560 return stringBuilder.toString(); 561 } 562 563 String FragmentEntryPointScaffolding::pack(MangledVariableName inputVariableName, MangledVariableName outputVariableName) 564 { 565 StringBuilder stringBuilder; 566 534 emitMangledInputPath(stringBuilder, path); 535 stringBuilder.flexibleAppend(" = ", m_stageInParameterName, '.', elementName, ";\n"); 536 } 537 } 538 539 void FragmentEntryPointScaffolding::emitPack(StringBuilder& stringBuilder, MangledVariableName inputVariableName, MangledVariableName outputVariableName) 540 { 567 541 stringBuilder.flexibleAppend(m_returnStructName, ' ', outputVariableName, ";\n"); 568 542 if (m_entryPointItems.outputs.size() == 1 && !m_entryPointItems.outputs[0].path.size()) { 569 543 auto& elementName = m_namedOutputs[0].elementName; 570 544 stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", inputVariableName, ";\n"); 571 return stringBuilder.toString();545 return; 572 546 } 573 547 for (size_t i = 0; i < m_entryPointItems.outputs.size(); ++i) { … … 575 549 auto& internalTypeName = m_namedOutputs[i].internalTypeName; 576 550 auto& path = m_entryPointItems.outputs[i].path; 577 stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName, mangledOutputPath(path), ");\n"); 578 } 579 return stringBuilder.toString(); 551 stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName); 552 emitMangledOutputPath(stringBuilder, path); 553 stringBuilder.flexibleAppend(");\n"); 554 } 580 555 } 581 556 … … 585 560 } 586 561 587 String ComputeEntryPointScaffolding::helperTypes() 588 { 589 return resourceHelperTypes(); 590 } 591 592 String ComputeEntryPointScaffolding::signature(MangledFunctionName functionName) 593 { 594 StringBuilder stringBuilder; 595 562 void ComputeEntryPointScaffolding::emitHelperTypes(StringBuilder& stringBuilder) 563 { 564 emitResourceHelperTypes(stringBuilder); 565 } 566 567 void ComputeEntryPointScaffolding::emitSignature(StringBuilder& stringBuilder, MangledFunctionName functionName) 568 { 596 569 stringBuilder.flexibleAppend("kernel void ", functionName, '('); 597 bool empty = true; 598 if (auto resourceSignature = this->resourceSignature()) { 599 empty = false; 600 stringBuilder.append(*resourceSignature); 601 } 602 if (auto builtInsSignature = this->builtInsSignature()) { 603 if (!empty) 604 stringBuilder.append(", "); 605 stringBuilder.append(*builtInsSignature); 606 } 570 bool addedToSignature = emitResourceSignature(stringBuilder, IncludePrecedingComma::No); 571 emitBuiltInsSignature(stringBuilder, addedToSignature ? IncludePrecedingComma::Yes : IncludePrecedingComma::No); 607 572 stringBuilder.append(')'); 608 609 return stringBuilder.toString(); 610 } 611 612 String ComputeEntryPointScaffolding::unpack() 613 { 614 return unpackResourcesAndNamedBuiltIns(); 615 } 616 617 String ComputeEntryPointScaffolding::pack(MangledVariableName, MangledVariableName) 573 } 574 575 void ComputeEntryPointScaffolding::emitUnpack(StringBuilder& stringBuilder) 576 { 577 emitUnpackResourcesAndNamedBuiltIns(stringBuilder); 578 } 579 580 void ComputeEntryPointScaffolding::emitPack(StringBuilder&, MangledVariableName, MangledVariableName) 618 581 { 619 582 ASSERT_NOT_REACHED(); 620 return String();621 583 } 622 584 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h
r248266 r248307 54 54 virtual ~EntryPointScaffolding() = default; 55 55 56 virtual String helperTypes() = 0;57 virtual String signature(MangledFunctionName) = 0;58 virtual String unpack() = 0;59 virtual String pack(MangledVariableName existingVariableName, MangledVariableName) = 0;56 virtual void emitHelperTypes(StringBuilder&) = 0; 57 virtual void emitSignature(StringBuilder&, MangledFunctionName) = 0; 58 virtual void emitUnpack(StringBuilder&) = 0; 59 virtual void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) = 0; 60 60 61 61 Vector<MangledVariableName>& parameterVariables() { return m_parameterVariables; } … … 64 64 EntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName); 65 65 66 String resourceHelperTypes(); 67 Optional<String> resourceSignature(); 68 Optional<String> builtInsSignature(); 66 void emitResourceHelperTypes(StringBuilder&); 69 67 70 String mangledInputPath(Vector<String>& path); 71 String mangledOutputPath(Vector<String>& path); 72 String unpackResourcesAndNamedBuiltIns(); 68 enum class IncludePrecedingComma { 69 Yes, 70 No 71 }; 72 bool emitResourceSignature(StringBuilder&, IncludePrecedingComma); 73 bool emitBuiltInsSignature(StringBuilder&, IncludePrecedingComma); 74 75 void emitMangledInputPath(StringBuilder&, Vector<String>& path); 76 void emitMangledOutputPath(StringBuilder&, Vector<String>& path); 77 void emitUnpackResourcesAndNamedBuiltIns(StringBuilder&); 73 78 74 79 AST::FunctionDefinition& m_functionDefinition; … … 107 112 }; 108 113 109 class VertexEntryPointScaffolding : public EntryPointScaffolding {114 class VertexEntryPointScaffolding final : public EntryPointScaffolding { 110 115 public: 111 116 VertexEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes); 112 117 virtual ~VertexEntryPointScaffolding() = default; 113 118 114 String helperTypes() override; 115 String signature(MangledFunctionName) override; 116 String unpack() override; 117 String pack(MangledVariableName existingVariableName, MangledVariableName) override; 119 private: 120 void emitHelperTypes(StringBuilder&) override; 121 void emitSignature(StringBuilder&, MangledFunctionName) override; 122 void emitUnpack(StringBuilder&) override; 123 void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) override; 118 124 119 private:120 125 HashMap<VertexAttribute*, size_t>& m_matchedVertexAttributes; 121 126 MangledTypeName m_stageInStructName; … … 137 142 }; 138 143 139 class FragmentEntryPointScaffolding : public EntryPointScaffolding {144 class FragmentEntryPointScaffolding final : public EntryPointScaffolding { 140 145 public: 141 146 FragmentEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>& matchedColorAttachments); 142 147 virtual ~FragmentEntryPointScaffolding() = default; 143 148 144 String helperTypes() override; 145 String signature(MangledFunctionName) override; 146 String unpack() override; 147 String pack(MangledVariableName existingVariableName, MangledVariableName) override; 149 private: 150 void emitHelperTypes(StringBuilder&) override; 151 void emitSignature(StringBuilder&, MangledFunctionName) override; 152 void emitUnpack(StringBuilder&) override; 153 void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) override; 148 154 149 private:150 155 MangledTypeName m_stageInStructName; 151 156 MangledTypeName m_returnStructName; … … 166 171 }; 167 172 168 class ComputeEntryPointScaffolding : public EntryPointScaffolding {173 class ComputeEntryPointScaffolding final : public EntryPointScaffolding { 169 174 public: 170 175 ComputeEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName); 171 176 virtual ~ComputeEntryPointScaffolding() = default; 172 177 173 String helperTypes() override; 174 String signature(MangledFunctionName) override; 175 String unpack() override; 176 String pack(MangledVariableName existingVariableName, MangledVariableName) override; 178 private: 179 void emitHelperTypes(StringBuilder&) override; 180 void emitSignature(StringBuilder&, MangledFunctionName) override; 181 void emitUnpack(StringBuilder&) override; 182 void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) override; 177 183 }; 178 184 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp
r248280 r248307 48 48 namespace Metal { 49 49 50 class FunctionDeclarationWriter : public Visitor {50 class FunctionDeclarationWriter final : public Visitor { 51 51 public: 52 FunctionDeclarationWriter( TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping)52 FunctionDeclarationWriter(StringBuilder& stringBuilder, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping) 53 53 : m_typeNamer(typeNamer) 54 54 , m_functionMapping(functionMapping) 55 , m_stringBuilder(stringBuilder) 55 56 { 56 57 } 57 58 58 59 virtual ~FunctionDeclarationWriter() = default; 59 60 String toString() { return m_stringBuilder.toString(); }61 60 62 61 void visit(AST::FunctionDeclaration&) override; … … 65 64 TypeNamer& m_typeNamer; 66 65 HashMap<AST::FunctionDeclaration*, MangledFunctionName>& m_functionMapping; 67 StringBuilder m_stringBuilder;66 StringBuilder& m_stringBuilder; 68 67 }; 69 68 … … 86 85 class FunctionDefinitionWriter : public Visitor { 87 86 public: 88 FunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, Layout& layout) 89 : m_intrinsics(intrinsics) 87 FunctionDefinitionWriter(StringBuilder& stringBuilder, Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, Layout& layout) 88 : m_stringBuilder(stringBuilder) 89 , m_intrinsics(intrinsics) 90 90 , m_typeNamer(typeNamer) 91 91 , m_functionMapping(functionMapping) … … 95 95 96 96 virtual ~FunctionDefinitionWriter() = default; 97 98 String toString() { return m_stringBuilder.toString(); }99 97 100 98 void visit(AST::NativeFunctionDeclaration&) override; … … 149 147 void emitLoop(LoopConditionLocation, AST::Expression* conditionExpression, AST::Expression* increment, AST::Statement& body); 150 148 151 String constantExpressionString(AST::ConstantExpression&);149 void emitConstantExpressionString(AST::ConstantExpression&); 152 150 153 151 MangledVariableName generateNextVariableName() { return { m_variableCount++ }; } … … 216 214 Optional<BreakContext> m_currentBreakContext; 217 215 216 StringBuilder& m_stringBuilder; 218 217 Intrinsics& m_intrinsics; 219 218 TypeNamer& m_typeNamer; 220 219 HashMap<AST::FunctionDeclaration*, MangledFunctionName>& m_functionMapping; 221 220 HashMap<AST::VariableDeclaration*, MangledVariableName> m_variableMapping; 222 StringBuilder m_stringBuilder;223 221 224 222 Vector<StackItem> m_stack; … … 243 241 return; 244 242 m_entryPointScaffolding = WTFMove(entryPointScaffolding); 245 m_stringBuilder.flexibleAppend( 246 m_entryPointScaffolding->helperTypes(), '\n', 247 m_entryPointScaffolding->signature(iterator->value), " {\n", 248 m_entryPointScaffolding->unpack() 249 ); 243 m_entryPointScaffolding->emitHelperTypes(m_stringBuilder); 244 m_stringBuilder.append('\n'); 245 m_entryPointScaffolding->emitSignature(m_stringBuilder, iterator->value); 246 m_stringBuilder.append(" {\n"); 247 m_entryPointScaffolding->emitUnpack(m_stringBuilder); 248 250 249 for (size_t i = 0; i < functionDefinition.parameters().size(); ++i) { 251 250 auto addResult = m_variableMapping.add(&functionDefinition.parameters()[i], m_entryPointScaffolding->parameterVariables()[i]); … … 407 406 if (m_entryPointScaffolding) { 408 407 auto variableName = generateNextVariableName(); 409 m_stringBuilder.flexibleAppend( 410 m_entryPointScaffolding->pack(takeLastValue(), variableName), 411 "return ", variableName, ";\n" 412 ); 408 m_entryPointScaffolding->emitPack(m_stringBuilder, takeLastValue(), variableName); 409 m_stringBuilder.flexibleAppend("return ", variableName, ";\n"); 413 410 } else 414 411 m_stringBuilder.flexibleAppend("return ", takeLastValue(), ";\n"); … … 429 426 void FunctionDefinitionWriter::visit(AST::SwitchCase& switchCase) 430 427 { 431 if (switchCase.value()) 432 m_stringBuilder.flexibleAppend("case ", constantExpressionString(*switchCase.value()), ":\n"); 433 else 428 if (switchCase.value()) { 429 m_stringBuilder.flexibleAppend("case "); 430 emitConstantExpressionString(*switchCase.value()); 431 m_stringBuilder.flexibleAppend(":\n"); 432 } else 434 433 m_stringBuilder.append("default:\n"); 435 434 SetForScope<Optional<BreakContext>> breakContext(m_currentBreakContext, BreakContext::Switch); … … 736 735 } 737 736 738 String FunctionDefinitionWriter::constantExpressionString(AST::ConstantExpression& constantExpression) 739 { 740 return constantExpression.visit(WTF::makeVisitor([&](AST::IntegerLiteral& integerLiteral) -> String { 741 return makeString("", integerLiteral.value()); 742 }, [&](AST::UnsignedIntegerLiteral& unsignedIntegerLiteral) -> String { 743 return makeString("", unsignedIntegerLiteral.value()); 744 }, [&](AST::FloatLiteral& floatLiteral) -> String { 745 return makeString("", floatLiteral.value()); 746 }, [&](AST::NullLiteral&) -> String { 747 return "nullptr"_str; 748 }, [&](AST::BooleanLiteral& booleanLiteral) -> String { 749 return booleanLiteral.value() ? "true"_str : "false"_str; 750 }, [&](AST::EnumerationMemberLiteral& enumerationMemberLiteral) -> String { 751 ASSERT(enumerationMemberLiteral.enumerationDefinition()); 752 ASSERT(enumerationMemberLiteral.enumerationDefinition()); 753 return makeString(m_typeNamer.mangledNameForType(*enumerationMemberLiteral.enumerationDefinition()), "::", m_typeNamer.mangledNameForEnumerationMember(*enumerationMemberLiteral.enumerationMember())); 754 })); 755 } 756 757 class RenderFunctionDefinitionWriter : public FunctionDefinitionWriter { 737 void FunctionDefinitionWriter::emitConstantExpressionString(AST::ConstantExpression& constantExpression) 738 { 739 constantExpression.visit(WTF::makeVisitor( 740 [&](AST::IntegerLiteral& integerLiteral) { 741 m_stringBuilder.flexibleAppend(integerLiteral.value()); 742 }, 743 [&](AST::UnsignedIntegerLiteral& unsignedIntegerLiteral) { 744 m_stringBuilder.flexibleAppend(unsignedIntegerLiteral.value()); 745 }, 746 [&](AST::FloatLiteral& floatLiteral) { 747 m_stringBuilder.flexibleAppend(floatLiteral.value()); 748 }, 749 [&](AST::NullLiteral&) { 750 m_stringBuilder.flexibleAppend("nullptr"); 751 }, 752 [&](AST::BooleanLiteral& booleanLiteral) { 753 if (booleanLiteral.value()) 754 m_stringBuilder.flexibleAppend("true"); 755 else 756 m_stringBuilder.flexibleAppend("false"); 757 }, 758 [&](AST::EnumerationMemberLiteral& enumerationMemberLiteral) { 759 ASSERT(enumerationMemberLiteral.enumerationDefinition()); 760 ASSERT(enumerationMemberLiteral.enumerationDefinition()); 761 m_stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*enumerationMemberLiteral.enumerationDefinition()), "::", m_typeNamer.mangledNameForEnumerationMember(*enumerationMemberLiteral.enumerationMember())); 762 } 763 )); 764 } 765 766 class RenderFunctionDefinitionWriter final : public FunctionDefinitionWriter { 758 767 public: 759 RenderFunctionDefinitionWriter( Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedRenderSemantics&& matchedSemantics, Layout& layout)760 : FunctionDefinitionWriter( intrinsics, typeNamer, functionMapping, layout)768 RenderFunctionDefinitionWriter(StringBuilder& stringBuilder, Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedRenderSemantics&& matchedSemantics, Layout& layout) 769 : FunctionDefinitionWriter(stringBuilder, intrinsics, typeNamer, functionMapping, layout) 761 770 , m_matchedSemantics(WTFMove(matchedSemantics)) 762 771 { … … 781 790 } 782 791 783 class ComputeFunctionDefinitionWriter : public FunctionDefinitionWriter {792 class ComputeFunctionDefinitionWriter final : public FunctionDefinitionWriter { 784 793 public: 785 ComputeFunctionDefinitionWriter( Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedComputeSemantics&& matchedSemantics, Layout& layout)786 : FunctionDefinitionWriter( intrinsics, typeNamer, functionMapping, layout)794 ComputeFunctionDefinitionWriter(StringBuilder& stringBuilder, Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedComputeSemantics&& matchedSemantics, Layout& layout) 795 : FunctionDefinitionWriter(stringBuilder, intrinsics, typeNamer, functionMapping, layout) 787 796 , m_matchedSemantics(WTFMove(matchedSemantics)) 788 797 { … … 805 814 } 806 815 807 struct SharedMetalFunctionsResult { 808 HashMap<AST::FunctionDeclaration*, MangledFunctionName> functionMapping; 809 String metalFunctions; 810 }; 811 static SharedMetalFunctionsResult sharedMetalFunctions(Program& program, TypeNamer& typeNamer, const HashSet<AST::FunctionDeclaration*>& reachableFunctions) 812 { 813 StringBuilder stringBuilder; 814 816 static HashMap<AST::FunctionDeclaration*, MangledFunctionName> generateMetalFunctionsMapping(Program& program) 817 { 815 818 unsigned numFunctions = 0; 816 819 HashMap<AST::FunctionDeclaration*, MangledFunctionName> functionMapping; … … 820 823 } 821 824 822 { 823 FunctionDeclarationWriter functionDeclarationWriter(typeNamer, functionMapping); 824 for (auto& functionDefinition : program.functionDefinitions()) { 825 if (!functionDefinition->entryPointType() && reachableFunctions.contains(&functionDefinition)) 826 functionDeclarationWriter.visit(functionDefinition); 827 } 828 stringBuilder.append(functionDeclarationWriter.toString()); 825 return functionMapping; 826 } 827 828 static void emitSharedMetalFunctions(StringBuilder& stringBuilder, Program& program, TypeNamer& typeNamer, const HashSet<AST::FunctionDeclaration*>& reachableFunctions, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping) 829 { 830 FunctionDeclarationWriter functionDeclarationWriter(stringBuilder, typeNamer, functionMapping); 831 for (auto& functionDefinition : program.functionDefinitions()) { 832 if (!functionDefinition->entryPointType() && reachableFunctions.contains(&functionDefinition)) 833 functionDeclarationWriter.visit(functionDefinition); 829 834 } 830 835 831 836 stringBuilder.append('\n'); 832 return { WTFMove(functionMapping), stringBuilder.toString() }; 833 } 834 835 class ReachableFunctionsGatherer : public Visitor { 837 } 838 839 class ReachableFunctionsGatherer final : public Visitor { 836 840 public: 837 841 void visit(AST::FunctionDeclaration& functionDeclaration) override … … 856 860 }; 857 861 858 RenderMetalFunction s metalFunctions(Program& program, TypeNamer& typeNamer, MatchedRenderSemantics&& matchedSemantics, Layout& layout)862 RenderMetalFunctionEntryPoints emitMetalFunctions(StringBuilder& stringBuilder, Program& program, TypeNamer& typeNamer, MatchedRenderSemantics&& matchedSemantics, Layout& layout) 859 863 { 860 864 auto& vertexShaderEntryPoint = *matchedSemantics.vertexShader; … … 866 870 auto reachableFunctions = reachableFunctionsGatherer.takeReachableFunctions(); 867 871 868 auto sharedMetalFunctions = Metal::sharedMetalFunctions(program, typeNamer, reachableFunctions); 869 870 StringBuilder stringBuilder; 871 stringBuilder.append(sharedMetalFunctions.metalFunctions); 872 873 RenderFunctionDefinitionWriter functionDefinitionWriter(program.intrinsics(), typeNamer, sharedMetalFunctions.functionMapping, WTFMove(matchedSemantics), layout); 872 auto functionMapping = generateMetalFunctionsMapping(program); 873 874 emitSharedMetalFunctions(stringBuilder, program, typeNamer, reachableFunctions, functionMapping); 875 876 RenderFunctionDefinitionWriter functionDefinitionWriter(stringBuilder, program.intrinsics(), typeNamer, functionMapping, WTFMove(matchedSemantics), layout); 874 877 for (auto& functionDefinition : program.functionDefinitions()) { 875 878 if (reachableFunctions.contains(&functionDefinition)) 876 879 functionDefinitionWriter.visit(functionDefinition); 877 880 } 878 stringBuilder.append(functionDefinitionWriter.toString()); 879 880 RenderMetalFunctions result; 881 result.metalSource = stringBuilder.toString(); 882 result.mangledVertexEntryPointName = sharedMetalFunctions.functionMapping.get(&vertexShaderEntryPoint); 883 result.mangledFragmentEntryPointName = sharedMetalFunctions.functionMapping.get(&fragmentShaderEntryPoint); 884 return result; 885 } 886 887 ComputeMetalFunctions metalFunctions(Program& program, TypeNamer& typeNamer, MatchedComputeSemantics&& matchedSemantics, Layout& layout) 881 882 return { functionMapping.get(&vertexShaderEntryPoint), functionMapping.get(&fragmentShaderEntryPoint) }; 883 } 884 885 ComputeMetalFunctionEntryPoints emitMetalFunctions(StringBuilder& stringBuilder, Program& program, TypeNamer& typeNamer, MatchedComputeSemantics&& matchedSemantics, Layout& layout) 888 886 { 889 887 auto& entryPoint = *matchedSemantics.shader; … … 893 891 auto reachableFunctions = reachableFunctionsGatherer.takeReachableFunctions(); 894 892 895 auto sharedMetalFunctions = Metal::sharedMetalFunctions(program, typeNamer, reachableFunctions); 896 897 StringBuilder stringBuilder; 898 stringBuilder.append(sharedMetalFunctions.metalFunctions); 899 900 ComputeFunctionDefinitionWriter functionDefinitionWriter(program.intrinsics(), typeNamer, sharedMetalFunctions.functionMapping, WTFMove(matchedSemantics), layout); 893 auto functionMapping = generateMetalFunctionsMapping(program); 894 emitSharedMetalFunctions(stringBuilder, program, typeNamer, reachableFunctions, functionMapping); 895 896 ComputeFunctionDefinitionWriter functionDefinitionWriter(stringBuilder, program.intrinsics(), typeNamer, functionMapping, WTFMove(matchedSemantics), layout); 901 897 for (auto& functionDefinition : program.functionDefinitions()) { 902 898 if (reachableFunctions.contains(&functionDefinition)) 903 899 functionDefinitionWriter.visit(functionDefinition); 904 900 } 905 stringBuilder.append(functionDefinitionWriter.toString()); 906 907 ComputeMetalFunctions result; 908 result.metalSource = stringBuilder.toString(); 909 result.mangledEntryPointName = sharedMetalFunctions.functionMapping.get(&entryPoint); 910 return result; 901 902 return { functionMapping.get(&entryPoint) }; 911 903 } 912 904 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h
r248266 r248307 41 41 class TypeNamer; 42 42 43 struct RenderMetalFunctions { 44 String metalSource; 43 struct RenderMetalFunctionEntryPoints { 45 44 MangledFunctionName mangledVertexEntryPointName; 46 45 MangledFunctionName mangledFragmentEntryPointName; 47 46 }; 48 RenderMetalFunction s metalFunctions(Program&, TypeNamer&, MatchedRenderSemantics&&, Layout&);47 RenderMetalFunctionEntryPoints emitMetalFunctions(StringBuilder&, Program&, TypeNamer&, MatchedRenderSemantics&&, Layout&); 49 48 50 struct ComputeMetalFunctions { 51 String metalSource; 49 struct ComputeMetalFunctionEntryPoints { 52 50 MangledFunctionName mangledEntryPointName; 53 51 }; 54 ComputeMetalFunction s metalFunctions(Program&, TypeNamer&, MatchedComputeSemantics&&, Layout&);52 ComputeMetalFunctionEntryPoints emitMetalFunctions(StringBuilder&, Program&, TypeNamer&, MatchedComputeSemantics&&, Layout&); 55 53 56 54 } -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp
r247917 r248307 42 42 static constexpr bool dumpMetalCode = false; 43 43 44 static String generateMetalCodeShared(String&& metalTypes, String&& metalFunctions)44 static StringView metalCodeProlog() 45 45 { 46 auto generatedMetalCode = makeString(46 return StringView { 47 47 "#include <metal_stdlib>\n" 48 48 "#include <metal_atomic>\n" … … 53 53 "\n" 54 54 "using namespace metal;\n" 55 "\n", 55 "\n" 56 }; 57 } 56 58 57 WTFMove(metalTypes), 58 WTFMove(metalFunctions) 59 ); 60 59 static void dumpMetalCodeIfNeeded(StringBuilder& stringBuilder) 60 { 61 61 if (dumpMetalCode) { 62 62 dataLogLn("Generated Metal code: "); 63 dataLogLn( generatedMetalCode);63 dataLogLn(stringBuilder.toString()); 64 64 } 65 66 return generatedMetalCode;67 65 } 68 66 69 67 RenderMetalCode generateMetalCode(Program& program, MatchedRenderSemantics&& matchedSemantics, Layout& layout) 70 68 { 69 StringBuilder stringBuilder; 70 stringBuilder.append(metalCodeProlog()); 71 71 72 TypeNamer typeNamer(program); 72 auto metalTypes = typeNamer.metalTypes(); 73 auto metalFunctions = Metal::metalFunctions(program, typeNamer, WTFMove(matchedSemantics), layout); 74 auto metalCode = generateMetalCodeShared(WTFMove(metalTypes), WTFMove(metalFunctions.metalSource)); 75 return { WTFMove(metalCode), WTFMove(metalFunctions.mangledVertexEntryPointName), WTFMove(metalFunctions.mangledFragmentEntryPointName) }; 73 typeNamer.emitMetalTypes(stringBuilder); 74 75 auto metalFunctionEntryPoints = Metal::emitMetalFunctions(stringBuilder, program, typeNamer, WTFMove(matchedSemantics), layout); 76 77 dumpMetalCodeIfNeeded(stringBuilder); 78 79 return { WTFMove(stringBuilder), WTFMove(metalFunctionEntryPoints.mangledVertexEntryPointName), WTFMove(metalFunctionEntryPoints.mangledFragmentEntryPointName) }; 76 80 } 77 81 78 82 ComputeMetalCode generateMetalCode(Program& program, MatchedComputeSemantics&& matchedSemantics, Layout& layout) 79 83 { 84 StringBuilder stringBuilder; 85 stringBuilder.append(metalCodeProlog()); 86 80 87 TypeNamer typeNamer(program); 81 auto metalTypes = typeNamer.metalTypes(); 82 auto metalFunctions = Metal::metalFunctions(program, typeNamer, WTFMove(matchedSemantics), layout); 83 auto metalCode = generateMetalCodeShared(WTFMove(metalTypes), WTFMove(metalFunctions.metalSource)); 84 return { WTFMove(metalCode), WTFMove(metalFunctions.mangledEntryPointName) }; 88 typeNamer.emitMetalTypes(stringBuilder); 89 90 auto metalFunctionEntryPoints = Metal::emitMetalFunctions(stringBuilder, program, typeNamer, WTFMove(matchedSemantics), layout); 91 92 dumpMetalCodeIfNeeded(stringBuilder); 93 94 return { WTFMove(stringBuilder), WTFMove(metalFunctionEntryPoints.mangledEntryPointName) }; 85 95 } 86 96 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h
r248266 r248307 31 31 #include "WHLSLPipelineDescriptor.h" 32 32 #include "WHLSLSemanticMatcher.h" 33 #include <wtf/Variant.h> 34 #include <wtf/text/WTFString.h> 33 #include <wtf/text/StringBuilder.h> 35 34 36 35 namespace WebCore { … … 43 42 44 43 struct RenderMetalCode { 45 String metalSource;44 StringBuilder metalSource; 46 45 MangledFunctionName mangledVertexEntryPointName; 47 46 MangledFunctionName mangledFragmentEntryPointName; … … 51 50 52 51 struct ComputeMetalCode { 53 String metalSource;52 StringBuilder metalSource; 54 53 MangledFunctionName mangledEntryPointName; 55 54 }; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp
r248266 r248307 352 352 } 353 353 354 class MetalTypeDeclarationWriter : public Visitor {354 class MetalTypeDeclarationWriter final : public Visitor { 355 355 WTF_MAKE_FAST_ALLOCATED; 356 356 public: 357 MetalTypeDeclarationWriter( std::function<MangledOrNativeTypeName(AST::NamedType&)>&& mangledNameForNamedType)357 MetalTypeDeclarationWriter(StringBuilder& stringBuilder, std::function<MangledOrNativeTypeName(AST::NamedType&)>&& mangledNameForNamedType) 358 358 : m_mangledNameForNamedType(WTFMove(mangledNameForNamedType)) 359 { 360 } 361 362 String toString() { return m_stringBuilder.toString(); } 359 , m_stringBuilder(stringBuilder) 360 { 361 } 363 362 364 363 private: 365 void visit(AST::StructureDefinition& structureDefinition) 364 void visit(AST::StructureDefinition& structureDefinition) override 366 365 { 367 366 m_stringBuilder.flexibleAppend("struct ", m_mangledNameForNamedType(structureDefinition), ";\n"); … … 369 368 370 369 std::function<MangledOrNativeTypeName(AST::NamedType&)> m_mangledNameForNamedType; 371 StringBuilder m_stringBuilder;370 StringBuilder& m_stringBuilder; 372 371 }; 373 372 374 String TypeNamer::metalTypeDeclarations()375 { 376 MetalTypeDeclarationWriter metalTypeDeclarationWriter( [&](AST::NamedType& namedType) -> MangledOrNativeTypeName {373 void TypeNamer::emitMetalTypeDeclarations(StringBuilder& stringBuilder) 374 { 375 MetalTypeDeclarationWriter metalTypeDeclarationWriter(stringBuilder, [&](AST::NamedType& namedType) -> MangledOrNativeTypeName { 377 376 return mangledNameForType(namedType); 378 377 }); 379 378 metalTypeDeclarationWriter.Visitor::visit(m_program); 380 return metalTypeDeclarationWriter.toString(); 381 } 382 383 void TypeNamer::emitUnnamedTypeDefinition(BaseTypeNameNode& baseTypeNameNode, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder& stringBuilder) 379 } 380 381 void TypeNamer::emitUnnamedTypeDefinition(StringBuilder& stringBuilder, BaseTypeNameNode& baseTypeNameNode, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes) 384 382 { 385 383 if (emittedUnnamedTypes.contains(&baseTypeNameNode)) 386 384 return; 387 385 if (baseTypeNameNode.parent()) 388 emitUnnamedTypeDefinition( *baseTypeNameNode.parent(), emittedNamedTypes, emittedUnnamedTypes, stringBuilder);386 emitUnnamedTypeDefinition(stringBuilder, *baseTypeNameNode.parent(), emittedNamedTypes, emittedUnnamedTypes); 389 387 if (is<ReferenceTypeNameNode>(baseTypeNameNode)) { 390 388 auto& namedType = downcast<ReferenceTypeNameNode>(baseTypeNameNode).namedType(); 391 emitNamedTypeDefinition( namedType, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);389 emitNamedTypeDefinition(stringBuilder, namedType, emittedNamedTypes, emittedUnnamedTypes); 392 390 stringBuilder.flexibleAppend("typedef ", mangledNameForType(namedType), ' ', baseTypeNameNode.mangledName(), ";\n"); 393 391 } else if (is<PointerTypeNameNode>(baseTypeNameNode)) { … … 412 410 } 413 411 414 void TypeNamer::emitNamedTypeDefinition( AST::NamedType& namedType, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder& stringBuilder)412 void TypeNamer::emitNamedTypeDefinition(StringBuilder& stringBuilder, AST::NamedType& namedType, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes) 415 413 { 416 414 if (emittedNamedTypes.contains(&namedType)) … … 419 417 ASSERT(iterator != m_dependencyGraph.end()); 420 418 for (auto& baseTypeNameNode : iterator->value) 421 emitUnnamedTypeDefinition( baseTypeNameNode, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);419 emitUnnamedTypeDefinition(stringBuilder, baseTypeNameNode, emittedNamedTypes, emittedUnnamedTypes); 422 420 if (is<AST::EnumerationDefinition>(namedType)) { 423 421 auto& enumerationDefinition = downcast<AST::EnumerationDefinition>(namedType); … … 442 440 } 443 441 444 void TypeNamer::emitAllUnnamedTypeDefinitions( Vector<UniqueRef<BaseTypeNameNode>>& nodes, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder& stringBuilder)442 void TypeNamer::emitAllUnnamedTypeDefinitions(StringBuilder& stringBuilder, Vector<UniqueRef<BaseTypeNameNode>>& nodes, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes) 445 443 { 446 444 for (auto& node : nodes) { 447 emitUnnamedTypeDefinition( node, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);448 emitAllUnnamedTypeDefinitions( node->children(), emittedNamedTypes, emittedUnnamedTypes, stringBuilder);449 } 450 } 451 452 String TypeNamer::metalTypeDefinitions()445 emitUnnamedTypeDefinition(stringBuilder, node, emittedNamedTypes, emittedUnnamedTypes); 446 emitAllUnnamedTypeDefinitions(stringBuilder, node->children(), emittedNamedTypes, emittedUnnamedTypes); 447 } 448 } 449 450 void TypeNamer::emitMetalTypeDefinitions(StringBuilder& stringBuilder) 453 451 { 454 452 HashSet<AST::NamedType*> emittedNamedTypes; 455 453 HashSet<BaseTypeNameNode*> emittedUnnamedTypes; 456 StringBuilder stringBuilder;457 454 for (auto& keyValuePair : m_dependencyGraph) 458 emitNamedTypeDefinition(*keyValuePair.key, emittedNamedTypes, emittedUnnamedTypes, stringBuilder); 459 emitAllUnnamedTypeDefinitions(m_trie, emittedNamedTypes, emittedUnnamedTypes, stringBuilder); 460 return stringBuilder.toString(); 455 emitNamedTypeDefinition(stringBuilder, *keyValuePair.key, emittedNamedTypes, emittedUnnamedTypes); 456 emitAllUnnamedTypeDefinitions(stringBuilder, m_trie, emittedNamedTypes, emittedUnnamedTypes); 461 457 } 462 458 … … 490 486 } 491 487 492 String TypeNamer::metalTypes()488 void TypeNamer::emitMetalTypes(StringBuilder& stringBuilder) 493 489 { 494 490 Visitor::visit(m_program); 495 return makeString(metalTypeDeclarations(), '\n', metalTypeDefinitions()); 491 492 emitMetalTypeDeclarations(stringBuilder); 493 stringBuilder.append('\n'); 494 emitMetalTypeDefinitions(stringBuilder); 496 495 } 497 496 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h
r248266 r248307 60 60 virtual ~TypeNamer(); 61 61 62 String metalTypes();62 void emitMetalTypes(StringBuilder&); 63 63 64 64 // Must be called after calling metalTypes(). … … 83 83 MangledEnumerationMemberName generateNextEnumerationMemberName() { return { m_enumerationMemberCount++ }; } 84 84 85 void emitNamedTypeDefinition( AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);86 void emitUnnamedTypeDefinition( BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);87 void emitAllUnnamedTypeDefinitions( Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);88 String metalTypeDeclarations();89 String metalTypeDefinitions();85 void emitNamedTypeDefinition(StringBuilder&, AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes); 86 void emitUnnamedTypeDefinition(StringBuilder&, BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes); 87 void emitAllUnnamedTypeDefinitions(StringBuilder&, Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes); 88 void emitMetalTypeDeclarations(StringBuilder&); 89 void emitMetalTypeDefinitions(StringBuilder&); 90 90 91 91 UniqueRef<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent); -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.cpp
r248303 r248307 696 696 CONSUME_TYPE(spaceToken, Identifier); 697 697 auto spaceTokenStringView = spaceToken->stringView(m_lexer); 698 auto prefix = "space"_str;699 if (!spaceTokenStringView.startsWith( StringView(prefix)))698 StringView prefix { "space" }; 699 if (!spaceTokenStringView.startsWith(prefix)) 700 700 return Unexpected<Error>(Error(makeString("Second argument to resource semantic ", spaceTokenStringView, " needs be of the form 'space0'"))); 701 701 if (spaceTokenStringView.length() <= prefix.length()) -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h
r248277 r248307 31 31 #include "WHLSLMangledNames.h" 32 32 #include "WHLSLPipelineDescriptor.h" 33 #include <wtf/text/StringBuilder.h> 33 34 #include <wtf/text/WTFString.h> 34 35 … … 40 41 41 42 struct RenderPrepareResult { 42 String metalSource;43 StringBuilder metalSource; 43 44 Metal::MangledFunctionName mangledVertexEntryPointName; 44 45 Metal::MangledFunctionName mangledFragmentEntryPointName; … … 53 54 54 55 struct ComputePrepareResult { 55 String metalSource;56 StringBuilder metalSource; 56 57 Metal::MangledFunctionName mangledEntryPointName; 57 58 ComputeDimensions computeDimensions; -
trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm
r248277 r248307 91 91 if (WHLSL::dumpMetalCompileTimes) 92 92 startTime = MonotonicTime::now(); 93 computeLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource options:nil error:&error]); 93 // FIXME: https://webkit.org/b/200474 Add direct StringBuilder -> NSString conversion to avoid extra copy into a WTF::String 94 computeLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource.toString() options:nil error:&error]); 94 95 if (WHLSL::dumpMetalCompileTimes) 95 96 dataLogLn("Metal compile times: ", (MonotonicTime::now() - startTime).milliseconds(), " ms"); -
trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm
r248277 r248307 403 403 if (WHLSL::dumpMetalCompileTimes) 404 404 startTime = MonotonicTime::now(); 405 vertexLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource options:nil error:&error]); 405 // FIXME: https://webkit.org/b/200474 Add direct StringBuilder -> NSString conversion to avoid extra copy into a WTF::String 406 vertexLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource.toString() options:nil error:&error]); 406 407 if (WHLSL::dumpMetalCompileTimes) 407 408 dataLogLn("Metal compile times: ", (MonotonicTime::now() - startTime).milliseconds(), " ms");
Note:
See TracChangeset
for help on using the changeset viewer.