Add Device and Window abstraction

This commit is contained in:
Thraix
2023-03-04 23:02:42 +01:00
parent 1e7d08250e
commit c975ed2674
47 changed files with 854 additions and 614 deletions
@@ -1,11 +1,13 @@
#include "copium/sampler/ColorAttachment.h"
#include "copium/core/Device.h"
#include "copium/core/SwapChain.h"
#include "copium/sampler/Image.h"
namespace Copium
{
ColorAttachment::ColorAttachment(Instance& instance, int width, int height)
: Sampler{instance}
ColorAttachment::ColorAttachment(Vulkan& vulkan, int width, int height)
: Sampler{vulkan}
{
InitializeColorAttachment(width, height);
}
@@ -13,11 +15,11 @@ namespace Copium
ColorAttachment::~ColorAttachment()
{
for (auto&& image : images)
vkDestroyImage(instance.GetDevice(), image, nullptr);
vkDestroyImage(vulkan.GetDevice(), image, nullptr);
for (auto&& imageMemory : imageMemories)
vkFreeMemory(instance.GetDevice(), imageMemory, nullptr);
vkFreeMemory(vulkan.GetDevice(), imageMemory, nullptr);
for (auto&& imageView : imageViews)
vkDestroyImageView(instance.GetDevice(), imageView, nullptr);
vkDestroyImageView(vulkan.GetDevice(), imageView, nullptr);
}
VkDescriptorImageInfo ColorAttachment::GetDescriptorImageInfo(int index) const
@@ -40,13 +42,13 @@ namespace Copium
void ColorAttachment::InitializeColorAttachment(int width, int height)
{
images.resize(instance.GetMaxFramesInFlight());
imageMemories.resize(instance.GetMaxFramesInFlight());
imageViews.resize(instance.GetMaxFramesInFlight());
images.resize(SwapChain::MAX_FRAMES_IN_FLIGHT);
imageViews.resize(SwapChain::MAX_FRAMES_IN_FLIGHT);
imageMemories.resize(SwapChain::MAX_FRAMES_IN_FLIGHT);
for (size_t i = 0; i < images.size(); i++)
{
Image::InitializeImage(instance, width, height, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &images[i], &imageMemories[i]);
imageViews[i] = Image::InitializeImageView(instance, images[i], VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_ASPECT_COLOR_BIT);
Image::InitializeImage(vulkan, width, height, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &images[i], &imageMemories[i]);
imageViews[i] = Image::InitializeImageView(vulkan, images[i], VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_ASPECT_COLOR_BIT);
}
}
}
@@ -1,6 +1,6 @@
#pragma once
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/sampler/Sampler.h"
#include "copium/util/Common.h"
@@ -16,7 +16,7 @@ namespace Copium
std::vector<VkDeviceMemory> imageMemories;
std::vector<VkImageView> imageViews;
public:
ColorAttachment(Instance& instance, int width, int height);
ColorAttachment(Vulkan& vulkan, int width, int height);
~ColorAttachment() override;
VkDescriptorImageInfo GetDescriptorImageInfo(int index) const override;
@@ -1,20 +1,21 @@
#include "copium/sampler/DepthAttachment.h"
#include "copium/core/Device.h"
#include "copium/sampler/Image.h"
namespace Copium
{
DepthAttachment::DepthAttachment(Instance& instance, int width, int height)
: Sampler{instance}
DepthAttachment::DepthAttachment(Vulkan& vulkan, int width, int height)
: Sampler{vulkan}
{
InitializeDepthAttachment(width, height);
}
DepthAttachment::~DepthAttachment()
{
vkDestroyImage(instance.GetDevice(), image, nullptr);
vkFreeMemory(instance.GetDevice(), imageMemory, nullptr);
vkDestroyImageView(instance.GetDevice(), imageView, nullptr);
vkDestroyImage(vulkan.GetDevice(), image, nullptr);
vkFreeMemory(vulkan.GetDevice(), imageMemory, nullptr);
vkDestroyImageView(vulkan.GetDevice(), imageView, nullptr);
}
VkDescriptorImageInfo DepthAttachment::GetDescriptorImageInfo(int index) const
@@ -33,8 +34,8 @@ namespace Copium
void DepthAttachment::InitializeDepthAttachment(int width, int height)
{
VkFormat depthFormat = Image::SelectDepthFormat(instance);
Image::InitializeImage(instance, width, height, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &image, &imageMemory);
imageView = Image::InitializeImageView(instance, image, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
VkFormat depthFormat = Image::SelectDepthFormat(vulkan);
Image::InitializeImage(vulkan, width, height, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &image, &imageMemory);
imageView = Image::InitializeImageView(vulkan, image, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
}
}
@@ -1,6 +1,6 @@
#pragma once
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/sampler/Sampler.h"
#include "copium/util/Common.h"
@@ -16,7 +16,7 @@ namespace Copium
VkDeviceMemory imageMemory;
VkImageView imageView;
public:
DepthAttachment(Instance& instance, int width, int height);
DepthAttachment(Vulkan& vulkan, int width, int height);
~DepthAttachment() override;
VkDescriptorImageInfo GetDescriptorImageInfo(int index) const override;
+17 -16
View File
@@ -1,10 +1,11 @@
#include "copium/sampler/Image.h"
#include "copium/buffer/CommandBufferScoped.h"
#include "copium/core/Device.h"
namespace Copium
{
void Image::InitializeImage(Instance& instance, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage* image, VkDeviceMemory* imageMemory)
void Image::InitializeImage(Vulkan& vulkan, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage* image, VkDeviceMemory* imageMemory)
{
VkImageCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
@@ -22,22 +23,22 @@ namespace Copium
createInfo.samples = VK_SAMPLE_COUNT_1_BIT;
createInfo.flags = 0;
CP_VK_ASSERT(vkCreateImage(instance.GetDevice(), &createInfo, nullptr, image), "InitializeImage : Failed to initialize image");
CP_VK_ASSERT(vkCreateImage(vulkan.GetDevice(), &createInfo, nullptr, image), "InitializeImage : Failed to initialize image");
VkMemoryRequirements memoryRequirements;
vkGetImageMemoryRequirements(instance.GetDevice(), *image, &memoryRequirements);
vkGetImageMemoryRequirements(vulkan.GetDevice(), *image, &memoryRequirements);
VkMemoryAllocateInfo allocateInfo{};
allocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
allocateInfo.allocationSize = memoryRequirements.size;
allocateInfo.memoryTypeIndex = instance.FindMemoryType(memoryRequirements.memoryTypeBits, properties);
allocateInfo.memoryTypeIndex = vulkan.GetDevice().FindMemoryType(memoryRequirements.memoryTypeBits, properties);
CP_VK_ASSERT(vkAllocateMemory(instance.GetDevice(), &allocateInfo, nullptr, imageMemory), "InitializeImage : Failed to initiallizse image memory");
CP_VK_ASSERT(vkAllocateMemory(vulkan.GetDevice(), &allocateInfo, nullptr, imageMemory), "InitializeImage : Failed to initiallizse image memory");
vkBindImageMemory(instance.GetDevice(), *image, *imageMemory, 0);
vkBindImageMemory(vulkan.GetDevice(), *image, *imageMemory, 0);
}
VkImageView Image::InitializeImageView(Instance& instance, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags)
VkImageView Image::InitializeImageView(Vulkan& vulkan, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags)
{
VkImageView imageView;
VkImageViewCreateInfo createInfo{};
@@ -54,13 +55,13 @@ namespace Copium
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;
CP_VK_ASSERT(vkCreateImageView(instance.GetDevice(), &createInfo, nullptr, &imageView), "InitializeImageView : Failed to initialize image view");
CP_VK_ASSERT(vkCreateImageView(vulkan.GetDevice(), &createInfo, nullptr, &imageView), "InitializeImageView : Failed to initialize image view");
return imageView;
}
void Image::TransitionImageLayout(Instance& instance, VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout)
void Image::TransitionImageLayout(Vulkan& vulkan, VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout)
{
CommandBufferScoped commandBuffer{instance};
CommandBufferScoped commandBuffer{vulkan};
VkImageMemoryBarrier barrier{};
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
@@ -126,9 +127,9 @@ namespace Copium
vkCmdPipelineBarrier(commandBuffer, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &barrier);
}
void Image::CopyBufferToImage(Instance& instance, const Buffer& buffer, VkImage image, uint32_t width, uint32_t height)
void Image::CopyBufferToImage(Vulkan& vulkan, const Buffer& buffer, VkImage image, uint32_t width, uint32_t height)
{
CommandBufferScoped commandBuffer{instance};
CommandBufferScoped commandBuffer{vulkan};
VkBufferImageCopy region{};
region.bufferOffset = 0;
@@ -147,9 +148,9 @@ namespace Copium
}
VkFormat Image::SelectDepthFormat(Instance& instance)
VkFormat Image::SelectDepthFormat(Vulkan& vulkan)
{
return SelectSupportedFormat(instance, {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT}, VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
return SelectSupportedFormat(vulkan, {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT}, VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
}
bool Image::HasStencilComponent(VkFormat format)
@@ -157,12 +158,12 @@ namespace Copium
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
}
VkFormat Image::SelectSupportedFormat(Instance& instance, const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features)
VkFormat Image::SelectSupportedFormat(Vulkan& vulkan, const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features)
{
for (VkFormat format : candidates)
{
VkFormatProperties properties;
vkGetPhysicalDeviceFormatProperties(instance.GetPhysicalDevice(), format, &properties);
vkGetPhysicalDeviceFormatProperties(vulkan.GetDevice().GetPhysicalDevice(), format, &properties);
if (tiling == VK_IMAGE_TILING_LINEAR && (properties.linearTilingFeatures & features) == features)
{
return format;
+7 -7
View File
@@ -1,7 +1,7 @@
#pragma once
#include "copium/buffer/Buffer.h"
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
#include <vulkan/vulkan.hpp>
@@ -12,14 +12,14 @@ namespace Copium
{
CP_STATIC_CLASS(Image);
public:
static void InitializeImage(Instance& instance, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage* image, VkDeviceMemory* imageMemory);
static VkImageView InitializeImageView(Instance& instance, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags);
static void TransitionImageLayout(Instance& instance, VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);
static void CopyBufferToImage(Instance& instance, const Buffer& buffer, VkImage image, uint32_t width, uint32_t height);
static VkFormat SelectDepthFormat(Instance& instance);
static void InitializeImage(Vulkan& vulkan, uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage* image, VkDeviceMemory* imageMemory);
static VkImageView InitializeImageView(Vulkan& vulkan, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags);
static void TransitionImageLayout(Vulkan& vulkan, VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);
static void CopyBufferToImage(Vulkan& vulkan, const Buffer& buffer, VkImage image, uint32_t width, uint32_t height);
static VkFormat SelectDepthFormat(Vulkan& vulkan);
private:
static bool HasStencilComponent(VkFormat format);
static VkFormat SelectSupportedFormat(Instance& instance, const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
static VkFormat SelectSupportedFormat(Vulkan& vulkan, const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
};
}
+7 -5
View File
@@ -1,22 +1,24 @@
#include "copium/sampler/Sampler.h"
#include "copium/core/Device.h"
namespace Copium
{
Sampler::Sampler(Instance& instance)
: instance{instance}
Sampler::Sampler(Vulkan& vulkan)
: vulkan{vulkan}
{
InitializeSampler();
}
Sampler::~Sampler()
{
vkDestroySampler(instance.GetDevice(), sampler, nullptr);
vkDestroySampler(vulkan.GetDevice(), sampler, nullptr);
}
void Sampler::InitializeSampler()
{
VkPhysicalDeviceProperties properties{};
vkGetPhysicalDeviceProperties(instance.GetPhysicalDevice(), &properties);
vkGetPhysicalDeviceProperties(vulkan.GetDevice().GetPhysicalDevice(), &properties);
VkSamplerCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
@@ -35,6 +37,6 @@ namespace Copium
createInfo.minLod = 0.0f;
createInfo.maxLod = 0.0f;
CP_VK_ASSERT(vkCreateSampler(instance.GetDevice(), &createInfo, nullptr, &sampler), "InitializeSampler : Failed to initialize texture sampler");
CP_VK_ASSERT(vkCreateSampler(vulkan.GetDevice(), &createInfo, nullptr, &sampler), "InitializeSampler : Failed to initialize texture sampler");
}
}
+3 -3
View File
@@ -1,6 +1,6 @@
#pragma once
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/util/Common.h"
#include <vulkan/vulkan.hpp>
@@ -11,10 +11,10 @@ namespace Copium
{
CP_DELETE_COPY_AND_MOVE_CTOR(Sampler);
protected:
Instance& instance;
Vulkan& vulkan;
VkSampler sampler;
public:
Sampler(Instance& instance);
Sampler(Vulkan& vulkan);
virtual ~Sampler();
virtual VkDescriptorImageInfo GetDescriptorImageInfo(int index) const = 0;
+13 -11
View File
@@ -1,21 +1,23 @@
#include "copium/sampler/Texture2D.h"
#include "copium/core/Device.h"
#define STB_IMAGE_IMPLEMENTATION
#include <stb/stb_image.h>
namespace Copium
{
Texture2D::Texture2D(Instance& instance, const std::string& filename)
: Sampler{instance}
Texture2D::Texture2D(Vulkan& vulkan, const std::string& filename)
: Sampler{vulkan}
{
InitializeTextureImage(filename);
}
Texture2D::~Texture2D()
{
vkDestroyImage(instance.GetDevice(), image, nullptr);
vkFreeMemory(instance.GetDevice(), imageMemory, nullptr);
vkDestroyImageView(instance.GetDevice(), imageView, nullptr);
vkDestroyImage(vulkan.GetDevice(), image, nullptr);
vkFreeMemory(vulkan.GetDevice(), imageMemory, nullptr);
vkDestroyImageView(vulkan.GetDevice(), imageView, nullptr);
}
VkDescriptorImageInfo Texture2D::GetDescriptorImageInfo(int index) const
@@ -38,16 +40,16 @@ namespace Copium
CP_ASSERT(pixels, "InitializeTextureImage : Failed to load texture image");
VkDeviceSize bufferSize = texWidth * texHeight * 4;
Buffer stagingBuffer{instance, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, bufferSize, 1};
Buffer stagingBuffer{vulkan, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, bufferSize, 1};
void* data = stagingBuffer.Map();
memcpy(data, pixels, bufferSize);
stagingBuffer.Unmap();
stbi_image_free(pixels);
Image::InitializeImage(instance, texWidth, texHeight, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &image, &imageMemory);
Image::TransitionImageLayout(instance, image, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
Image::CopyBufferToImage(instance, stagingBuffer, image, texWidth, texHeight);
Image::TransitionImageLayout(instance, image, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
imageView = Image::InitializeImageView(instance, image, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_ASPECT_COLOR_BIT);
Image::InitializeImage(vulkan, texWidth, texHeight, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &image, &imageMemory);
Image::TransitionImageLayout(vulkan, image, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
Image::CopyBufferToImage(vulkan, stagingBuffer, image, texWidth, texHeight);
Image::TransitionImageLayout(vulkan, image, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
imageView = Image::InitializeImageView(vulkan, image, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_ASPECT_COLOR_BIT);
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
#pragma once
#include "copium/buffer/CommandBufferScoped.h"
#include "copium/core/Instance.h"
#include "copium/core/Vulkan.h"
#include "copium/sampler/Image.h"
#include "copium/sampler/Sampler.h"
#include "copium/util/Common.h"
@@ -18,7 +18,7 @@ namespace Copium
VkDeviceMemory imageMemory;
VkImageView imageView;
public:
Texture2D(Instance& instance, const std::string& filename);
Texture2D(Vulkan& vulkan, const std::string& filename);
~Texture2D() override;
VkDescriptorImageInfo GetDescriptorImageInfo(int index) const override;