/* Copyright (c) 2015-2023 The Khronos Group Inc.
 * Copyright (c) 2015-2023 Valve Corporation
 * Copyright (c) 2015-2023 LunarG, Inc.
 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
 * Modifications Copyright (C) 2022 RasterGrid Kft.
 *
 * 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 "best_practices/best_practices_validation.h"
#include "best_practices/best_practices_error_enums.h"

bool BestPractices::PreCallValidateGetVideoSessionMemoryRequirementsKHR(VkDevice device, VkVideoSessionKHR videoSession,
                                                                        uint32_t* pMemoryRequirementsCount,
                                                                        VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements,
                                                                        const ErrorObject& error_obj) const {
    bool skip = false;

    auto vs_state = Get<VIDEO_SESSION_STATE>(videoSession);
    if (vs_state) {
        if (pMemoryRequirements != nullptr && !vs_state->memory_binding_count_queried) {
            skip |= LogWarning(kVUID_BestPractices_GetVideoSessionMemReqCountNotRetrieved, videoSession, error_obj.location,
                               "querying list of memory requirements of %s "
                               "but the number of memory requirements has not been queried before by calling this "
                               "command with pMemoryRequirements set to NULL.",
                               FormatHandle(videoSession).c_str());
        }
    }

    return skip;
}

bool BestPractices::PreCallValidateBindVideoSessionMemoryKHR(VkDevice device, VkVideoSessionKHR videoSession,
                                                             uint32_t bindSessionMemoryInfoCount,
                                                             const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos,
                                                             const ErrorObject& error_obj) const {
    bool skip = false;

    auto vs_state = Get<VIDEO_SESSION_STATE>(videoSession);
    if (vs_state) {
        if (!vs_state->memory_binding_count_queried) {
            skip |= LogWarning(kVUID_BestPractices_BindVideoSessionMemReqCountNotRetrieved, videoSession, error_obj.location,
                               "binding memory to %s but "
                               "vkGetVideoSessionMemoryRequirementsKHR() has not been called to retrieve the "
                               "number of memory requirements for the video session.",
                               FormatHandle(videoSession).c_str());
        } else if (vs_state->memory_bindings_queried < vs_state->GetMemoryBindingCount()) {
            skip |= LogWarning(kVUID_BestPractices_BindVideoSessionMemReqNotAllBindingsRetrieved, videoSession, error_obj.location,
                               "binding memory to %s but "
                               "not all memory requirements for the video session have been queried using "
                               "vkGetVideoSessionMemoryRequirementsKHR().",
                               FormatHandle(videoSession).c_str());
        }
    }

    return skip;
}
