//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// CLKernelImpl.h: Defines the abstract rx::CLKernelImpl class.

#ifndef LIBANGLE_RENDERER_CLKERNELIMPL_H_
#define LIBANGLE_RENDERER_CLKERNELIMPL_H_

#include "libANGLE/renderer/CLtypes.h"

namespace rx
{

class CLKernelImpl : angle::NonCopyable
{
  public:
    using Ptr         = std::unique_ptr<CLKernelImpl>;
    using CreateFunc  = std::function<Ptr(const cl::Kernel &)>;
    using CreateFuncs = std::list<CreateFunc>;

    struct WorkGroupInfo
    {
        WorkGroupInfo();
        ~WorkGroupInfo();

        WorkGroupInfo(const WorkGroupInfo &) = delete;
        WorkGroupInfo &operator=(const WorkGroupInfo &) = delete;

        WorkGroupInfo(WorkGroupInfo &&);
        WorkGroupInfo &operator=(WorkGroupInfo &&);

        std::array<size_t, 3u> globalWorkSize       = {};
        size_t workGroupSize                        = 0u;
        std::array<size_t, 3u> compileWorkGroupSize = {};
        cl_ulong localMemSize                       = 0u;
        size_t prefWorkGroupSizeMultiple            = 0u;
        cl_ulong privateMemSize                     = 0u;
    };

    struct ArgInfo
    {
        ArgInfo();
        ~ArgInfo();

        ArgInfo(const ArgInfo &) = delete;
        ArgInfo &operator=(const ArgInfo &) = delete;

        ArgInfo(ArgInfo &&);
        ArgInfo &operator=(ArgInfo &&);

        bool isAvailable() const { return !name.empty(); }

        cl_kernel_arg_address_qualifier addressQualifier = 0u;
        cl_kernel_arg_access_qualifier accessQualifier   = 0u;
        std::string typeName;
        cl_kernel_arg_type_qualifier typeQualifier = 0u;
        std::string name;
    };

    struct Info
    {
        Info();
        ~Info();

        Info(const Info &) = delete;
        Info &operator=(const Info &) = delete;

        Info(Info &&);
        Info &operator=(Info &&);

        bool isValid() const { return !functionName.empty(); }

        std::string functionName;
        cl_uint numArgs = 0u;
        std::string attributes;

        std::vector<WorkGroupInfo> workGroups;
        std::vector<ArgInfo> args;
    };

    CLKernelImpl(const cl::Kernel &kernel);
    virtual ~CLKernelImpl();

    virtual cl_int setArg(cl_uint argIndex, size_t argSize, const void *argValue) = 0;

    virtual Info createInfo(cl_int &errorCode) const = 0;

  protected:
    const cl::Kernel &mKernel;
};

}  // namespace rx

#endif  // LIBANGLE_RENDERER_CLKERNELIMPL_H_
