# Copyright 2020 The Dawn & Tint Authors
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

###############################################################################
# Dawn projects
###############################################################################

add_subdirectory(partition_alloc)
add_subdirectory(common)
add_subdirectory(platform)
add_subdirectory(native)
add_subdirectory(wire)
# TODO(dawn:269): Remove once the implementation-based swapchains are removed.
add_subdirectory(utils)
add_subdirectory(glfw)
add_subdirectory(tests/benchmarks)

if (DAWN_BUILD_SAMPLES)
    #TODO(dawn:269): Add this once implementation-based swapchains are removed.
    #add_subdirectory(src/utils)
    add_subdirectory(samples)
endif()

if (DAWN_BUILD_NODE_BINDINGS)
    set(NODE_BINDING_DEPS
        ${NODE_ADDON_API_DIR}
        ${NODE_API_HEADERS_DIR}
        ${WEBGPU_IDL_PATH}
    )
    foreach(DEP ${NODE_BINDING_DEPS})
        if (NOT EXISTS ${DEP})
            message(FATAL_ERROR
                "DAWN_BUILD_NODE_BINDINGS requires missing dependency '${DEP}'\n"
                "Please follow the 'Fetch dependencies' instructions at:\n"
                "./src/dawn/node/README.md"
            )
        endif()
    endforeach()
    if (NOT CMAKE_POSITION_INDEPENDENT_CODE)
        message(FATAL_ERROR "DAWN_BUILD_NODE_BINDINGS requires building with DAWN_ENABLE_PIC")
    endif()

    add_subdirectory(node)
endif()

###############################################################################
# Dawn headers
###############################################################################

DawnJSONGenerator(
    TARGET "headers"
    PRINT_NAME "Dawn headers"
    RESULT_VARIABLE "DAWN_HEADERS_GEN_SOURCES"
)

# Headers only INTERFACE library with generated headers don't work in CMake
# because the GENERATED property is local to a directory. Instead we make a
# STATIC library with a placeholder cpp file.
#
# INTERFACE libraries can only have INTERFACE sources so the sources get added
# to the dependant's list of sources. If these dependents are in another
# directory, they don't see the GENERATED property and fail to configure
# because the file doesn't exist on disk.
add_library(dawn_headers STATIC ${DAWN_PLACEHOLDER_FILE})
common_compile_options(dawn_headers)
target_sources(dawn_headers INTERFACE
    "${DAWN_INCLUDE_DIR}/webgpu/webgpu.h"
    PRIVATE
    ${DAWN_HEADERS_GEN_SOURCES}
)
target_link_libraries(dawn_headers INTERFACE dawn_public_config)
install_if_enabled(dawn_headers)

###############################################################################
# Dawn C++ headers
###############################################################################

DawnJSONGenerator(
    TARGET "cpp_headers"
    PRINT_NAME "Dawn C++ headers"
    RESULT_VARIABLE "DAWNCPP_HEADERS_GEN_SOURCES"
)

# This headers only library needs to be a STATIC library, see comment for
# dawn_headers above.
add_library(dawncpp_headers STATIC ${DAWN_PLACEHOLDER_FILE})
common_compile_options(dawncpp_headers)
target_sources(dawncpp_headers
  INTERFACE
    "${DAWN_INCLUDE_DIR}/webgpu/webgpu_cpp.h"
    "${DAWN_INCLUDE_DIR}/webgpu/webgpu_enum_class_bitmasks.h"
  PRIVATE
    ${DAWNCPP_HEADERS_GEN_SOURCES}
)
target_link_libraries(dawncpp_headers INTERFACE dawn_headers)
install_if_enabled(dawncpp_headers)
###############################################################################
# Dawn C++ wrapper
###############################################################################

DawnJSONGenerator(
    TARGET "cpp"
    PRINT_NAME "Dawn C++ wrapper"
    RESULT_VARIABLE "DAWNCPP_GEN_SOURCES"
)

add_library(dawncpp STATIC ${DAWN_PLACEHOLDER_FILE})
common_compile_options(dawncpp)
target_sources(dawncpp PRIVATE ${DAWNCPP_GEN_SOURCES})
target_link_libraries(dawncpp PUBLIC dawncpp_headers)

add_library(webgpu_cpp ALIAS dawncpp)

install_if_enabled(dawncpp)

###############################################################################
# libdawn_proc
###############################################################################

DawnJSONGenerator(
    TARGET "proc"
    PRINT_NAME "Dawn C++ wrapper"
    RESULT_VARIABLE "DAWNPROC_GEN_SOURCES"
)

add_library(dawn_proc ${DAWN_PLACEHOLDER_FILE})
common_compile_options(dawn_proc)
target_compile_definitions(dawn_proc PRIVATE "WGPU_IMPLEMENTATION")
if(BUILD_SHARED_LIBS)
    target_compile_definitions(dawn_proc PRIVATE "WGPU_SHARED_LIBRARY")
endif()
target_sources(dawn_proc
  INTERFACE
    "${DAWN_INCLUDE_DIR}/dawn/dawn_thread_dispatch_proc.h"
    "${DAWN_INCLUDE_DIR}/dawn/dawn_proc.h"
  PRIVATE
    ${DAWNPROC_GEN_SOURCES}
)
target_link_libraries(dawn_proc
  PUBLIC
  dawn_headers
  PRIVATE
  dawn_common
  dawn_internal_config
)

install_if_enabled(dawn_proc)

###############################################################################
# Other generated files (upstream header, emscripten header, emscripten bits)
###############################################################################

DawnJSONGenerator(
    TARGET "webgpu_headers"
    PRINT_NAME "WebGPU headers"
    RESULT_VARIABLE "WEBGPU_HEADERS_GEN_SOURCES"
)
add_custom_target(webgpu_headers_gen
    DEPENDS ${WEBGPU_HEADERS_GEN_SOURCES}
)

DawnJSONGenerator(
    TARGET "emscripten_bits"
    PRINT_NAME "Emscripten WebGPU bits"
    RESULT_VARIABLE "EMSCRIPTEN_BITS_GEN_SOURCES"
)
add_custom_target(emscripten_bits_gen
    DEPENDS ${EMSCRIPTEN_BITS_GEN_SOURCES}
)
