This commit is contained in:
parent
2b81b4376c
commit
1b91851739
14 changed files with 480 additions and 120 deletions
248
.clang-tidy
248
.clang-tidy
|
|
@ -0,0 +1,248 @@
|
||||||
|
---
|
||||||
|
Checks: "-*,
|
||||||
|
|
||||||
|
performance-unnecessary-value-param,
|
||||||
|
performance-unnecessary-copy-initialization,
|
||||||
|
performance-type-promotion-in-math-fn,
|
||||||
|
performance-trivially-destructible,
|
||||||
|
performance-noexcept-swap,
|
||||||
|
performance-noexcept-move-constructor,
|
||||||
|
performance-noexcept-destructor,
|
||||||
|
performance-no-int-to-ptr,
|
||||||
|
performance-no-automatic-move,
|
||||||
|
performance-move-constructor-init,
|
||||||
|
performance-move-const-arg,
|
||||||
|
performance-inefficient-vector-operation,
|
||||||
|
performance-inefficient-string-concatenation,
|
||||||
|
performance-inefficient-algorithm,
|
||||||
|
performance-implicit-conversion-in-loop,
|
||||||
|
performance-for-range-copy,
|
||||||
|
performance-faster-string-find,
|
||||||
|
performance-enum-size,
|
||||||
|
performance-avoid-endl,
|
||||||
|
|
||||||
|
readability-avoid-const-params-in-decls,
|
||||||
|
readability-avoid-nested-conditional-operator,
|
||||||
|
readability-avoid-return-with-void-value,
|
||||||
|
readability-avoid-unconditional-preprocessor-if,
|
||||||
|
readability-braces-around-statements,
|
||||||
|
readability-const-return-type,
|
||||||
|
readability-container-contains,
|
||||||
|
readability-container-data-pointdr,
|
||||||
|
readability-container-size-empty,
|
||||||
|
readability-delete-null-pointer,
|
||||||
|
readability-duplicate-include,
|
||||||
|
readability-else-after-return,
|
||||||
|
readability-inconsistent-declaration-parameter-name,
|
||||||
|
readability-isolate-declaration,
|
||||||
|
readability-make-member-function-const,
|
||||||
|
readability-misleading-indentation,
|
||||||
|
readability-misplaced-array-index,
|
||||||
|
readability-named-parameter,
|
||||||
|
readability-non-const-parameter,
|
||||||
|
readability-qualified-auto,
|
||||||
|
readability-redundant-access-specifiers,
|
||||||
|
readability-redundant-casting,
|
||||||
|
readability-redundant-control-flow,
|
||||||
|
readability-redundant-declaration,
|
||||||
|
readability-redundant-function-ptr-dereference,
|
||||||
|
readability-redundant-inline-specifier,
|
||||||
|
readability-redundant-member-init,
|
||||||
|
readability-redundant-preprocessor,
|
||||||
|
readability-redundant-smartptr-get,
|
||||||
|
readability-redundant-string-cstr,
|
||||||
|
readability-reference-to-constructed-temporary,
|
||||||
|
readability-simplify-boolean-expr,
|
||||||
|
readability-simplify-subscript-expr,
|
||||||
|
readability-static-accessed-through-instance,
|
||||||
|
readability-static-definition-in-anonymous-namespace,
|
||||||
|
readability-string-compare,
|
||||||
|
readability-suspicious-call-argument,
|
||||||
|
readability-uniqueptr-delete-release,
|
||||||
|
readability-use-anyofallof
|
||||||
|
readability-use-std-min-max,
|
||||||
|
readability-function-cognitive-complexity
|
||||||
|
readability-function-size
|
||||||
|
readability-identifier-naming
|
||||||
|
readability-identifier-length
|
||||||
|
readability-magic-numbers
|
||||||
|
|
||||||
|
modernize-avoid-bind,
|
||||||
|
modernize-avoid-c-arrays,
|
||||||
|
modernize-concat-nested-namespaces,
|
||||||
|
modernize-deprecated-headers,
|
||||||
|
modernize-deprecated-ios-base-aliases,
|
||||||
|
modernize-loop-convert,
|
||||||
|
modernize-macro-to-enum,
|
||||||
|
modernize-make-shared,
|
||||||
|
modernize-make-unique,
|
||||||
|
modernize-pass-by-value,
|
||||||
|
modernize-raw-string-literal,
|
||||||
|
modernize-redundant-void-arg,
|
||||||
|
modernize-replace-auto-ptr,
|
||||||
|
modernize-replace-disallow-copy-and-assign-macro,
|
||||||
|
modernize-replace-random-shuffle,
|
||||||
|
modernize-return-braced-init-list,
|
||||||
|
modernize-shrink-to-fit,
|
||||||
|
modernize-type-traits,
|
||||||
|
modernize-unary-static-assert,
|
||||||
|
modernize-use-auto,
|
||||||
|
modernize-use-bool-literals,
|
||||||
|
modernize-use-constraints,
|
||||||
|
modernize-use-default-member-init,
|
||||||
|
modernize-use-designated-initializers,
|
||||||
|
modernize-use-emplace,
|
||||||
|
modernize-use-equals-default,
|
||||||
|
modernize-use-equals-delete,
|
||||||
|
modernize-use-nodiscard,
|
||||||
|
modernize-use-noexcept,
|
||||||
|
modernize-use-nullptr,
|
||||||
|
modernize-use-override,
|
||||||
|
modernize-use-starts-ends-with,
|
||||||
|
modernize-use-std-numbers,
|
||||||
|
modernize-use-std-print,
|
||||||
|
modernize-use-transparent-functors,
|
||||||
|
modernize-use-uncaught-exceptions,
|
||||||
|
modernize-use-using
|
||||||
|
modernize-min-max-use-initializer-list,
|
||||||
|
|
||||||
|
cppcoreguidelines-avoid-capturing-lambda-coroutines,
|
||||||
|
cppcoreguidelines-avoid-const-or-ref-data-members,
|
||||||
|
cppcoreguidelines-avoid-do-while,
|
||||||
|
cppcoreguidelines-avoid-goto,
|
||||||
|
cppcoreguidelines-avoid-non-const-global-variables,
|
||||||
|
cppcoreguidelines-avoid-reference-coroutine-parameters,
|
||||||
|
cppcoreguidelines-init-variables,
|
||||||
|
cppcoreguidelines-interfaces-global-init,
|
||||||
|
cppcoreguidelines-macro-usage,
|
||||||
|
cppcoreguidelines-misleading-capture-default-by-value,
|
||||||
|
cppcoreguidelines-missing-std-forward,
|
||||||
|
cppcoreguidelines-narrowing-conversions,
|
||||||
|
cppcoreguidelines-no-malloc,
|
||||||
|
cppcoreguidelines-no-suspend-with-lock,
|
||||||
|
cppcoreguidelines-owning-memory,
|
||||||
|
cppcoreguidelines-prefer-member-initializer,
|
||||||
|
cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||||
|
cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||||
|
cppcoreguidelines-pro-type-const-cast,
|
||||||
|
cppcoreguidelines-pro-type-cstyle-cast,
|
||||||
|
cppcoreguidelines-pro-type-member-init,
|
||||||
|
cppcoreguidelines-pro-type-reinterpret-cast,
|
||||||
|
cppcoreguidelines-pro-type-static-cast-downcast,
|
||||||
|
cppcoreguidelines-pro-type-vararg,
|
||||||
|
cppcoreguidelines-rvalue-reference-param-not-moved,
|
||||||
|
cppcoreguidelines-slicing,
|
||||||
|
cppcoreguidelines-special-member-functions,
|
||||||
|
cppcoreguidelines-virtual-class-destructor,
|
||||||
|
|
||||||
|
bugprone-argument-comment,
|
||||||
|
bugprone-assert-side-effect,
|
||||||
|
bugprone-assignment-in-if-condition,
|
||||||
|
bugprone-bad-signal-to-kill-thread,
|
||||||
|
bugprone-bool-pointer-implicit-conversion,
|
||||||
|
bugprone-branch-clone,
|
||||||
|
bugprone-casting-through-void,
|
||||||
|
bugprone-chained-comparison,
|
||||||
|
bugprone-compare-pointer-to-member-virtual-function,
|
||||||
|
bugprone-copy-constructor-init,
|
||||||
|
bugprone-crtp-constructor-accessibility,
|
||||||
|
bugprone-dangling-handle,
|
||||||
|
bugprone-empty-catch,
|
||||||
|
bugprone-exception-escape,
|
||||||
|
bugprone-fold-init-type,
|
||||||
|
bugprone-forward-declaration-namespace,
|
||||||
|
bugprone-forwarding-reference-overload,
|
||||||
|
bugprone-implicit-widening-of-multiplication-result,
|
||||||
|
bugprone-inaccurate-erase,
|
||||||
|
bugprone-inc-dec-in-conditions,
|
||||||
|
bugprone-incorrect-enable-if,
|
||||||
|
bugprone-incorrect-roundings,
|
||||||
|
bugprone-infinite-loop,
|
||||||
|
bugprone-integer-division,
|
||||||
|
bugprone-lambda-function-name,
|
||||||
|
bugprone-macro-parentheses,
|
||||||
|
bugprone-macro-repeated-side-effects,
|
||||||
|
bugprone-misplaced-operator-in-strlen-in-alloc,
|
||||||
|
bugprone-misplaced-pointer-arithmetic-in-alloc,
|
||||||
|
bugprone-misplaced-widening-cast,
|
||||||
|
bugprone-move-forwarding-reference,
|
||||||
|
bugprone-multi-level-implicit-pointer-conversion,
|
||||||
|
bugprone-multiple-new-in-one-expression,
|
||||||
|
bugprone-multiple-statement-macro,
|
||||||
|
bugprone-no-escape,
|
||||||
|
bugprone-non-zero-enum-to-bool-conversion,
|
||||||
|
bugprone-not-null-terminated-result,
|
||||||
|
bugprone-optional-value-conversion,
|
||||||
|
bugprone-parent-virtual-call,
|
||||||
|
bugprone-posix-return,
|
||||||
|
bugprone-redundant-branch-condition,
|
||||||
|
bugprone-reserved-identifier,
|
||||||
|
bugprone-return-const-ref-from-parameter,
|
||||||
|
bugprone-shared-ptr-array-mismatch,
|
||||||
|
bugprone-signal-handler,
|
||||||
|
bugprone-signed-char-misuse,
|
||||||
|
bugprone-sizeof-container,
|
||||||
|
bugprone-sizeof-expression,
|
||||||
|
bugprone-spuriously-wake-up-functions,
|
||||||
|
bugprone-standalone-empty,
|
||||||
|
bugprone-string-constructor,
|
||||||
|
bugprone-string-integer-assignment,
|
||||||
|
bugprone-string-literal-with-embedded-nul,
|
||||||
|
bugprone-stringview-nullptr,
|
||||||
|
bugprone-suspicious-enum-usage,
|
||||||
|
bugprone-suspicious-include,
|
||||||
|
bugprone-suspicious-memory-comparison,
|
||||||
|
bugprone-suspicious-memset-usage,
|
||||||
|
bugprone-suspicious-missing-comma,
|
||||||
|
bugprone-suspicious-realloc-usage,
|
||||||
|
bugprone-suspicious-semicolon,
|
||||||
|
bugprone-suspicious-string-compare,
|
||||||
|
bugprone-suspicious-stringview-data-usage,
|
||||||
|
bugprone-swapped-arguments,
|
||||||
|
bugprone-switch-missing-default-case,
|
||||||
|
bugprone-terminating-continue,
|
||||||
|
bugprone-throw-keyword-missing,
|
||||||
|
bugprone-too-small-loop-variable,
|
||||||
|
bugprone-unchecked-optional-access,
|
||||||
|
bugprone-undefined-memory-manipulation,
|
||||||
|
bugprone-undelegated-constructor,
|
||||||
|
bugprone-unhandled-exception-at-new,
|
||||||
|
bugprone-unhandled-self-assignment,
|
||||||
|
bugprone-unique-ptr-array-mismatch,
|
||||||
|
bugprone-unsafe-functions,
|
||||||
|
bugprone-unused-local-non-trivial-variable,
|
||||||
|
bugprone-unused-raii,
|
||||||
|
bugprone-unused-return-value,
|
||||||
|
bugprone-use-after-move,
|
||||||
|
bugprone-virtual-near-miss,
|
||||||
|
|
||||||
|
concurrency-mt-unsafe,
|
||||||
|
concurrency-thread-canceltype-asynchronous,
|
||||||
|
|
||||||
|
misc-use-anonymous-namespace,
|
||||||
|
misc-unused-using-decls,
|
||||||
|
misc-unused-parameters,
|
||||||
|
misc-unused-alias-decls,
|
||||||
|
misc-uniqueptr-reset-release,
|
||||||
|
misc-unconventional-assign-operator,
|
||||||
|
misc-throw-by-value-catch-by-reference,
|
||||||
|
misc-static-assert,
|
||||||
|
misc-redundant-expression,
|
||||||
|
misc-non-private-member-variables-in-classes,
|
||||||
|
misc-non-copyable-objects,
|
||||||
|
misc-no-recursion,
|
||||||
|
misc-new-delete-overloads,
|
||||||
|
misc-misplaced-const,
|
||||||
|
misc-misleading-identifier,
|
||||||
|
misc-misleading-bidirectional,
|
||||||
|
misc-header-include-cycle,
|
||||||
|
misc-definitions-in-headers,
|
||||||
|
misc-coroutine-hostile-raii,
|
||||||
|
misc-const-correctness,
|
||||||
|
|
||||||
|
hicpp-signed-bitwise,
|
||||||
|
hicpp-no-assembler,
|
||||||
|
hicpp-multiway-paths-covered,
|
||||||
|
hicpp-ignored-remove-result,
|
||||||
|
hicpp-exception-baseclass,
|
||||||
|
"
|
||||||
|
|
@ -1,21 +1,21 @@
|
||||||
#include <renderer/frontend/data/buffer.hpp>
|
import renderer.frontend;
|
||||||
#include <renderer/test/utils.hpp>
|
import renderer.test_utils;
|
||||||
|
|
||||||
using ::lt::renderer::IBuffer;
|
using enum ::lt::renderer::IDebugger::MessageSeverity;
|
||||||
using enum ::lt::renderer::IMessenger::MessageSeverity;
|
using enum ::lt::renderer::IBuffer::Usage;
|
||||||
|
|
||||||
Suite raii = "buffer_raii"_suite = [] {
|
Suite raii = "buffer_raii"_suite = [] {
|
||||||
Case { "happy path won't throw" } = [] {
|
Case { "happy path won't throw" } = [] {
|
||||||
auto fixture = FixtureDeviceSwapchain {};
|
auto fixture = FixtureDeviceSwapchain {};
|
||||||
|
|
||||||
for (auto idx = 0; idx <= std::to_underlying(IBuffer::Usage::staging); ++idx)
|
for (auto idx = 0; idx <= std::to_underlying(staging); ++idx)
|
||||||
{
|
{
|
||||||
ignore = IBuffer::create(
|
ignore = lt::renderer::create_buffer(
|
||||||
lt::renderer::Api::vulkan,
|
lt::renderer::Api::vulkan,
|
||||||
fixture.device(),
|
fixture.device(),
|
||||||
fixture.gpu(),
|
fixture.gpu(),
|
||||||
IBuffer::CreateInfo {
|
lt::renderer::IBuffer::CreateInfo {
|
||||||
.usage = static_cast<IBuffer::Usage>(idx),
|
.usage = static_cast<lt::renderer::IBuffer::Usage>(idx),
|
||||||
.size = 1000u,
|
.size = 1000u,
|
||||||
.debug_name = "",
|
.debug_name = "",
|
||||||
}
|
}
|
||||||
|
|
@ -29,23 +29,28 @@ Suite raii = "buffer_raii"_suite = [] {
|
||||||
Case { "unhappy path throws" } = [] {
|
Case { "unhappy path throws" } = [] {
|
||||||
auto fixture = FixtureDeviceSwapchain {};
|
auto fixture = FixtureDeviceSwapchain {};
|
||||||
|
|
||||||
auto info = IBuffer::CreateInfo {
|
auto info = lt::renderer::IBuffer::CreateInfo {
|
||||||
.usage = IBuffer::Usage::vertex,
|
.usage = vertex,
|
||||||
.size = 10000u,
|
.size = 10000u,
|
||||||
.debug_name = "",
|
.debug_name = "",
|
||||||
};
|
};
|
||||||
|
|
||||||
expect_throw([&] {
|
expect_throw([&] {
|
||||||
ignore = IBuffer::create(lt::renderer::Api::vulkan, nullptr, fixture.gpu(), info);
|
ignore = lt::renderer::create_buffer(
|
||||||
|
lt::renderer::Api::vulkan,
|
||||||
|
nullptr,
|
||||||
|
fixture.gpu(),
|
||||||
|
info
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
expect_throw([&] {
|
expect_throw([&] {
|
||||||
ignore = IBuffer::create(lt::renderer::Api::vulkan, fixture.device(), nullptr, info);
|
ignore = lt::renderer::create_buffer(lt::renderer::Api::vulkan, fixture.device(), nullptr, info);
|
||||||
});
|
});
|
||||||
|
|
||||||
expect_throw([&, info] mutable {
|
expect_throw([&, info] mutable {
|
||||||
info.size = 0;
|
info.size = 0;
|
||||||
ignore = IBuffer::create(
|
ignore = lt::renderer::create_buffer(
|
||||||
lt::renderer::Api::vulkan,
|
lt::renderer::Api::vulkan,
|
||||||
fixture.device(),
|
fixture.device(),
|
||||||
fixture.gpu(),
|
fixture.gpu(),
|
||||||
|
|
@ -54,7 +59,7 @@ Suite raii = "buffer_raii"_suite = [] {
|
||||||
});
|
});
|
||||||
|
|
||||||
expect_throw([&] {
|
expect_throw([&] {
|
||||||
ignore = IBuffer::create(
|
ignore = lt::renderer::create_buffer(
|
||||||
lt::renderer::Api::direct_x,
|
lt::renderer::Api::direct_x,
|
||||||
fixture.device(),
|
fixture.device(),
|
||||||
fixture.gpu(),
|
fixture.gpu(),
|
||||||
|
|
@ -63,7 +68,7 @@ Suite raii = "buffer_raii"_suite = [] {
|
||||||
});
|
});
|
||||||
|
|
||||||
expect_throw([&] {
|
expect_throw([&] {
|
||||||
ignore = IBuffer::create(
|
ignore = lt::renderer::create_buffer(
|
||||||
lt::renderer::Api::metal,
|
lt::renderer::Api::metal,
|
||||||
fixture.device(),
|
fixture.device(),
|
||||||
fixture.gpu(),
|
fixture.gpu(),
|
||||||
|
|
@ -72,7 +77,7 @@ Suite raii = "buffer_raii"_suite = [] {
|
||||||
});
|
});
|
||||||
|
|
||||||
expect_throw([&] {
|
expect_throw([&] {
|
||||||
ignore = IBuffer::create(
|
ignore = lt::renderer::create_buffer(
|
||||||
lt::renderer::Api::none,
|
lt::renderer::Api::none,
|
||||||
fixture.device(),
|
fixture.device(),
|
||||||
fixture.gpu(),
|
fixture.gpu(),
|
||||||
|
|
@ -81,7 +86,7 @@ Suite raii = "buffer_raii"_suite = [] {
|
||||||
});
|
});
|
||||||
|
|
||||||
/** Make sure the default-case was OK */
|
/** Make sure the default-case was OK */
|
||||||
ignore = IBuffer::create(lt::renderer::Api::vulkan, fixture.device(), fixture.gpu(), info);
|
ignore = lt::renderer::create_buffer(lt::renderer::Api::vulkan, fixture.device(), fixture.gpu(), info);
|
||||||
|
|
||||||
expect_false(fixture.has_any_messages_of(error));
|
expect_false(fixture.has_any_messages_of(error));
|
||||||
expect_false(fixture.has_any_messages_of(warning));
|
expect_false(fixture.has_any_messages_of(warning));
|
||||||
|
|
@ -94,12 +99,12 @@ Suite mapping = "buffer_mapping"_suite = [] {
|
||||||
|
|
||||||
constexpr auto size = 1000u;
|
constexpr auto size = 1000u;
|
||||||
|
|
||||||
auto buffer = IBuffer::create(
|
auto buffer = lt::renderer::create_buffer(
|
||||||
lt::renderer::Api::vulkan,
|
lt::renderer::Api::vulkan,
|
||||||
fixture.device(),
|
fixture.device(),
|
||||||
fixture.gpu(),
|
fixture.gpu(),
|
||||||
IBuffer::CreateInfo {
|
lt::renderer::IBuffer::CreateInfo {
|
||||||
.usage = IBuffer::Usage::staging,
|
.usage = staging,
|
||||||
.size = size,
|
.size = size,
|
||||||
.debug_name = "",
|
.debug_name = "",
|
||||||
}
|
}
|
||||||
|
|
@ -2,16 +2,25 @@ export module renderer.test_utils;
|
||||||
|
|
||||||
export import logger;
|
export import logger;
|
||||||
export import surface.system;
|
export import surface.system;
|
||||||
|
export import ecs.registry;
|
||||||
|
export import renderer.factory;
|
||||||
export import test.test;
|
export import test.test;
|
||||||
export import test.expects;
|
export import test.expects;
|
||||||
export import memory.reference;
|
export import memory.reference;
|
||||||
export import renderer.frontend;
|
export import renderer.frontend;
|
||||||
|
export import renderer.system;
|
||||||
|
export import math.vec2;
|
||||||
|
export import math.vec3;
|
||||||
|
export import math.vec4;
|
||||||
|
export import math.mat4;
|
||||||
|
export import std;
|
||||||
|
|
||||||
export using ::lt::test::Case;
|
export using ::lt::test::Case;
|
||||||
export using ::lt::test::expect_eq;
|
export using ::lt::test::expect_eq;
|
||||||
export using ::lt::test::expect_false;
|
export using ::lt::test::expect_false;
|
||||||
export using ::lt::test::expect_not_nullptr;
|
export using ::lt::test::expect_not_nullptr;
|
||||||
export using ::lt::test::expect_throw;
|
export using ::lt::test::expect_throw;
|
||||||
|
export using ::lt::test::operator""_suite;
|
||||||
export using ::lt::test::expect_true;
|
export using ::lt::test::expect_true;
|
||||||
export using ::lt::test::Suite;
|
export using ::lt::test::Suite;
|
||||||
export using ::std::ignore;
|
export using ::std::ignore;
|
||||||
|
|
@ -20,15 +29,15 @@ export namespace constants {
|
||||||
|
|
||||||
constexpr auto api = lt::renderer::Api::vulkan;
|
constexpr auto api = lt::renderer::Api::vulkan;
|
||||||
constexpr auto resolution = lt::math::uvec2 { 800u, 600u };
|
constexpr auto resolution = lt::math::uvec2 { 800u, 600u };
|
||||||
constexpr auto frames_in_flight = uint32_t { 3u };
|
constexpr auto frames_in_flight = std::uint32_t { 3u };
|
||||||
|
|
||||||
} // namespace constants
|
} // namespace constants
|
||||||
|
|
||||||
|
|
||||||
void noop_messenger_callback(
|
void noop_messenger_callback(
|
||||||
lt::renderer::IMessenger::MessageSeverity severity,
|
lt::renderer::IDebugger::MessageSeverity severity,
|
||||||
lt::renderer::IMessenger::MessageType type,
|
lt::renderer::IDebugger::MessageType type,
|
||||||
const lt::renderer::IMessenger::MessageData &data,
|
const lt::renderer::IDebugger::MessageData &data,
|
||||||
std::any &user_data
|
std::any &user_data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
@ -58,8 +67,8 @@ public:
|
||||||
.registry = registry(),
|
.registry = registry(),
|
||||||
.surface_entity = surface_entity(),
|
.surface_entity = surface_entity(),
|
||||||
.debug_callback_info = {
|
.debug_callback_info = {
|
||||||
.severities = lt::renderer::IMessenger::MessageSeverity::all,
|
.severities = lt::renderer::IDebugger::MessageSeverity::all,
|
||||||
.types= lt::renderer::IMessenger::MessageType::all,
|
.types= lt::renderer::IDebugger::MessageType::all,
|
||||||
.callback = noop_messenger_callback,
|
.callback = noop_messenger_callback,
|
||||||
.user_data = {},
|
.user_data = {},
|
||||||
}
|
}
|
||||||
|
|
@ -105,14 +114,14 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
lt::memory::Scope<lt::renderer::ISurface> m_surface { lt::renderer::ISurface::create(
|
lt::memory::Scope<lt::renderer::ISurface> m_surface { lt::renderer::create_surface(
|
||||||
constants::api,
|
constants::api,
|
||||||
lt::renderer::IInstance::get(constants::api),
|
lt::renderer::get_instance(constants::api),
|
||||||
surface_entity()
|
surface_entity()
|
||||||
) };
|
) };
|
||||||
|
|
||||||
lt::memory::Scope<lt::renderer::IGpu> m_gpu {
|
lt::memory::Scope<lt::renderer::IGpu> m_gpu {
|
||||||
lt::renderer::IGpu::create(constants::api, lt::renderer::IInstance::get(constants::api))
|
lt::renderer::create_gpu(constants::api, lt::renderer::get_instance(constants::api))
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -134,7 +143,7 @@ public:
|
||||||
void recreate_swapchain()
|
void recreate_swapchain()
|
||||||
{
|
{
|
||||||
m_swapchain.reset();
|
m_swapchain.reset();
|
||||||
m_swapchain = lt::renderer::ISwapchain::create(
|
m_swapchain = lt::renderer::create_swapchain(
|
||||||
constants::api,
|
constants::api,
|
||||||
surface(),
|
surface(),
|
||||||
gpu(),
|
gpu(),
|
||||||
|
|
@ -147,24 +156,23 @@ public:
|
||||||
return m_user_data->m_has_any_messages;
|
return m_user_data->m_has_any_messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] auto has_any_messages_of(
|
[[nodiscard]] auto has_any_messages_of(lt::renderer::IDebugger ::MessageSeverity severity) const
|
||||||
lt::renderer::IMessenger ::MessageSeverity severity
|
-> std::uint32_t
|
||||||
) const -> uint32_t
|
|
||||||
{
|
{
|
||||||
return m_user_data->m_severity_counter.contains(severity);
|
return m_user_data->m_severity_counter.contains(severity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void messenger_callback(
|
static void messenger_callback(
|
||||||
lt::renderer::IMessenger::MessageSeverity severity,
|
lt::renderer::IDebugger::MessageSeverity severity,
|
||||||
lt::renderer::IMessenger::MessageType type,
|
lt::renderer::IDebugger::MessageType type,
|
||||||
const lt::renderer::IMessenger::MessageData &data,
|
const lt::renderer::IDebugger::MessageData &data,
|
||||||
std::any &user_data
|
std::any &user_data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// I know this makes the tests too verbose...
|
// I know this makes the tests too verbose...
|
||||||
// but makes it easier to figure out what the problem is when things fail on ci
|
// but makes it easier to figure out what the problem is when things fail on ci
|
||||||
lt::log::trace("vulkan: {}", data.message);
|
lt::log::error("vulkan: {}", data.message);
|
||||||
std::ignore = data;
|
std::ignore = data;
|
||||||
std::ignore = type;
|
std::ignore = type;
|
||||||
|
|
||||||
|
|
@ -175,30 +183,31 @@ private:
|
||||||
|
|
||||||
struct UserData
|
struct UserData
|
||||||
{
|
{
|
||||||
std::unordered_map<lt::renderer::IMessenger::MessageSeverity, uint32_t> m_severity_counter;
|
std::unordered_map<lt::renderer::IDebugger::MessageSeverity, std::uint32_t>
|
||||||
|
m_severity_counter;
|
||||||
|
|
||||||
bool m_has_any_messages {};
|
bool m_has_any_messages {};
|
||||||
};
|
};
|
||||||
|
|
||||||
lt::memory::Scope<UserData> m_user_data = lt::memory::create_scope<UserData>();
|
lt::memory::Scope<UserData> m_user_data = lt::memory::create_scope<UserData>();
|
||||||
|
|
||||||
lt::memory::Scope<lt::renderer::IMessenger> m_messenger = lt::renderer::IMessenger::create(
|
lt::memory::Scope<lt::renderer::IDebugger> m_messenger = lt::renderer::create_debugger(
|
||||||
constants::api,
|
constants::api,
|
||||||
lt::renderer::IInstance::get(constants::api),
|
lt::renderer::get_instance(constants::api),
|
||||||
lt::renderer::IMessenger ::CreateInfo {
|
lt::renderer::IDebugger ::CreateInfo {
|
||||||
.severities = lt::renderer::IMessenger ::MessageSeverity::all,
|
.severities = lt::renderer::IDebugger::MessageSeverity::all,
|
||||||
.types = lt::renderer::IMessenger ::MessageType::all,
|
.types = lt::renderer::IDebugger::MessageType::all,
|
||||||
.callback = &messenger_callback,
|
.callback = &messenger_callback,
|
||||||
.user_data = m_user_data.get(),
|
.user_data = m_user_data.get(),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
lt::memory::Scope<lt::renderer::IDevice> m_device {
|
lt::memory::Scope<lt::renderer::IDevice> m_device {
|
||||||
lt::renderer::IDevice::create(constants::api, gpu(), surface())
|
lt::renderer::create_device(constants::api, gpu(), surface())
|
||||||
};
|
};
|
||||||
|
|
||||||
lt::memory::Scope<lt::renderer::ISwapchain> m_swapchain {
|
lt::memory::Scope<lt::renderer::ISwapchain> m_swapchain {
|
||||||
lt::renderer::ISwapchain::create(constants::api, surface(), gpu(), m_device.get())
|
lt::renderer::create_swapchain(constants::api, surface(), gpu(), m_device.get())
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -217,18 +226,17 @@ public:
|
||||||
return m_user_data->m_has_any_messages;
|
return m_user_data->m_has_any_messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] auto has_any_messages_of(
|
[[nodiscard]] auto has_any_messages_of(lt::renderer::IDebugger ::MessageSeverity severity) const
|
||||||
lt::renderer::IMessenger ::MessageSeverity severity
|
-> std::uint32_t
|
||||||
) const -> uint32_t
|
|
||||||
{
|
{
|
||||||
return m_user_data->m_severity_counter.contains(severity);
|
return m_user_data->m_severity_counter.contains(severity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void messenger_callback(
|
static void messenger_callback(
|
||||||
lt::renderer::IMessenger::MessageSeverity severity,
|
lt::renderer::IDebugger::MessageSeverity severity,
|
||||||
lt::renderer::IMessenger::MessageType type,
|
lt::renderer::IDebugger::MessageType type,
|
||||||
const lt::renderer::IMessenger::MessageData &data,
|
const lt::renderer::IDebugger::MessageData &data,
|
||||||
std::any &user_data
|
std::any &user_data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
@ -246,7 +254,8 @@ private:
|
||||||
|
|
||||||
struct UserData
|
struct UserData
|
||||||
{
|
{
|
||||||
std::unordered_map<lt::renderer::IMessenger::MessageSeverity, uint32_t> m_severity_counter;
|
std::unordered_map<lt::renderer::IDebugger::MessageSeverity, std::uint32_t>
|
||||||
|
m_severity_counter;
|
||||||
|
|
||||||
bool m_has_any_messages {};
|
bool m_has_any_messages {};
|
||||||
};
|
};
|
||||||
|
|
@ -260,9 +269,9 @@ private:
|
||||||
},
|
},
|
||||||
.registry = registry(),
|
.registry = registry(),
|
||||||
.surface_entity = surface_entity(),
|
.surface_entity = surface_entity(),
|
||||||
.debug_callback_info = lt::renderer::IMessenger ::CreateInfo {
|
.debug_callback_info = lt::renderer::IDebugger ::CreateInfo {
|
||||||
.severities = lt::renderer::IMessenger ::MessageSeverity::all,
|
.severities = lt::renderer::IDebugger ::MessageSeverity::all,
|
||||||
.types = lt::renderer::IMessenger ::MessageType::all,
|
.types = lt::renderer::IDebugger ::MessageType::all,
|
||||||
.callback = &messenger_callback,
|
.callback = &messenger_callback,
|
||||||
.user_data = m_user_data.get(),
|
.user_data = m_user_data.get(),
|
||||||
}
|
}
|
||||||
|
|
@ -51,6 +51,13 @@ export namespace lt::renderer {
|
||||||
std::uint32_t max_frames_in_flight
|
std::uint32_t max_frames_in_flight
|
||||||
) -> memory::Scope<IRenderer>;
|
) -> memory::Scope<IRenderer>;
|
||||||
|
|
||||||
|
[[nodiscard]] auto create_buffer(
|
||||||
|
Api target_api,
|
||||||
|
IDevice *device,
|
||||||
|
IGpu *gpu,
|
||||||
|
const IBuffer::CreateInfo &info
|
||||||
|
) -> memory::Scope<IBuffer>;
|
||||||
|
|
||||||
} // namespace lt::renderer
|
} // namespace lt::renderer
|
||||||
|
|
||||||
module :private;
|
module :private;
|
||||||
|
|
@ -71,7 +78,7 @@ namespace lt::renderer {
|
||||||
|
|
||||||
[[nodiscard]] auto create_surface(
|
[[nodiscard]] auto create_surface(
|
||||||
Api target_api,
|
Api target_api,
|
||||||
class IInstance *instance,
|
IInstance *instance,
|
||||||
const lt::ecs::Entity &surface_entity
|
const lt::ecs::Entity &surface_entity
|
||||||
) -> memory::Scope<ISurface>
|
) -> memory::Scope<ISurface>
|
||||||
{
|
{
|
||||||
|
|
@ -134,8 +141,8 @@ namespace lt::renderer {
|
||||||
|
|
||||||
[[nodiscard]] auto create_buffer(
|
[[nodiscard]] auto create_buffer(
|
||||||
Api target_api,
|
Api target_api,
|
||||||
class IDevice *device,
|
IDevice *device,
|
||||||
class IGpu *gpu,
|
IGpu *gpu,
|
||||||
const IBuffer::CreateInfo &info
|
const IBuffer::CreateInfo &info
|
||||||
) -> memory::Scope<IBuffer>
|
) -> memory::Scope<IBuffer>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ import math.vec3;
|
||||||
import math.vec2;
|
import math.vec2;
|
||||||
import debug.assertions;
|
import debug.assertions;
|
||||||
import std;
|
import std;
|
||||||
|
import logger;
|
||||||
|
|
||||||
template<class... Ts>
|
template<class... Ts>
|
||||||
struct overloads: Ts...
|
struct overloads: Ts...
|
||||||
|
|
@ -81,6 +82,9 @@ constexpr auto validation = "VK_LAYER_KHRONOS_validation";
|
||||||
namespace instance_extension_names {
|
namespace instance_extension_names {
|
||||||
|
|
||||||
constexpr auto debug_utils = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
|
constexpr auto debug_utils = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
|
||||||
|
constexpr auto physical_device_properties_2
|
||||||
|
= VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
|
||||||
|
|
||||||
constexpr auto surface = VK_KHR_SURFACE_EXTENSION_NAME;
|
constexpr auto surface = VK_KHR_SURFACE_EXTENSION_NAME;
|
||||||
#if defined(LIGHT_PLATFORM_LINUX)
|
#if defined(LIGHT_PLATFORM_LINUX)
|
||||||
constexpr auto platform_surface = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
|
constexpr auto platform_surface = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;
|
||||||
|
|
@ -90,8 +94,6 @@ constexpr auto platform_surface = VK_KHR_WIN32_SURFACE_EXTENSION_NAME;
|
||||||
#else
|
#else
|
||||||
#error "Unsupported platform"
|
#error "Unsupported platform"
|
||||||
#endif
|
#endif
|
||||||
constexpr auto physical_device_properties_2
|
|
||||||
= VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME;
|
|
||||||
|
|
||||||
} // namespace instance_extension_names
|
} // namespace instance_extension_names
|
||||||
|
|
||||||
|
|
@ -100,6 +102,10 @@ namespace device_extension_names {
|
||||||
constexpr auto swapchain = VK_KHR_SWAPCHAIN_EXTENSION_NAME;
|
constexpr auto swapchain = VK_KHR_SWAPCHAIN_EXTENSION_NAME;
|
||||||
constexpr auto dynamic_rendering = VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME;
|
constexpr auto dynamic_rendering = VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME;
|
||||||
constexpr auto descriptor_indexing = VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME;
|
constexpr auto descriptor_indexing = VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME;
|
||||||
|
constexpr auto depth_stencil_resolve = VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME;
|
||||||
|
constexpr auto maintenance_3 = VK_KHR_MAINTENANCE3_EXTENSION_NAME;
|
||||||
|
constexpr auto create_renderpass2= VK_KHR_CREATE_RENDERPASS2_EXTENSION_NAME
|
||||||
|
|
||||||
|
|
||||||
}; // namespace device_extension_names
|
}; // namespace device_extension_names
|
||||||
|
|
||||||
|
|
@ -1278,8 +1284,10 @@ public:
|
||||||
/** de-allocation functions */
|
/** de-allocation functions */
|
||||||
void free_memory(VkDeviceMemory memory) const;
|
void free_memory(VkDeviceMemory memory) const;
|
||||||
|
|
||||||
void free_descriptor_set(VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set)
|
void free_descriptor_set(
|
||||||
const;
|
VkDescriptorPool descriptor_pool,
|
||||||
|
VkDescriptorSet descriptor_set
|
||||||
|
) const;
|
||||||
|
|
||||||
/** destroy functions */
|
/** destroy functions */
|
||||||
void destroy_swapchain(VkSwapchainKHR swapchain) const;
|
void destroy_swapchain(VkSwapchainKHR swapchain) const;
|
||||||
|
|
@ -2542,6 +2550,10 @@ public:
|
||||||
private:
|
private:
|
||||||
memory::NullOnMove<VkInstance> m_instance {};
|
memory::NullOnMove<VkInstance> m_instance {};
|
||||||
|
|
||||||
|
Callback m_user_callback;
|
||||||
|
|
||||||
|
void *m_user_data {};
|
||||||
|
|
||||||
VkDebugUtilsMessengerEXT m_messenger {};
|
VkDebugUtilsMessengerEXT m_messenger {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -2925,22 +2937,55 @@ Instance::Instance(CreateInfo info)
|
||||||
auto layer_settings = std::vector<VkLayerSettingEXT> {};
|
auto layer_settings = std::vector<VkLayerSettingEXT> {};
|
||||||
auto layer_names = std::vector<const char *> {};
|
auto layer_names = std::vector<const char *> {};
|
||||||
auto extension_names = std::vector<const char *> {};
|
auto extension_names = std::vector<const char *> {};
|
||||||
|
for (auto &extension : info.extensions)
|
||||||
|
{
|
||||||
|
extension_names.emplace_back(extension.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto &layer : info.layers)
|
for (const auto &layer : info.layers)
|
||||||
{
|
{
|
||||||
layer_names.emplace_back(layer.name.c_str());
|
layer_names.emplace_back(layer.name.c_str());
|
||||||
for (const auto &setting : layer.settings)
|
for (const auto &setting : layer.settings)
|
||||||
{
|
{
|
||||||
layer_settings.emplace_back(VkLayerSettingEXT {
|
const auto *values = (void *) { nullptr };
|
||||||
.pLayerName = layer.name.c_str(),
|
|
||||||
.pSettingName = setting.name.c_str(),
|
if (setting.values.index() == 0)
|
||||||
.type = std::visit(layer_setting_type_visitor, setting.values),
|
{
|
||||||
.valueCount = 1u,
|
values = std::bit_cast<const void *>(std::get<0>(setting.values).data());
|
||||||
.pValues = std::visit(layer_setting_value_visitor, setting.values),
|
}
|
||||||
});
|
else if (setting.values.index() == 1)
|
||||||
|
{
|
||||||
|
values = std::bit_cast<const void *>(&std::get<1>(setting.values));
|
||||||
|
}
|
||||||
|
else if (setting.values.index() == 2)
|
||||||
|
{
|
||||||
|
values = std::bit_cast<const void *>(&std::get<2>(setting.values));
|
||||||
|
}
|
||||||
|
|
||||||
|
debug::ensure(values, "Failed to get variant from setting.values");
|
||||||
|
|
||||||
|
layer_settings.emplace_back(
|
||||||
|
VkLayerSettingEXT {
|
||||||
|
.pLayerName = layer.name.c_str(),
|
||||||
|
.pSettingName = setting.name.c_str(),
|
||||||
|
.type = std::visit(layer_setting_type_visitor, setting.values),
|
||||||
|
.valueCount = 1u,
|
||||||
|
.pValues = values,
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log::debug("Settings size: {}", layer_settings.size());
|
||||||
|
log::debug("Settings:");
|
||||||
|
for (auto &setting : layer_settings)
|
||||||
|
{
|
||||||
|
log::debug("\tpValues: {}", (std::size_t)setting.pValues);
|
||||||
|
log::debug("\tname: {}", setting.pSettingName);
|
||||||
|
log::debug("\tlayer name: {}", setting.pLayerName);
|
||||||
|
log::debug("\ttype: {}", std::to_underlying(setting.type));
|
||||||
|
log::debug("\tvalue count: {}", setting.valueCount);
|
||||||
|
}
|
||||||
const auto layer_settings_create_info = VkLayerSettingsCreateInfoEXT {
|
const auto layer_settings_create_info = VkLayerSettingsCreateInfoEXT {
|
||||||
.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT,
|
.sType = VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT,
|
||||||
.settingCount = static_cast<uint32_t>(layer_settings.size()),
|
.settingCount = static_cast<uint32_t>(layer_settings.size()),
|
||||||
|
|
@ -2953,10 +2998,17 @@ Instance::Instance(CreateInfo info)
|
||||||
.flags = {},
|
.flags = {},
|
||||||
.enabledLayerCount = static_cast<uint32_t>(info.layers.size()),
|
.enabledLayerCount = static_cast<uint32_t>(info.layers.size()),
|
||||||
.ppEnabledLayerNames = layer_names.data(),
|
.ppEnabledLayerNames = layer_names.data(),
|
||||||
.enabledExtensionCount = static_cast<uint32_t>(info.extensions.size()),
|
.enabledExtensionCount = static_cast<uint32_t>(extension_names.size()),
|
||||||
.ppEnabledExtensionNames = extension_names.data(),
|
.ppEnabledExtensionNames = extension_names.data(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
log::debug("Extension names:");
|
||||||
|
for (auto &extension_name : extension_names)
|
||||||
|
{
|
||||||
|
log::debug("\t{}", extension_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
log::debug("Create instance: {}", (std::size_t)(api::create_instance));
|
||||||
vkc(api::create_instance(&vk_info, nullptr, &m_instance));
|
vkc(api::create_instance(&vk_info, nullptr, &m_instance));
|
||||||
debug::ensure(m_instance, "Failed to create vulkan instance");
|
debug::ensure(m_instance, "Failed to create vulkan instance");
|
||||||
}
|
}
|
||||||
|
|
@ -3096,6 +3148,7 @@ Surface::~Surface()
|
||||||
};
|
};
|
||||||
|
|
||||||
api::get_physical_device_features(m_physical_device, &features_2);
|
api::get_physical_device_features(m_physical_device, &features_2);
|
||||||
|
log::debug("Dynamic rendering features: {}", features.dynamicRendering);
|
||||||
return DynamicRenderingFeatures {
|
return DynamicRenderingFeatures {
|
||||||
.enabled = !!features.dynamicRendering,
|
.enabled = !!features.dynamicRendering,
|
||||||
};
|
};
|
||||||
|
|
@ -3116,26 +3169,26 @@ Surface::~Surface()
|
||||||
api::get_physical_device_features(m_physical_device, &features_2);
|
api::get_physical_device_features(m_physical_device, &features_2);
|
||||||
return DescriptorIndexingFeatures {
|
return DescriptorIndexingFeatures {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
.shader_input_attachment_array_dynamic_indexing = features.shaderInputAttachmentArrayDynamicIndexing,
|
.shader_input_attachment_array_dynamic_indexing =false,
|
||||||
.shader_uniform_texel_buffer_array_dynamic_indexing = features.shaderUniformTexelBufferArrayDynamicIndexing,
|
.shader_uniform_texel_buffer_array_dynamic_indexing =false,
|
||||||
.shader_storage_texel_buffer_array_dynamic_indexing = features.shaderStorageTexelBufferArrayDynamicIndexing,
|
.shader_storage_texel_buffer_array_dynamic_indexing =false,
|
||||||
.shader_uniform_buffer_array_non_uniform_indexing = features.shaderUniformBufferArrayNonUniformIndexing,
|
.shader_uniform_buffer_array_non_uniform_indexing =false,
|
||||||
.shader_sampled_image_array_non_uniform_indexing = features.shaderSampledImageArrayNonUniformIndexing,
|
.shader_sampled_image_array_non_uniform_indexing =false,
|
||||||
.shader_storage_buffer_array_non_uniform_indexing = features.shaderStorageBufferArrayNonUniformIndexing,
|
.shader_storage_buffer_array_non_uniform_indexing =false,
|
||||||
.shader_storage_image_array_non_uniform_indexing = features.shaderStorageImageArrayNonUniformIndexing,
|
.shader_storage_image_array_non_uniform_indexing =false,
|
||||||
.shader_input_attachment_array_non_uniform_indexing = features.shaderInputAttachmentArrayNonUniformIndexing,
|
.shader_input_attachment_array_non_uniform_indexing =false,
|
||||||
.shader_uniform_texel_buffer_array_non_uniform_indexing = features.shaderUniformTexelBufferArrayNonUniformIndexing,
|
.shader_uniform_texel_buffer_array_non_uniform_indexing =false,
|
||||||
.shader_storage_texel_buffer_array_non_uniform_indexing = features.shaderStorageTexelBufferArrayNonUniformIndexing,
|
.shader_storage_texel_buffer_array_non_uniform_indexing =false,
|
||||||
.descriptor_binding_uniform_buffer_update_after_bind = features.descriptorBindingUniformBufferUpdateAfterBind,
|
.descriptor_binding_uniform_buffer_update_after_bind =false,
|
||||||
.descriptor_binding_sampled_image_update_after_bind = features.descriptorBindingSampledImageUpdateAfterBind,
|
.descriptor_binding_sampled_image_update_after_bind =false,
|
||||||
.descriptor_binding_storage_image_update_after_bind = features.descriptorBindingStorageImageUpdateAfterBind,
|
.descriptor_binding_storage_image_update_after_bind =false,
|
||||||
.descriptor_binding_storage_buffer_update_after_bind = features.descriptorBindingStorageBufferUpdateAfterBind,
|
.descriptor_binding_storage_buffer_update_after_bind =false,
|
||||||
.descriptor_binding_uniform_texel_buffer_update_after_bind = features.descriptorBindingUniformTexelBufferUpdateAfterBind,
|
.descriptor_binding_uniform_texel_buffer_update_after_bind =false,
|
||||||
.descriptor_binding_storage_texel_buffer_update_after_bind = features.descriptorBindingStorageTexelBufferUpdateAfterBind,
|
.descriptor_binding_storage_texel_buffer_update_after_bind =false,
|
||||||
.descriptor_binding_update_unused_while_pending = features.descriptorBindingUpdateUnusedWhilePending,
|
.descriptor_binding_update_unused_while_pending =false,
|
||||||
.descriptor_binding_partially_bound = features.descriptorBindingPartiallyBound,
|
.descriptor_binding_partially_bound =false,
|
||||||
.descriptor_binding_variable_descriptor_count = features.descriptorBindingVariableDescriptorCount,
|
.descriptor_binding_variable_descriptor_count =false,
|
||||||
.runtime_descriptor_array = features.runtimeDescriptorArray,
|
.runtime_descriptor_array =false,
|
||||||
// clang-format on
|
// clang-format on
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -3413,10 +3466,12 @@ Surface::~Surface()
|
||||||
auto formats = std::vector<Surface::Format> {};
|
auto formats = std::vector<Surface::Format> {};
|
||||||
for (auto &vk_format : vk_formats)
|
for (auto &vk_format : vk_formats)
|
||||||
{
|
{
|
||||||
formats.emplace_back(Surface::Format {
|
formats.emplace_back(
|
||||||
.format = static_cast<Format>(vk_format.format),
|
Surface::Format {
|
||||||
.color_space = static_cast<ColorSpace>(vk_format.colorSpace),
|
.format = static_cast<Format>(vk_format.format),
|
||||||
});
|
.color_space = static_cast<ColorSpace>(vk_format.colorSpace),
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return formats;
|
return formats;
|
||||||
|
|
@ -3473,15 +3528,17 @@ Device::Device(const Gpu &gpu, CreateInfo info)
|
||||||
auto vk_queue_infos = std::vector<VkDeviceQueueCreateInfo> {};
|
auto vk_queue_infos = std::vector<VkDeviceQueueCreateInfo> {};
|
||||||
for (auto queue_family : info.queue_indices)
|
for (auto queue_family : info.queue_indices)
|
||||||
{
|
{
|
||||||
vk_queue_infos.emplace_back(VkDeviceQueueCreateInfo {
|
vk_queue_infos.emplace_back(
|
||||||
.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
|
VkDeviceQueueCreateInfo {
|
||||||
.queueFamilyIndex = queue_family,
|
.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
|
||||||
.queueCount = 1u,
|
.queueFamilyIndex = queue_family,
|
||||||
.pQueuePriorities = &priorities,
|
.queueCount = 1u,
|
||||||
});
|
.pQueuePriorities = &priorities,
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto vk_extension_names = std::vector<const char *>(info.extensions.size());
|
auto vk_extension_names = std::vector<const char *> {};
|
||||||
for (const auto &extension : info.extensions)
|
for (const auto &extension : info.extensions)
|
||||||
{
|
{
|
||||||
vk_extension_names.emplace_back(extension.c_str());
|
vk_extension_names.emplace_back(extension.c_str());
|
||||||
|
|
@ -3562,11 +3619,12 @@ Device::Device(const Gpu &gpu, CreateInfo info)
|
||||||
vk_dynamic_rendering_features = VkPhysicalDeviceDynamicRenderingFeatures {
|
vk_dynamic_rendering_features = VkPhysicalDeviceDynamicRenderingFeatures {
|
||||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,
|
||||||
.pNext = {},
|
.pNext = {},
|
||||||
.dynamicRendering = (*info.dynamic_rendering_features).enabled,
|
.dynamicRendering = true,
|
||||||
};
|
};
|
||||||
|
log::debug("Dynamic rendering: {}", vk_dynamic_rendering_features.dynamicRendering);
|
||||||
|
|
||||||
*last_p_next = &vk_descriptor_indexing_features;
|
*last_p_next = &vk_dynamic_rendering_features;
|
||||||
last_p_next = &vk_descriptor_indexing_features.pNext;
|
// last_p_next = &vk_dynamic_rendering_features.pNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info.descriptor_indexing_features)
|
if (info.descriptor_indexing_features)
|
||||||
|
|
@ -3599,18 +3657,22 @@ Device::Device(const Gpu &gpu, CreateInfo info)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
};
|
};
|
||||||
|
|
||||||
*last_p_next = &vk_descriptor_indexing_features;
|
// *last_p_next = &vk_descriptor_indexing_features;
|
||||||
last_p_next = &vk_descriptor_indexing_features.pNext;
|
// last_p_next = &vk_descriptor_indexing_features.pNext;
|
||||||
|
}
|
||||||
|
for (auto name : vk_extension_names)
|
||||||
|
{
|
||||||
|
log::debug("Extension name: {}", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto vk_info = VkDeviceCreateInfo {
|
auto vk_info = VkDeviceCreateInfo {
|
||||||
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
||||||
.pNext = &vk_features_2,
|
.pNext = &vk_dynamic_rendering_features,
|
||||||
.queueCreateInfoCount = static_cast<uint32_t>(vk_queue_infos.size()),
|
.queueCreateInfoCount = static_cast<uint32_t>(vk_queue_infos.size()),
|
||||||
.pQueueCreateInfos = vk_queue_infos.data(),
|
.pQueueCreateInfos = vk_queue_infos.data(),
|
||||||
.enabledExtensionCount = static_cast<uint32_t>(vk_extension_names.size()),
|
.enabledExtensionCount = static_cast<uint32_t>(vk_extension_names.size()),
|
||||||
.ppEnabledExtensionNames = vk_extension_names.data(),
|
.ppEnabledExtensionNames = vk_extension_names.data(),
|
||||||
.pEnabledFeatures = nullptr, // replaced with VkPhysicalDeviceFeatures2
|
.pEnabledFeatures = &vk_features_2.features, // replaced with VkPhysicalDeviceFeatures2
|
||||||
};
|
};
|
||||||
|
|
||||||
vkc(api::create_device(gpu.m_physical_device, &vk_info, nullptr, &m_device));
|
vkc(api::create_device(gpu.m_physical_device, &vk_info, nullptr, &m_device));
|
||||||
|
|
@ -3871,8 +3933,10 @@ void Device::free_memory(VkDeviceMemory memory) const
|
||||||
api::free_memory(m_device, memory, nullptr);
|
api::free_memory(m_device, memory, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Device::free_descriptor_set(VkDescriptorPool descriptor_pool, VkDescriptorSet descriptor_set)
|
void Device::free_descriptor_set(
|
||||||
const
|
VkDescriptorPool descriptor_pool,
|
||||||
|
VkDescriptorSet descriptor_set
|
||||||
|
) const
|
||||||
{
|
{
|
||||||
vkc(api::free_descriptor_sets(m_device, descriptor_pool, 1, &descriptor_set));
|
vkc(api::free_descriptor_sets(m_device, descriptor_pool, 1, &descriptor_set));
|
||||||
}
|
}
|
||||||
|
|
@ -4164,18 +4228,19 @@ void Memory::unmap()
|
||||||
|
|
||||||
Pipeline::Pipeline(Device &device, PipelineLayout &layout, CreateInfo info)
|
Pipeline::Pipeline(Device &device, PipelineLayout &layout, CreateInfo info)
|
||||||
: m_device(device.m_device.get())
|
: m_device(device.m_device.get())
|
||||||
, m_pipeline()
|
|
||||||
|
|
||||||
{
|
{
|
||||||
auto shader_stages = std::vector<VkPipelineShaderStageCreateInfo> {};
|
auto shader_stages = std::vector<VkPipelineShaderStageCreateInfo> {};
|
||||||
for (auto &[shader, stage] : info.shaders)
|
for (auto &[shader, stage] : info.shaders)
|
||||||
{
|
{
|
||||||
shader_stages.emplace_back(VkPipelineShaderStageCreateInfo {
|
shader_stages.emplace_back(
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
|
VkPipelineShaderStageCreateInfo {
|
||||||
.stage = static_cast<VkShaderStageFlagBits>(stage),
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
|
||||||
.module = shader.get_vk_handle(),
|
.stage = static_cast<VkShaderStageFlagBits>(stage),
|
||||||
.pName = "main",
|
.module = shader.get_vk_handle(),
|
||||||
});
|
.pName = "main",
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dynamic_states = std::array<VkDynamicState, 2> {
|
auto dynamic_states = std::array<VkDynamicState, 2> {
|
||||||
|
|
@ -4258,7 +4323,8 @@ Pipeline::Pipeline(Device &device, PipelineLayout &layout, CreateInfo info)
|
||||||
.colorAttachmentCount = static_cast<uint32_t>(color_attachment_formats.size()),
|
.colorAttachmentCount = static_cast<uint32_t>(color_attachment_formats.size()),
|
||||||
.pColorAttachmentFormats = std::bit_cast<VkFormat *>(color_attachment_formats.data()),
|
.pColorAttachmentFormats = std::bit_cast<VkFormat *>(color_attachment_formats.data()),
|
||||||
.depthAttachmentFormat = info.attachment_state.depth_attachment ?
|
.depthAttachmentFormat = info.attachment_state.depth_attachment ?
|
||||||
static_cast<VkFormat>(*info.attachment_state.depth_attachment
|
static_cast<VkFormat>(
|
||||||
|
*info.attachment_state.depth_attachment
|
||||||
) :
|
) :
|
||||||
VK_FORMAT_UNDEFINED,
|
VK_FORMAT_UNDEFINED,
|
||||||
|
|
||||||
|
|
@ -4298,10 +4364,33 @@ Pipeline::~Pipeline()
|
||||||
|
|
||||||
Messenger::Messenger(Instance &instance, CreateInfo info): m_instance(instance.get_vk_handle())
|
Messenger::Messenger(Instance &instance, CreateInfo info): m_instance(instance.get_vk_handle())
|
||||||
{
|
{
|
||||||
|
constexpr auto native_callback = [](VkDebugUtilsMessageSeverityFlagBitsEXT severity,
|
||||||
|
VkDebugUtilsMessageTypeFlagsEXT types,
|
||||||
|
const VkDebugUtilsMessengerCallbackDataEXT *data,
|
||||||
|
void *user_data) {
|
||||||
|
auto *messenger = std::bit_cast<Messenger *>(user_data);
|
||||||
|
messenger->m_user_callback(
|
||||||
|
severity,
|
||||||
|
types,
|
||||||
|
{ .message = data->pMessage },
|
||||||
|
messenger->m_user_data
|
||||||
|
);
|
||||||
|
|
||||||
|
return VK_FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
m_user_callback = std::move(info.user_callback);
|
||||||
|
m_user_data = info.user_data;
|
||||||
auto vk_info = VkDebugUtilsMessengerCreateInfoEXT {
|
auto vk_info = VkDebugUtilsMessengerCreateInfoEXT {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
|
||||||
|
.messageSeverity = info.enabled_severities,
|
||||||
|
.messageType = info.enabled_types,
|
||||||
|
.pfnUserCallback = native_callback,
|
||||||
|
.pUserData = this,
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
log::debug("Creating debug messenger....");
|
||||||
vkc(api::create_debug_messenger(m_instance, &vk_info, nullptr, &m_messenger));
|
vkc(api::create_debug_messenger(m_instance, &vk_info, nullptr, &m_messenger));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,6 @@ export class Debugger: public IDebugger
|
||||||
public:
|
public:
|
||||||
Debugger(IInstance *instance, CreateInfo info);
|
Debugger(IInstance *instance, CreateInfo info);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void native_callback(
|
static void native_callback(
|
||||||
vk::Flags severity,
|
vk::Flags severity,
|
||||||
|
|
|
||||||
|
|
@ -101,9 +101,12 @@ void Device::initialize_logical_device()
|
||||||
vk::device_extension_names::swapchain,
|
vk::device_extension_names::swapchain,
|
||||||
vk::device_extension_names::dynamic_rendering,
|
vk::device_extension_names::dynamic_rendering,
|
||||||
vk::device_extension_names::descriptor_indexing,
|
vk::device_extension_names::descriptor_indexing,
|
||||||
|
vk::device_extension_names::depth_stencil_resolve,
|
||||||
|
vk::device_extension_names::maintenance_3,
|
||||||
|
vk::device_extension_names::create_renderpass2,
|
||||||
},
|
},
|
||||||
|
|
||||||
.features = m_gpu->vk().get_features(),
|
.features = {},
|
||||||
|
|
||||||
.dynamic_rendering_features = m_gpu->vk().get_supported_dynamic_rendering_features(),
|
.dynamic_rendering_features = m_gpu->vk().get_supported_dynamic_rendering_features(),
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue