// Copyright 2023 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/client/SwapChain.h"

#include "dawn/wire/client/Client.h"
#include "dawn/wire/client/Device.h"
#include "dawn/wire/client/Texture.h"

namespace dawn::wire::client {

// static
WGPUSwapChain SwapChain::Create(Device* device,
                                WGPUSurface surface,
                                const WGPUSwapChainDescriptor* descriptor) {
    Client* wireClient = device->GetClient();
    SwapChain* swapChain = wireClient->Make<SwapChain>(surface, descriptor);

    // Send the Device::CreateSwapChain command without modifications.
    DeviceCreateSwapChainCmd cmd;
    cmd.self = ToAPI(device);
    cmd.selfId = device->GetWireId();
    cmd.descriptor = descriptor;
    cmd.result = swapChain->GetWireHandle();
    wireClient->SerializeCommand(cmd);

    return ToAPI(swapChain);
}

SwapChain::SwapChain(const ObjectBaseParams& params,
                     WGPUSurface,
                     const WGPUSwapChainDescriptor* descriptor)
    : ObjectBase(params) {
    mTextureDescriptor = {};
    mTextureDescriptor.size = {descriptor->width, descriptor->height, 1};
    mTextureDescriptor.format = descriptor->format;
    mTextureDescriptor.usage = descriptor->usage;
    mTextureDescriptor.dimension = WGPUTextureDimension_2D;
    mTextureDescriptor.mipLevelCount = 1;
    mTextureDescriptor.sampleCount = 1;
}

SwapChain::~SwapChain() = default;

WGPUTexture SwapChain::GetCurrentTexture() {
    Client* wireClient = GetClient();
    Texture* texture = wireClient->Make<Texture>(&mTextureDescriptor);

    SwapChainGetCurrentTextureCmd cmd;
    cmd.self = ToAPI(this);
    cmd.selfId = GetWireId();
    cmd.result = texture->GetWireHandle();
    wireClient->SerializeCommand(cmd);

    return ToAPI(texture);
}

}  // namespace dawn::wire::client
