// 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/native/Limits.h"

#include "dawn/common/Assert.h"

#include <array>

// clang-format off
// TODO(crbug.com/dawn/685):
// For now, only expose these tiers until metrics can determine better ones.
#define LIMITS_WORKGROUP_STORAGE_SIZE(X)                                  \
    X(Higher, maxComputeWorkgroupStorageSize, 16352, 32768, 49152, 65536)

#define LIMITS_STORAGE_BUFFER_BINDING_SIZE(X)                                             \
    X(Higher, maxStorageBufferBindingSize, 134217728, 1073741824, 2147483647, 4294967295)

// TODO(crbug.com/dawn/685):
// These limits don't have tiers yet. Define two tiers with the same values since the macros
// in this file expect more than one tier.
#define LIMITS_OTHER(X)                                                \
    X(Higher,                     maxTextureDimension1D,  8192,  8192) \
    X(Higher,                     maxTextureDimension2D,  8192,  8192) \
    X(Higher,                     maxTextureDimension3D,  2048,  2048) \
    X(Higher,                     maxTextureArrayLayers,   256,   256) \
    X(Higher,                             maxBindGroups,     4,     4) \
    X(Higher, maxDynamicUniformBuffersPerPipelineLayout,     8,     8) \
    X(Higher, maxDynamicStorageBuffersPerPipelineLayout,     4,     4) \
    X(Higher,          maxSampledTexturesPerShaderStage,    16,    16) \
    X(Higher,                 maxSamplersPerShaderStage,    16,    16) \
    X(Higher,           maxStorageBuffersPerShaderStage,     8,     8) \
    X(Higher,          maxStorageTexturesPerShaderStage,     4,     4) \
    X(Higher,           maxUniformBuffersPerShaderStage,    12,    12) \
    X(Higher,               maxUniformBufferBindingSize, 65536, 65536) \
    X( Lower,           minUniformBufferOffsetAlignment,   256,   256) \
    X( Lower,           minStorageBufferOffsetAlignment,   256,   256) \
    X(Higher,                          maxVertexBuffers,     8,     8) \
    X(Higher,                       maxVertexAttributes,    16,    16) \
    X(Higher,                maxVertexBufferArrayStride,  2048,  2048) \
    X(Higher,             maxInterStageShaderComponents,    60,    60) \
    X(Higher,         maxComputeInvocationsPerWorkgroup,   256,   256) \
    X(Higher,                  maxComputeWorkgroupSizeX,   256,   256) \
    X(Higher,                  maxComputeWorkgroupSizeY,   256,   256) \
    X(Higher,                  maxComputeWorkgroupSizeZ,    64,    64) \
    X(Higher,          maxComputeWorkgroupsPerDimension, 65535, 65535)
// clang-format on

#define LIMITS_EACH_GROUP(X)              \
    X(LIMITS_WORKGROUP_STORAGE_SIZE)      \
    X(LIMITS_STORAGE_BUFFER_BINDING_SIZE) \
    X(LIMITS_OTHER)

#define LIMITS(X)                         \
    LIMITS_WORKGROUP_STORAGE_SIZE(X)      \
    LIMITS_STORAGE_BUFFER_BINDING_SIZE(X) \
    LIMITS_OTHER(X)

namespace dawn::native {
    namespace {
        template <uint32_t A, uint32_t B>
        constexpr void StaticAssertSame() {
            static_assert(A == B, "Mismatching tier count in limit group.");
        }

        template <uint32_t I, uint32_t... Is>
        constexpr uint32_t ReduceSameValue(std::integer_sequence<uint32_t, I, Is...>) {
            int unused[] = {0, (StaticAssertSame<I, Is>(), 0)...};
            DAWN_UNUSED(unused);
            return I;
        }

        enum class LimitBetterDirection {
            Lower,
            Higher,
        };

        template <LimitBetterDirection Better>
        struct CheckLimit;

        template <>
        struct CheckLimit<LimitBetterDirection::Lower> {
            template <typename T>
            static bool IsBetter(T lhs, T rhs) {
                return lhs < rhs;
            }

            template <typename T>
            static MaybeError Validate(T supported, T required) {
                DAWN_INVALID_IF(IsBetter(required, supported),
                                "Required limit (%u) is lower than the supported limit (%u).",
                                required, supported);
                return {};
            }
        };

        template <>
        struct CheckLimit<LimitBetterDirection::Higher> {
            template <typename T>
            static bool IsBetter(T lhs, T rhs) {
                return lhs > rhs;
            }

            template <typename T>
            static MaybeError Validate(T supported, T required) {
                DAWN_INVALID_IF(IsBetter(required, supported),
                                "Required limit (%u) is greater than the supported limit (%u).",
                                required, supported);
                return {};
            }
        };

        template <typename T>
        bool IsLimitUndefined(T value) {
            static_assert(sizeof(T) != sizeof(T), "IsLimitUndefined not implemented for this type");
            return false;
        }

        template <>
        bool IsLimitUndefined<uint32_t>(uint32_t value) {
            return value == wgpu::kLimitU32Undefined;
        }

        template <>
        bool IsLimitUndefined<uint64_t>(uint64_t value) {
            return value == wgpu::kLimitU64Undefined;
        }

    }  // namespace

    void GetDefaultLimits(Limits* limits) {
        ASSERT(limits != nullptr);
#define X(Better, limitName, base, ...) limits->limitName = base;
        LIMITS(X)
#undef X
    }

    Limits ReifyDefaultLimits(const Limits& limits) {
        Limits out;
#define X(Better, limitName, base, ...)                                           \
    if (IsLimitUndefined(limits.limitName) ||                                     \
        CheckLimit<LimitBetterDirection::Better>::IsBetter(                       \
            static_cast<decltype(limits.limitName)>(base), limits.limitName)) {   \
        /* If the limit is undefined or the default is better, use the default */ \
        out.limitName = base;                                                     \
    } else {                                                                      \
        out.limitName = limits.limitName;                                         \
    }
        LIMITS(X)
#undef X
        return out;
    }

    MaybeError ValidateLimits(const Limits& supportedLimits, const Limits& requiredLimits) {
#define X(Better, limitName, ...)                                                  \
    if (!IsLimitUndefined(requiredLimits.limitName)) {                             \
        DAWN_TRY_CONTEXT(CheckLimit<LimitBetterDirection::Better>::Validate(       \
                             supportedLimits.limitName, requiredLimits.limitName), \
                         "validating " #limitName);                                \
    }
        LIMITS(X)
#undef X
        return {};
    }

    Limits ApplyLimitTiers(Limits limits) {
#define X_TIER_COUNT(Better, limitName, ...) , std::integer_sequence<uint64_t, __VA_ARGS__>{}.size()
#define GET_TIER_COUNT(LIMIT_GROUP) \
    ReduceSameValue(std::integer_sequence<uint32_t LIMIT_GROUP(X_TIER_COUNT)>{})

#define X_EACH_GROUP(LIMIT_GROUP)                                    \
    {                                                                \
        constexpr uint32_t kTierCount = GET_TIER_COUNT(LIMIT_GROUP); \
        for (uint32_t i = kTierCount; i != 0; --i) {                 \
            LIMIT_GROUP(X_CHECK_BETTER_AND_CLAMP)                    \
            /* Limits fit in tier and have been clamped. Break. */   \
            break;                                                   \
        }                                                            \
    }

#define X_CHECK_BETTER_AND_CLAMP(Better, limitName, ...)                                       \
    {                                                                                          \
        constexpr std::array<decltype(Limits::limitName), kTierCount> tiers{__VA_ARGS__};      \
        decltype(Limits::limitName) tierValue = tiers[i - 1];                                  \
        if (CheckLimit<LimitBetterDirection::Better>::IsBetter(tierValue, limits.limitName)) { \
            /* The tier is better. Go to the next tier. */                                     \
            continue;                                                                          \
        } else if (tierValue != limits.limitName) {                                            \
            /* Better than the tier. Degrade |limits| to the tier. */                          \
            limits.limitName = tiers[i - 1];                                                   \
        }                                                                                      \
    }

        LIMITS_EACH_GROUP(X_EACH_GROUP)
#undef X_CHECK_BETTER
#undef X_EACH_GROUP
#undef GET_TIER_COUNT
#undef X_TIER_COUNT
        return limits;
    }

}  // namespace dawn::native
