Skip to content

Commit

Permalink
New plain Vulkan Triangle example.
Browse files Browse the repository at this point in the history
Just using the Vulkan APIs directly with hand-written SPIR-V,
completely offscreen with no swapchain or anything. Shows how to use
basic Magnum APIs for math handling and image export.
  • Loading branch information
mosra committed Sep 15, 2018
1 parent ef90e8b commit 41c78ef
Show file tree
Hide file tree
Showing 10 changed files with 1,672 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ cmake_dependent_option(WITH_TEXTUREDTRIANGLE_EXAMPLE "Build TexturedTriangle exa
option(WITH_TRIANGLE_EXAMPLE "Build Triangle example" ON)
option(WITH_TRIANGLE_PLAIN_GLFW_EXAMPLE "Build Plain GLFW Triangle example" OFF)
option(WITH_TRIANGLE_SOKOL_EXAMPLE "Build sokol_gfx Triangle example" OFF)
option(WITH_TRIANGLE_VULKAN_EXAMPLE "Build Vulkan Triangle example" OFF)
option(WITH_VIEWER_EXAMPLE "Build Viewer example (requires ColladaImporter plugin)" OFF)
if(CORRADE_TARGET_EMSCRIPTEN)
option(WITH_WEBVR_EXAMPLE "Build WebVR example" OFF)
Expand Down
2 changes: 2 additions & 0 deletions doc/changelog-examples.dox
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ namespace Magnum {
- New @ref examples-box2d example showing usage with Box2D
- New @ref examples-mouseinteraction example showing advanced mouse
interaction (see [mosra/magnum-examples#46](https://github.com/mosra/magnum-examples/pull/46))
- New @ref examples-triangle-vulkan example showcasing basic Vulkan usage
with Magnum

@subsection changelog-examples-latest-buildsystem Build system

Expand Down
1 change: 1 addition & 0 deletions doc/example-index.dox
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ The following consist of documented source code only:
- @subpage examples-shadows --- @copybrief examples-shadows
- @subpage examples-text @m_class{m-label m-default m-flat} **live web demo**
--- @copybrief examples-text
- @subpage examples-triangle-vulkan --- @copybrief examples-triangle-vulkan
- @subpage examples-webvr @m_class{m-label m-default m-flat} **live web demo**
--- @copybrief examples-webvr

Expand Down
54 changes: 54 additions & 0 deletions doc/triangle-vulkan.dox
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
This file is part of Magnum.

Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
Vladimír Vondruš <mosra@centrum.cz>

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/

namespace Magnum {
/** @page examples-triangle-vulkan Triangle using plain Vulkan
@brief Directly using Vulkan with hand-written SPIR-V to produce a triangle offscreen.

@m_footernavigation

@image html triangle-vulkan.png

This example has equivalent output to the OpenGL @ref examples-triangle "Triangle"
example, but uses Vulkan instead. Showcases how to use Magnum builtin
[flextGL](https://github.com/mosra/flextgl)-generated headers to load Vulkan
function pointers, create the Vulkan instance, create the device, do the
initial setup, handcraft a SPIR-V shader bytecode and render a basic rainbow
triangle offscreen, exporting it to a PNG file using the
@ref Trade::AbstractImageConverter APIs.

@section examples-triangle-vulkan-source Source

Full source code is linked below and together with assets also available in the
[magnum-examples GitHub repository](https://github.com/mosra/magnum-examples/tree/master/src/triangle-vulkan).

- @ref triangle-vulkan/CMakeLists.txt "CMakeLists.txt"
- @ref triangle-vulkan/main.cpp "main.cpp"

@example triangle-vulkan/CMakeLists.txt @m_examplenavigation{examples-triangle-vulkan,triangle-vulkan/} @m_footernavigation
@example triangle-vulkan/main.cpp @m_examplenavigation{examples-triangle-vulkan,triangle-vulkan/} @m_footernavigation

*/
}
Binary file added doc/triangle-vulkan.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ if(WITH_TRIANGLE_SOKOL_EXAMPLE)
add_subdirectory(triangle-sokol)
endif()

if(WITH_TRIANGLE_VULKAN_EXAMPLE)
add_subdirectory(triangle-vulkan)
endif()

if(WITH_VIEWER_EXAMPLE)
add_subdirectory(viewer)
endif()
Expand Down
1 change: 1 addition & 0 deletions src/triangle-vulkan/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
spirv.h linguist-vendored
47 changes: 47 additions & 0 deletions src/triangle-vulkan/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#
# This file is part of Magnum.
#
# Original authors — credit is appreciated but not required:
#
# 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 —
# Vladimír Vondruš <mosra@centrum.cz>
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or distribute
# this software, either in source code form or as a compiled binary, for any
# purpose, commercial or non-commercial, and by any means.
#
# In jurisdictions that recognize copyright laws, the author or authors of
# this software dedicate any and all copyright interest in the software to
# the public domain. We make this dedication for the benefit of the public
# at large and to the detriment of our heirs and successors. We intend this
# dedication to be an overt act of relinquishment in perpetuity of all
# present and future rights to this software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#

cmake_minimum_required(VERSION 3.7)
project(MagnumTriangleVulkanExample)

# Add module path in case this is project root
if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/../../modules/")
endif()

find_package(Magnum REQUIRED Trade Vk)

set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON)

add_executable(magnum-triangle-vulkan main.cpp)
target_link_libraries(magnum-triangle-vulkan PRIVATE
Magnum::Trade
Magnum::Vk)

install(TARGETS magnum-triangle-vulkan DESTINATION ${MAGNUM_BINARY_INSTALL_DIR})
Loading

0 comments on commit 41c78ef

Please sign in to comment.