Title: [248307] trunk/Source/WebCore
Revision
248307
Author
wei...@apple.com
Date
2019-08-06 12:04:00 -0700 (Tue, 06 Aug 2019)

Log Message

WHLSL Metal code generation unnecessarily does string copies by passing partial results as Strings
https://bugs.webkit.org/show_bug.cgi?id=200471

Reviewed by Saam Barati.

Avoid string copies by passing a single StringBuilder all the way through Metal code
generation and only converting to a String when passing the constructed shader to Metal
API.
        
Where possible, use StringView in lieu of String for temporary strings being passed to
the StringBuilder to avoid the allocation overhead of StringImpl. 

* Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h:
(WebCore::WHLSL::AST::toString):
Switch to StringView.

* Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h:
(WebCore::WHLSL::AST::BuiltInSemantic::toString const):
Switch to StringView.

* Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h:
(WebCore::WHLSL::AST::toString):
Switch to StringView.

* Modules/webgpu/WHLSL/AST/WHLSLPointerType.h:
Remove unnecessary "private:".
    
* Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h:
(WebCore::WHLSL::AST::ResourceSemantic::toString):
Switch to StringView.

* Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp:
(WebCore::WHLSL::Metal::EntryPointScaffolding::emitResourceHelperTypes):
(WebCore::WHLSL::Metal::EntryPointScaffolding::emitResourceSignature):
(WebCore::WHLSL::Metal::EntryPointScaffolding::emitBuiltInsSignature):
(WebCore::WHLSL::Metal::EntryPointScaffolding::emitMangledInputPath):
(WebCore::WHLSL::Metal::EntryPointScaffolding::emitMangledOutputPath):
(WebCore::WHLSL::Metal::EntryPointScaffolding::emitUnpackResourcesAndNamedBuiltIns):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitHelperTypes):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitSignature):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitUnpack):
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitPack):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitHelperTypes):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitSignature):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitUnpack):
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitPack):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitHelperTypes):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitSignature):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitUnpack):
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitPack):
(WebCore::WHLSL::Metal::EntryPointScaffolding::resourceHelperTypes): Deleted.
(WebCore::WHLSL::Metal::EntryPointScaffolding::resourceSignature): Deleted.
(WebCore::WHLSL::Metal::EntryPointScaffolding::builtInsSignature): Deleted.
(WebCore::WHLSL::Metal::EntryPointScaffolding::mangledInputPath): Deleted.
(WebCore::WHLSL::Metal::EntryPointScaffolding::mangledOutputPath): Deleted.
(WebCore::WHLSL::Metal::EntryPointScaffolding::unpackResourcesAndNamedBuiltIns): Deleted.
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::helperTypes): Deleted.
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::signature): Deleted.
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::unpack): Deleted.
(WebCore::WHLSL::Metal::VertexEntryPointScaffolding::pack): Deleted.
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::helperTypes): Deleted.
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::signature): Deleted.
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::unpack): Deleted.
(WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::pack): Deleted.
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::helperTypes): Deleted.
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::signature): Deleted.
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::unpack): Deleted.
(WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::pack): Deleted.
* Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h:
Rather than have scaffolding return strings, pass in StringBuilders everywhere. 

* Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp:
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::FunctionDefinitionWriter):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit):
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::emitConstantExpressionString):
(WebCore::WHLSL::Metal::generateMetalFunctionsMapping):
(WebCore::WHLSL::Metal::emitSharedMetalFunctions):
(WebCore::WHLSL::Metal::emitMetalFunctions):
(WebCore::WHLSL::Metal::FunctionDeclarationWriter::FunctionDeclarationWriter): Deleted.
(WebCore::WHLSL::Metal::FunctionDeclarationWriter::toString): Deleted.
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::toString): Deleted.
(WebCore::WHLSL::Metal::FunctionDefinitionWriter::constantExpressionString): Deleted.
(WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::RenderFunctionDefinitionWriter): Deleted.
(WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::ComputeFunctionDefinitionWriter): Deleted.
(WebCore::WHLSL::Metal::sharedMetalFunctions): Deleted.
(WebCore::WHLSL::Metal::metalFunctions): Deleted.
* Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h:
Rather than returning Strings from function generation functions, pass in StringBuilders everywhere.

* Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp:
(WebCore::WHLSL::Metal::metalCodeProlog):
(WebCore::WHLSL::Metal::dumpMetalCodeIfNeeded):
(WebCore::WHLSL::Metal::generateMetalCode):
(WebCore::WHLSL::Metal::generateMetalCodeShared): Deleted.
* Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h:
Switch RenderMetalCode and ComputeMetalCode to contain StringBuilders to allow
delaying conversion to String to the latest point possible.
        
* Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp:
(WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDeclarations):
(WebCore::WHLSL::Metal::TypeNamer::emitUnnamedTypeDefinition):
(WebCore::WHLSL::Metal::TypeNamer::emitNamedTypeDefinition):
(WebCore::WHLSL::Metal::TypeNamer::emitAllUnnamedTypeDefinitions):
(WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDefinitions):
(WebCore::WHLSL::Metal::TypeNamer::emitMetalTypes):
(WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::MetalTypeDeclarationWriter): Deleted.
(WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::toString): Deleted.
(WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::visit): Deleted.
(WebCore::WHLSL::Metal::TypeNamer::metalTypeDeclarations): Deleted.
(WebCore::WHLSL::Metal::TypeNamer::metalTypeDefinitions): Deleted.
(WebCore::WHLSL::Metal::TypeNamer::metalTypes): Deleted.
* Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h:
Rather than returning Strings from function generation functions, pass in StringBuilders everywhere.

* Modules/webgpu/WHLSL/WHLSLParser.cpp:
(WebCore::WHLSL::Parser::parseResourceSemantic):
Remove use of _str, which allocates a String, and just use a StringView directly.

* Modules/webgpu/WHLSL/WHLSLPrepare.h:
Switch RenderPrepareResult and ComputePrepareResult to contain StringBuilders to allow
delaying conversion to String to the latest point possible.

* platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm:
(WebCore::trySetFunctions):
* platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm:
(WebCore::trySetFunctions):
Convert StringBuilders to String at the last moment necessary. Adds a FIXME to improve
in the future by adding direct conversion from StringBuilder to NSString to avoid another
copy.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (248306 => 248307)


--- trunk/Source/WebCore/ChangeLog	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/ChangeLog	2019-08-06 19:04:00 UTC (rev 248307)
@@ -1,3 +1,135 @@
+2019-08-06  Sam Weinig  <wei...@apple.com>
+
+        WHLSL Metal code generation unnecessarily does string copies by passing partial results as Strings
+        https://bugs.webkit.org/show_bug.cgi?id=200471
+
+        Reviewed by Saam Barati.
+
+        Avoid string copies by passing a single StringBuilder all the way through Metal code
+        generation and only converting to a String when passing the constructed shader to Metal
+        API.
+        
+        Where possible, use StringView in lieu of String for temporary strings being passed to
+        the StringBuilder to avoid the allocation overhead of StringImpl. 
+
+        * Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h:
+        (WebCore::WHLSL::AST::toString):
+        Switch to StringView.
+
+        * Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h:
+        (WebCore::WHLSL::AST::BuiltInSemantic::toString const):
+        Switch to StringView.
+
+        * Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h:
+        (WebCore::WHLSL::AST::toString):
+        Switch to StringView.
+
+        * Modules/webgpu/WHLSL/AST/WHLSLPointerType.h:
+        Remove unnecessary "private:".
+    
+        * Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h:
+        (WebCore::WHLSL::AST::ResourceSemantic::toString):
+        Switch to StringView.
+
+        * Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp:
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::emitResourceHelperTypes):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::emitResourceSignature):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::emitBuiltInsSignature):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::emitMangledInputPath):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::emitMangledOutputPath):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::emitUnpackResourcesAndNamedBuiltIns):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitHelperTypes):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitSignature):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitUnpack):
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::emitPack):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitHelperTypes):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitSignature):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitUnpack):
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::emitPack):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitHelperTypes):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitSignature):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitUnpack):
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::emitPack):
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::resourceHelperTypes): Deleted.
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::resourceSignature): Deleted.
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::builtInsSignature): Deleted.
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::mangledInputPath): Deleted.
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::mangledOutputPath): Deleted.
+        (WebCore::WHLSL::Metal::EntryPointScaffolding::unpackResourcesAndNamedBuiltIns): Deleted.
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::helperTypes): Deleted.
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::signature): Deleted.
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::unpack): Deleted.
+        (WebCore::WHLSL::Metal::VertexEntryPointScaffolding::pack): Deleted.
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::helperTypes): Deleted.
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::signature): Deleted.
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::unpack): Deleted.
+        (WebCore::WHLSL::Metal::FragmentEntryPointScaffolding::pack): Deleted.
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::helperTypes): Deleted.
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::signature): Deleted.
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::unpack): Deleted.
+        (WebCore::WHLSL::Metal::ComputeEntryPointScaffolding::pack): Deleted.
+        * Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h:
+        Rather than have scaffolding return strings, pass in StringBuilders everywhere. 
+
+        * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp:
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::FunctionDefinitionWriter):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit):
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::emitConstantExpressionString):
+        (WebCore::WHLSL::Metal::generateMetalFunctionsMapping):
+        (WebCore::WHLSL::Metal::emitSharedMetalFunctions):
+        (WebCore::WHLSL::Metal::emitMetalFunctions):
+        (WebCore::WHLSL::Metal::FunctionDeclarationWriter::FunctionDeclarationWriter): Deleted.
+        (WebCore::WHLSL::Metal::FunctionDeclarationWriter::toString): Deleted.
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::toString): Deleted.
+        (WebCore::WHLSL::Metal::FunctionDefinitionWriter::constantExpressionString): Deleted.
+        (WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::RenderFunctionDefinitionWriter): Deleted.
+        (WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::ComputeFunctionDefinitionWriter): Deleted.
+        (WebCore::WHLSL::Metal::sharedMetalFunctions): Deleted.
+        (WebCore::WHLSL::Metal::metalFunctions): Deleted.
+        * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h:
+        Rather than returning Strings from function generation functions, pass in StringBuilders everywhere.
+
+        * Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp:
+        (WebCore::WHLSL::Metal::metalCodeProlog):
+        (WebCore::WHLSL::Metal::dumpMetalCodeIfNeeded):
+        (WebCore::WHLSL::Metal::generateMetalCode):
+        (WebCore::WHLSL::Metal::generateMetalCodeShared): Deleted.
+        * Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h:
+        Switch RenderMetalCode and ComputeMetalCode to contain StringBuilders to allow
+        delaying conversion to String to the latest point possible.
+        
+        * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp:
+        (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDeclarations):
+        (WebCore::WHLSL::Metal::TypeNamer::emitUnnamedTypeDefinition):
+        (WebCore::WHLSL::Metal::TypeNamer::emitNamedTypeDefinition):
+        (WebCore::WHLSL::Metal::TypeNamer::emitAllUnnamedTypeDefinitions):
+        (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypeDefinitions):
+        (WebCore::WHLSL::Metal::TypeNamer::emitMetalTypes):
+        (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::MetalTypeDeclarationWriter): Deleted.
+        (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::toString): Deleted.
+        (WebCore::WHLSL::Metal::MetalTypeDeclarationWriter::visit): Deleted.
+        (WebCore::WHLSL::Metal::TypeNamer::metalTypeDeclarations): Deleted.
+        (WebCore::WHLSL::Metal::TypeNamer::metalTypeDefinitions): Deleted.
+        (WebCore::WHLSL::Metal::TypeNamer::metalTypes): Deleted.
+        * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h:
+        Rather than returning Strings from function generation functions, pass in StringBuilders everywhere.
+
+        * Modules/webgpu/WHLSL/WHLSLParser.cpp:
+        (WebCore::WHLSL::Parser::parseResourceSemantic):
+        Remove use of _str, which allocates a String, and just use a StringView directly.
+
+        * Modules/webgpu/WHLSL/WHLSLPrepare.h:
+        Switch RenderPrepareResult and ComputePrepareResult to contain StringBuilders to allow
+        delaying conversion to String to the latest point possible.
+
+        * platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm:
+        (WebCore::trySetFunctions):
+        * platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm:
+        (WebCore::trySetFunctions):
+        Convert StringBuilders to String at the last moment necessary. Adds a FIXME to improve
+        in the future by adding direct conversion from StringBuilder to NSString to avoid another
+        copy.
+
 2019-08-06  Saam Barati  <sbar...@apple.com>
 
         [WHLSL] Reduce the number of variables that make it into the global struct by skipping stdlib functions and internal uses of MakePointerExpression/MakeArrayReference

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLAddressSpace.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -44,18 +44,18 @@
     Thread
 };
 
-ALWAYS_INLINE String toString(AddressSpace addressSpace)
+ALWAYS_INLINE StringView toString(AddressSpace addressSpace)
 {
     switch (addressSpace) {
     case AddressSpace::Constant:
-        return "constant"_str;
+        return "constant";
     case AddressSpace::Device:
-        return "device"_str;
+        return "device";
     case AddressSpace::Threadgroup:
-        return "threadgroup"_str;
+        return "threadgroup";
     default:
         ASSERT(addressSpace == AddressSpace::Thread);
-        return "thread"_str;
+        return "thread";
     }
 }
 

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLBuiltInSemantic.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -83,7 +83,7 @@
         return !(*this == other);
     }
 
-    String toString() const
+    StringView toString() const
     {
         switch (m_variable) {
         case Variable::SVInstanceID:

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLEntryPointType.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -41,7 +41,7 @@
     Compute,
 };
 
-ALWAYS_INLINE String toString(EntryPointType type)
+ALWAYS_INLINE StringView toString(EntryPointType type)
 {
     switch (type) {
     case EntryPointType::Vertex:

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLPointerType.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLPointerType.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLPointerType.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -49,8 +49,8 @@
         : Base(location, addressSpace, WTFMove(elementType))
     {
     }
+
 public:
-
     static Ref<PointerType> create(CodeLocation location, AddressSpace addressSpace, Ref<UnnamedType> elementType)
     {
         return adoptRef(*new PointerType(location, addressSpace, WTFMove(elementType)));
@@ -78,8 +78,6 @@
     {
         return makeString(elementType().toString(), '*');
     }
-
-private:
 };
 
 } // namespace AST

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLResourceSemantic.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -60,7 +60,7 @@
     ResourceSemantic(const ResourceSemantic&) = delete;
     ResourceSemantic(ResourceSemantic&&) = default;
 
-    String toString()
+    StringView toString()
     {
         switch (m_mode) {
         case Mode::UnorderedAccessView:

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.cpp	2019-08-06 19:04:00 UTC (rev 248307)
@@ -139,9 +139,8 @@
         m_parameterVariables.uncheckedAppend(m_generateNextVariableName());
 }
 
-String EntryPointScaffolding::resourceHelperTypes()
+void EntryPointScaffolding::emitResourceHelperTypes(StringBuilder& stringBuilder)
 {
-    StringBuilder stringBuilder;
     for (size_t i = 0; i < m_layout.size(); ++i) {
         stringBuilder.flexibleAppend("struct ", m_namedBindGroups[i].structName, " {\n");
         Vector<std::pair<unsigned, String>> structItems;
@@ -174,15 +173,16 @@
             stringBuilder.flexibleAppend("    ", structItem.second, '\n');
         stringBuilder.append("};\n\n");
     }
-    return stringBuilder.toString();
 }
 
-Optional<String> EntryPointScaffolding::resourceSignature()
+bool EntryPointScaffolding::emitResourceSignature(StringBuilder& stringBuilder, IncludePrecedingComma includePrecedingComma)
 {
     if (!m_layout.size())
-        return WTF::nullopt;
+        return false;
 
-    StringBuilder stringBuilder;
+    if (includePrecedingComma == IncludePrecedingComma::Yes)
+        stringBuilder.append(", ");
+
     for (size_t i = 0; i < m_layout.size(); ++i) {
         if (i)
             stringBuilder.append(", ");
@@ -189,7 +189,7 @@
         auto& namedBindGroup = m_namedBindGroups[i];
         stringBuilder.flexibleAppend("device ", namedBindGroup.structName, "& ", namedBindGroup.variableName, " [[buffer(", namedBindGroup.argumentBufferIndex, ")]]");
     }
-    return stringBuilder.toString();
+    return true;
 }
 
 static StringView internalTypeForSemantic(const AST::BuiltInSemantic& builtInSemantic)
@@ -227,12 +227,14 @@
     }
 }
 
-Optional<String> EntryPointScaffolding::builtInsSignature()
+bool EntryPointScaffolding::emitBuiltInsSignature(StringBuilder& stringBuilder, IncludePrecedingComma includePrecedingComma)
 {
     if (!m_namedBuiltIns.size())
-        return WTF::nullopt;
+        return false;
 
-    StringBuilder stringBuilder;
+    if (includePrecedingComma == IncludePrecedingComma::Yes)
+        stringBuilder.append(", ");
+
     for (size_t i = 0; i < m_namedBuiltIns.size(); ++i) {
         if (i)
             stringBuilder.append(", ");
@@ -246,13 +248,12 @@
             stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*item.unnamedType));
         stringBuilder.flexibleAppend(' ', namedBuiltIn.variableName, ' ', attributeForSemantic(builtInSemantic));
     }
-    return stringBuilder.toString();
+    return true;
 }
 
-String EntryPointScaffolding::mangledInputPath(Vector<String>& path)
+void EntryPointScaffolding::emitMangledInputPath(StringBuilder& stringBuilder, Vector<String>& path)
 {
     ASSERT(!path.isEmpty());
-    StringBuilder stringBuilder;
     bool found = false;
     AST::StructureDefinition* structureDefinition = nullptr;
     for (size_t i = 0; i < m_functionDefinition.parameters().size(); ++i) {
@@ -282,14 +283,10 @@
                 structureDefinition = &downcast<AST::StructureDefinition>(namedType);
         }
     }
-
-    return stringBuilder.toString();
 }
 
-String EntryPointScaffolding::mangledOutputPath(Vector<String>& path)
+void EntryPointScaffolding::emitMangledOutputPath(StringBuilder& stringBuilder, Vector<String>& path)
 {
-    StringBuilder stringBuilder;
-
     AST::StructureDefinition* structureDefinition = nullptr;
     auto& unifyNode = m_functionDefinition.type().unifyNode();
     structureDefinition = &downcast<AST::StructureDefinition>(downcast<AST::NamedType>(unifyNode));
@@ -306,13 +303,10 @@
                 structureDefinition = &downcast<AST::StructureDefinition>(namedType);
         }
     }
-
-    return stringBuilder.toString();
 }
 
-String EntryPointScaffolding::unpackResourcesAndNamedBuiltIns()
+void EntryPointScaffolding::emitUnpackResourcesAndNamedBuiltIns(StringBuilder& stringBuilder)
 {
-    StringBuilder stringBuilder;
     for (size_t i = 0; i < m_functionDefinition.parameters().size(); ++i)
         stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*m_functionDefinition.parameters()[i]->type()), ' ', m_parameterVariables[i], ";\n");
 
@@ -336,13 +330,19 @@
                     lengthTemporaryName, " = ", lengthTemporaryName, " << 32;\n",
                     lengthTemporaryName, " = ", lengthTemporaryName, " | ", variableName, '.', lengthElementName, ".x;\n",
                     lengthTemporaryName, " = ", lengthTemporaryName, " / sizeof(", mangledTypeName, ");\n",
-                    "if (", lengthTemporaryName, " > 0xFFFFFFFF) ", lengthTemporaryName, " = 0xFFFFFFFF;\n",
-                    mangledInputPath(path), " = { ", variableName, '.', elementName, ", static_cast<uint32_t>(", lengthTemporaryName, ") };\n"
+                    "if (", lengthTemporaryName, " > 0xFFFFFFFF) ", lengthTemporaryName, " = 0xFFFFFFFF;\n"
                 );
+                    
+                emitMangledInputPath(stringBuilder, path);
+                stringBuilder.flexibleAppend(
+                    " = { ", variableName, '.', elementName, ", static_cast<uint32_t>(", lengthTemporaryName, ") };\n"
+                );
             } else {
                 auto& path = m_entryPointItems.inputs[iterator->value].path;
                 auto elementName = m_namedBindGroups[i].namedBindings[j].elementName;
-                stringBuilder.flexibleAppend(mangledInputPath(path), " = ", variableName, '.', elementName, ";\n");
+                
+                emitMangledInputPath(stringBuilder, path);
+                stringBuilder.flexibleAppend(" = ", variableName, '.', elementName, ";\n");
             }
         }
     }
@@ -352,9 +352,10 @@
         auto& path = item.path;
         auto& variableName = namedBuiltIn.variableName;
         auto mangledTypeName = m_typeNamer.mangledNameForType(*item.unnamedType);
-        stringBuilder.flexibleAppend(mangledInputPath(path), " = ", mangledTypeName, '(', variableName, ");\n");
+
+        emitMangledInputPath(stringBuilder, path);
+        stringBuilder.flexibleAppend(" = ", mangledTypeName, '(', variableName, ");\n");
     }
-    return stringBuilder.toString();
 }
 
 VertexEntryPointScaffolding::VertexEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes)
@@ -389,10 +390,8 @@
     }
 }
 
-String VertexEntryPointScaffolding::helperTypes()
+void VertexEntryPointScaffolding::emitHelperTypes(StringBuilder& stringBuilder)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend("struct ", m_stageInStructName, " {\n");
     for (auto& namedStageIn : m_namedStageIns) {
         auto mangledTypeName = m_typeNamer.mangledNameForType(*m_entryPointItems.inputs[namedStageIn.indexInEntryPointItems].unnamedType);
@@ -411,60 +410,49 @@
         auto attribute = attributeForSemantic(*outputItem.semantic);
         stringBuilder.flexibleAppend("    ", internalTypeName, ' ', elementName, ' ', attribute, ";\n");
     }
-    stringBuilder.flexibleAppend(
-        "};\n\n",
-        resourceHelperTypes()
+    stringBuilder.append(
+        "};\n\n"
     );
-
-    return stringBuilder.toString();
+    
+    emitResourceHelperTypes(stringBuilder);
 }
 
-String VertexEntryPointScaffolding::signature(MangledFunctionName functionName)
+void VertexEntryPointScaffolding::emitSignature(StringBuilder& stringBuilder, MangledFunctionName functionName)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend("vertex ", m_returnStructName, ' ', functionName, '(', m_stageInStructName, ' ', m_stageInParameterName, " [[stage_in]]");
-    if (auto resourceSignature = this->resourceSignature())
-        stringBuilder.flexibleAppend(", ", *resourceSignature);
-    if (auto builtInsSignature = this->builtInsSignature())
-        stringBuilder.flexibleAppend(", ", *builtInsSignature);
+    emitResourceSignature(stringBuilder, IncludePrecedingComma::Yes);
+    emitBuiltInsSignature(stringBuilder, IncludePrecedingComma::Yes);
     stringBuilder.append(')');
-
-    return stringBuilder.toString();
 }
 
-String VertexEntryPointScaffolding::unpack()
+void VertexEntryPointScaffolding::emitUnpack(StringBuilder& stringBuilder)
 {
-    StringBuilder stringBuilder;
+    emitUnpackResourcesAndNamedBuiltIns(stringBuilder);
 
-    stringBuilder.append(unpackResourcesAndNamedBuiltIns());
-
     for (auto& namedStageIn : m_namedStageIns) {
         auto& path = m_entryPointItems.inputs[namedStageIn.indexInEntryPointItems].path;
         auto& elementName = namedStageIn.elementName;
-        stringBuilder.flexibleAppend(mangledInputPath(path), " = ", m_stageInParameterName, '.', elementName, ";\n");
+        emitMangledInputPath(stringBuilder, path);
+        stringBuilder.flexibleAppend(" = ", m_stageInParameterName, '.', elementName, ";\n");
     }
-
-    return stringBuilder.toString();
 }
 
-String VertexEntryPointScaffolding::pack(MangledVariableName inputVariableName, MangledVariableName outputVariableName)
+void VertexEntryPointScaffolding::emitPack(StringBuilder& stringBuilder, MangledVariableName inputVariableName, MangledVariableName outputVariableName)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend(m_returnStructName, ' ', outputVariableName, ";\n");
     if (m_entryPointItems.outputs.size() == 1 && !m_entryPointItems.outputs[0].path.size()) {
         auto& elementName = m_namedOutputs[0].elementName;
         stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", inputVariableName, ";\n");
-        return stringBuilder.toString();
+        return;
     }
     for (size_t i = 0; i < m_entryPointItems.outputs.size(); ++i) {
         auto& elementName = m_namedOutputs[i].elementName;
         auto& internalTypeName = m_namedOutputs[i].internalTypeName;
         auto& path = m_entryPointItems.outputs[i].path;
-        stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName, mangledOutputPath(path), ");\n");
+        stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName);
+        emitMangledOutputPath(stringBuilder, path);
+        stringBuilder.flexibleAppend(");\n");
     }
-    return stringBuilder.toString();
 }
 
 FragmentEntryPointScaffolding::FragmentEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>&)
@@ -501,10 +489,8 @@
     }
 }
 
-String FragmentEntryPointScaffolding::helperTypes()
+void FragmentEntryPointScaffolding::emitHelperTypes(StringBuilder& stringBuilder)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend("struct ", m_stageInStructName, " {\n");
     for (auto& namedStageIn : m_namedStageIns) {
         auto mangledTypeName = m_typeNamer.mangledNameForType(*m_entryPointItems.inputs[namedStageIn.indexInEntryPointItems].unnamedType);
@@ -523,60 +509,49 @@
         auto attribute = attributeForSemantic(*outputItem.semantic);
         stringBuilder.flexibleAppend("    ", internalTypeName, ' ', elementName, ' ', attribute, ";\n");
     }
-    stringBuilder.flexibleAppend(
-        "};\n\n",
-        resourceHelperTypes()
+    stringBuilder.append(
+        "};\n\n"
     );
 
-    return stringBuilder.toString();
+    emitResourceHelperTypes(stringBuilder);
 }
 
-String FragmentEntryPointScaffolding::signature(MangledFunctionName functionName)
+void FragmentEntryPointScaffolding::emitSignature(StringBuilder& stringBuilder, MangledFunctionName functionName)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend("fragment ", m_returnStructName, ' ', functionName, '(', m_stageInStructName, ' ', m_stageInParameterName, " [[stage_in]]");
-    if (auto resourceSignature = this->resourceSignature())
-        stringBuilder.flexibleAppend(", ", *resourceSignature);
-    if (auto builtInsSignature = this->builtInsSignature())
-        stringBuilder.flexibleAppend(", ", *builtInsSignature);
+    emitResourceSignature(stringBuilder, IncludePrecedingComma::Yes);
+    emitBuiltInsSignature(stringBuilder, IncludePrecedingComma::Yes);
     stringBuilder.append(')');
-
-    return stringBuilder.toString();
 }
 
-String FragmentEntryPointScaffolding::unpack()
+void FragmentEntryPointScaffolding::emitUnpack(StringBuilder& stringBuilder)
 {
-    StringBuilder stringBuilder;
+    emitUnpackResourcesAndNamedBuiltIns(stringBuilder);
 
-    stringBuilder.append(unpackResourcesAndNamedBuiltIns());
-
     for (auto& namedStageIn : m_namedStageIns) {
         auto& path = m_entryPointItems.inputs[namedStageIn.indexInEntryPointItems].path;
         auto& elementName = namedStageIn.elementName;
-        stringBuilder.flexibleAppend(mangledInputPath(path), " = ", m_stageInParameterName, '.', elementName, ";\n");
+        emitMangledInputPath(stringBuilder, path);
+        stringBuilder.flexibleAppend(" = ", m_stageInParameterName, '.', elementName, ";\n");
     }
-
-    return stringBuilder.toString();
 }
 
-String FragmentEntryPointScaffolding::pack(MangledVariableName inputVariableName, MangledVariableName outputVariableName)
+void FragmentEntryPointScaffolding::emitPack(StringBuilder& stringBuilder, MangledVariableName inputVariableName, MangledVariableName outputVariableName)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend(m_returnStructName, ' ', outputVariableName, ";\n");
     if (m_entryPointItems.outputs.size() == 1 && !m_entryPointItems.outputs[0].path.size()) {
         auto& elementName = m_namedOutputs[0].elementName;
         stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", inputVariableName, ";\n");
-        return stringBuilder.toString();
+        return;
     }
     for (size_t i = 0; i < m_entryPointItems.outputs.size(); ++i) {
         auto& elementName = m_namedOutputs[i].elementName;
         auto& internalTypeName = m_namedOutputs[i].internalTypeName;
         auto& path = m_entryPointItems.outputs[i].path;
-        stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName, mangledOutputPath(path), ");\n");
+        stringBuilder.flexibleAppend(outputVariableName, '.', elementName, " = ", internalTypeName, '(', inputVariableName);
+        emitMangledOutputPath(stringBuilder, path);
+        stringBuilder.flexibleAppend(");\n");
     }
-    return stringBuilder.toString();
 }
 
 ComputeEntryPointScaffolding::ComputeEntryPointScaffolding(AST::FunctionDefinition& functionDefinition, Intrinsics& intrinsics, TypeNamer& typeNamer, EntryPointItems& entryPointItems, HashMap<Binding*, size_t>& resourceMap, Layout& layout, std::function<MangledVariableName()>&& generateNextVariableName)
@@ -584,40 +559,27 @@
 {
 }
 
-String ComputeEntryPointScaffolding::helperTypes()
+void ComputeEntryPointScaffolding::emitHelperTypes(StringBuilder& stringBuilder)
 {
-    return resourceHelperTypes();
+    emitResourceHelperTypes(stringBuilder);
 }
 
-String ComputeEntryPointScaffolding::signature(MangledFunctionName functionName)
+void ComputeEntryPointScaffolding::emitSignature(StringBuilder& stringBuilder, MangledFunctionName functionName)
 {
-    StringBuilder stringBuilder;
-
     stringBuilder.flexibleAppend("kernel void ", functionName, '(');
-    bool empty = true;
-    if (auto resourceSignature = this->resourceSignature()) {
-        empty = false;
-        stringBuilder.append(*resourceSignature);
-    }
-    if (auto builtInsSignature = this->builtInsSignature()) {
-        if (!empty)
-            stringBuilder.append(", ");
-        stringBuilder.append(*builtInsSignature);
-    }
+    bool addedToSignature = emitResourceSignature(stringBuilder, IncludePrecedingComma::No);
+    emitBuiltInsSignature(stringBuilder, addedToSignature ? IncludePrecedingComma::Yes : IncludePrecedingComma::No);
     stringBuilder.append(')');
-
-    return stringBuilder.toString();
 }
 
-String ComputeEntryPointScaffolding::unpack()
+void ComputeEntryPointScaffolding::emitUnpack(StringBuilder& stringBuilder)
 {
-    return unpackResourcesAndNamedBuiltIns();
+    emitUnpackResourcesAndNamedBuiltIns(stringBuilder);
 }
 
-String ComputeEntryPointScaffolding::pack(MangledVariableName, MangledVariableName)
+void ComputeEntryPointScaffolding::emitPack(StringBuilder&, MangledVariableName, MangledVariableName)
 {
     ASSERT_NOT_REACHED();
-    return String();
 }
 
 }

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLEntryPointScaffolding.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -53,10 +53,10 @@
 public:
     virtual ~EntryPointScaffolding() = default;
 
-    virtual String helperTypes() = 0;
-    virtual String signature(MangledFunctionName) = 0;
-    virtual String unpack() = 0;
-    virtual String pack(MangledVariableName existingVariableName, MangledVariableName) = 0;
+    virtual void emitHelperTypes(StringBuilder&) = 0;
+    virtual void emitSignature(StringBuilder&, MangledFunctionName) = 0;
+    virtual void emitUnpack(StringBuilder&) = 0;
+    virtual void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) = 0;
 
     Vector<MangledVariableName>& parameterVariables() { return m_parameterVariables; }
 
@@ -63,14 +63,19 @@
 protected:
     EntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
 
-    String resourceHelperTypes();
-    Optional<String> resourceSignature();
-    Optional<String> builtInsSignature();
+    void emitResourceHelperTypes(StringBuilder&);
 
-    String mangledInputPath(Vector<String>& path);
-    String mangledOutputPath(Vector<String>& path);
-    String unpackResourcesAndNamedBuiltIns();
+    enum class IncludePrecedingComma {
+        Yes,
+        No
+    };
+    bool emitResourceSignature(StringBuilder&, IncludePrecedingComma);
+    bool emitBuiltInsSignature(StringBuilder&, IncludePrecedingComma);
 
+    void emitMangledInputPath(StringBuilder&, Vector<String>& path);
+    void emitMangledOutputPath(StringBuilder&, Vector<String>& path);
+    void emitUnpackResourcesAndNamedBuiltIns(StringBuilder&);
+
     AST::FunctionDefinition& m_functionDefinition;
     Intrinsics& m_intrinsics;
     TypeNamer& m_typeNamer;
@@ -106,17 +111,17 @@
     Vector<MangledVariableName> m_parameterVariables;
 };
 
-class VertexEntryPointScaffolding : public EntryPointScaffolding {
+class VertexEntryPointScaffolding final : public EntryPointScaffolding {
 public:
     VertexEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<VertexAttribute*, size_t>& matchedVertexAttributes);
     virtual ~VertexEntryPointScaffolding() = default;
 
-    String helperTypes() override;
-    String signature(MangledFunctionName) override;
-    String unpack() override;
-    String pack(MangledVariableName existingVariableName, MangledVariableName) override;
+private:
+    void emitHelperTypes(StringBuilder&) override;
+    void emitSignature(StringBuilder&, MangledFunctionName) override;
+    void emitUnpack(StringBuilder&) override;
+    void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) override;
 
-private:
     HashMap<VertexAttribute*, size_t>& m_matchedVertexAttributes;
     MangledTypeName m_stageInStructName;
     MangledTypeName m_returnStructName;
@@ -136,17 +141,17 @@
     Vector<NamedOutput> m_namedOutputs;
 };
 
-class FragmentEntryPointScaffolding : public EntryPointScaffolding {
+class FragmentEntryPointScaffolding final : public EntryPointScaffolding {
 public:
     FragmentEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName, HashMap<AttachmentDescriptor*, size_t>& matchedColorAttachments);
     virtual ~FragmentEntryPointScaffolding() = default;
 
-    String helperTypes() override;
-    String signature(MangledFunctionName) override;
-    String unpack() override;
-    String pack(MangledVariableName existingVariableName, MangledVariableName) override;
+private:
+    void emitHelperTypes(StringBuilder&) override;
+    void emitSignature(StringBuilder&, MangledFunctionName) override;
+    void emitUnpack(StringBuilder&) override;
+    void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) override;
 
-private:
     MangledTypeName m_stageInStructName;
     MangledTypeName m_returnStructName;
     MangledVariableName m_stageInParameterName;
@@ -165,15 +170,16 @@
     Vector<NamedOutput> m_namedOutputs;
 };
 
-class ComputeEntryPointScaffolding : public EntryPointScaffolding {
+class ComputeEntryPointScaffolding final : public EntryPointScaffolding {
 public:
     ComputeEntryPointScaffolding(AST::FunctionDefinition&, Intrinsics&, TypeNamer&, EntryPointItems&, HashMap<Binding*, size_t>& resourceMap, Layout&, std::function<MangledVariableName()>&& generateNextVariableName);
     virtual ~ComputeEntryPointScaffolding() = default;
 
-    String helperTypes() override;
-    String signature(MangledFunctionName) override;
-    String unpack() override;
-    String pack(MangledVariableName existingVariableName, MangledVariableName) override;
+private:
+    void emitHelperTypes(StringBuilder&) override;
+    void emitSignature(StringBuilder&, MangledFunctionName) override;
+    void emitUnpack(StringBuilder&) override;
+    void emitPack(StringBuilder&, MangledVariableName existingVariableName, MangledVariableName) override;
 };
 
 }

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp	2019-08-06 19:04:00 UTC (rev 248307)
@@ -47,24 +47,23 @@
 
 namespace Metal {
 
-class FunctionDeclarationWriter : public Visitor {
+class FunctionDeclarationWriter final : public Visitor {
 public:
-    FunctionDeclarationWriter(TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping)
+    FunctionDeclarationWriter(StringBuilder& stringBuilder, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping)
         : m_typeNamer(typeNamer)
         , m_functionMapping(functionMapping)
+        , m_stringBuilder(stringBuilder)
     {
     }
 
     virtual ~FunctionDeclarationWriter() = default;
 
-    String toString() { return m_stringBuilder.toString(); }
-
     void visit(AST::FunctionDeclaration&) override;
 
 private:
     TypeNamer& m_typeNamer;
     HashMap<AST::FunctionDeclaration*, MangledFunctionName>& m_functionMapping;
-    StringBuilder m_stringBuilder;
+    StringBuilder& m_stringBuilder;
 };
 
 void FunctionDeclarationWriter::visit(AST::FunctionDeclaration& functionDeclaration)
@@ -85,8 +84,9 @@
 
 class FunctionDefinitionWriter : public Visitor {
 public:
-    FunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, Layout& layout)
-        : m_intrinsics(intrinsics)
+    FunctionDefinitionWriter(StringBuilder& stringBuilder, Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, Layout& layout)
+        : m_stringBuilder(stringBuilder)
+        , m_intrinsics(intrinsics)
         , m_typeNamer(typeNamer)
         , m_functionMapping(functionMapping)
         , m_layout(layout)
@@ -95,8 +95,6 @@
 
     virtual ~FunctionDefinitionWriter() = default;
 
-    String toString() { return m_stringBuilder.toString(); }
-
     void visit(AST::NativeFunctionDeclaration&) override;
     void visit(AST::FunctionDefinition&) override;
 
@@ -148,7 +146,7 @@
     };
     void emitLoop(LoopConditionLocation, AST::_expression_* conditionExpression, AST::_expression_* increment, AST::Statement& body);
 
-    String constantExpressionString(AST::ConstantExpression&);
+    void emitConstantExpressionString(AST::ConstantExpression&);
 
     MangledVariableName generateNextVariableName() { return { m_variableCount++ }; }
 
@@ -215,11 +213,11 @@
 
     Optional<BreakContext> m_currentBreakContext;
 
+    StringBuilder& m_stringBuilder;
     Intrinsics& m_intrinsics;
     TypeNamer& m_typeNamer;
     HashMap<AST::FunctionDeclaration*, MangledFunctionName>& m_functionMapping;
     HashMap<AST::VariableDeclaration*, MangledVariableName> m_variableMapping;
-    StringBuilder m_stringBuilder;
 
     Vector<StackItem> m_stack;
     std::unique_ptr<EntryPointScaffolding> m_entryPointScaffolding;
@@ -242,11 +240,12 @@
         if (!entryPointScaffolding)
             return;
         m_entryPointScaffolding = WTFMove(entryPointScaffolding);
-        m_stringBuilder.flexibleAppend(
-            m_entryPointScaffolding->helperTypes(), '\n',
-            m_entryPointScaffolding->signature(iterator->value), " {\n",
-            m_entryPointScaffolding->unpack()
-        );
+        m_entryPointScaffolding->emitHelperTypes(m_stringBuilder);
+        m_stringBuilder.append('\n');
+        m_entryPointScaffolding->emitSignature(m_stringBuilder, iterator->value);
+        m_stringBuilder.append(" {\n");
+        m_entryPointScaffolding->emitUnpack(m_stringBuilder);
+    
         for (size_t i = 0; i < functionDefinition.parameters().size(); ++i) {
             auto addResult = m_variableMapping.add(&functionDefinition.parameters()[i], m_entryPointScaffolding->parameterVariables()[i]);
             ASSERT_UNUSED(addResult, addResult.isNewEntry);
@@ -406,10 +405,8 @@
         checkErrorAndVisit(*returnStatement.value());
         if (m_entryPointScaffolding) {
             auto variableName = generateNextVariableName();
-            m_stringBuilder.flexibleAppend(
-                m_entryPointScaffolding->pack(takeLastValue(), variableName),
-                "return ", variableName, ";\n"
-            );
+            m_entryPointScaffolding->emitPack(m_stringBuilder, takeLastValue(), variableName);
+            m_stringBuilder.flexibleAppend("return ", variableName, ";\n");
         } else
             m_stringBuilder.flexibleAppend("return ", takeLastValue(), ";\n");
     } else
@@ -428,9 +425,11 @@
 
 void FunctionDefinitionWriter::visit(AST::SwitchCase& switchCase)
 {
-    if (switchCase.value())
-        m_stringBuilder.flexibleAppend("case ", constantExpressionString(*switchCase.value()), ":\n");
-    else
+    if (switchCase.value()) {
+        m_stringBuilder.flexibleAppend("case ");
+        emitConstantExpressionString(*switchCase.value());
+        m_stringBuilder.flexibleAppend(":\n");
+    } else
         m_stringBuilder.append("default:\n");
     SetForScope<Optional<BreakContext>> breakContext(m_currentBreakContext, BreakContext::Switch);
     checkErrorAndVisit(switchCase.block());
@@ -735,29 +734,39 @@
     appendLeftValue(variableReference, iterator->value, pointerName, Nullability::NotNull);
 }
 
-String FunctionDefinitionWriter::constantExpressionString(AST::ConstantExpression& constantExpression)
+void FunctionDefinitionWriter::emitConstantExpressionString(AST::ConstantExpression& constantExpression)
 {
-    return constantExpression.visit(WTF::makeVisitor([&](AST::IntegerLiteral& integerLiteral) -> String {
-        return makeString("", integerLiteral.value());
-    }, [&](AST::UnsignedIntegerLiteral& unsignedIntegerLiteral) -> String {
-        return makeString("", unsignedIntegerLiteral.value());
-    }, [&](AST::FloatLiteral& floatLiteral) -> String {
-        return makeString("", floatLiteral.value());
-    }, [&](AST::NullLiteral&) -> String {
-        return "nullptr"_str;
-    }, [&](AST::BooleanLiteral& booleanLiteral) -> String {
-        return booleanLiteral.value() ? "true"_str : "false"_str;
-    }, [&](AST::EnumerationMemberLiteral& enumerationMemberLiteral) -> String {
-        ASSERT(enumerationMemberLiteral.enumerationDefinition());
-        ASSERT(enumerationMemberLiteral.enumerationDefinition());
-        return makeString(m_typeNamer.mangledNameForType(*enumerationMemberLiteral.enumerationDefinition()), "::", m_typeNamer.mangledNameForEnumerationMember(*enumerationMemberLiteral.enumerationMember()));
-    }));
+    constantExpression.visit(WTF::makeVisitor(
+        [&](AST::IntegerLiteral& integerLiteral) {
+            m_stringBuilder.flexibleAppend(integerLiteral.value());
+        },
+        [&](AST::UnsignedIntegerLiteral& unsignedIntegerLiteral) {
+            m_stringBuilder.flexibleAppend(unsignedIntegerLiteral.value());
+        },
+        [&](AST::FloatLiteral& floatLiteral) {
+            m_stringBuilder.flexibleAppend(floatLiteral.value());
+        },
+        [&](AST::NullLiteral&) {
+            m_stringBuilder.flexibleAppend("nullptr");
+        },
+        [&](AST::BooleanLiteral& booleanLiteral) {
+            if (booleanLiteral.value())
+                m_stringBuilder.flexibleAppend("true");
+            else
+                m_stringBuilder.flexibleAppend("false");
+        },
+        [&](AST::EnumerationMemberLiteral& enumerationMemberLiteral) {
+            ASSERT(enumerationMemberLiteral.enumerationDefinition());
+            ASSERT(enumerationMemberLiteral.enumerationDefinition());
+            m_stringBuilder.flexibleAppend(m_typeNamer.mangledNameForType(*enumerationMemberLiteral.enumerationDefinition()), "::", m_typeNamer.mangledNameForEnumerationMember(*enumerationMemberLiteral.enumerationMember()));
+        }
+    ));
 }
 
-class RenderFunctionDefinitionWriter : public FunctionDefinitionWriter {
+class RenderFunctionDefinitionWriter final : public FunctionDefinitionWriter {
 public:
-    RenderFunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
-        : FunctionDefinitionWriter(intrinsics, typeNamer, functionMapping, layout)
+    RenderFunctionDefinitionWriter(StringBuilder& stringBuilder, Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
+        : FunctionDefinitionWriter(stringBuilder, intrinsics, typeNamer, functionMapping, layout)
         , m_matchedSemantics(WTFMove(matchedSemantics))
     {
     }
@@ -780,10 +789,10 @@
     return nullptr;
 }
 
-class ComputeFunctionDefinitionWriter : public FunctionDefinitionWriter {
+class ComputeFunctionDefinitionWriter final : public FunctionDefinitionWriter {
 public:
-    ComputeFunctionDefinitionWriter(Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
-        : FunctionDefinitionWriter(intrinsics, typeNamer, functionMapping, layout)
+    ComputeFunctionDefinitionWriter(StringBuilder& stringBuilder, Intrinsics& intrinsics, TypeNamer& typeNamer, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
+        : FunctionDefinitionWriter(stringBuilder, intrinsics, typeNamer, functionMapping, layout)
         , m_matchedSemantics(WTFMove(matchedSemantics))
     {
     }
@@ -804,14 +813,8 @@
     return nullptr;
 }
 
-struct SharedMetalFunctionsResult {
-    HashMap<AST::FunctionDeclaration*, MangledFunctionName> functionMapping;
-    String metalFunctions;
-};
-static SharedMetalFunctionsResult sharedMetalFunctions(Program& program, TypeNamer& typeNamer, const HashSet<AST::FunctionDeclaration*>& reachableFunctions)
+static HashMap<AST::FunctionDeclaration*, MangledFunctionName> generateMetalFunctionsMapping(Program& program)
 {
-    StringBuilder stringBuilder;
-
     unsigned numFunctions = 0;
     HashMap<AST::FunctionDeclaration*, MangledFunctionName> functionMapping;
     for (auto& functionDefinition : program.functionDefinitions()) {
@@ -819,20 +822,21 @@
         ASSERT_UNUSED(addResult, addResult.isNewEntry);
     }
 
-    {
-        FunctionDeclarationWriter functionDeclarationWriter(typeNamer, functionMapping);
-        for (auto& functionDefinition : program.functionDefinitions()) {
-            if (!functionDefinition->entryPointType() && reachableFunctions.contains(&functionDefinition))
-                functionDeclarationWriter.visit(functionDefinition);
-        }
-        stringBuilder.append(functionDeclarationWriter.toString());
+    return functionMapping;
+}
+
+static void emitSharedMetalFunctions(StringBuilder& stringBuilder, Program& program, TypeNamer& typeNamer, const HashSet<AST::FunctionDeclaration*>& reachableFunctions, HashMap<AST::FunctionDeclaration*, MangledFunctionName>& functionMapping)
+{
+    FunctionDeclarationWriter functionDeclarationWriter(stringBuilder, typeNamer, functionMapping);
+    for (auto& functionDefinition : program.functionDefinitions()) {
+        if (!functionDefinition->entryPointType() && reachableFunctions.contains(&functionDefinition))
+            functionDeclarationWriter.visit(functionDefinition);
     }
 
     stringBuilder.append('\n');
-    return { WTFMove(functionMapping), stringBuilder.toString() };
 }
 
-class ReachableFunctionsGatherer : public Visitor {
+class ReachableFunctionsGatherer final : public Visitor {
 public:
     void visit(AST::FunctionDeclaration& functionDeclaration) override
     {
@@ -855,7 +859,7 @@
     HashSet<AST::FunctionDeclaration*> m_reachableFunctions;
 };
 
-RenderMetalFunctions metalFunctions(Program& program, TypeNamer& typeNamer, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
+RenderMetalFunctionEntryPoints emitMetalFunctions(StringBuilder& stringBuilder, Program& program, TypeNamer& typeNamer, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
 {
     auto& vertexShaderEntryPoint = *matchedSemantics.vertexShader;
     auto& fragmentShaderEntryPoint = *matchedSemantics.fragmentShader;
@@ -865,26 +869,20 @@
     reachableFunctionsGatherer.Visitor::visit(fragmentShaderEntryPoint);
     auto reachableFunctions = reachableFunctionsGatherer.takeReachableFunctions();
 
-    auto sharedMetalFunctions = Metal::sharedMetalFunctions(program, typeNamer, reachableFunctions);
+    auto functionMapping = generateMetalFunctionsMapping(program);
+    
+    emitSharedMetalFunctions(stringBuilder, program, typeNamer, reachableFunctions, functionMapping);
 
-    StringBuilder stringBuilder;
-    stringBuilder.append(sharedMetalFunctions.metalFunctions);
-
-    RenderFunctionDefinitionWriter functionDefinitionWriter(program.intrinsics(), typeNamer, sharedMetalFunctions.functionMapping, WTFMove(matchedSemantics), layout);
+    RenderFunctionDefinitionWriter functionDefinitionWriter(stringBuilder, program.intrinsics(), typeNamer, functionMapping, WTFMove(matchedSemantics), layout);
     for (auto& functionDefinition : program.functionDefinitions()) {
         if (reachableFunctions.contains(&functionDefinition))
             functionDefinitionWriter.visit(functionDefinition);
     }
-    stringBuilder.append(functionDefinitionWriter.toString());
 
-    RenderMetalFunctions result;
-    result.metalSource = stringBuilder.toString();
-    result.mangledVertexEntryPointName = sharedMetalFunctions.functionMapping.get(&vertexShaderEntryPoint);
-    result.mangledFragmentEntryPointName = sharedMetalFunctions.functionMapping.get(&fragmentShaderEntryPoint);
-    return result;
+    return { functionMapping.get(&vertexShaderEntryPoint), functionMapping.get(&fragmentShaderEntryPoint) };
 }
 
-ComputeMetalFunctions metalFunctions(Program& program, TypeNamer& typeNamer, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
+ComputeMetalFunctionEntryPoints emitMetalFunctions(StringBuilder& stringBuilder, Program& program, TypeNamer& typeNamer, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
 {
     auto& entryPoint = *matchedSemantics.shader;
 
@@ -892,22 +890,16 @@
     reachableFunctionsGatherer.Visitor::visit(entryPoint);
     auto reachableFunctions = reachableFunctionsGatherer.takeReachableFunctions();
 
-    auto sharedMetalFunctions = Metal::sharedMetalFunctions(program, typeNamer, reachableFunctions);
+    auto functionMapping = generateMetalFunctionsMapping(program);
+    emitSharedMetalFunctions(stringBuilder, program, typeNamer, reachableFunctions, functionMapping);
 
-    StringBuilder stringBuilder;
-    stringBuilder.append(sharedMetalFunctions.metalFunctions);
-
-    ComputeFunctionDefinitionWriter functionDefinitionWriter(program.intrinsics(), typeNamer, sharedMetalFunctions.functionMapping, WTFMove(matchedSemantics), layout);
+    ComputeFunctionDefinitionWriter functionDefinitionWriter(stringBuilder, program.intrinsics(), typeNamer, functionMapping, WTFMove(matchedSemantics), layout);
     for (auto& functionDefinition : program.functionDefinitions()) {
         if (reachableFunctions.contains(&functionDefinition))
             functionDefinitionWriter.visit(functionDefinition);
     }
-    stringBuilder.append(functionDefinitionWriter.toString());
 
-    ComputeMetalFunctions result;
-    result.metalSource = stringBuilder.toString();
-    result.mangledEntryPointName = sharedMetalFunctions.functionMapping.get(&entryPoint);
-    return result;
+    return { functionMapping.get(&entryPoint) };
 }
 
 } // namespace Metal

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -40,18 +40,16 @@
 
 class TypeNamer;
 
-struct RenderMetalFunctions {
-    String metalSource;
+struct RenderMetalFunctionEntryPoints {
     MangledFunctionName mangledVertexEntryPointName;
     MangledFunctionName mangledFragmentEntryPointName;
 };
-RenderMetalFunctions metalFunctions(Program&, TypeNamer&, MatchedRenderSemantics&&, Layout&);
+RenderMetalFunctionEntryPoints emitMetalFunctions(StringBuilder&, Program&, TypeNamer&, MatchedRenderSemantics&&, Layout&);
 
-struct ComputeMetalFunctions {
-    String metalSource;
+struct ComputeMetalFunctionEntryPoints {
     MangledFunctionName mangledEntryPointName;
 };
-ComputeMetalFunctions metalFunctions(Program&, TypeNamer&, MatchedComputeSemantics&&, Layout&);
+ComputeMetalFunctionEntryPoints emitMetalFunctions(StringBuilder&, Program&, TypeNamer&, MatchedComputeSemantics&&, Layout&);
 
 }
 

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.cpp	2019-08-06 19:04:00 UTC (rev 248307)
@@ -41,9 +41,9 @@
 
 static constexpr bool dumpMetalCode = false;
 
-static String generateMetalCodeShared(String&& metalTypes, String&& metalFunctions)
+static StringView metalCodeProlog()
 {
-    auto generatedMetalCode = makeString(
+    return StringView {
         "#include <metal_stdlib>\n"
         "#include <metal_atomic>\n"
         "#include <metal_math>\n"
@@ -52,36 +52,46 @@
         "#include <metal_texture>\n"
         "\n"
         "using namespace metal;\n"
-        "\n",
+        "\n"
+    };
+}
 
-        WTFMove(metalTypes),
-        WTFMove(metalFunctions)
-    );
-
+static void dumpMetalCodeIfNeeded(StringBuilder& stringBuilder)
+{
     if (dumpMetalCode) {
         dataLogLn("Generated Metal code: ");
-        dataLogLn(generatedMetalCode);
+        dataLogLn(stringBuilder.toString());
     }
-
-    return generatedMetalCode;
 }
 
 RenderMetalCode generateMetalCode(Program& program, MatchedRenderSemantics&& matchedSemantics, Layout& layout)
 {
+    StringBuilder stringBuilder;
+    stringBuilder.append(metalCodeProlog());
+
     TypeNamer typeNamer(program);
-    auto metalTypes = typeNamer.metalTypes();
-    auto metalFunctions = Metal::metalFunctions(program, typeNamer, WTFMove(matchedSemantics), layout);
-    auto metalCode = generateMetalCodeShared(WTFMove(metalTypes), WTFMove(metalFunctions.metalSource));
-    return { WTFMove(metalCode), WTFMove(metalFunctions.mangledVertexEntryPointName), WTFMove(metalFunctions.mangledFragmentEntryPointName) };
+    typeNamer.emitMetalTypes(stringBuilder);
+    
+    auto metalFunctionEntryPoints = Metal::emitMetalFunctions(stringBuilder, program, typeNamer, WTFMove(matchedSemantics), layout);
+
+    dumpMetalCodeIfNeeded(stringBuilder);
+
+    return { WTFMove(stringBuilder), WTFMove(metalFunctionEntryPoints.mangledVertexEntryPointName), WTFMove(metalFunctionEntryPoints.mangledFragmentEntryPointName) };
 }
 
 ComputeMetalCode generateMetalCode(Program& program, MatchedComputeSemantics&& matchedSemantics, Layout& layout)
 {
+    StringBuilder stringBuilder;
+    stringBuilder.append(metalCodeProlog());
+
     TypeNamer typeNamer(program);
-    auto metalTypes = typeNamer.metalTypes();
-    auto metalFunctions = Metal::metalFunctions(program, typeNamer, WTFMove(matchedSemantics), layout);
-    auto metalCode = generateMetalCodeShared(WTFMove(metalTypes), WTFMove(metalFunctions.metalSource));
-    return { WTFMove(metalCode), WTFMove(metalFunctions.mangledEntryPointName) };
+    typeNamer.emitMetalTypes(stringBuilder);
+
+    auto metalFunctionEntryPoints = Metal::emitMetalFunctions(stringBuilder, program, typeNamer, WTFMove(matchedSemantics), layout);
+
+    dumpMetalCodeIfNeeded(stringBuilder);
+
+    return { WTFMove(stringBuilder), WTFMove(metalFunctionEntryPoints.mangledEntryPointName) };
 }
 
 }

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLMetalCodeGenerator.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -30,8 +30,7 @@
 #include "WHLSLMangledNames.h"
 #include "WHLSLPipelineDescriptor.h"
 #include "WHLSLSemanticMatcher.h"
-#include <wtf/Variant.h>
-#include <wtf/text/WTFString.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
 
@@ -42,7 +41,7 @@
 namespace Metal {
 
 struct RenderMetalCode {
-    String metalSource;
+    StringBuilder metalSource;
     MangledFunctionName mangledVertexEntryPointName;
     MangledFunctionName mangledFragmentEntryPointName;
 };
@@ -50,7 +49,7 @@
 RenderMetalCode generateMetalCode(Program&, MatchedRenderSemantics&& matchedSemantics, Layout&);
 
 struct ComputeMetalCode {
-    String metalSource;
+    StringBuilder metalSource;
     MangledFunctionName mangledEntryPointName;
 };
 // Can't fail. Any failure checks need to be done earlier, in the backend-agnostic part of the compiler.

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp	2019-08-06 19:04:00 UTC (rev 248307)
@@ -351,44 +351,42 @@
     return &*iterator;
 }
 
-class MetalTypeDeclarationWriter : public Visitor {
+class MetalTypeDeclarationWriter final : public Visitor {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    MetalTypeDeclarationWriter(std::function<MangledOrNativeTypeName(AST::NamedType&)>&& mangledNameForNamedType)
+    MetalTypeDeclarationWriter(StringBuilder& stringBuilder, std::function<MangledOrNativeTypeName(AST::NamedType&)>&& mangledNameForNamedType)
         : m_mangledNameForNamedType(WTFMove(mangledNameForNamedType))
+        , m_stringBuilder(stringBuilder)
     {
     }
 
-    String toString() { return m_stringBuilder.toString(); }
-
 private:
-    void visit(AST::StructureDefinition& structureDefinition)
+    void visit(AST::StructureDefinition& structureDefinition) override
     {
         m_stringBuilder.flexibleAppend("struct ", m_mangledNameForNamedType(structureDefinition), ";\n");
     }
 
     std::function<MangledOrNativeTypeName(AST::NamedType&)> m_mangledNameForNamedType;
-    StringBuilder m_stringBuilder;
+    StringBuilder& m_stringBuilder;
 };
 
-String TypeNamer::metalTypeDeclarations()
+void TypeNamer::emitMetalTypeDeclarations(StringBuilder& stringBuilder)
 {
-    MetalTypeDeclarationWriter metalTypeDeclarationWriter([&](AST::NamedType& namedType) -> MangledOrNativeTypeName {
+    MetalTypeDeclarationWriter metalTypeDeclarationWriter(stringBuilder, [&](AST::NamedType& namedType) -> MangledOrNativeTypeName {
         return mangledNameForType(namedType);
     });
     metalTypeDeclarationWriter.Visitor::visit(m_program);
-    return metalTypeDeclarationWriter.toString();
 }
 
-void TypeNamer::emitUnnamedTypeDefinition(BaseTypeNameNode& baseTypeNameNode, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder& stringBuilder)
+void TypeNamer::emitUnnamedTypeDefinition(StringBuilder& stringBuilder, BaseTypeNameNode& baseTypeNameNode, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes)
 {
     if (emittedUnnamedTypes.contains(&baseTypeNameNode))
         return;
     if (baseTypeNameNode.parent())
-        emitUnnamedTypeDefinition(*baseTypeNameNode.parent(), emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
+        emitUnnamedTypeDefinition(stringBuilder, *baseTypeNameNode.parent(), emittedNamedTypes, emittedUnnamedTypes);
     if (is<ReferenceTypeNameNode>(baseTypeNameNode)) {
         auto& namedType = downcast<ReferenceTypeNameNode>(baseTypeNameNode).namedType();
-        emitNamedTypeDefinition(namedType, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
+        emitNamedTypeDefinition(stringBuilder, namedType, emittedNamedTypes, emittedUnnamedTypes);
         stringBuilder.flexibleAppend("typedef ", mangledNameForType(namedType), ' ', baseTypeNameNode.mangledName(), ";\n");
     } else if (is<PointerTypeNameNode>(baseTypeNameNode)) {
         auto& pointerType = downcast<PointerTypeNameNode>(baseTypeNameNode);
@@ -411,7 +409,7 @@
     emittedUnnamedTypes.add(&baseTypeNameNode);
 }
 
-void TypeNamer::emitNamedTypeDefinition(AST::NamedType& namedType, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder& stringBuilder)
+void TypeNamer::emitNamedTypeDefinition(StringBuilder& stringBuilder, AST::NamedType& namedType, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes)
 {
     if (emittedNamedTypes.contains(&namedType))
         return;
@@ -418,7 +416,7 @@
     auto iterator = m_dependencyGraph.find(&namedType);
     ASSERT(iterator != m_dependencyGraph.end());
     for (auto& baseTypeNameNode : iterator->value)
-        emitUnnamedTypeDefinition(baseTypeNameNode, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
+        emitUnnamedTypeDefinition(stringBuilder, baseTypeNameNode, emittedNamedTypes, emittedUnnamedTypes);
     if (is<AST::EnumerationDefinition>(namedType)) {
         auto& enumerationDefinition = downcast<AST::EnumerationDefinition>(namedType);
         auto& baseType = enumerationDefinition.type().unifyNode();
@@ -441,23 +439,21 @@
     emittedNamedTypes.add(&namedType);
 }
 
-void TypeNamer::emitAllUnnamedTypeDefinitions(Vector<UniqueRef<BaseTypeNameNode>>& nodes, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder& stringBuilder)
+void TypeNamer::emitAllUnnamedTypeDefinitions(StringBuilder& stringBuilder, Vector<UniqueRef<BaseTypeNameNode>>& nodes, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes)
 {
     for (auto& node : nodes) {
-        emitUnnamedTypeDefinition(node, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
-        emitAllUnnamedTypeDefinitions(node->children(), emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
+        emitUnnamedTypeDefinition(stringBuilder, node, emittedNamedTypes, emittedUnnamedTypes);
+        emitAllUnnamedTypeDefinitions(stringBuilder, node->children(), emittedNamedTypes, emittedUnnamedTypes);
     }
 }
 
-String TypeNamer::metalTypeDefinitions()
+void TypeNamer::emitMetalTypeDefinitions(StringBuilder& stringBuilder)
 {
     HashSet<AST::NamedType*> emittedNamedTypes;
     HashSet<BaseTypeNameNode*> emittedUnnamedTypes;
-    StringBuilder stringBuilder;
     for (auto& keyValuePair : m_dependencyGraph)
-        emitNamedTypeDefinition(*keyValuePair.key, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
-    emitAllUnnamedTypeDefinitions(m_trie, emittedNamedTypes, emittedUnnamedTypes, stringBuilder);
-    return stringBuilder.toString();
+        emitNamedTypeDefinition(stringBuilder, *keyValuePair.key, emittedNamedTypes, emittedUnnamedTypes);
+    emitAllUnnamedTypeDefinitions(stringBuilder, m_trie, emittedNamedTypes, emittedUnnamedTypes);
 }
 
 MangledTypeName TypeNamer::mangledNameForType(AST::UnnamedType& unnamedType)
@@ -489,10 +485,13 @@
     return iterator->value;
 }
 
-String TypeNamer::metalTypes()
+void TypeNamer::emitMetalTypes(StringBuilder& stringBuilder)
 {
     Visitor::visit(m_program);
-    return makeString(metalTypeDeclarations(), '\n', metalTypeDefinitions());
+
+    emitMetalTypeDeclarations(stringBuilder);
+    stringBuilder.append('\n');
+    emitMetalTypeDefinitions(stringBuilder);
 }
 
 } // namespace Metal

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -59,7 +59,7 @@
     TypeNamer(Program&);
     virtual ~TypeNamer();
 
-    String metalTypes();
+    void emitMetalTypes(StringBuilder&);
 
     // Must be called after calling metalTypes().
     String mangledNameForType(AST::NativeTypeDeclaration&);
@@ -82,11 +82,11 @@
 
     MangledEnumerationMemberName generateNextEnumerationMemberName() { return { m_enumerationMemberCount++ }; }
 
-    void emitNamedTypeDefinition(AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
-    void emitUnnamedTypeDefinition(BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
-    void emitAllUnnamedTypeDefinitions(Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes, StringBuilder&);
-    String metalTypeDeclarations();
-    String metalTypeDefinitions();
+    void emitNamedTypeDefinition(StringBuilder&, AST::NamedType&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes);
+    void emitUnnamedTypeDefinition(StringBuilder&, BaseTypeNameNode&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes);
+    void emitAllUnnamedTypeDefinitions(StringBuilder&, Vector<UniqueRef<BaseTypeNameNode>>&, HashSet<AST::NamedType*>& emittedNamedTypes, HashSet<BaseTypeNameNode*>& emittedUnnamedTypes);
+    void emitMetalTypeDeclarations(StringBuilder&);
+    void emitMetalTypeDefinitions(StringBuilder&);
 
     UniqueRef<BaseTypeNameNode> createNameNode(AST::UnnamedType&, BaseTypeNameNode* parent);
     BaseTypeNameNode* insert(AST::UnnamedType&, Vector<UniqueRef<BaseTypeNameNode>>&);

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.cpp (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.cpp	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.cpp	2019-08-06 19:04:00 UTC (rev 248307)
@@ -695,8 +695,8 @@
     if (tryType(Token::Type::Comma)) {
         CONSUME_TYPE(spaceToken, Identifier);
         auto spaceTokenStringView = spaceToken->stringView(m_lexer);
-        auto prefix = "space"_str;
-        if (!spaceTokenStringView.startsWith(StringView(prefix)))
+        StringView prefix { "space" };
+        if (!spaceTokenStringView.startsWith(prefix))
             return Unexpected<Error>(Error(makeString("Second argument to resource semantic ", spaceTokenStringView, " needs be of the form 'space0'")));
         if (spaceTokenStringView.length() <= prefix.length())
             return Unexpected<Error>(Error(makeString("Second argument to resource semantic ", spaceTokenStringView, " needs be of the form 'space0'")));

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h (248306 => 248307)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLPrepare.h	2019-08-06 19:04:00 UTC (rev 248307)
@@ -30,6 +30,7 @@
 #include "WHLSLError.h"
 #include "WHLSLMangledNames.h"
 #include "WHLSLPipelineDescriptor.h"
+#include <wtf/text/StringBuilder.h>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -39,7 +40,7 @@
 constexpr bool dumpMetalCompileTimes = false;
 
 struct RenderPrepareResult {
-    String metalSource;
+    StringBuilder metalSource;
     Metal::MangledFunctionName mangledVertexEntryPointName;
     Metal::MangledFunctionName mangledFragmentEntryPointName;
 };
@@ -52,7 +53,7 @@
 };
 
 struct ComputePrepareResult {
-    String metalSource;
+    StringBuilder metalSource;
     Metal::MangledFunctionName mangledEntryPointName;
     ComputeDimensions computeDimensions;
 };

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm (248306 => 248307)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPUComputePipelineMetal.mm	2019-08-06 19:04:00 UTC (rev 248307)
@@ -90,7 +90,8 @@
         MonotonicTime startTime;
         if (WHLSL::dumpMetalCompileTimes)
             startTime = MonotonicTime::now();
-        computeLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource options:nil error:&error]);
+        // FIXME: https://webkit.org/b/200474 Add direct StringBuilder -> NSString conversion to avoid extra copy into a WTF::String
+        computeLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource.toString() options:nil error:&error]);
         if (WHLSL::dumpMetalCompileTimes)
             dataLogLn("Metal compile times: ", (MonotonicTime::now() - startTime).milliseconds(), " ms");
         END_BLOCK_OBJC_EXCEPTIONS;

Modified: trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm (248306 => 248307)


--- trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm	2019-08-06 17:57:45 UTC (rev 248306)
+++ trunk/Source/WebCore/platform/graphics/gpu/cocoa/GPURenderPipelineMetal.mm	2019-08-06 19:04:00 UTC (rev 248307)
@@ -402,7 +402,8 @@
         MonotonicTime startTime;
         if (WHLSL::dumpMetalCompileTimes)
             startTime = MonotonicTime::now();
-        vertexLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource options:nil error:&error]);
+        // FIXME: https://webkit.org/b/200474 Add direct StringBuilder -> NSString conversion to avoid extra copy into a WTF::String
+        vertexLibrary = adoptNS([device.platformDevice() newLibraryWithSource:whlslCompileResult->metalSource.toString() options:nil error:&error]);
         if (WHLSL::dumpMetalCompileTimes)
             dataLogLn("Metal compile times: ", (MonotonicTime::now() - startTime).milliseconds(), " ms");
         END_BLOCK_OBJC_EXCEPTIONS;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to