// Copyright 2017 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 DAWNNATIVE_COMMANDS_H_
#define DAWNNATIVE_COMMANDS_H_

#include "dawn/common/Constants.h"

#include "dawn/native/AttachmentState.h"
#include "dawn/native/BindingInfo.h"
#include "dawn/native/Texture.h"

#include "dawn/native/dawn_platform.h"

#include <array>
#include <bitset>

namespace dawn::native {

    // Definition of the commands that are present in the CommandIterator given by the
    // CommandBufferBuilder. There are not defined in CommandBuffer.h to break some header
    // dependencies: Ref<Object> needs Object to be defined.

    enum class Command {
        BeginComputePass,
        BeginOcclusionQuery,
        BeginRenderPass,
        ClearBuffer,
        CopyBufferToBuffer,
        CopyBufferToTexture,
        CopyTextureToBuffer,
        CopyTextureToTexture,
        Dispatch,
        DispatchIndirect,
        Draw,
        DrawIndexed,
        DrawIndirect,
        DrawIndexedIndirect,
        EndComputePass,
        EndOcclusionQuery,
        EndRenderPass,
        ExecuteBundles,
        InsertDebugMarker,
        PopDebugGroup,
        PushDebugGroup,
        ResolveQuerySet,
        SetComputePipeline,
        SetRenderPipeline,
        SetStencilReference,
        SetViewport,
        SetScissorRect,
        SetBlendConstant,
        SetBindGroup,
        SetIndexBuffer,
        SetVertexBuffer,
        WriteBuffer,
        WriteTimestamp,
    };

    struct BeginComputePassCmd {};

    struct BeginOcclusionQueryCmd {
        Ref<QuerySetBase> querySet;
        uint32_t queryIndex;
    };

    struct RenderPassColorAttachmentInfo {
        Ref<TextureViewBase> view;
        Ref<TextureViewBase> resolveTarget;
        wgpu::LoadOp loadOp;
        wgpu::StoreOp storeOp;
        dawn::native::Color clearColor;
    };

    struct RenderPassDepthStencilAttachmentInfo {
        Ref<TextureViewBase> view;
        wgpu::LoadOp depthLoadOp;
        wgpu::StoreOp depthStoreOp;
        wgpu::LoadOp stencilLoadOp;
        wgpu::StoreOp stencilStoreOp;
        float clearDepth;
        uint32_t clearStencil;
        bool depthReadOnly;
        bool stencilReadOnly;
    };

    struct BeginRenderPassCmd {
        Ref<AttachmentState> attachmentState;
        ityp::array<ColorAttachmentIndex, RenderPassColorAttachmentInfo, kMaxColorAttachments>
            colorAttachments;
        RenderPassDepthStencilAttachmentInfo depthStencilAttachment;

        // Cache the width and height of all attachments for convenience
        uint32_t width;
        uint32_t height;

        Ref<QuerySetBase> occlusionQuerySet;
    };

    struct BufferCopy {
        Ref<BufferBase> buffer;
        uint64_t offset;
        uint32_t bytesPerRow;
        uint32_t rowsPerImage;
    };

    struct TextureCopy {
        Ref<TextureBase> texture;
        uint32_t mipLevel;
        Origin3D origin;  // Texels / array layer
        Aspect aspect;
    };

    struct CopyBufferToBufferCmd {
        Ref<BufferBase> source;
        uint64_t sourceOffset;
        Ref<BufferBase> destination;
        uint64_t destinationOffset;
        uint64_t size;
    };

    struct CopyBufferToTextureCmd {
        BufferCopy source;
        TextureCopy destination;
        Extent3D copySize;  // Texels
    };

    struct CopyTextureToBufferCmd {
        TextureCopy source;
        BufferCopy destination;
        Extent3D copySize;  // Texels
    };

    struct CopyTextureToTextureCmd {
        TextureCopy source;
        TextureCopy destination;
        Extent3D copySize;  // Texels
    };

    struct DispatchCmd {
        uint32_t x;
        uint32_t y;
        uint32_t z;
    };

    struct DispatchIndirectCmd {
        Ref<BufferBase> indirectBuffer;
        uint64_t indirectOffset;
    };

    struct DrawCmd {
        uint32_t vertexCount;
        uint32_t instanceCount;
        uint32_t firstVertex;
        uint32_t firstInstance;
    };

    struct DrawIndexedCmd {
        uint32_t indexCount;
        uint32_t instanceCount;
        uint32_t firstIndex;
        int32_t baseVertex;
        uint32_t firstInstance;
    };

    struct DrawIndirectCmd {
        Ref<BufferBase> indirectBuffer;
        uint64_t indirectOffset;
    };

    struct DrawIndexedIndirectCmd {
        Ref<BufferBase> indirectBuffer;
        uint64_t indirectOffset;
    };

    struct EndComputePassCmd {};

    struct EndOcclusionQueryCmd {
        Ref<QuerySetBase> querySet;
        uint32_t queryIndex;
    };

    struct EndRenderPassCmd {};

    struct ExecuteBundlesCmd {
        uint32_t count;
    };

    struct ClearBufferCmd {
        Ref<BufferBase> buffer;
        uint64_t offset;
        uint64_t size;
    };

    struct InsertDebugMarkerCmd {
        uint32_t length;
    };

    struct PopDebugGroupCmd {};

    struct PushDebugGroupCmd {
        uint32_t length;
    };

    struct ResolveQuerySetCmd {
        Ref<QuerySetBase> querySet;
        uint32_t firstQuery;
        uint32_t queryCount;
        Ref<BufferBase> destination;
        uint64_t destinationOffset;
    };

    struct SetComputePipelineCmd {
        Ref<ComputePipelineBase> pipeline;
    };

    struct SetRenderPipelineCmd {
        Ref<RenderPipelineBase> pipeline;
    };

    struct SetStencilReferenceCmd {
        uint32_t reference;
    };

    struct SetViewportCmd {
        float x, y, width, height, minDepth, maxDepth;
    };

    struct SetScissorRectCmd {
        uint32_t x, y, width, height;
    };

    struct SetBlendConstantCmd {
        Color color;
    };

    struct SetBindGroupCmd {
        BindGroupIndex index;
        Ref<BindGroupBase> group;
        uint32_t dynamicOffsetCount;
    };

    struct SetIndexBufferCmd {
        Ref<BufferBase> buffer;
        wgpu::IndexFormat format;
        uint64_t offset;
        uint64_t size;
    };

    struct SetVertexBufferCmd {
        VertexBufferSlot slot;
        Ref<BufferBase> buffer;
        uint64_t offset;
        uint64_t size;
    };

    struct WriteBufferCmd {
        Ref<BufferBase> buffer;
        uint64_t offset;
        uint64_t size;
    };

    struct WriteTimestampCmd {
        Ref<QuerySetBase> querySet;
        uint32_t queryIndex;
    };

    // This needs to be called before the CommandIterator is freed so that the Ref<> present in
    // the commands have a chance to run their destructor and remove internal references.
    class CommandIterator;
    void FreeCommands(CommandIterator* commands);

    // Helper function to allow skipping over a command when it is unimplemented, while still
    // consuming the correct amount of data from the command iterator.
    void SkipCommand(CommandIterator* commands, Command type);

}  // namespace dawn::native

#endif  // DAWNNATIVE_COMMANDS_H_
