Descriptorize ComputePipeline

Change-Id: Ic9d7014ba44d927d7f9ddf81a8870432c68941e8
diff --git a/src/dawn_native/ComputePipeline.cpp b/src/dawn_native/ComputePipeline.cpp
index 0ffcfe6..8829996 100644
--- a/src/dawn_native/ComputePipeline.cpp
+++ b/src/dawn_native/ComputePipeline.cpp
@@ -18,24 +18,31 @@
 
 namespace dawn_native {
 
+    MaybeError ValidateComputePipelineDescriptor(DeviceBase*,
+                                                 const ComputePipelineDescriptor* descriptor) {
+        DAWN_TRY_ASSERT(descriptor->nextInChain == nullptr, "nextInChain must be nullptr");
+
+        if (descriptor->entryPoint != std::string("main")) {
+            DAWN_RETURN_ERROR("Currently the entry point has to be main()");
+        }
+
+        if (descriptor->module->GetExecutionModel() != dawn::ShaderStage::Compute) {
+            DAWN_RETURN_ERROR("Setting module with wrong execution model");
+        }
+
+        if (!descriptor->module->IsCompatibleWithPipelineLayout(descriptor->layout)) {
+            DAWN_RETURN_ERROR("Stage not compatible with layout");
+        }
+
+        return {};
+    }
+
     // ComputePipelineBase
 
-    ComputePipelineBase::ComputePipelineBase(ComputePipelineBuilder* builder)
-        : PipelineBase(builder) {
-        if (GetStageMask() != dawn::ShaderStageBit::Compute) {
-            builder->HandleError("Compute pipeline should have exactly a compute stage");
-            return;
-        }
-    }
-
-    // ComputePipelineBuilder
-
-    ComputePipelineBuilder::ComputePipelineBuilder(DeviceBase* device)
-        : Builder(device), PipelineBuilder(this) {
-    }
-
-    ComputePipelineBase* ComputePipelineBuilder::GetResultImpl() {
-        return mDevice->CreateComputePipeline(this);
+    ComputePipelineBase::ComputePipelineBase(DeviceBase* device,
+                                             const ComputePipelineDescriptor* descriptor)
+        : PipelineBase(device, descriptor->layout, dawn::ShaderStageBit::Compute) {
+        ExtractModuleData(dawn::ShaderStage::Compute, descriptor->module);
     }
 
 }  // namespace dawn_native