diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6f87c94 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,36 @@ +name: ci +on: + push: + tags-ignore: v*.* + branches: + - '*' + pull_request: + branches: + - '*' +jobs: + build-linux: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: init + run: sudo apt install -yqq ninja-build xorg-dev g++-11 + - name: configure gcc + run: cmake -S . --preset=default -B build -DCMAKE_CXX_COMPILER=g++-11 -DFACADE_BUILD_SHADERS=OFF + - name: configure clang + run: cmake -S . --preset=ninja-clang -B clang -DFACADE_BUILD_SHADERS=OFF + - name: build gcc + run: cmake --build build --config=Release + - name: build clang + run: cmake --build clang --config=Release + - name: test + run: cd build && ctest -C Release + build-windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: configure + run: cmake -S . --preset=vs22 -B build -DFACADE_BUILD_SHADERS=OFF + - name: build + run: cmake --build build --config=Release + - name: test + run: cd build && ctest -C Release diff --git a/CMakeLists.txt b/CMakeLists.txt index 30c602d..d384d36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,27 +6,31 @@ set(CMAKE_DEBUG_POSTFIX "-d") project(facade) +option(FACADE_BUILD_SHADERS ON) + add_subdirectory(ext) add_subdirectory(cmake/interface) add_subdirectory(tools/embed_shader) add_subdirectory(facade-lib) -add_custom_command( - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/shaders/default.vert - ${CMAKE_CURRENT_SOURCE_DIR}/shaders/unlit.frag - ${CMAKE_CURRENT_SOURCE_DIR}/shaders/lit.frag - - OUTPUT - ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/default_vert.spv.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/unlit_frag.spv.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/lit_frag.spv.hpp - - COMMAND embed-shader ${CMAKE_CURRENT_SOURCE_DIR}/shaders/default.vert > ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/default_vert.spv.hpp - COMMAND embed-shader ${CMAKE_CURRENT_SOURCE_DIR}/shaders/unlit.frag > ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/unlit_frag.spv.hpp - COMMAND embed-shader ${CMAKE_CURRENT_SOURCE_DIR}/shaders/lit.frag > ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/lit_frag.spv.hpp -) +if(FACADE_BUILD_SHADERS) + add_custom_command( + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/shaders/default.vert + ${CMAKE_CURRENT_SOURCE_DIR}/shaders/unlit.frag + ${CMAKE_CURRENT_SOURCE_DIR}/shaders/lit.frag + + OUTPUT + ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/default_vert.spv.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/unlit_frag.spv.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/lit_frag.spv.hpp + + COMMAND embed-shader ${CMAKE_CURRENT_SOURCE_DIR}/shaders/default.vert > ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/default_vert.spv.hpp + COMMAND embed-shader ${CMAKE_CURRENT_SOURCE_DIR}/shaders/unlit.frag > ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/unlit_frag.spv.hpp + COMMAND embed-shader ${CMAKE_CURRENT_SOURCE_DIR}/shaders/lit.frag > ${CMAKE_CURRENT_SOURCE_DIR}/src/bin/lit_frag.spv.hpp + ) +endif() add_executable(${PROJECT_NAME}) diff --git a/facade-lib/src/detail/gltf.cpp b/facade-lib/src/detail/gltf.cpp index d894735..3fd2563 100644 --- a/facade-lib/src/detail/gltf.cpp +++ b/facade-lib/src/detail/gltf.cpp @@ -538,7 +538,7 @@ Geometry build_geometry(Data const data, MeshData::Primitive const& mp) { Transform transform(dj::Json const& node) { auto ret = Transform{}; if (auto const& mat = node["matrix"]) { - auto const& arr = mat.array_view(); + [[maybe_unused]] auto const& arr = mat.array_view(); assert(arr.size() == 16); ret.set_matrix(to(mat)); } else { diff --git a/facade-lib/src/glfw/glfw.cpp b/facade-lib/src/glfw/glfw.cpp index eec6222..d2ed754 100644 --- a/facade-lib/src/glfw/glfw.cpp +++ b/facade-lib/src/glfw/glfw.cpp @@ -1,19 +1,18 @@ #include #include -#include #include #include namespace facade { namespace { -std::atomic> g_glfw{}; +std::weak_ptr g_glfw{}; std::mutex g_mutex{}; std::unordered_map g_states{}; std::shared_ptr get_or_make_glfw() { - if (auto glfw = g_glfw.load().lock()) { return glfw; } auto lock = std::scoped_lock{g_mutex}; + if (auto glfw = g_glfw.lock()) { return glfw; } if (glfwInit() != GLFW_TRUE) { throw InitError{"GLFW initialization failed"}; } if (!glfwVulkanSupported()) { glfwTerminate(); @@ -21,7 +20,7 @@ std::shared_ptr get_or_make_glfw() { } auto ret = std::make_shared(); ret->active = true; - g_glfw.load() = ret; + g_glfw = ret; return ret; } diff --git a/facade-lib/src/vk/pipes.cpp b/facade-lib/src/vk/pipes.cpp index b175209..22925de 100644 --- a/facade-lib/src/vk/pipes.cpp +++ b/facade-lib/src/vk/pipes.cpp @@ -7,7 +7,7 @@ namespace facade { namespace { -constexpr bool has_all_sets(std::span layouts) { +[[maybe_unused]] constexpr bool has_all_sets(std::span layouts) { std::uint32_t set{}; for (auto const& layout : layouts) { if (layout.set != set) { return false; } diff --git a/facade-lib/src/vk/vma.cpp b/facade-lib/src/vk/vma.cpp index de17cdd..e832837 100644 --- a/facade-lib/src/vk/vma.cpp +++ b/facade-lib/src/vk/vma.cpp @@ -32,7 +32,7 @@ UniqueBuffer Vma::make_buffer(vk::BufferUsageFlags const usage, vk::DeviceSize c ret.allocation.vma = *this; ret.size = bci.size; if (host_visible) { vmaMapMemory(allocator, ret.allocation.allocation, &ret.ptr); } - return ret; + return UniqueBuffer{std::move(ret)}; } UniqueImage Vma::make_image(ImageCreateInfo const& info, vk::Extent2D const extent) const { @@ -56,7 +56,7 @@ UniqueImage Vma::make_image(ImageCreateInfo const& info, vk::Extent2D const exte ret.image = image; ret.allocation.vma = *this; ret.extent = extent; - return ret; + return UniqueImage{std::move(ret)}; } vk::UniqueImageView Vma::make_image_view(vk::Image const image, vk::Format const format, vk::ImageSubresourceRange isr) const {