# Copyright (c) 2021 Huawei Device Co., Ltd.
# 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.

import("//build/ohos.gni")
import("//third_party/vk-gl-cts/vk_gl_cts.gni")

config("deqp_spirvtool_reduce_config") {
  cflags_cc = deqp_common_cflags_cc
  cflags_cc += [ "-ftemplate-depth=1024" ]
  defines = deqp_common_defines
  defines += [
    "SPIRV_CHECK_CONTEXT",
    "SPIRV_COLOR_TERMINAL",
    "SPIRV_LINUX",
    "SPIRV_TIMER_ENABLED",
  ]
}

config("spv_headers_public_config") {
  include_dirs = [ "include" ]
}

config("spvtools_include_gen_dirs") {
  include_dirs = [ "$target_gen_dir" ]
}

config("spvtools_internal_config") {
  include_dirs = [
    ".",
    "//third_party/spirv-headers/include",
  ]

  configs = [
    ":spv_headers_public_config",
    ":spvtools_include_gen_dirs",
  ]

  cflags = []
  if (is_clang) {
    cflags += [
      "-Wno-implicit-fallthrough",
      "-Wno-newline-eof",
      "-Wno-unreachable-code-break",
      "-Wno-unreachable-code-return",
    ]
  } else if (!is_win) {
    # Work around a false-positive on a Skia GCC 10 builder.
    cflags += [ "-Wno-format-truncation" ]
  } else {
    # Make MSVC report the correct value for __cplusplus
    cflags += [ "/Zc:__cplusplus" ]
  }

  if (!is_win) {
    cflags += [ "-std=c++17" ]
  } else {
    cflags += [ "/std:c++17" ]
  }
}

ohos_source_set("deqp_spirvtool_reduce_source") {
  sources = [
    "//third_party/spirv-tools/include/spirv-tools/instrument.hpp",
    "//third_party/spirv-tools/include/spirv-tools/libspirv.h",
    "//third_party/spirv-tools/include/spirv-tools/libspirv.hpp",
    "//third_party/spirv-tools/include/spirv-tools/linker.hpp",
    "//third_party/spirv-tools/include/spirv-tools/optimizer.hpp",
    "//third_party/spirv-tools/source/reduce/change_operand_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/change_operand_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/merge_blocks_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/merge_blocks_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/merge_blocks_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/merge_blocks_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/operand_to_const_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/operand_to_const_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/operand_to_dominating_id_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/operand_to_dominating_id_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/operand_to_undef_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/operand_to_undef_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/reducer.cpp",
    "//third_party/spirv-tools/source/reduce/reducer.h",
    "//third_party/spirv-tools/source/reduce/reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/reduction_pass.cpp",
    "//third_party/spirv-tools/source/reduce/reduction_pass.h",
    "//third_party/spirv-tools/source/reduce/reduction_util.cpp",
    "//third_party/spirv-tools/source/reduce/reduction_util.h",
    "//third_party/spirv-tools/source/reduce/remove_block_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/remove_block_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/remove_block_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/remove_block_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/remove_function_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/remove_function_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/remove_function_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/remove_function_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/remove_selection_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/remove_selection_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/remove_selection_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/remove_selection_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/remove_struct_member_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/remove_struct_member_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/remove_unused_instruction_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/remove_unused_instruction_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/remove_unused_struct_member_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/remove_unused_struct_member_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/simple_conditional_branch_to_branch_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/simple_conditional_branch_to_branch_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/simple_conditional_branch_to_branch_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/simple_conditional_branch_to_branch_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity_finder.h",
    "//third_party/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.cpp",
    "//third_party/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.h",
    "//third_party/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity_finder.cpp",
    "//third_party/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity_finder.h",
  ]

  include_dirs = deqp_common_include_dirs
  include_dirs += [
    "//third_party/spirv-tools",
    "//third_party/vk-gl-cts/build/external/spirv-tools/spirv-tools",
    "//third_party/spirv-headers/include",
    "//third_party/spirv-tools/include",
  ]

  if (build_with_chromium) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }

  configs = [ ":deqp_spirvtool_reduce_config" ]
  configs += [ ":spv_headers_public_config" ]
  configs += [ ":spvtools_internal_config" ]
}

ohos_static_library("libdeqp_spirvtools-reduce") {
  deps = [
    ":deqp_spirvtool_reduce_source",
    "//third_party/spirv-tools:libdeqp_spirvtools",
    "//third_party/spirv-tools/source/opt:libdeqp_spirvtools-opt",
  ]
  part_name = "graphic_2d"
  subsystem_name = "graphic"
}