text: // Copyright 2020 The Dawn Authors
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  //
  //     http://www.apache.org/licenses/LICENSE-2.0
  //
  // Unless required by applicable law or agreed to in writing, software
  // distributed under the License is distributed on an "AS IS" BASIS,
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  // See the License for the specific language governing permissions and
  // limitations under the License.
  
  #ifndef SRC_DAWN_NATIVE_CREATEPIPELINEASYNCTASK_H_
  #define SRC_DAWN_NATIVE_CREATEPIPELINEASYNCTASK_H_
  
  #include <memory>
  #include <string>
  
  #include "dawn/common/RefCounted.h"
  #include "dawn/native/CallbackTaskManager.h"
  #include "dawn/native/Error.h"
  #include "dawn/webgpu.h"
  
  namespace dawn::native {
  
  class ComputePipelineBase;
  class DeviceBase;
  class PipelineLayoutBase;
  class RenderPipelineBase;
  class ShaderModuleBase;
  struct FlatComputePipelineDescriptor;
  
  struct CreatePipelineAsyncCallbackTaskBase : CallbackTask {
      CreatePipelineAsyncCallbackTaskBase(std::string errorMessage, void* userData);
  
    protected:
      std::string mErrorMessage;
      void* mUserData;
  };
  
  struct CreateComputePipelineAsyncCallbackTask : CreatePipelineAsyncCallbackTaskBase {
      CreateComputePipelineAsyncCallbackTask(Ref<ComputePipelineBase> pipeline,
                                             std::string errorMessage,
                                             WGPUCreateComputePipelineAsyncCallback callback,
                                             void* userdata);
  
      void Finish() override;
      void HandleShutDown() final;
      void HandleDeviceLoss() final;
  
    protected:
      Ref<ComputePipelineBase> mPipeline;
      WGPUCreateComputePipelineAsyncCallback mCreateComputePipelineAsyncCallback;
  };
  
  struct CreateRenderPipelineAsyncCallbackTask : CreatePipelineAsyncCallbackTaskBase {
      CreateRenderPipelineAsyncCallbackTask(Ref<RenderPipelineBase> pipeline,
                                            std::string errorMessage,
                                            WGPUCreateRenderPipelineAsyncCallback callback,
                                            void* userdata);
  
      void Finish() override;
      void HandleShutDown() final;
      void HandleDeviceLoss() final;
  
    protected:
      Ref<RenderPipelineBase> mPipeline;
      WGPUCreateRenderPipelineAsyncCallback mCreateRenderPipelineAsyncCallback;
  };
  
  // CreateComputePipelineAsyncTask defines all the inputs and outputs of
  // CreateComputePipelineAsync() tasks, which are the same among all the backends.
  class CreateComputePipelineAsyncTask {
    public:
      CreateComputePipelineAsyncTask(Ref<ComputePipelineBase> nonInitializedComputePipeline,
                                     WGPUCreateComputePipelineAsyncCallback callback,
                                     void* userdata);
  
      void Run();
  
      static void RunAsync(std::unique_ptr<CreateComputePipelineAsyncTask> task);
  
    private:
      Ref<ComputePipelineBase> mComputePipeline;
      WGPUCreateComputePipelineAsyncCallback mCallback;
      void* mUserdata;
  };
  
  // CreateRenderPipelineAsyncTask defines all the inputs and outputs of
  // CreateRenderPipelineAsync() tasks, which are the same among all the backends.
  class CreateRenderPipelineAsyncTask {
    public:
      CreateRenderPipelineAsyncTask(Ref<RenderPipelineBase> nonInitializedRenderPipeline,
                                    WGPUCreateRenderPipelineAsyncCallback callback,
                                    void* userdata);
  
      void Run();
  
      static void RunAsync(std::unique_ptr<CreateRenderPipelineAsyncTask> task);
  
    private:
      Ref<RenderPipelineBase> mRenderPipeline;
      WGPUCreateRenderPipelineAsyncCallback mCallback;
      void* mUserdata;
  };
  
  }  // namespace dawn::native
  
  #endif  // SRC_DAWN_NATIVE_CREATEPIPELINEASYNCTASK_H_
  