Skip to content

Commit 5a00110

Browse files
switched from combined image to sampled image and sampler
1 parent b7a3161 commit 5a00110

File tree

16 files changed

+360
-240
lines changed

16 files changed

+360
-240
lines changed

Resources/Shaders/fragment_common.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ layout(std140, set = 0, binding = 5) readonly buffer MatSB
6161
}
6262
MaterialDataBuffer;
6363

64-
layout(set = 1, binding = 0) uniform Texture2D TextureArray[];
64+
layout(set = 1, binding = 0) uniform texture2D TextureArray[];
6565
layout(set = 1, binding = 1) uniform sampler LinearWrapSampler;
6666

6767
MaterialData FetchMaterial(uint dataIndex)

Resources/Shaders/g_buffer.frag

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ void main()
2424
if (material.AlbedoMap < INVALID_MAP_HANDLE)
2525
{
2626
uint texId = uint(material.AlbedoMap);
27-
OutAlbedo = texture(TextureArray[nonuniformEXT(texId)], TexCoord);
27+
OutAlbedo = texture(sampler2D(TextureArray[nonuniformEXT(texId)], LinearWrapSampler), TexCoord);
2828
}
2929

3030
if (material.SpecularMap < INVALID_MAP_HANDLE)
3131
{
3232
uint texId = uint(material.SpecularMap);
33-
OutSpecular = texture(TextureArray[nonuniformEXT(texId)], TexCoord);
33+
OutSpecular = texture(sampler2D(TextureArray[nonuniformEXT(texId)], LinearWrapSampler), TexCoord);
3434
}
3535

3636
if (material.NormalMap < INVALID_MAP_HANDLE)
3737
{
3838
uint texId = uint(material.NormalMap);
39-
OutNormal = texture(TextureArray[nonuniformEXT(texId)], TexCoord).rgb;
39+
OutNormal = texture(sampler2D(TextureArray[nonuniformEXT(texId)], LinearWrapSampler), TexCoord).rgb;
4040
}
41-
}
41+
}

Resources/Shaders/imgui.frag

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
#extension GL_EXT_nonuniform_qualifier : require
33

44
layout(location = 0) out vec4 fColor;
5-
layout(set = 0, binding = 0) uniform sampler2D _unused;
6-
layout(set = 1, binding = 0) uniform sampler2D TextureArray[];
5+
layout(set = 0, binding = 0) uniform sampler _unused;
6+
layout(set = 1, binding = 0) uniform texture2D TextureArray[];
7+
layout(set = 1, binding = 1) uniform sampler LinearWrapSampler;
78

89
layout(location = 0) in struct
910
{
@@ -14,6 +15,6 @@ layout(location = 0) in struct
1415
void main()
1516
{
1617
uint texId = uint(floor(In.TexData.z + 0.5));
17-
vec4 texVal = texture(TextureArray[nonuniformEXT(texId)], In.TexData.xy);
18+
vec4 texVal = texture(sampler2D(TextureArray[nonuniformEXT(texId)], LinearWrapSampler), In.TexData.xy);
1819
fColor = In.Color * texVal;
1920
}

Resources/Shaders/skybox.frag

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
layout(location = 0) in vec3 dir;
33
layout(location = 0) out vec4 outColor;
44

5-
layout(set = 0, binding = 1) uniform samplerCube EnvMap;
5+
layout(set = 0, binding = 1) uniform textureCube EnvMap;
6+
layout(set = 1, binding = 1) uniform sampler LinearWrapSampler;
67

78
void main()
89
{
9-
outColor = texture(EnvMap, dir);
10+
outColor = texture(samplerCube(EnvMap, LinearWrapSampler), dir);
1011
}

ZEngine/ZEngine/Applications/AppRenderPipeline.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22
#include <Hardwares/VulkanDevice.h>
33
#include <Rendering/Renderers/GraphicRenderer.h>
44
#include <Rendering/Renderers/ImGUIRenderer.h>
5+
#include <new>
56

67
namespace ZEngine::Applications
78
{
8-
struct alignas(std::hardware_destructive_interference_size) PaddedAtomicInt
9+
#ifdef __cpp_lib_hardware_interference_size
10+
constexpr auto CACHE_LINE_SIZE = std::hardware_destructive_interference_size;
11+
#else
12+
constexpr auto CACHE_LINE_SIZE = 64;
13+
#endif
14+
15+
struct alignas(CACHE_LINE_SIZE) PaddedAtomicInt
916
{
1017
std::atomic_uint32_t value = 0;
1118
};

ZEngine/ZEngine/Hardwares/AsyncResourceLoader.cpp

Lines changed: 109 additions & 114 deletions
Large diffs are not rendered by default.

ZEngine/ZEngine/Hardwares/AsyncResourceLoader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace ZEngine::Hardwares
1010

1111
struct UpdateTextureRequest
1212
{
13+
uint32_t FrameOwnerIndex = 0;
1314
Rendering::Textures::TextureHandle Handle;
1415
Rendering::Textures::Texture* Texture;
1516
};

ZEngine/ZEngine/Hardwares/DeviceSwapchain.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,8 @@ namespace ZEngine::Hardwares
280280

281281
for (auto& req : Device->WriteBindlessDescriptorSetRequests)
282282
{
283-
write_descriptor_sets.push(VkWriteDescriptorSet{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .pNext = nullptr, .dstSet = req.DstSet, .dstBinding = req.Binding, .dstArrayElement = (uint32_t) tex_handle.Index, .descriptorCount = 1, .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .pImageInfo = &(image_info), .pBufferInfo = nullptr, .pTexelBufferView = nullptr});
283+
write_descriptor_sets.push(VkWriteDescriptorSet{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .pNext = nullptr, .dstSet = req.DstSet, .dstBinding = req.Binding, .dstArrayElement = (uint32_t) tex_handle.Index, .descriptorCount = 1, .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .pImageInfo = &(image_info), .pBufferInfo = nullptr, .pTexelBufferView = nullptr});
284284
}
285-
286285
vkUpdateDescriptorSets(Device->LogicalDevice, write_descriptor_sets.size(), write_descriptor_sets.data(), 0, nullptr);
287286
}
288287
ZReleaseScratch(scratch);

ZEngine/ZEngine/Hardwares/VulkanDevice.cpp

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,9 @@ namespace ZEngine::Hardwares
307307
physical_device_descriptor_indexing_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
308308
VkPhysicalDeviceFeatures2 device_features_2 = {};
309309
device_features_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
310-
device_features_2.features = PhysicalDeviceFeature.features;
310+
device_features_2.features.drawIndirectFirstInstance = PhysicalDeviceFeature.features.drawIndirectFirstInstance;
311+
device_features_2.features.multiDrawIndirect = PhysicalDeviceFeature.features.multiDrawIndirect;
312+
device_features_2.features.samplerAnisotropy = PhysicalDeviceFeature.features.samplerAnisotropy;
311313

312314
if (PhysicalDeviceSupportSampledImageBindless || PhysicalDeviceSupportStorageBufferBindless)
313315
{
@@ -417,9 +419,29 @@ namespace ZEngine::Hardwares
417419
CommandBufferMgr->Initialize(this, SwapchainPtr->BufferredFrameCount);
418420

419421
/*
420-
* Creating Global Descriptor Pool for : Textures
422+
* Creating Global Descriptor Pool for : Textures, Samplers
421423
*/
422-
MaxGlobalTexture = std::min(MaxGlobalTexture, PhysicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSampledImages - 1);
424+
VkSamplerCreateInfo sampler_create_info = {};
425+
sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
426+
sampler_create_info.minFilter = VK_FILTER_LINEAR;
427+
sampler_create_info.magFilter = VK_FILTER_LINEAR;
428+
sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
429+
sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
430+
sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
431+
sampler_create_info.anisotropyEnable = PhysicalDeviceFeature.features.samplerAnisotropy;
432+
sampler_create_info.maxAnisotropy = PhysicalDeviceFeature.features.samplerAnisotropy ? PhysicalDeviceProperties.properties.limits.maxSamplerAnisotropy : 1.0f;
433+
sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
434+
sampler_create_info.unnormalizedCoordinates = VK_FALSE;
435+
sampler_create_info.compareEnable = VK_FALSE;
436+
sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
437+
sampler_create_info.mipLodBias = 0.0f;
438+
sampler_create_info.minLod = 0.0f;
439+
sampler_create_info.maxLod = VK_LOD_CLAMP_NONE;
440+
441+
ZENGINE_VALIDATE_ASSERT(vkCreateSampler(LogicalDevice, &sampler_create_info, nullptr, &GlobalLinearWrapSampler) == VK_SUCCESS, "Failed to create Texture Sampler")
442+
443+
GlobalLinearWrapSamplerImageInfo = VkDescriptorImageInfo{.sampler = GlobalLinearWrapSampler, .imageView = VK_NULL_HANDLE, .imageLayout = VK_IMAGE_LAYOUT_UNDEFINED};
444+
MaxGlobalTexture = std::min(MaxGlobalTexture, PhysicalDeviceDescriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSampledImages - 1);
423445

424446
GlobalTextures.Initialize(Arena, MaxGlobalTexture);
425447
Image2DBufferManager.Initialize(Arena, MaxGlobalTexture);
@@ -434,7 +456,7 @@ namespace ZEngine::Hardwares
434456

435457
VkDescriptorPoolSize pool_sizes[] = {
436458
{.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, .descriptorCount = (MaxGlobalTexture * SwapchainPtr->BufferredFrameCount)},
437-
{.type = VK_DESCRIPTOR_TYPE_SAMPLER, .descriptorCount = (1 * SwapchainPtr->BufferredFrameCount)}
459+
{ .type = VK_DESCRIPTOR_TYPE_SAMPLER, .descriptorCount = (1 * SwapchainPtr->BufferredFrameCount)}
438460
};
439461

440462
for (const auto& layout_binding_set : ShaderReservedLayoutBindingSpecificationMap)
@@ -581,11 +603,13 @@ namespace ZEngine::Hardwares
581603
__destroyDebugMessengerPtr = nullptr;
582604
__createDebugMessengerPtr = nullptr;
583605
}
606+
vkDestroySampler(LogicalDevice, GlobalLinearWrapSampler, nullptr);
584607
vkDestroyDevice(LogicalDevice, nullptr);
585608
vkDestroyInstance(Instance, nullptr);
586609

587-
LogicalDevice = VK_NULL_HANDLE;
588-
Instance = VK_NULL_HANDLE;
610+
GlobalLinearWrapSampler = VK_NULL_HANDLE;
611+
LogicalDevice = VK_NULL_HANDLE;
612+
Instance = VK_NULL_HANDLE;
589613
}
590614

591615
bool VulkanDevice::QueueSubmit(const VkPipelineStageFlags wait_stage_flag, CommandBuffer* command_buffer, Rendering::Primitives::Semaphore* const signal_semaphore, Rendering::Primitives::Fence* const fence)
@@ -726,7 +750,7 @@ namespace ZEngine::Hardwares
726750
switch (res_handle.Type)
727751
{
728752
case Rendering::DeviceResourceType::SAMPLER:
729-
vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
753+
// vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
730754
break;
731755
case Rendering::DeviceResourceType::FRAMEBUFFER:
732756
vkDestroyFramebuffer(LogicalDevice, reinterpret_cast<VkFramebuffer>(res_handle.Handle), nullptr);
@@ -810,7 +834,7 @@ namespace ZEngine::Hardwares
810834
BufferImage& buffer = DirtyBufferImages[handle];
811835

812836
vkDestroyImageView(LogicalDevice, buffer.ViewHandle, nullptr);
813-
vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
837+
// vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
814838
vmaDestroyImage(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
815839

816840
DirtyBufferImages.Remove(handle);
@@ -972,41 +996,14 @@ namespace ZEngine::Hardwares
972996
ZENGINE_VALIDATE_ASSERT(vmaCreateImage(VmaAllocatorValue, &image_create_info, &allocation_create_info, &(buffer_image.Handle), &(buffer_image.Allocation), nullptr) == VK_SUCCESS, "Failed to create buffer");
973997

974998
buffer_image.ViewHandle = CreateImageView(buffer_image.Handle, image_format, image_view_type, image_aspect_flag, layer_count);
975-
buffer_image.Sampler = CreateImageSampler();
999+
// buffer_image.Sampler = GlobalLinearWrapSampler;
9761000

9771001
// Metadata info
9781002
buffer_image.FrameIndex = SwapchainPtr->CurrentFrame == nullptr ? 0u : SwapchainPtr->CurrentFrame->Index;
9791003

9801004
return buffer_image;
9811005
}
9821006

983-
VkSampler VulkanDevice::CreateImageSampler()
984-
{
985-
VkSampler sampler{VK_NULL_HANDLE};
986-
987-
VkSamplerCreateInfo sampler_create_info = {};
988-
sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
989-
sampler_create_info.minFilter = VK_FILTER_LINEAR;
990-
sampler_create_info.magFilter = VK_FILTER_LINEAR;
991-
sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
992-
sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
993-
sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
994-
sampler_create_info.anisotropyEnable = PhysicalDeviceFeature.features.samplerAnisotropy;
995-
sampler_create_info.maxAnisotropy = PhysicalDeviceFeature.features.samplerAnisotropy ? PhysicalDeviceProperties.properties.limits.maxSamplerAnisotropy : 1.0f;
996-
sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
997-
sampler_create_info.unnormalizedCoordinates = VK_FALSE;
998-
sampler_create_info.compareEnable = VK_FALSE;
999-
sampler_create_info.compareOp = VK_COMPARE_OP_ALWAYS;
1000-
sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
1001-
sampler_create_info.mipLodBias = 0.0f;
1002-
sampler_create_info.minLod = -1000.0f;
1003-
sampler_create_info.maxLod = 1000.0f;
1004-
1005-
ZENGINE_VALIDATE_ASSERT(vkCreateSampler(LogicalDevice, &sampler_create_info, nullptr, &sampler) == VK_SUCCESS, "Failed to create Texture Sampler")
1006-
1007-
return sampler;
1008-
}
1009-
10101007
VkFormat VulkanDevice::FindSupportedFormat(Core::Containers::ArrayView<VkFormat> format_collection, VkImageTiling image_tiling, VkFormatFeatureFlags feature_flags)
10111008
{
10121009
VkFormat supported_format = VK_FORMAT_UNDEFINED;
@@ -1186,7 +1183,7 @@ namespace ZEngine::Hardwares
11861183
switch (res_handle.Type)
11871184
{
11881185
case Rendering::DeviceResourceType::SAMPLER:
1189-
vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
1186+
// vkDestroySampler(LogicalDevice, reinterpret_cast<VkSampler>(res_handle.Handle), nullptr);
11901187
break;
11911188
case Rendering::DeviceResourceType::FRAMEBUFFER:
11921189
vkDestroyFramebuffer(LogicalDevice, reinterpret_cast<VkFramebuffer>(res_handle.Handle), nullptr);
@@ -1279,7 +1276,7 @@ namespace ZEngine::Hardwares
12791276
if (buffer && buffer.FrameIndex == SwapchainPtr->CurrentFrame->Index)
12801277
{
12811278
vkDestroyImageView(LogicalDevice, buffer.ViewHandle, nullptr);
1282-
vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
1279+
// vkDestroySampler(LogicalDevice, buffer.Sampler, nullptr);
12831280
vmaDestroyImage(VmaAllocatorValue, buffer.Handle, buffer.Allocation);
12841281
buffer.Handle = VK_NULL_HANDLE;
12851282
buffer.Allocation = VK_NULL_HANDLE;

ZEngine/ZEngine/Hardwares/VulkanDevice.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -595,9 +595,10 @@ namespace ZEngine::Hardwares
595595
VkPhysicalDevice PhysicalDevice = VK_NULL_HANDLE;
596596
VkPhysicalDeviceFeatures2 PhysicalDeviceFeature = {};
597597
VkPhysicalDeviceMemoryProperties PhysicalDeviceMemoryProperties = {};
598-
598+
VkSampler GlobalLinearWrapSampler = VK_NULL_HANDLE;
599599
VkDescriptorPool GlobalDescriptorPoolHandle = VK_NULL_HANDLE;
600600
VmaAllocator VmaAllocatorValue = nullptr;
601+
VkDescriptorImageInfo GlobalLinearWrapSamplerImageInfo = {};
601602
CommandBufferManagerPtr CommandBufferMgr = {};
602603
DeviceSwapchainPtr SwapchainPtr = {};
603604
Core::Containers::Array<VkFormat> DefaultDepthFormats = {};
@@ -642,7 +643,6 @@ namespace ZEngine::Hardwares
642643
BufferView CreateBuffer(VkDeviceSize byte_size, VkBufferUsageFlags buffer_usage, VmaAllocationCreateFlags vma_create_flags = 0);
643644
void CopyBuffer(const BufferView& source, const BufferView& destination, VkDeviceSize byte_size, VkDeviceSize src_buffer_offset = 0u, VkDeviceSize dst_buffer_offset = 0u);
644645
BufferImage CreateImage(uint32_t width, uint32_t height, VkImageType image_type, VkImageViewType image_view_type, VkFormat image_format, VkImageTiling image_tiling, VkImageLayout image_initial_layout, VkImageUsageFlags image_usage, VkSharingMode image_sharing_mode, VkSampleCountFlagBits image_sample_count, VkMemoryPropertyFlags requested_properties, VkImageAspectFlagBits image_aspect_flag, uint32_t layer_count = 1U, VkImageCreateFlags image_create_flag_bit = 0);
645-
VkSampler CreateImageSampler();
646646
VkFormat FindSupportedFormat(Core::Containers::ArrayView<VkFormat> format_collection, VkImageTiling image_tiling, VkFormatFeatureFlags feature_flags);
647647
VkFormat FindDepthFormat();
648648
VkImageView CreateImageView(VkImage image, VkFormat image_format, VkImageViewType image_view_type, VkImageAspectFlagBits image_aspect_flag, uint32_t layer_count = 1U);

0 commit comments

Comments
 (0)