// Copyright 2021 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.

#include "dawn_wire/server/Server.h"

#include <memory>

namespace dawn_wire { namespace server {

    bool Server::DoShaderModuleGetCompilationInfo(ObjectId shaderModuleId, uint64_t requestSerial) {
        auto* shaderModule = ShaderModuleObjects().Get(shaderModuleId);
        if (shaderModule == nullptr) {
            return false;
        }

        auto userdata = MakeUserdata<ShaderModuleGetCompilationInfoUserdata>();
        userdata->shaderModule = ObjectHandle{shaderModuleId, shaderModule->generation};
        userdata->requestSerial = requestSerial;

        mProcs.shaderModuleGetCompilationInfo(
            shaderModule->handle,
            ForwardToServer<decltype(&Server::OnShaderModuleGetCompilationInfo)>::Func<
                &Server::OnShaderModuleGetCompilationInfo>(),
            userdata.release());
        return true;
    }

    void Server::OnShaderModuleGetCompilationInfo(WGPUCompilationInfoRequestStatus status,
                                                  const WGPUCompilationInfo* info,
                                                  ShaderModuleGetCompilationInfoUserdata* data) {
        ReturnShaderModuleGetCompilationInfoCallbackCmd cmd;
        cmd.shaderModule = data->shaderModule;
        cmd.requestSerial = data->requestSerial;
        cmd.status = status;
        cmd.info = info;

        SerializeCommand(cmd);
    }

}}  // namespace dawn_wire::server
