Compare commits
3 Commits
703624eb86
...
a790c26f1c
| Author | SHA1 | Date |
|---|---|---|
|
|
a790c26f1c | |
|
|
668189acb5 | |
|
|
b8b620a723 |
|
|
@ -7,7 +7,7 @@ INTERFACE
|
||||||
"global.h"
|
"global.h"
|
||||||
"constants.h"
|
"constants.h"
|
||||||
"config.h"
|
"config.h"
|
||||||
"context.h"
|
"instance.h"
|
||||||
"physical_device.h"
|
"physical_device.h"
|
||||||
"device.h"
|
"device.h"
|
||||||
"swapchain.h"
|
"swapchain.h"
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
#include <EASTL/vector.h>
|
#include <EASTL/vector.h>
|
||||||
|
|
||||||
struct QueueAllocation;
|
struct QueueAllocation;
|
||||||
struct Context;
|
struct Instance;
|
||||||
struct PhysicalDevice;
|
struct PhysicalDevice;
|
||||||
|
|
||||||
struct Features
|
struct Features
|
||||||
|
|
@ -40,9 +40,9 @@ struct Device final
|
||||||
void WaitIdle() const;
|
void WaitIdle() const;
|
||||||
|
|
||||||
// Ctor/Dtor
|
// Ctor/Dtor
|
||||||
Device(const Context *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
Device(const Instance *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
||||||
const eastl::vector<QueueAllocation> &queueAllocations, NameString &&name);
|
const eastl::vector<QueueAllocation> &queueAllocations, NameString &&name);
|
||||||
Device(const Context *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
Device(const Instance *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
||||||
const eastl::vector<QueueAllocation> &queueAllocations, eastl::span<u8> &&pipelineCacheData,
|
const eastl::vector<QueueAllocation> &queueAllocations, eastl::span<u8> &&pipelineCacheData,
|
||||||
NameString &&name);
|
NameString &&name);
|
||||||
~Device();
|
~Device();
|
||||||
|
|
|
||||||
|
|
@ -8,25 +8,25 @@
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class Context
|
* @class Instance
|
||||||
*
|
*
|
||||||
* @brief Vulkan context to handle device initialization logic.
|
* @brief Vulkan context to handle device initialization logic.
|
||||||
*
|
*
|
||||||
* Handles the required hardware interactions.
|
* Handles the required hardware interactions.
|
||||||
*/
|
*/
|
||||||
struct Context final
|
struct Instance final
|
||||||
{
|
{
|
||||||
// Members
|
// Members
|
||||||
vk::Instance m_Instance = nullptr;
|
vk::Instance m_Instance = nullptr;
|
||||||
vk::DebugUtilsMessengerEXT m_DebugMessenger = nullptr;
|
vk::DebugUtilsMessengerEXT m_DebugMessenger = nullptr;
|
||||||
|
|
||||||
// Ctor/Dtor
|
// Ctor/Dtor
|
||||||
Context(cstr appName, Version version, bool enableValidation = ENABLE_LAYER_MESSAGES_DEFAULT_VALUE);
|
Instance(cstr appName, Version version, bool enableValidation = ENABLE_LAYER_MESSAGES_DEFAULT_VALUE);
|
||||||
~Context();
|
~Instance();
|
||||||
|
|
||||||
// Move
|
// Move
|
||||||
Context(Context &&other) noexcept;
|
Instance(Instance &&other) noexcept;
|
||||||
Context &operator=(Context &&other) noexcept;
|
Instance &operator=(Instance &&other) noexcept;
|
||||||
|
|
||||||
#if !defined(ASTER_NDEBUG)
|
#if !defined(ASTER_NDEBUG)
|
||||||
constexpr static bool ENABLE_LAYER_MESSAGES_DEFAULT_VALUE = true;
|
constexpr static bool ENABLE_LAYER_MESSAGES_DEFAULT_VALUE = true;
|
||||||
|
|
@ -34,5 +34,5 @@ struct Context final
|
||||||
constexpr static bool ENABLE_LAYER_MESSAGES_DEFAULT_VALUE = false;
|
constexpr static bool ENABLE_LAYER_MESSAGES_DEFAULT_VALUE = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Context);
|
DISALLOW_COPY_AND_ASSIGN(Instance);
|
||||||
};
|
};
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
#include <EASTL/fixed_vector.h>
|
#include <EASTL/fixed_vector.h>
|
||||||
|
|
||||||
struct Window;
|
struct Window;
|
||||||
struct Context;
|
struct Instance;
|
||||||
|
|
||||||
enum class QueueSupportFlagBits
|
enum class QueueSupportFlagBits
|
||||||
{
|
{
|
||||||
|
|
@ -54,5 +54,5 @@ struct PhysicalDevice final
|
||||||
class PhysicalDevices : public eastl::fixed_vector<PhysicalDevice, 4>
|
class PhysicalDevices : public eastl::fixed_vector<PhysicalDevice, 4>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PhysicalDevices(const Surface *surface, const Context *context);
|
PhysicalDevices(const Surface *surface, const Instance *context);
|
||||||
};
|
};
|
||||||
|
|
@ -7,17 +7,17 @@
|
||||||
|
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
struct Context;
|
struct Instance;
|
||||||
struct Window;
|
struct Window;
|
||||||
|
|
||||||
struct Surface
|
struct Surface
|
||||||
{
|
{
|
||||||
Context *m_Context;
|
Instance *m_Context;
|
||||||
vk::SurfaceKHR m_Surface;
|
vk::SurfaceKHR m_Surface;
|
||||||
NameString m_Name;
|
NameString m_Name;
|
||||||
|
|
||||||
// Ctor Dtor
|
// Ctor Dtor
|
||||||
Surface(Context *context, const Window *window, cstr name);
|
Surface(Instance *context, const Window *window, cstr name);
|
||||||
~Surface();
|
~Surface();
|
||||||
|
|
||||||
// Move
|
// Move
|
||||||
|
|
|
||||||
|
|
@ -30,5 +30,6 @@ class BufferManager final
|
||||||
[[nodiscard]] Ref<StorageBuffer> CreateStorageBuffer(usize size, cstr name = nullptr) const;
|
[[nodiscard]] Ref<StorageBuffer> CreateStorageBuffer(usize size, cstr name = nullptr) const;
|
||||||
[[nodiscard]] Ref<UniformBuffer> CreateUniformBuffer(usize size, cstr name = nullptr) const;
|
[[nodiscard]] Ref<UniformBuffer> CreateUniformBuffer(usize size, cstr name = nullptr) const;
|
||||||
[[nodiscard]] Ref<StagingBuffer> CreateStagingBuffer(usize size, cstr name = nullptr) const;
|
[[nodiscard]] Ref<StagingBuffer> CreateStagingBuffer(usize size, cstr name = nullptr) const;
|
||||||
|
[[nodiscard]] Ref<VertexBuffer> CreateVertexBuffer(usize size, cstr name = nullptr) const;
|
||||||
};
|
};
|
||||||
} // namespace systems
|
} // namespace systems
|
||||||
|
|
@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.13)
|
||||||
target_sources(aster_core
|
target_sources(aster_core
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"global.cpp"
|
"global.cpp"
|
||||||
"context.cpp"
|
"instance.cpp"
|
||||||
"physical_device.cpp"
|
"physical_device.cpp"
|
||||||
"device.cpp"
|
"device.cpp"
|
||||||
"swapchain.cpp"
|
"swapchain.cpp"
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include "core/device.h"
|
#include "core/device.h"
|
||||||
|
|
||||||
#include "core/context.h"
|
#include "core/instance.h"
|
||||||
#include "core/physical_device.h"
|
#include "core/physical_device.h"
|
||||||
#include "core/queue_allocation.h"
|
#include "core/queue_allocation.h"
|
||||||
|
|
||||||
|
|
@ -17,13 +17,13 @@ constexpr eastl::array DEVICE_EXTENSIONS = {
|
||||||
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
|
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
|
||||||
};
|
};
|
||||||
|
|
||||||
Device::Device(const Context *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
Device::Device(const Instance *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
||||||
const eastl::vector<QueueAllocation> &queueAllocations, NameString &&name)
|
const eastl::vector<QueueAllocation> &queueAllocations, NameString &&name)
|
||||||
: Device(context, physicalDevice, enabledFeatures, queueAllocations, {}, std::move(name))
|
: Device(context, physicalDevice, enabledFeatures, queueAllocations, {}, std::move(name))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Device::Device(const Context *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
Device::Device(const Instance *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
||||||
const eastl::vector<QueueAllocation> &queueAllocations, eastl::span<u8> &&pipelineCacheData,
|
const eastl::vector<QueueAllocation> &queueAllocations, eastl::span<u8> &&pipelineCacheData,
|
||||||
NameString &&name)
|
NameString &&name)
|
||||||
: m_Name(std::move(name))
|
: m_Name(std::move(name))
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
// Copyright (c) 2020-2025 Anish Bhobe
|
// Copyright (c) 2020-2025 Anish Bhobe
|
||||||
// =============================================
|
// =============================================
|
||||||
|
|
||||||
#include "core/context.h"
|
#include "core/instance.h"
|
||||||
|
|
||||||
#include <EASTL/array.h>
|
#include <EASTL/array.h>
|
||||||
#include <EASTL/fixed_vector.h>
|
#include <EASTL/fixed_vector.h>
|
||||||
|
|
@ -35,7 +35,7 @@ DebugCallback(const VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context::Context(const cstr appName, const Version version, bool enableValidation)
|
Instance::Instance(const cstr appName, const Version version, bool enableValidation)
|
||||||
{
|
{
|
||||||
INFO_IF(enableValidation, "Validation Layers enabled");
|
INFO_IF(enableValidation, "Validation Layers enabled");
|
||||||
|
|
||||||
|
|
@ -97,7 +97,7 @@ Context::Context(const cstr appName, const Version version, bool enableValidatio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context::~Context()
|
Instance::~Instance()
|
||||||
{
|
{
|
||||||
if (m_DebugMessenger)
|
if (m_DebugMessenger)
|
||||||
{
|
{
|
||||||
|
|
@ -108,14 +108,14 @@ Context::~Context()
|
||||||
DEBUG("Instance destroyed");
|
DEBUG("Instance destroyed");
|
||||||
}
|
}
|
||||||
|
|
||||||
Context::Context(Context &&other) noexcept
|
Instance::Instance(Instance &&other) noexcept
|
||||||
: m_Instance(Take(other.m_Instance))
|
: m_Instance(Take(other.m_Instance))
|
||||||
, m_DebugMessenger(Take(other.m_DebugMessenger))
|
, m_DebugMessenger(Take(other.m_DebugMessenger))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Context &
|
Instance &
|
||||||
Context::operator=(Context &&other) noexcept
|
Instance::operator=(Instance &&other) noexcept
|
||||||
{
|
{
|
||||||
if (this == &other)
|
if (this == &other)
|
||||||
return *this;
|
return *this;
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include "core/physical_device.h"
|
#include "core/physical_device.h"
|
||||||
|
|
||||||
#include "core/context.h"
|
#include "core/instance.h"
|
||||||
#include "core/surface.h"
|
#include "core/surface.h"
|
||||||
|
|
||||||
[[nodiscard]] vk::SurfaceCapabilitiesKHR
|
[[nodiscard]] vk::SurfaceCapabilitiesKHR
|
||||||
|
|
@ -154,7 +154,7 @@ EnumeratePhysicalDevices(const vk::Instance instance)
|
||||||
return physicalDevices;
|
return physicalDevices;
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicalDevices::PhysicalDevices(const Surface *surface, const Context *context)
|
PhysicalDevices::PhysicalDevices(const Surface *surface, const Instance *context)
|
||||||
{
|
{
|
||||||
auto physicalDevices = EnumeratePhysicalDevices(context->m_Instance);
|
auto physicalDevices = EnumeratePhysicalDevices(context->m_Instance);
|
||||||
for (auto physicalDevice : physicalDevices)
|
for (auto physicalDevice : physicalDevices)
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@
|
||||||
|
|
||||||
#include "core/surface.h"
|
#include "core/surface.h"
|
||||||
|
|
||||||
#include "core/context.h"
|
#include "core/instance.h"
|
||||||
#include "core/window.h"
|
#include "core/window.h"
|
||||||
|
|
||||||
Surface::Surface(Context *context, const Window *window, cstr name)
|
Surface::Surface(Instance *context, const Window *window, cstr name)
|
||||||
: m_Context(context)
|
: m_Context(context)
|
||||||
, m_Name(name)
|
, m_Name(name)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include "core/window.h"
|
#include "core/window.h"
|
||||||
|
|
||||||
#include "core/context.h"
|
#include "core/instance.h"
|
||||||
#include "util/logger.h"
|
#include "util/logger.h"
|
||||||
|
|
||||||
std::atomic_uint64_t Window::m_WindowCount = 0;
|
std::atomic_uint64_t Window::m_WindowCount = 0;
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,16 @@ BufferManager::CreateStagingBuffer(const usize size, const cstr name) const
|
||||||
return std::make_shared<StagingBuffer>(Buffer{m_Device, size, usage, createFlags, memoryUsage, name});
|
return std::make_shared<StagingBuffer>(Buffer{m_Device, size, usage, createFlags, memoryUsage, name});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<VertexBuffer>
|
||||||
|
BufferManager::CreateVertexBuffer(const usize size, const cstr name) const
|
||||||
|
{
|
||||||
|
constexpr vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eVertexBuffer;
|
||||||
|
constexpr VmaAllocationCreateFlags createFlags =
|
||||||
|
VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;
|
||||||
|
constexpr VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_AUTO;
|
||||||
|
return std::make_shared<VertexBuffer>(Buffer{m_Device, size, usage, createFlags, memoryUsage, name});
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// void
|
// void
|
||||||
// UniformBuffer::Init(const Device *device, const usize size, const cstr name)
|
// UniformBuffer::Init(const Device *device, const usize size, const cstr name)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
|
||||||
#include "aster/core/context.h"
|
#include "aster/core/instance.h"
|
||||||
#include "aster/core/device.h"
|
#include "aster/core/device.h"
|
||||||
#include "aster/core/window.h"
|
#include "aster/core/window.h"
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
|
|
@ -26,7 +26,7 @@ VulkanAssert(VkResult result)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Init(const Context *context, const Device *device, const Window *window, vk::Format attachmentFormat,
|
Init(const Instance *context, const Device *device, const Window *window, vk::Format attachmentFormat,
|
||||||
const u32 imageCount, const u32 queueFamily, const vk::Queue queue)
|
const u32 imageCount, const u32 queueFamily, const vk::Queue queue)
|
||||||
{
|
{
|
||||||
g_AttachmentFormat = attachmentFormat;
|
g_AttachmentFormat = attachmentFormat;
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,14 @@
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
|
||||||
struct Device;
|
struct Device;
|
||||||
struct Context;
|
struct Instance;
|
||||||
struct Window;
|
struct Window;
|
||||||
struct Swapchain;
|
struct Swapchain;
|
||||||
|
|
||||||
// ReSharper disable once CppInconsistentNaming
|
// ReSharper disable once CppInconsistentNaming
|
||||||
namespace ImGui
|
namespace ImGui
|
||||||
{
|
{
|
||||||
void Init(const Context *context, const Device *device, const Window *window, vk::Format attachmentFormat,
|
void Init(const Instance *context, const Device *device, const Window *window, vk::Format attachmentFormat,
|
||||||
u32 imageCount, u32 queueFamily, vk::Queue queue);
|
u32 imageCount, u32 queueFamily, vk::Queue queue);
|
||||||
void Destroy(const Device *device);
|
void Destroy(const Device *device);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "aster/core/buffer.h"
|
#include "aster/core/buffer.h"
|
||||||
#include "aster/core/constants.h"
|
#include "aster/core/constants.h"
|
||||||
#include "aster/core/context.h"
|
#include "aster/core/instance.h"
|
||||||
#include "aster/core/device.h"
|
#include "aster/core/device.h"
|
||||||
#include "aster/core/physical_device.h"
|
#include "aster/core/physical_device.h"
|
||||||
#include "aster/core/pipeline.h"
|
#include "aster/core/pipeline.h"
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
#include "aster/core/window.h"
|
#include "aster/core/window.h"
|
||||||
|
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
|
#include "aster/systems/resource_manager.h"
|
||||||
|
|
||||||
#include <EASTL/array.h>
|
#include <EASTL/array.h>
|
||||||
|
|
||||||
|
|
@ -75,7 +76,7 @@ main(int, char **)
|
||||||
MIN_LOG_LEVEL(Logger::LogType::eInfo);
|
MIN_LOG_LEVEL(Logger::LogType::eInfo);
|
||||||
|
|
||||||
Window window = {"Triangle (Aster)", {640, 480}};
|
Window window = {"Triangle (Aster)", {640, 480}};
|
||||||
Context context = {"Triangle", VERSION};
|
Instance context = {"Triangle", VERSION};
|
||||||
Surface surface = {&context, &window, "Primary"};
|
Surface surface = {&context, &window, "Primary"};
|
||||||
|
|
||||||
PhysicalDevices physicalDevices = {&surface, &context};
|
PhysicalDevices physicalDevices = {&surface, &context};
|
||||||
|
|
@ -92,6 +93,7 @@ main(int, char **)
|
||||||
vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0);
|
vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0);
|
||||||
Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"};
|
Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"};
|
||||||
Pipeline pipeline = CreatePipeline(&device, &swapchain);
|
Pipeline pipeline = CreatePipeline(&device, &swapchain);
|
||||||
|
systems::ResourceManager resourceManager{&device};
|
||||||
|
|
||||||
vk::CommandPool copyPool;
|
vk::CommandPool copyPool;
|
||||||
vk::CommandBuffer copyBuffer;
|
vk::CommandBuffer copyBuffer;
|
||||||
|
|
@ -117,45 +119,8 @@ main(int, char **)
|
||||||
Vertex{.m_Position = {0.5f, -0.5f, 0.0f}, .m_Color = {0.0f, 1.0f, 0.0f}},
|
Vertex{.m_Position = {0.5f, -0.5f, 0.0f}, .m_Color = {0.0f, 1.0f, 0.0f}},
|
||||||
Vertex{.m_Position = {0.0f, 0.5f, 0.0f}, .m_Color = {0.0f, 0.0f, 1.0f}},
|
Vertex{.m_Position = {0.0f, 0.5f, 0.0f}, .m_Color = {0.0f, 0.0f, 1.0f}},
|
||||||
};
|
};
|
||||||
VertexBuffer vbo;
|
auto vbo = resourceManager.Buffers().CreateVertexBuffer(vertices.size() * sizeof vertices[0], "VBO");
|
||||||
vbo.Init(&device, vertices.size() * sizeof vertices[0], "VBO");
|
vbo->Write(0, vertices.size() * sizeof vertices[0], vertices.data());
|
||||||
{
|
|
||||||
StagingBuffer staging;
|
|
||||||
staging.Init(&device, vertices.size() * sizeof vertices[0], "Staging");
|
|
||||||
staging.Write(0, vertices.size() * sizeof vertices[0], vertices.data());
|
|
||||||
|
|
||||||
vk::Fence fence;
|
|
||||||
vk::FenceCreateInfo fenceCreateInfo = {};
|
|
||||||
auto result = device.m_Device.createFence(&fenceCreateInfo, nullptr, &fence);
|
|
||||||
ERROR_IF(Failed(result), "Fence creation failed. Cause: {}", result) THEN_ABORT(result);
|
|
||||||
|
|
||||||
vk::CommandBufferBeginInfo beginInfo = {.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit};
|
|
||||||
result = copyBuffer.begin(&beginInfo);
|
|
||||||
ERROR_IF(Failed(result), "Copy begin failed. Cause: {}", result) THEN_ABORT(result);
|
|
||||||
|
|
||||||
vk::BufferCopy bufferCopy = {.srcOffset = 0, .dstOffset = 0, .size = staging.m_Size};
|
|
||||||
copyBuffer.copyBuffer(staging.m_Buffer, vbo.m_Buffer, 1, &bufferCopy);
|
|
||||||
|
|
||||||
result = copyBuffer.end();
|
|
||||||
ERROR_IF(Failed(result), "Copy end failed. Cause: {}", result) THEN_ABORT(result);
|
|
||||||
|
|
||||||
vk::SubmitInfo submitInfo = {
|
|
||||||
.commandBufferCount = 1,
|
|
||||||
.pCommandBuffers = ©Buffer,
|
|
||||||
};
|
|
||||||
|
|
||||||
result = commandQueue.submit(1, &submitInfo, fence);
|
|
||||||
ERROR_IF(Failed(result), "Submit failed. Cause: {}", result) THEN_ABORT(result) ELSE_INFO("Submit copy");
|
|
||||||
|
|
||||||
result = device.m_Device.waitForFences(1, &fence, true, MaxValue<u64>);
|
|
||||||
ERROR_IF(Failed(result), "Fence wait failed. Cause: {}", result) THEN_ABORT(result) ELSE_INFO("Fence wait");
|
|
||||||
|
|
||||||
result = device.m_Device.resetCommandPool(copyPool, {});
|
|
||||||
ERROR_IF(Failed(result), "Couldn't reset command pool. Cause: {}", result) THEN_ABORT(result);
|
|
||||||
|
|
||||||
device.m_Device.destroy(fence, nullptr);
|
|
||||||
staging.Destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Persistent variables
|
// Persistent variables
|
||||||
vk::Viewport viewport = {
|
vk::Viewport viewport = {
|
||||||
|
|
@ -294,7 +259,7 @@ main(int, char **)
|
||||||
cmd.setScissor(0, 1, &scissor);
|
cmd.setScissor(0, 1, &scissor);
|
||||||
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.m_Pipeline);
|
cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.m_Pipeline);
|
||||||
usize offsets = 0;
|
usize offsets = 0;
|
||||||
cmd.bindVertexBuffers(0, 1, &vbo.m_Buffer, &offsets);
|
cmd.bindVertexBuffers(0, 1, &vbo->m_Buffer, &offsets);
|
||||||
cmd.draw(3, 1, 0, 0);
|
cmd.draw(3, 1, 0, 0);
|
||||||
|
|
||||||
cmd.endRendering();
|
cmd.endRendering();
|
||||||
|
|
@ -352,7 +317,6 @@ main(int, char **)
|
||||||
device.WaitIdle();
|
device.WaitIdle();
|
||||||
|
|
||||||
device.m_Device.destroy(copyPool, nullptr);
|
device.m_Device.destroy(copyPool, nullptr);
|
||||||
vbo.Destroy();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "aster/core/buffer.h"
|
#include "aster/core/buffer.h"
|
||||||
#include "aster/core/constants.h"
|
#include "aster/core/constants.h"
|
||||||
#include "aster/core/context.h"
|
#include "aster/core/instance.h"
|
||||||
#include "aster/core/device.h"
|
#include "aster/core/device.h"
|
||||||
#include "aster/core/image.h"
|
#include "aster/core/image.h"
|
||||||
#include "aster/core/physical_device.h"
|
#include "aster/core/physical_device.h"
|
||||||
|
|
@ -99,7 +99,7 @@ main(int, char **)
|
||||||
MIN_LOG_LEVEL(Logger::LogType::eInfo);
|
MIN_LOG_LEVEL(Logger::LogType::eInfo);
|
||||||
|
|
||||||
Window window = {"Box (Aster)", {640, 480}};
|
Window window = {"Box (Aster)", {640, 480}};
|
||||||
Context context = {"Box", VERSION};
|
Instance context = {"Box", VERSION};
|
||||||
Surface surface = {&context, &window, "Primary"};
|
Surface surface = {&context, &window, "Primary"};
|
||||||
|
|
||||||
PhysicalDevices physicalDevices = {&surface, &context};
|
PhysicalDevices physicalDevices = {&surface, &context};
|
||||||
|
|
|
||||||
|
|
@ -367,14 +367,21 @@ GenerateMipMaps(vk::CommandBuffer commandBuffer, const Ref<Texture> &texture, vk
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<systems::ResId<TextureView>, Ref<Buffer>>
|
std::tuple<systems::ResId<TextureView>, Ref<StagingBuffer>>
|
||||||
AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const
|
AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb, cstr name) const
|
||||||
{
|
{
|
||||||
// TODO(Something not loading properly).
|
// TODO(Something not loading properly).
|
||||||
|
|
||||||
assert(image->component == 4);
|
assert(image->component == 4);
|
||||||
assert(image->height > 0 && image->width > 0);
|
assert(image->height > 0 && image->width > 0);
|
||||||
|
|
||||||
|
#if !defined(ASTER_NDEBUG)
|
||||||
|
auto assignedName = name ? name : image->name.empty() ? image->uri.c_str() : image->name.c_str();
|
||||||
|
#else
|
||||||
|
auto assignedName = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
u32 height = Cast<u32>(image->height);
|
u32 height = Cast<u32>(image->height);
|
||||||
u32 width = Cast<u32>(image->width);
|
u32 width = Cast<u32>(image->width);
|
||||||
|
|
||||||
|
|
@ -384,7 +391,7 @@ AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const
|
||||||
auto texture = m_ResourceManager->Images().CreateTexture2D<Texture>({
|
auto texture = m_ResourceManager->Images().CreateTexture2D<Texture>({
|
||||||
.m_Format = imageFormat,
|
.m_Format = imageFormat,
|
||||||
.m_Extent = {width, height},
|
.m_Extent = {width, height},
|
||||||
.m_Name = image->name.c_str(),
|
.m_Name = assignedName,
|
||||||
.m_IsSampled = true,
|
.m_IsSampled = true,
|
||||||
.m_IsMipMapped = true,
|
.m_IsMipMapped = true,
|
||||||
.m_IsStorage = false,
|
.m_IsStorage = false,
|
||||||
|
|
@ -395,7 +402,7 @@ AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const
|
||||||
|
|
||||||
#if !defined(ASTER_NDEBUG)
|
#if !defined(ASTER_NDEBUG)
|
||||||
StackString<128> loadActionName = "Load: ";
|
StackString<128> loadActionName = "Load: ";
|
||||||
loadActionName += image->name.empty() ? "<texture>" : image->name.c_str();
|
loadActionName += assignedName;
|
||||||
vk::DebugUtilsLabelEXT debugLabel = {
|
vk::DebugUtilsLabelEXT debugLabel = {
|
||||||
.pLabelName = loadActionName.c_str(),
|
.pLabelName = loadActionName.c_str(),
|
||||||
.color = std::array{1.0f, 1.0f, 1.0f, 1.0f},
|
.color = std::array{1.0f, 1.0f, 1.0f, 1.0f},
|
||||||
|
|
@ -541,7 +548,7 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name)
|
||||||
m_CommandBuffer.beginDebugUtilsLabelEXT(&debugLabel);
|
m_CommandBuffer.beginDebugUtilsLabelEXT(&debugLabel);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
eastl::vector<Ref<Buffer>> stagingBuffers;
|
eastl::vector<Ref<StagingBuffer>> stagingBuffers;
|
||||||
|
|
||||||
eastl::hash_map<i32, systems::ResId<TextureView>> textureHandleMap;
|
eastl::hash_map<i32, systems::ResId<TextureView>> textureHandleMap;
|
||||||
|
|
||||||
|
|
@ -562,8 +569,9 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name)
|
||||||
return iter->second;
|
return iter->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *image = &model.images[index];
|
const auto &texture = model.textures[index];
|
||||||
auto [handle, staging] = LoadImageToGpu(image, isSrgb);
|
auto *image = &model.images[texture.source];
|
||||||
|
auto [handle, staging] = LoadImageToGpu(image, isSrgb, texture.name.empty() ? nullptr : texture.name.c_str());
|
||||||
textureHandleMap.emplace(index, handle);
|
textureHandleMap.emplace(index, handle);
|
||||||
stagingBuffers.emplace_back(std::move(staging));
|
stagingBuffers.emplace_back(std::move(staging));
|
||||||
return handle;
|
return handle;
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,6 @@ struct AssetLoader
|
||||||
u32 m_GraphicsQueueIndex;
|
u32 m_GraphicsQueueIndex;
|
||||||
|
|
||||||
Ref<TextureView> LoadHdrImage(cstr path, cstr name = nullptr) const;
|
Ref<TextureView> LoadHdrImage(cstr path, cstr name = nullptr) const;
|
||||||
std::tuple<systems::ResId<TextureView>, Ref<Buffer>> LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const;
|
|
||||||
Model LoadModelToGpu(cstr path, cstr name = nullptr);
|
Model LoadModelToGpu(cstr path, cstr name = nullptr);
|
||||||
|
|
||||||
constexpr static auto ANormal = "NORMAL";
|
constexpr static auto ANormal = "NORMAL";
|
||||||
|
|
@ -132,6 +131,10 @@ struct AssetLoader
|
||||||
AssetLoader &operator=(AssetLoader &&other) noexcept;
|
AssetLoader &operator=(AssetLoader &&other) noexcept;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AssetLoader);
|
DISALLOW_COPY_AND_ASSIGN(AssetLoader);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::tuple<systems::ResId<TextureView>, Ref<StagingBuffer>>
|
||||||
|
LoadImageToGpu(tinygltf::Image *image, bool isSrgb, cstr name = nullptr) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "aster/core/buffer.h"
|
#include "aster/core/buffer.h"
|
||||||
#include "aster/core/constants.h"
|
#include "aster/core/constants.h"
|
||||||
#include "aster/core/context.h"
|
#include "aster/core/instance.h"
|
||||||
#include "aster/core/device.h"
|
#include "aster/core/device.h"
|
||||||
#include "aster/core/image.h"
|
#include "aster/core/image.h"
|
||||||
#include "aster/core/physical_device.h"
|
#include "aster/core/physical_device.h"
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
constexpr u32 MAX_FRAMES_IN_FLIGHT = 3;
|
constexpr u32 MAX_FRAMES_IN_FLIGHT = 3;
|
||||||
constexpr auto PIPELINE_CACHE_FILE = "PipelineCacheData.bin";
|
constexpr auto PIPELINE_CACHE_FILE = "PipelineCacheData.bin";
|
||||||
constexpr auto MODEL_FILE = "model/DamagedHelmet.glb";
|
constexpr auto MODEL_FILE = "model/Sponza/Sponza.gltf";
|
||||||
constexpr auto BACKDROP_FILE = "image/photo_studio_loft_hall_4k.hdr";
|
constexpr auto BACKDROP_FILE = "image/photo_studio_loft_hall_4k.hdr";
|
||||||
constexpr u32 INIT_WIDTH = 1280;
|
constexpr u32 INIT_WIDTH = 1280;
|
||||||
constexpr u32 INIT_HEIGHT = 720;
|
constexpr u32 INIT_HEIGHT = 720;
|
||||||
|
|
@ -136,7 +136,7 @@ main(int, char **)
|
||||||
MIN_LOG_LEVEL(Logger::LogType::eInfo);
|
MIN_LOG_LEVEL(Logger::LogType::eInfo);
|
||||||
|
|
||||||
Window window = {"ModelRender (Aster)", {INIT_WIDTH, INIT_HEIGHT}};
|
Window window = {"ModelRender (Aster)", {INIT_WIDTH, INIT_HEIGHT}};
|
||||||
Context context = {"ModelRender", VERSION};
|
Instance context = {"ModelRender", VERSION};
|
||||||
Surface surface = {&context, &window, "Primary Surface"};
|
Surface surface = {&context, &window, "Primary Surface"};
|
||||||
|
|
||||||
PhysicalDevices physicalDevices = {&surface, &context};
|
PhysicalDevices physicalDevices = {&surface, &context};
|
||||||
|
|
|
||||||
|
|
@ -15,38 +15,38 @@ struct FS_Output
|
||||||
|
|
||||||
float4 GetAlbedo(float2 UV, float4 InColor)
|
float4 GetAlbedo(float2 UV, float4 InColor)
|
||||||
{
|
{
|
||||||
float4 AlbedoFactor = (float4) MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].AlbedoFactor;
|
float4 AlbedoFactor = (float4) MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].AlbedoFactor;
|
||||||
uint AlbedoTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].AlbedoTex;
|
uint AlbedoTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].AlbedoTex;
|
||||||
|
|
||||||
return AlbedoFactor * InColor * (AlbedoTexId != INVALID_HANDLE ? Textures[AlbedoTexId].Sample(ImmutableSamplers[AlbedoTexId], UV) : 1.0f.xxxx);
|
return AlbedoFactor * InColor * (AlbedoTexId != INVALID_HANDLE ? Textures[NonUniformResourceIndex(AlbedoTexId)].Sample(ImmutableSamplers[NonUniformResourceIndex(AlbedoTexId)], UV) : 1.0f.xxxx);
|
||||||
}
|
}
|
||||||
|
|
||||||
float GetOcclusion(float2 UV)
|
float GetOcclusion(float2 UV)
|
||||||
{
|
{
|
||||||
uint OcclusionTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].OcclusionTex;
|
uint OcclusionTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].OcclusionTex;
|
||||||
|
|
||||||
return OcclusionTexId != INVALID_HANDLE ? Textures[OcclusionTexId].Sample(ImmutableSamplers[OcclusionTexId], UV).r : 1.0f;
|
return OcclusionTexId != INVALID_HANDLE ? Textures[NonUniformResourceIndex(OcclusionTexId)].Sample(ImmutableSamplers[NonUniformResourceIndex(OcclusionTexId)], UV).r : 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float3 GetEmissive(float2 UV)
|
float3 GetEmissive(float2 UV)
|
||||||
{
|
{
|
||||||
float3 EmissionFactor = (float3) MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].EmissionFactor;
|
float3 EmissionFactor = (float3) MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].EmissionFactor;
|
||||||
uint EmissionTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].EmissionTex;
|
uint EmissionTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].EmissionTex;
|
||||||
|
|
||||||
return EmissionFactor * (EmissionTexId != INVALID_HANDLE ? Textures[EmissionTexId].Sample(ImmutableSamplers[EmissionTexId], UV).rgb : 1.0f.xxx);
|
return EmissionFactor * (EmissionTexId != INVALID_HANDLE ? Textures[NonUniformResourceIndex(EmissionTexId)].Sample(ImmutableSamplers[NonUniformResourceIndex(EmissionTexId)], UV).rgb : 1.0f.xxx);
|
||||||
}
|
}
|
||||||
|
|
||||||
float3 GetNormal(float3 Position, float3 Normal, float2 UV)
|
float3 GetNormal(float3 Position, float3 Normal, float2 UV)
|
||||||
{
|
{
|
||||||
float3 N = normalize(Normal);
|
float3 N = normalize(Normal);
|
||||||
|
|
||||||
uint NormalTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].NormalTex;
|
uint NormalTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].NormalTex;
|
||||||
if (NormalTexId == INVALID_HANDLE)
|
if (NormalTexId == INVALID_HANDLE)
|
||||||
{
|
{
|
||||||
return N;
|
return N;
|
||||||
}
|
}
|
||||||
|
|
||||||
float3 TangentSpaceNormal = Textures[NormalTexId].Sample(ImmutableSamplers[NormalTexId], UV).xyz * 2.0f - 1.0f;
|
float3 TangentSpaceNormal = Textures[NonUniformResourceIndex(NormalTexId)].Sample(ImmutableSamplers[NonUniformResourceIndex(NormalTexId)], UV).xyz * 2.0f - 1.0f;
|
||||||
|
|
||||||
float3 q1 = ddx(Position);
|
float3 q1 = ddx(Position);
|
||||||
float3 q2 = ddy(Position);
|
float3 q2 = ddy(Position);
|
||||||
|
|
@ -62,10 +62,10 @@ float3 GetNormal(float3 Position, float3 Normal, float2 UV)
|
||||||
|
|
||||||
float2 GetMetalRough(float2 UV)
|
float2 GetMetalRough(float2 UV)
|
||||||
{
|
{
|
||||||
float2 MetalRoughFactors = float2(MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].MetalFactor, MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].RoughFactor);
|
float2 MetalRoughFactors = float2(MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].MetalFactor, MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].RoughFactor);
|
||||||
uint MetalRoughTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][PushConstant.MaterialIdx].MetalRoughTex;
|
uint MetalRoughTexId = MaterialsBuffer[PushConstant.MaterialBufferHandle][NonUniformResourceIndex(PushConstant.MaterialIdx)].MetalRoughTex;
|
||||||
|
|
||||||
return MetalRoughFactors * (MetalRoughTexId != INVALID_HANDLE ? Textures[MetalRoughTexId].Sample(ImmutableSamplers[MetalRoughTexId], UV).bg : 1.0f.xx); // Metal is B, Rough is G.
|
return MetalRoughFactors * (MetalRoughTexId != INVALID_HANDLE ? Textures[NonUniformResourceIndex(MetalRoughTexId)].Sample(ImmutableSamplers[NonUniformResourceIndex(MetalRoughTexId)], UV).bg : 1.0f.xx); // Metal is B, Rough is G.
|
||||||
}
|
}
|
||||||
|
|
||||||
float3 SampleIrradiance(float3 Direction)
|
float3 SampleIrradiance(float3 Direction)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
|
||||||
add_subdirectory("00_util")
|
add_subdirectory("00_util")
|
||||||
# add_subdirectory("01_triangle")
|
add_subdirectory("01_triangle")
|
||||||
add_subdirectory("02_box")
|
add_subdirectory("02_box")
|
||||||
add_subdirectory("03_model_render")
|
add_subdirectory("03_model_render")
|
||||||
# add_subdirectory("04_scenes")
|
# add_subdirectory("04_scenes")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue