[WebGPU] Code quality concerns raised for 191291: [WebGPU] Experimental prototype...
authorjustin_fan@apple.com <justin_fan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Nov 2018 00:33:53 +0000 (00:33 +0000)
committerjustin_fan@apple.com <justin_fan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Nov 2018 00:33:53 +0000 (00:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191383

Reviewed by Dean Jackson.

Covered by existing WebGPU tests introduced in original patch.

* Modules/webgpu/GPUDevice.h:
* Modules/webgpu/GPUPipelineStageDescriptor.h:
* Modules/webgpu/GPURenderPipelineDescriptor.h: Now a base struct with a guaranteed vertex stage member.
(): Refactored into enum class.
(WebCore::GPURenderPipelineDescriptor::GPURenderPipelineDescriptor): Removed in favor of init-list construction.
(WebCore::GPURenderPipelineDescriptor::primitiveTopology): Now a proper enum class member.
* Modules/webgpu/GPUShaderModule.h:
* Modules/webgpu/WebGPUDevice.cpp:
(WebCore::WebGPUDevice::createRenderPipeline const):
* Modules/webgpu/WebGPUShaderModule.h:
(WebCore::WebGPUShaderModule::module const):
* Modules/webgpu/WebGPUShaderStage.h: Replaced enum with constants to better reflect IDL.
* Modules/webgpu/cocoa/GPURenderPipeline.h:
* Modules/webgpu/cocoa/GPURenderPipelineMetal.mm:
(WebCore::setFunctionsForPipelineDescriptor):
(WebCore::GPURenderPipeline::create):
* Modules/webgpu/cocoa/GPUSwapChain.h:
* WebCore.xcodeproj/project.pbxproj: Removed GPUPipelineDescriptorBase.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@238208 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/Modules/webgpu/GPUDevice.h
Source/WebCore/Modules/webgpu/GPUPipelineStageDescriptor.h
Source/WebCore/Modules/webgpu/GPURenderPipelineDescriptor.h
Source/WebCore/Modules/webgpu/GPUShaderModule.h
Source/WebCore/Modules/webgpu/WebGPUDevice.cpp
Source/WebCore/Modules/webgpu/WebGPUShaderModule.h
Source/WebCore/Modules/webgpu/WebGPUShaderStage.h
Source/WebCore/Modules/webgpu/cocoa/GPURenderPipeline.h
Source/WebCore/Modules/webgpu/cocoa/GPURenderPipelineMetal.mm
Source/WebCore/Modules/webgpu/cocoa/GPUSwapChain.h
Source/WebCore/WebCore.xcodeproj/project.pbxproj

index 7b0b090..c3aac0a 100644 (file)
@@ -1,3 +1,31 @@
+2018-11-14  Justin Fan  <justin_fan@apple.com>
+
+        [WebGPU] Code quality concerns raised for 191291: [WebGPU] Experimental prototype for WebGPURenderPipeline and WebGPUSwapChain
+        https://bugs.webkit.org/show_bug.cgi?id=191383
+
+        Reviewed by Dean Jackson.
+
+        Covered by existing WebGPU tests introduced in original patch.
+
+        * Modules/webgpu/GPUDevice.h:
+        * Modules/webgpu/GPUPipelineStageDescriptor.h:
+        * Modules/webgpu/GPURenderPipelineDescriptor.h: Now a base struct with a guaranteed vertex stage member.
+        (): Refactored into enum class.
+        (WebCore::GPURenderPipelineDescriptor::GPURenderPipelineDescriptor): Removed in favor of init-list construction.
+        (WebCore::GPURenderPipelineDescriptor::primitiveTopology): Now a proper enum class member.
+        * Modules/webgpu/GPUShaderModule.h:
+        * Modules/webgpu/WebGPUDevice.cpp:
+        (WebCore::WebGPUDevice::createRenderPipeline const):
+        * Modules/webgpu/WebGPUShaderModule.h:
+        (WebCore::WebGPUShaderModule::module const):
+        * Modules/webgpu/WebGPUShaderStage.h: Replaced enum with constants to better reflect IDL.
+        * Modules/webgpu/cocoa/GPURenderPipeline.h:
+        * Modules/webgpu/cocoa/GPURenderPipelineMetal.mm:
+        (WebCore::setFunctionsForPipelineDescriptor):
+        (WebCore::GPURenderPipeline::create):
+        * Modules/webgpu/cocoa/GPUSwapChain.h:
+        * WebCore.xcodeproj/project.pbxproj: Removed GPUPipelineDescriptorBase.
+
 2018-11-14  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector: Pass Inspector::FrontendChannel as a reference connect/disconnect methods
index 88b0cd2..7fd7618 100644 (file)
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
 
-#if USE(METAL)
 OBJC_PROTOCOL(MTLDevice);
-#endif
 
 namespace WebCore {
 
-#if USE(METAL)
 using PlatformDevice = MTLDevice;
 using PlatformDeviceSmartPtr = RetainPtr<MTLDevice>;
-#else
-using PlatformDevice = void;
-using PlatformDeviceSmartPtr = RefPtr<void>;
-#endif
 
 class GPUShaderModule;
 class GPURenderPipeline;
index 90cdd48..c43145b 100644 (file)
@@ -34,8 +34,7 @@
 namespace WebCore {
 
 struct GPUPipelineStageDescriptor {
-    const GPUShaderModule& module;
-    unsigned long stage;
+    const GPUShaderModule* module = nullptr;
     String entryPoint;
 };
 
index 0035ea6..14ec7d2 100644 (file)
@@ -34,8 +34,8 @@
 
 namespace WebCore {
 
-struct GPURenderPipelineDescriptor : GPUPipelineDescriptorBase {
-    enum {
+struct GPURenderPipelineDescriptor {
+    enum class PrimitiveTopology {
         PointList,
         LineList,
         LineStrip,
@@ -43,13 +43,9 @@ struct GPURenderPipelineDescriptor : GPUPipelineDescriptorBase {
         TriangleStrip
     };
 
-    GPURenderPipelineDescriptor(Vector<GPUPipelineStageDescriptor>&& stages, int topology)
-        : GPUPipelineDescriptorBase { WTFMove(stages) }
-        , primitiveTopology(topology)
-    {
-    }
-
-    int primitiveTopology;
+    GPUPipelineStageDescriptor vertexStage;
+    GPUPipelineStageDescriptor fragmentStage;
+    PrimitiveTopology primitiveTopology;
 };
 
 } // namespace WebCore
index fdf3023..7218d45 100644 (file)
@@ -31,9 +31,7 @@
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
 
-#if USE(METAL)
 OBJC_PROTOCOL(MTLLibrary);
-#endif
 
 namespace WebCore {
 
@@ -41,13 +39,8 @@ class GPUDevice;
 
 struct GPUShaderModuleDescriptor;
 
-#if USE(METAL)
 using PlatformShaderModule = MTLLibrary;
 using PlatformShaderModuleSmartPtr = RetainPtr<MTLLibrary>;
-#else
-using PlatformShaderModule = void;
-using PlatformShaderModuleSmartPtr = RefPtr<void>;
-#endif
 
 class GPUShaderModule : public RefCounted<GPUShaderModule> {
 public:
index cc04dfc..a655225 100644 (file)
@@ -37,6 +37,7 @@
 #include "WebGPURenderPipelineDescriptor.h"
 #include "WebGPUShaderModule.h"
 #include "WebGPUShaderModuleDescriptor.h"
+#include "WebGPUShaderStage.h"
 
 namespace WebCore {
 
@@ -63,18 +64,58 @@ RefPtr<WebGPUShaderModule> WebGPUDevice::createShaderModule(WebGPUShaderModuleDe
 
 RefPtr<WebGPURenderPipeline> WebGPUDevice::createRenderPipeline(WebGPURenderPipelineDescriptor&& descriptor) const
 {
-    Vector<GPUPipelineStageDescriptor> stages;
+    const char* const functionName = "WebGPUDevice::createRenderPipeline()";
+#if LOG_DISABLED
+    UNUSED_PARAM(functionName);
+#endif
+
+    if (descriptor.stages.isEmpty()) {
+        LOG(WebGPU, "%s: No stages in WebGPURenderPipelineDescriptor!", functionName);
+        return nullptr;
+    }
+
+    GPUPipelineStageDescriptor vertexStage;
+    GPUPipelineStageDescriptor fragmentStage;
+
     for (const auto& stageDescriptor : descriptor.stages) {
-        if (!stageDescriptor.module) {
-            LOG(WebGPU, "WebGPUDevice::createRenderPipeline(): WebGPUShaderModule not found!");
+        if (!stageDescriptor.module || !stageDescriptor.module->module() || stageDescriptor.entryPoint.isEmpty()) {
+            LOG(WebGPU, "%s: Invalid WebGPUPipelineStageDescriptor!", functionName);
+            return nullptr;
+        }
+
+        switch (stageDescriptor.stage) {
+        case WebGPUShaderStage::VERTEX:
+            if (vertexStage.module) {
+                LOG(WebGPU, "%s: Multiple vertex stages in WebGPURenderPipelineDescriptor!", functionName);
+                return nullptr;
+            }
+
+            vertexStage.module = stageDescriptor.module->module();
+            vertexStage.entryPoint = stageDescriptor.entryPoint;
+            break;
+        case WebGPUShaderStage::FRAGMENT:
+            if (fragmentStage.module) {
+                LOG(WebGPU, "%s: Multiple fragment stages in WebGPURenderPipelineDescriptor!", functionName);
+                return nullptr;
+            }
+
+            fragmentStage.module = stageDescriptor.module->module();
+            fragmentStage.entryPoint = stageDescriptor.entryPoint;
+            break;
+        default:
+            LOG(WebGPU, "%s: Invalid shader stage in WebGPURenderPipelineDescriptor!", functionName);
             return nullptr;
         }
-        stages.append({ stageDescriptor.module->module(), stageDescriptor.stage, stageDescriptor.entryPoint });
     }
 
-    return WebGPURenderPipeline::create(m_device->createRenderPipeline(GPURenderPipelineDescriptor { WTFMove(stages), static_cast<int>(descriptor.primitiveTopology) }));
-}
+    // Metal (if not other APIs) requires at least the vertex shader.
+    if (!vertexStage.module || vertexStage.entryPoint.isEmpty()) {
+        LOG(WebGPU, "%s: Invalid vertex stage in WebGPURenderPipelineDescriptor!", functionName);
+        return nullptr;
+    }
 
+    return WebGPURenderPipeline::create(m_device->createRenderPipeline(GPURenderPipelineDescriptor { WTFMove(vertexStage), WTFMove(fragmentStage), static_cast<GPURenderPipelineDescriptor::PrimitiveTopology>(descriptor.primitiveTopology) }));
+}
 
 } // namespace WebCore
 
index 5060d56..deac20e 100644 (file)
@@ -38,7 +38,7 @@ class WebGPUShaderModule : public RefCounted<WebGPUShaderModule> {
 public:
     static RefPtr<WebGPUShaderModule> create(RefPtr<GPUShaderModule>&&);
 
-    const GPUShaderModule& module() const { return *m_module; }
+    const GPUShaderModule* module() const { return m_module.get(); }
 
 private:
     WebGPUShaderModule(RefPtr<GPUShaderModule>&&);
index 817d42f..2a5130c 100644 (file)
@@ -33,11 +33,9 @@ namespace WebCore {
 
 class WebGPUShaderStage : public RefCounted<WebGPUShaderStage> {
 public:
-    enum {
-        VERTEX = 0,
-        FRAGMENT = 1,
-        COMPUTE = 2
-    };
+    static const unsigned long VERTEX = 0;
+    static const unsigned long FRAGMENT = 1;
+    static const unsigned long COMPUTE = 2;
 };
 
 } // namespace WebCore
index f792a93..c433aba 100644 (file)
@@ -31,9 +31,7 @@
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
 
-#if USE(METAL)
 OBJC_PROTOCOL(MTLRenderPipelineState);
-#endif
 
 namespace WebCore {
 
@@ -41,13 +39,8 @@ class GPUDevice;
 
 struct GPURenderPipelineDescriptor;
 
-#if USE(METAL)
 using PlatformRenderPipeline = MTLRenderPipelineState;
 using PlatformRenderPipelineSmartPtr = RetainPtr<MTLRenderPipelineState>;
-#else
-using PlatformRenderPipeline = void;
-using PlatformRenderPipelineSmartPtr = RefPtr<void>;
-#endif
 
 class GPURenderPipeline : public RefCounted<GPURenderPipeline> {
 public:
index 364d2f1..fff2359 100644 (file)
@@ -30,7 +30,6 @@
 
 #import "GPURenderPipelineDescriptor.h"
 #import "Logging.h"
-#import "WebGPUShaderStage.h"
 
 #import <Metal/Metal.h>
 #import <wtf/BlockObjCExceptions.h>
@@ -42,35 +41,45 @@ static bool setFunctionsForPipelineDescriptor(const char* const functionName, MT
 #if LOG_DISABLED
     UNUSED_PARAM(functionName);
 #endif
-    for (const auto& stageDescriptor : descriptor.stages) {
-        auto mtlLibrary = retainPtr(stageDescriptor.module.platformShaderModule());
-
-        if (!mtlLibrary) {
-            LOG(WebGPU, "%s: MTLLibrary does not exist!", functionName);
-            return false;
-        }
-
-        auto function = adoptNS([mtlLibrary newFunctionWithName:stageDescriptor.entryPoint]);
-
-        if (!function) {
-            LOG(WebGPU, "%s: MTLFunction %s not found!", functionName, stageDescriptor.entryPoint.utf8().data());
-            return false;
-        }
-
-        switch (stageDescriptor.stage) {
-        case WebGPUShaderStage::VERTEX:
-            [mtlDescriptor setVertexFunction:function.get()];
-            break;
-        case WebGPUShaderStage::FRAGMENT:
-            [mtlDescriptor setFragmentFunction:function.get()];
-            break;
-        default:
-            LOG(WebGPU, "%s: Invalid shader stage specified!", functionName);
-            return false;
-            break;
-        }
+    // Metal requires a vertex shader in all render pipelines.
+    const auto& vertexStage = descriptor.vertexStage;
+    auto mtlLibrary = vertexStage.module->platformShaderModule();
+
+    if (!mtlLibrary) {
+        LOG(WebGPU, "%s: MTLLibrary for vertex stage does not exist!", functionName);
+        return false;
+    }
+
+    auto function = adoptNS([mtlLibrary newFunctionWithName:vertexStage.entryPoint]);
+
+    if (!function) {
+        LOG(WebGPU, "%s: Vertex MTLFunction \"%s\" not found!", functionName, vertexStage.entryPoint.utf8().data());
+        return false;
     }
 
+    [mtlDescriptor setVertexFunction:function.get()];
+
+    // However, fragment shaders are optional.
+    const auto fragmentStage = descriptor.fragmentStage;
+    if (!fragmentStage.module || !fragmentStage.entryPoint)
+        return true;
+
+    mtlLibrary = fragmentStage.module->platformShaderModule();
+
+    if (!mtlLibrary) {
+        LOG(WebGPU, "%s: MTLLibrary for fragment stage does not exist!", functionName);
+        return false;
+    }
+
+    function = adoptNS([mtlLibrary newFunctionWithName:fragmentStage.entryPoint]);
+
+    if (!function) {
+        LOG(WebGPU, "%s: Fragment MTLFunction \"%s\" not found!", functionName, fragmentStage.entryPoint.utf8().data());
+        return false;
+    }
+
+    [mtlDescriptor setFragmentFunction:function.get()];
+
     return true;
 }
 
@@ -106,10 +115,7 @@ RefPtr<GPURenderPipeline> GPURenderPipeline::create(const GPUDevice& device, GPU
 
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
 
-    if ([mtlDescriptor vertexFunction])
-        pipeline = adoptNS([device.platformDevice() newRenderPipelineStateWithDescriptor:mtlDescriptor.get() error:nil]);
-    else
-        LOG(WebGPU, "%s: No vertex function assigned for MTLRenderPipelineDescriptor!", functionName);
+    pipeline = adoptNS([device.platformDevice() newRenderPipelineStateWithDescriptor:mtlDescriptor.get() error:nil]);
 
     END_BLOCK_OBJC_EXCEPTIONS;
 
index abe62e3..4129845 100644 (file)
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
 
-#if USE(METAL)
 OBJC_CLASS CAMetalLayer;
-#endif
 
 namespace WebCore {
 
 class GPUDevice;
 
-#if USE(METAL)
 using PlatformSwapLayer = CAMetalLayer;
 using PlatformSwapLayerSmartPtr = RetainPtr<CAMetalLayer>;
-#else
-using PlatformSwapLayer = void;
-using PlatformSwapLayerSmartPtr = RefPtr<void>;
-#endif
 
 class GPUSwapChain : public RefCounted<GPUSwapChain> {
 public:
index f8b90da..f69720a 100644 (file)
                46B9519A207D635400A7D2DD /* RemoteFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B95192207D632E00A7D2DD /* RemoteFrame.h */; settings = {ATTRIBUTES = (Private, ); }; };
                46BCBBC22085008F00710638 /* JSRemoteDOMWindowBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 46BCBBC02085007F00710638 /* JSRemoteDOMWindowBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
                46C376622085177D00C73829 /* JSRemoteDOMWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 46C376612085176D00C73829 /* JSRemoteDOMWindow.h */; };
-               CD5F3EDD9D333C40A9A38A54 /* AbortableTaskQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DFDB912CF8E88A6DA1AD264F /* AbortableTaskQueue.h */; settings = {ATTRIBUTES = (Private, ); }; };
                46C696CB1E7205F700597937 /* CPUMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 46C696C91E7205E400597937 /* CPUMonitor.h */; settings = {ATTRIBUTES = (Private, ); }; };
                46C696CC1E7205FC00597937 /* CPUMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46C696CA1E7205E400597937 /* CPUMonitor.cpp */; };
                46C83EFE1A9BBE2900A79A41 /* GeoNotifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 46C83EFC1A9BBE2900A79A41 /* GeoNotifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
                46BCBBC3208500A700710638 /* RemoteDOMWindow.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RemoteDOMWindow.idl; sourceTree = "<group>"; };
                46C3765F2085176C00C73829 /* JSRemoteDOMWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSRemoteDOMWindow.cpp; sourceTree = "<group>"; };
                46C376612085176D00C73829 /* JSRemoteDOMWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSRemoteDOMWindow.h; sourceTree = "<group>"; };
-               DFDB912CF8E88A6DA1AD264F /* AbortableTaskQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbortableTaskQueue.h; sourceTree = "<group>"; };
                46C696C91E7205E400597937 /* CPUMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUMonitor.h; sourceTree = "<group>"; };
                46C696CA1E7205E400597937 /* CPUMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPUMonitor.cpp; sourceTree = "<group>"; };
                46C83EFB1A9BBE2900A79A41 /* GeoNotifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GeoNotifier.cpp; sourceTree = "<group>"; };
                D045AD2321682475000A6E9B /* WebMetalCommandQueue.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebMetalCommandQueue.cpp; sourceTree = "<group>"; };
                D046FB65218D073C00CB8F62 /* GPURenderPipelineDescriptor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPURenderPipelineDescriptor.h; sourceTree = "<group>"; };
                D046FB67218D180300CB8F62 /* GPUPipelineStageDescriptor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPUPipelineStageDescriptor.h; sourceTree = "<group>"; };
-               D046FB68218D18CD00CB8F62 /* GPUPipelineDescriptorBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPUPipelineDescriptorBase.h; sourceTree = "<group>"; };
                D0573D42217EB81E00D1BE91 /* GPULegacyTextureMetal.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GPULegacyTextureMetal.mm; sourceTree = "<group>"; };
                D05CED270A40BB2C00C5AF38 /* FormatBlockCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FormatBlockCommand.cpp; sourceTree = "<group>"; };
                D05CED280A40BB2C00C5AF38 /* FormatBlockCommand.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FormatBlockCommand.h; sourceTree = "<group>"; };
                DF7E9A294C7AACE0AD89B3DD /* MathMLOperatorDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLOperatorDictionary.h; sourceTree = "<group>"; };
                DF9AFD7013FC31D80015FEB7 /* MediaPlayerPrivateAVFoundationObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlayerPrivateAVFoundationObjC.h; sourceTree = "<group>"; };
                DF9AFD7113FC31D80015FEB7 /* MediaPlayerPrivateAVFoundationObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaPlayerPrivateAVFoundationObjC.mm; sourceTree = "<group>"; };
+               DFDB912CF8E88A6DA1AD264F /* AbortableTaskQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbortableTaskQueue.h; sourceTree = "<group>"; };
                E0FEF371B07C53EAC1C1FBEE /* EventSource.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventSource.idl; sourceTree = "<group>"; };
                E0FEF371B17C53EAC1C1FBEE /* EventSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventSource.h; sourceTree = "<group>"; };
                E0FEF371B27C53EAC1C1FBEE /* EventSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventSource.cpp; sourceTree = "<group>"; };
                                D00F5942216ECC7A000D71DB /* DOMWindowWebGPU.idl */,
                                D09727CA218BD7A500942F3A /* GPUDevice.cpp */,
                                D0615FCF217FF185008A48A8 /* GPUDevice.h */,
-                               D046FB68218D18CD00CB8F62 /* GPUPipelineDescriptorBase.h */,
                                D046FB67218D180300CB8F62 /* GPUPipelineStageDescriptor.h */,
                                D0C419FA21840F6C009EC1DE /* GPURenderPipeline.h */,
                                D046FB65218D073C00CB8F62 /* GPURenderPipelineDescriptor.h */,