diff --git a/WickedEngine/shaders/blockcompressCS_BC1.hlsl b/WickedEngine/shaders/blockcompressCS_BC1.hlsl index c17174db7..e585d0450 100644 --- a/WickedEngine/shaders/blockcompressCS_BC1.hlsl +++ b/WickedEngine/shaders/blockcompressCS_BC1.hlsl @@ -46,6 +46,17 @@ RWTexture2D output : register(u0); [numthreads(8, 8, 1)] void main(uint3 DTid : SV_DispatchThreadID) { + uint2 dim; + input.GetDimensions(dim.x, dim.y); + uint2 block_dim = dim / 4; + + [branch] + if (any(DTid.xy >= block_dim)) + return; + + const float2 dim_rcp = rcp(dim); + const float2 uv = float2(DTid.xy * 4 + 1) * dim_rcp; + #ifdef BC1 float3 block[16]; #endif // BC1 @@ -64,11 +75,6 @@ void main(uint3 DTid : SV_DispatchThreadID) float block_v[16]; #endif // BC5 - uint2 dim; - input.GetDimensions(dim.x, dim.y); - const float2 dim_rcp = rcp(dim); - const float2 uv = float2(DTid.xy * 4 + 1) * dim_rcp; - //SUB-BLOCK/////////////////////////////////////////////////////////////////////// float4 red = input.GatherRed(sampler_linear_clamp, uv, int2(0, 0)); diff --git a/WickedEngine/shaders/blockcompressCS_BC6H.hlsl b/WickedEngine/shaders/blockcompressCS_BC6H.hlsl index a26154c00..b74d40713 100644 --- a/WickedEngine/shaders/blockcompressCS_BC6H.hlsl +++ b/WickedEngine/shaders/blockcompressCS_BC6H.hlsl @@ -710,9 +710,14 @@ void main(uint3 groupID : SV_GroupID, uint2 dim; SrcTexture.GetDimensions(dim.x, dim.y); - float2 TextureSizeRcp = rcp(dim); uint2 TextureSizeInBlocks = dim / 4; + [branch] + if (any(blockCoord >= TextureSizeInBlocks)) + return; + + float2 TextureSizeRcp = rcp(dim); + if (all(blockCoord < TextureSizeInBlocks)) { // Gather texels for current 4x4 block diff --git a/WickedEngine/shaders/globals.hlsli b/WickedEngine/shaders/globals.hlsli index a552c5ea0..a15eadc19 100644 --- a/WickedEngine/shaders/globals.hlsli +++ b/WickedEngine/shaders/globals.hlsli @@ -70,6 +70,41 @@ SamplerState sampler_aniso_wrap : register(s107); SamplerState sampler_aniso_mirror : register(s108); SamplerComparisonState sampler_cmp_depth : register(s109); +#ifdef SPIRV +// In Vulkan, we can manually overlap descriptor sets to reduce bindings: +// Note that HLSL register space declaration was not working correctly with overlapped spaces, +// But vk::binding works correctly in this case. +// HLSL register space declaration is working well with Vulkan when spaces are not overlapping. +static const uint DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER = 1; +static const uint DESCRIPTOR_SET_BINDLESS_UNIFORM_TEXEL_BUFFER = 2; +static const uint DESCRIPTOR_SET_BINDLESS_SAMPLER = 3; +static const uint DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE = 4; +static const uint DESCRIPTOR_SET_BINDLESS_STORAGE_IMAGE = 5; +static const uint DESCRIPTOR_SET_BINDLESS_ACCELERATION_STRUCTURE = 6; + +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] ByteAddressBuffer bindless_buffers[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_UNIFORM_TEXEL_BUFFER)]] Buffer bindless_ib[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLER)]] SamplerState bindless_samplers[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture2D bindless_textures[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture2DArray bindless_textures2DArray[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] TextureCube bindless_cubemaps[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] TextureCubeArray bindless_cubearrays[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture3D bindless_textures3D[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture2D bindless_textures_float[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture2D bindless_textures_float2[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture2D bindless_textures_uint[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_SAMPLED_IMAGE)]] Texture2D bindless_textures_uint4[]; + +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] RWByteAddressBuffer bindless_rwbuffers[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_IMAGE)]] RWTexture2D bindless_rwtextures[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_IMAGE)]] RWTexture2DArray bindless_rwtextures2DArray[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_IMAGE)]] RWTexture3D bindless_rwtextures3D[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_IMAGE)]] RWTexture2D bindless_rwtextures_uint[]; +#ifdef RTAPI +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_ACCELERATION_STRUCTURE)]] RaytracingAccelerationStructure bindless_accelerationstructures[]; +#endif // RTAPI + +#else SamplerState bindless_samplers[] : register(space1); Texture2D bindless_textures[] : register(space2); ByteAddressBuffer bindless_buffers[] : register(space3); @@ -91,6 +126,7 @@ RWByteAddressBuffer bindless_rwbuffers[] : register(space15); RWTexture2DArray bindless_rwtextures2DArray[] : register(space16); RWTexture3D bindless_rwtextures3D[] : register(space17); RWTexture2D bindless_rwtextures_uint[] : register(space18); +#endif // SPIRV #include "ShaderInterop_Renderer.h" diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index 395cab0f6..ea625f329 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -1482,6 +1482,7 @@ using namespace vulkan_internal; { cbSubmitInfo.commandBuffer = cmd.transferCommandBuffer; signalSemaphoreInfos[0].semaphore = cmd.semaphores[0]; // signal for graphics queue + signalSemaphoreInfos[0].stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; submitInfo.commandBufferInfoCount = 1; submitInfo.pCommandBufferInfos = &cbSubmitInfo; @@ -1495,7 +1496,7 @@ using namespace vulkan_internal; { waitSemaphoreInfo.semaphore = cmd.semaphores[0]; // wait for copy queue - waitSemaphoreInfo.stageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT; + waitSemaphoreInfo.stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; cbSubmitInfo.commandBuffer = cmd.transitionCommandBuffer; signalSemaphoreInfos[0].semaphore = cmd.semaphores[1]; // signal for compute queue @@ -1525,7 +1526,7 @@ using namespace vulkan_internal; if (device->queues[QUEUE_VIDEO_DECODE].queue != VK_NULL_HANDLE) { waitSemaphoreInfo.semaphore = cmd.semaphores[2]; // wait for graphics queue - waitSemaphoreInfo.stageMask = VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR; + waitSemaphoreInfo.stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; submitInfo.waitSemaphoreInfoCount = 1; submitInfo.pWaitSemaphoreInfos = &waitSemaphoreInfo; @@ -3879,24 +3880,6 @@ using namespace vulkan_internal; if(cmd.IsValid()) { - VkBufferMemoryBarrier2 barrier = {}; - barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2; - barrier.buffer = internal_state->resource; - barrier.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; - barrier.srcAccessMask = 0; - barrier.dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT; - barrier.dstAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT; - barrier.size = VK_WHOLE_SIZE; - - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - - VkDependencyInfo dependencyInfo = {}; - dependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; - dependencyInfo.bufferMemoryBarrierCount = 1; - dependencyInfo.pBufferMemoryBarriers = &barrier; - vkCmdPipelineBarrier2(cmd.transferCommandBuffer, &dependencyInfo); - VkBufferCopy copyRegion = {}; copyRegion.size = buffer->desc.size; copyRegion.srcOffset = 0; @@ -3910,8 +3893,17 @@ using namespace vulkan_internal; ©Region ); - std::swap(barrier.srcStageMask, barrier.dstStageMask); - std::swap(barrier.srcAccessMask, barrier.dstAccessMask); + VkBufferMemoryBarrier2 barrier = {}; + barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2; + barrier.buffer = internal_state->resource; + barrier.srcStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT; + barrier.srcAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT; + barrier.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; + barrier.dstAccessMask = VK_ACCESS_2_MEMORY_READ_BIT | VK_ACCESS_2_MEMORY_WRITE_BIT; + barrier.size = VK_WHOLE_SIZE; + + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; if (has_flag(buffer->desc.bind_flags, BindFlag::CONSTANT_BUFFER)) { @@ -3919,10 +3911,12 @@ using namespace vulkan_internal; } if (has_flag(buffer->desc.bind_flags, BindFlag::VERTEX_BUFFER)) { + barrier.dstStageMask |= VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT; barrier.dstAccessMask |= VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT; } if (has_flag(buffer->desc.bind_flags, BindFlag::INDEX_BUFFER)) { + barrier.dstStageMask |= VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT; barrier.dstAccessMask |= VK_ACCESS_2_INDEX_READ_BIT; } if (has_flag(buffer->desc.bind_flags, BindFlag::SHADER_RESOURCE)) @@ -3942,7 +3936,17 @@ using namespace vulkan_internal; { barrier.dstAccessMask |= VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR; } - vkCmdPipelineBarrier2(cmd.transferCommandBuffer, &dependencyInfo); + if (has_flag(buffer->desc.misc_flags, ResourceMiscFlag::VIDEO_DECODE)) + { + barrier.dstAccessMask |= VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR; + } + + VkDependencyInfo dependencyInfo = {}; + dependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; + dependencyInfo.bufferMemoryBarrierCount = 1; + dependencyInfo.pBufferMemoryBarriers = &barrier; + + vkCmdPipelineBarrier2(cmd.transitionCommandBuffer, &dependencyInfo); copyAllocator.submit(cmd); } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 3eb6bd058..313196bb6 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 219; + const int revision = 220; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);