# Copyright 2020 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.

add_library(dawn_utils STATIC ${DAWN_DUMMY_FILE})
common_compile_options(dawn_utils)
target_sources(dawn_utils PRIVATE
    "ComboRenderBundleEncoderDescriptor.cpp"
    "ComboRenderBundleEncoderDescriptor.h"
    "ComboRenderPipelineDescriptor.cpp"
    "ComboRenderPipelineDescriptor.h"
    "PlatformDebugLogger.h"
    "ScopedAutoreleasePool.cpp"
    "ScopedAutoreleasePool.h"
    "SystemUtils.cpp"
    "SystemUtils.h"
    "TerribleCommandBuffer.cpp"
    "TerribleCommandBuffer.h"
    "TestUtils.cpp"
    "TestUtils.h"
    "TextureUtils.cpp"
    "TextureUtils.h"
    "Timer.h"
    "WGPUHelpers.cpp"
    "WGPUHelpers.h"
    "WireHelper.cpp"
    "WireHelper.h"
)
target_link_libraries(dawn_utils
    PUBLIC dawncpp_headers
    PRIVATE dawn_internal_config
            dawn_common
            dawn_native
            dawn_proc
            dawn_wire
            SPIRV-Tools-opt
)

if(WIN32 AND NOT WINDOWS_STORE)
    target_sources(dawn_utils PRIVATE "WindowsDebugLogger.cpp")
else()
    target_sources(dawn_utils PRIVATE "EmptyDebugLogger.cpp")
endif()

if(WIN32)
    target_sources(dawn_utils PRIVATE "WindowsTimer.cpp")
elseif(APPLE)
    target_sources(dawn_utils PRIVATE
        "OSXTimer.cpp"
        "ObjCUtils.h"
        "ObjCUtils.mm"
    )
    target_link_libraries(dawn_utils PRIVATE "-framework QuartzCore")
elseif(UNIX)
    target_sources(dawn_utils PRIVATE "PosixTimer.cpp")
endif()

if (DAWN_ENABLE_METAL)
    target_link_libraries(dawn_utils PRIVATE "-framework Metal")
endif()

if(DAWN_SUPPORTS_GLFW_FOR_WINDOWING)
    target_sources(dawn_utils PRIVATE
        "BackendBinding.cpp"
        "BackendBinding.h"
        "GLFWUtils.cpp"
        "GLFWUtils.h"
    )
    target_link_libraries(dawn_utils PRIVATE glfw)

    if (DAWN_ENABLE_D3D12)
        target_sources(dawn_utils PRIVATE "D3D12Binding.cpp")
    endif()

    if (DAWN_ENABLE_METAL)
        target_sources(dawn_utils PRIVATE
            "GLFWUtils_metal.mm"
            "MetalBinding.mm"
        )
    endif()

    if (DAWN_ENABLE_NULL)
        target_sources(dawn_utils PRIVATE "NullBinding.cpp")
    endif()

    if (DAWN_ENABLE_OPENGL)
        target_sources(dawn_utils PRIVATE "OpenGLBinding.cpp")
    endif()

    if (DAWN_ENABLE_VULKAN)
        target_sources(dawn_utils PRIVATE "VulkanBinding.cpp")
    endif()
endif()
