From 4e089d42119414dae2b38be5ff0729967d5cc9bc Mon Sep 17 00:00:00 2001 From: Philip Trettner <Philip.Trettner@rwth-aachen.de> Date: Sat, 15 Dec 2018 14:55:13 +0100 Subject: [PATCH] initial commit --- .clang-format | 54 +++++++++++++++ CMakeLists.txt | 16 +++++ README.md | 102 +++++++++++++++++++++++++++- src/tg/backend/glow/glow-backend.cc | 1 + src/tg/backend/lava/lava-backend.cc | 1 + src/tg/objects/Buffer.hh | 15 ++++ src/tg/objects/CommandBuffer.hh | 13 ++++ src/tg/objects/Device.cc | 27 ++++++++ src/tg/objects/Device.hh | 51 ++++++++++++++ src/tg/objects/Framebuffer.hh | 13 ++++ src/tg/objects/Image.hh | 12 ++++ src/tg/objects/Shader.hh | 17 +++++ src/tg/objects/Window.hh | 23 +++++++ src/tg/objects/fwd.hh | 48 +++++++++++++ src/tg/shader/context.hh | 11 +++ src/tg/shader/types.hh | 31 +++++++++ src/tg/typed-graphics.cc | 0 src/tg/typed-graphics.hh | 14 ++++ 18 files changed, 448 insertions(+), 1 deletion(-) create mode 100644 .clang-format create mode 100644 CMakeLists.txt create mode 100644 src/tg/backend/glow/glow-backend.cc create mode 100644 src/tg/backend/lava/lava-backend.cc create mode 100644 src/tg/objects/Buffer.hh create mode 100644 src/tg/objects/CommandBuffer.hh create mode 100644 src/tg/objects/Device.cc create mode 100644 src/tg/objects/Device.hh create mode 100644 src/tg/objects/Framebuffer.hh create mode 100644 src/tg/objects/Image.hh create mode 100644 src/tg/objects/Shader.hh create mode 100644 src/tg/objects/Window.hh create mode 100644 src/tg/objects/fwd.hh create mode 100644 src/tg/shader/context.hh create mode 100644 src/tg/shader/types.hh create mode 100644 src/tg/typed-graphics.cc create mode 100644 src/tg/typed-graphics.hh diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d4b1133 --- /dev/null +++ b/.clang-format @@ -0,0 +1,54 @@ +# Style file for clang-format ( http://clang.llvm.org/docs/ClangFormatStyleOptions.html ) + +# Style is based on google's c++ coding style. +# see http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml +BasedOnStyle: Google +#Language: Cpp +Standard: Cpp11 + + +# 80 columns guideline +ColumnLimit: 150 +PenaltyExcessCharacter: 1 +PenaltyBreakString: 50 + + +# Indentation and Braces +IndentWidth: 4 +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: true +#BraceBreakingStyle: ??? +BreakBeforeBinaryOperators: true +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakBeforeBraces: Allman +BinPackParameters: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +Cpp11BracedListStyle: true +IndentCaseLabels: false + + +# Spaces +DerivePointerAlignment: true +DerivePointerBinding: true +MaxEmptyLinesToKeep: 2 +SpaceAfterControlStatementKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +#SpacesInSquareBrackets: false +UseTab: Never +ConstructorInitializerIndentWidth: 2 +AccessModifierOffset: -4 + + +# Comments +AlignTrailingComments: true +CommentPragmas: '!Api.*' diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..60798c7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.8) +project(TypedGraphics) + +# =============================================== +# Create target + +file(GLOB_RECURSE SOURCES + "src/*.cc" + "src/*.hh" +) + +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES}) + +add_library(typed-graphics ${SOURCES}) + +target_include_directories(typed-graphics PUBLIC "src") diff --git a/README.md b/README.md index a2006c9..4dbd86a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,103 @@ # typed-graphics -Graphics library with strongly typed interfaces. \ No newline at end of file +Graphics library with strongly typed interfaces. + + +## Usage / Example + + +``` +#include <tg/typed-graphics.hh> + +// TODO +``` + + +## Dependencies + +`typed-graphics` expects dependencies as CMake targets. + +### Required + +* ??? + +### Backend Dependencies + +* `lava` Vulkan library +* `glow` OpenGL library + +### Optional + +* `typed-math` math library +* `glm` math library +* `polymesh` mesh library +* `imgui` UI library +* `aion` profiling library + + +## CMake Usage + +``` +cmake_minimum_required(VERSION 3.8) +project(MyProject) + + +# =============================================== +# Global settings + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set(BUILD_SHARED_LIBS ON) # required by some dependencies + + +# =============================================== +# Dependencies + +# math library +add_subdirectory(extern/typed-math) + +# graphics library +add_subdirectory(extern/typed-graphics) + +# mesh library +add_subdirectory(extern/polymesh) + + +# =============================================== +# Create target + +file(GLOB_RECURSE SOURCES + "src/*.cc" + "src/*.hh" +) + +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES}) + +add_executable(MyProject ${SOURCES}) + +target_include_directories(MyProject PUBLIC "src") + +target_link_libraries(MyProject PUBLIC + typed-math + typed-graphics + polymesh +) + + +# =============================================== +# Compile flags + +if (MSVC) + target_compile_options(MyProject PUBLIC + /MP + ) +else() + target_compile_options(MyProject PUBLIC + -Wall + -Wno-unused-variable + ) +endif() + +``` diff --git a/src/tg/backend/glow/glow-backend.cc b/src/tg/backend/glow/glow-backend.cc new file mode 100644 index 0000000..0ffdd02 --- /dev/null +++ b/src/tg/backend/glow/glow-backend.cc @@ -0,0 +1 @@ +// TODO \ No newline at end of file diff --git a/src/tg/backend/lava/lava-backend.cc b/src/tg/backend/lava/lava-backend.cc new file mode 100644 index 0000000..0ffdd02 --- /dev/null +++ b/src/tg/backend/lava/lava-backend.cc @@ -0,0 +1 @@ +// TODO \ No newline at end of file diff --git a/src/tg/objects/Buffer.hh b/src/tg/objects/Buffer.hh new file mode 100644 index 0000000..4cffc03 --- /dev/null +++ b/src/tg/objects/Buffer.hh @@ -0,0 +1,15 @@ +#pragma once + +#include <vector> + +#include "fwd.hh" + +namespace tg +{ +template <class DataT> +class Buffer +{ + using data_t = DataT; +}; + +} // namespace tg diff --git a/src/tg/objects/CommandBuffer.hh b/src/tg/objects/CommandBuffer.hh new file mode 100644 index 0000000..4e3a73a --- /dev/null +++ b/src/tg/objects/CommandBuffer.hh @@ -0,0 +1,13 @@ +#pragma once + +namespace tg +{ +class CommandBuffer +{ + // TODO +public: + struct Recorder { + // TODO + }; +}; +} // namespace tg diff --git a/src/tg/objects/Device.cc b/src/tg/objects/Device.cc new file mode 100644 index 0000000..8f9c338 --- /dev/null +++ b/src/tg/objects/Device.cc @@ -0,0 +1,27 @@ +#include "Device.hh" + +#include "Window.hh" + +namespace tg +{ +SharedWindow Device::createWindow(int w, int h) +{ + // TODO + (void)w; + (void)h; + return std::make_shared<Window>(); +} + +SharedCommandBuffer Device::createCommandBuffer() +{ + // TODO + return std::make_shared<CommandBuffer>(); +} + +SharedDevice Device::create() +{ + // TODO + return std::make_shared<Device>(); +} + +} // namespace tg diff --git a/src/tg/objects/Device.hh b/src/tg/objects/Device.hh new file mode 100644 index 0000000..15fd5fb --- /dev/null +++ b/src/tg/objects/Device.hh @@ -0,0 +1,51 @@ +#pragma once + +#include <functional> +#include <vector> + +#include "CommandBuffer.hh" +#include "fwd.hh" + +#include <tg/shader/context.hh> + +namespace tg +{ +class Device +{ + // TODO + +public: + SharedWindow createWindow(int w, int h); + + template <class DataT> + SharedBuffer<DataT> createBuffer(std::vector<DataT> const& data) + { + auto buffer = std::make_shared<Buffer<DataT>>(); + // TODO: upload + (void)data; + return buffer; + } + + template <class VertexT, class FragmentT, class FunT> + SharedShader<VertexT, FragmentT> createShader(FunT&& fun) + { + auto shader = std::make_shared<Shader<VertexT, FragmentT>>(); + // std::function<FragmentT(shader::context & ctx, VertexT v)> f = fun; + // TODO: create shader from function + // TODO: properly use shader types + (void)fun; + return shader; + } + + SharedCommandBuffer createCommandBuffer(); + + CommandBuffer::Recorder submitGraphicsCommandBuffer() + { + // TODO + return {}; + } + +public: + static SharedDevice create(); +}; +} // namespace tg diff --git a/src/tg/objects/Framebuffer.hh b/src/tg/objects/Framebuffer.hh new file mode 100644 index 0000000..e8f29d2 --- /dev/null +++ b/src/tg/objects/Framebuffer.hh @@ -0,0 +1,13 @@ +#pragma once + +#include <memory> + +namespace tg +{ +template <class FragmentT> +class Framebuffer +{ + using fragment_t = FragmentT; +}; + +} // namespace tg diff --git a/src/tg/objects/Image.hh b/src/tg/objects/Image.hh new file mode 100644 index 0000000..75167e6 --- /dev/null +++ b/src/tg/objects/Image.hh @@ -0,0 +1,12 @@ +#pragma once + +#include <memory> + +namespace tg +{ +template <int D, class DataT> +struct Image +{ + using data_t = DataT; +}; +} // namespace tg diff --git a/src/tg/objects/Shader.hh b/src/tg/objects/Shader.hh new file mode 100644 index 0000000..8114e9b --- /dev/null +++ b/src/tg/objects/Shader.hh @@ -0,0 +1,17 @@ +#pragma once + +#include <functional> + +#include "fwd.hh" + +#include <tg/shader/context.hh> + +namespace tg +{ +template <class VertexT, class FragmentT> +struct Shader +{ + using vertex_t = VertexT; + using fragment_t = FragmentT; +}; +} // namespace tg diff --git a/src/tg/objects/Window.hh b/src/tg/objects/Window.hh new file mode 100644 index 0000000..e6c5e72 --- /dev/null +++ b/src/tg/objects/Window.hh @@ -0,0 +1,23 @@ +#pragma once + +#include "fwd.hh" + +namespace tg +{ +class Window +{ +public: + struct Frame + { + // TODO: RAII + + operator bool() const + { + // TODO + return true; + } + }; + + Frame startFrame() { return {}; } +}; +} // namespace tg diff --git a/src/tg/objects/fwd.hh b/src/tg/objects/fwd.hh new file mode 100644 index 0000000..d9a7dd9 --- /dev/null +++ b/src/tg/objects/fwd.hh @@ -0,0 +1,48 @@ +#pragma once + +#include <memory> + +// TODO: maybe better management? +namespace tg +{ +class Device; +using SharedDevice = std::shared_ptr<Device>; + +class Window; +using SharedWindow = std::shared_ptr<Window>; + +class CommandBuffer; +using SharedCommandBuffer = std::shared_ptr<CommandBuffer>; + +template <class FragmentT> +class Framebuffer; +template <class FragmentT> +using SharedFramebuffer = std::shared_ptr<Framebuffer<FragmentT>>; + +template <class VertexT, class FragmentT> +struct Shader; +template <class VertexT, class FragmentT> +using SharedShader = std::shared_ptr<Shader<VertexT, FragmentT>>; + +template <int D, class DataT> +struct Image; +template <class DataT> +using Image1D = Image<1, DataT>; +template <class DataT> +using Image2D = Image<2, DataT>; +template <class DataT> +using Image3D = Image<3, DataT>; +template <int D, class DataT> +using SharedImage = std::shared_ptr<Image<D, DataT>>; +template <class DataT> +using SharedImage1D = std::shared_ptr<Image1D<DataT>>; +template <class DataT> +using SharedImage2D = std::shared_ptr<Image2D<DataT>>; +template <class DataT> +using SharedImage3D = std::shared_ptr<Image3D<DataT>>; + +template <class DataT> +class Buffer; +template <class DataT> +using SharedBuffer = std::shared_ptr<Buffer<DataT>>; +} // namespace tg diff --git a/src/tg/shader/context.hh b/src/tg/shader/context.hh new file mode 100644 index 0000000..f2df04c --- /dev/null +++ b/src/tg/shader/context.hh @@ -0,0 +1,11 @@ +#pragma once + +#include "types.hh" + +namespace tg::shader +{ +struct context +{ + vec4 ndc_position; +}; +} // namespace tg::shader diff --git a/src/tg/shader/types.hh b/src/tg/shader/types.hh new file mode 100644 index 0000000..c7278a9 --- /dev/null +++ b/src/tg/shader/types.hh @@ -0,0 +1,31 @@ +#pragma once + +namespace tg::shader +{ +// TODO: properly + + +struct vec2; +struct vec3; +struct vec4; +struct f8vec3; + +struct vec2 +{ +}; +struct vec3 +{ + vec3() = default; + vec3(f8vec3 const&) {} +}; +struct vec4 +{ + vec4() = default; + vec4(vec3 const&, float) {} +}; + +struct f8vec3 +{ + f8vec3(vec3 const&) {} +}; +} // namespace tg::shader diff --git a/src/tg/typed-graphics.cc b/src/tg/typed-graphics.cc new file mode 100644 index 0000000..e69de29 diff --git a/src/tg/typed-graphics.hh b/src/tg/typed-graphics.hh new file mode 100644 index 0000000..fd04b2a --- /dev/null +++ b/src/tg/typed-graphics.hh @@ -0,0 +1,14 @@ +#pragma once + +// Objects +#include "objects/Buffer.hh" +#include "objects/CommandBuffer.hh" +#include "objects/Device.hh" +#include "objects/Framebuffer.hh" +#include "objects/Image.hh" +#include "objects/Shader.hh" +#include "objects/Window.hh" + +// Shader +#include "shader/context.hh" +#include "shader/types.hh" -- GitLab