Skip to content

Commit 3e15694

Browse files
committed
GPU Vulkan Display: Use Vulkan14Features::maintenance5 to load shaders directly
1 parent c4823a8 commit 3e15694

2 files changed

Lines changed: 14 additions & 29 deletions

File tree

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.cxx‎

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,6 @@ vk::Extent2D GPUDisplayBackendVulkan::chooseSwapExtent(const vk::SurfaceCapabili
125125
}
126126
}
127127

128-
static vk::ShaderModule createShaderModule(const char* code, size_t size, vk::Device device)
129-
{
130-
vk::ShaderModuleCreateInfo createInfo{};
131-
createInfo.codeSize = size;
132-
createInfo.pCode = reinterpret_cast<const uint32_t*>(code);
133-
return device.createShaderModule(createInfo, nullptr);
134-
}
135-
136128
static void cmdImageMemoryBarrier(vk::CommandBuffer cmdbuffer, vk::Image image, vk::PipelineStageFlags2 srcStageMask, vk::AccessFlags2 srcAccessMask, vk::PipelineStageFlags2 dstStageMask, vk::AccessFlags2 dstAccessMask, vk::ImageLayout oldLayout, vk::ImageLayout newLayout, vk::ImageAspectFlags aspect = vk::ImageAspectFlagBits::eColor)
137129
{
138130
vk::ImageMemoryBarrier2 barrier{srcStageMask, srcAccessMask, dstStageMask, dstAccessMask, oldLayout, newLayout, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, image, {aspect, 0, 1, 0, 1}};
@@ -502,7 +494,7 @@ void GPUDisplayBackendVulkan::createDevice()
502494
auto& reqFeatures10 = reqDeviceFeatures.get<vk::PhysicalDeviceFeatures2>().features;
503495
reqFeatures10.geometryShader = reqFeatures10.wideLines = reqFeatures10.largePoints = reqFeatures10.multiDrawIndirect = VK_TRUE;
504496
reqDeviceFeatures.get<vk::PhysicalDeviceVulkan12Features>().timelineSemaphore = VK_TRUE;
505-
reqDeviceFeatures.get<vk::PhysicalDeviceVulkan14Features>().pushDescriptor = VK_TRUE;
497+
reqDeviceFeatures.get<vk::PhysicalDeviceVulkan14Features>().pushDescriptor = reqDeviceFeatures.get<vk::PhysicalDeviceVulkan14Features>().maintenance5 = VK_TRUE;
506498
reqDeviceFeatures.get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering = reqDeviceFeatures.get<vk::PhysicalDeviceVulkan13Features>().synchronization2 = VK_TRUE;
507499
reqDeviceFeatures.get<vk::PhysicalDeviceVulkan13Features>().shaderDemoteToHelperInvocation = VK_TRUE; // discard in SPIR-V 1.6
508500
reqDeviceFeatures.get<vk::PhysicalDeviceSwapchainMaintenance1FeaturesKHR>().swapchainMaintenance1 = VK_TRUE;
@@ -913,11 +905,11 @@ void GPUDisplayBackendVulkan::createPipeline()
913905
vk::PipelineShaderStageCreateInfo shaderStages[2] = {vk::PipelineShaderStageCreateInfo{}, vk::PipelineShaderStageCreateInfo{}};
914906
vk::PipelineShaderStageCreateInfo& vertShaderStageInfo = shaderStages[0];
915907
vertShaderStageInfo.stage = vk::ShaderStageFlagBits::eVertex;
916-
// vertShaderStageInfo.module // below
908+
// vertShaderStageInfo.pNext // below: SPIR-V
917909
vertShaderStageInfo.pName = "main";
918910
vk::PipelineShaderStageCreateInfo& fragShaderStageInfo = shaderStages[1];
919911
fragShaderStageInfo.stage = vk::ShaderStageFlagBits::eFragment;
920-
// fragShaderStageInfo.module // below
912+
// fragShaderStageInfo.pNext // below: SPIR-V
921913
fragShaderStageInfo.pName = "main";
922914

923915
vk::VertexInputBindingDescription bindingDescription{};
@@ -1043,8 +1035,8 @@ void GPUDisplayBackendVulkan::createPipeline()
10431035
bindingDescription.stride = 4 * sizeof(float);
10441036
attributeDescriptions.format = vk::Format::eR32G32B32A32Sfloat;
10451037
inputAssembly.topology = vk::PrimitiveTopology::eTriangleList;
1046-
vertShaderStageInfo.module = mShaders["vertexTexture"];
1047-
fragShaderStageInfo.module = mShaders["fragmentTexture"];
1038+
vertShaderStageInfo.pNext = &mShaders.at("vertexTexture");
1039+
fragShaderStageInfo.pNext = &mShaders.at("fragmentTexture");
10481040
dynamicState.dynamicStateCount = 2;
10491041
pipelineInfo.layout = mPipelineLayoutTexture;
10501042
renderingInfo.depthAttachmentFormat = vk::Format::eUndefined;
@@ -1056,8 +1048,8 @@ void GPUDisplayBackendVulkan::createPipeline()
10561048
bindingDescription.stride = 4 * sizeof(float);
10571049
attributeDescriptions.format = vk::Format::eR32G32B32A32Sfloat;
10581050
inputAssembly.topology = vk::PrimitiveTopology::eTriangleList;
1059-
vertShaderStageInfo.module = mShaders["vertexTexture"];
1060-
fragShaderStageInfo.module = mShaders["fragmentText"];
1051+
vertShaderStageInfo.pNext = &mShaders.at("vertexTexture");
1052+
fragShaderStageInfo.pNext = &mShaders.at("fragmentText");
10611053
dynamicState.dynamicStateCount = 2;
10621054
pipelineInfo.layout = mPipelineLayoutTexture;
10631055
renderingInfo.depthAttachmentFormat = vk::Format::eUndefined;
@@ -1070,8 +1062,8 @@ void GPUDisplayBackendVulkan::createPipeline()
10701062
const uint32_t drawIdx = i >= 5 ? i - 5 : i;
10711063
inputAssembly.topology = types[drawIdx];
10721064
rasterizer.pNext = mSmoothLines && (i == 1 || i == 2) ? &smoothLineState : nullptr;
1073-
vertShaderStageInfo.module = mShaders[i < 5 ? (drawIdx == 0 ? "vertexPoint" : "vertex") : (drawIdx == 0 ? "vertexSmoothPoint" : "vertexSmoothLine")];
1074-
fragShaderStageInfo.module = mShaders[i < 5 ? "fragment" : (drawIdx == 0 ? "fragmentSmoothPoint" : "fragmentSmoothLine")];
1065+
vertShaderStageInfo.pNext = &mShaders.at(i < 5 ? (drawIdx == 0 ? "vertexPoint" : "vertex") : (drawIdx == 0 ? "vertexSmoothPoint" : "vertexSmoothLine"));
1066+
fragShaderStageInfo.pNext = &mShaders.at(i < 5 ? "fragment" : (drawIdx == 0 ? "fragmentSmoothPoint" : "fragmentSmoothLine"));
10751067
pipelineInfo.layout = mPipelineLayout;
10761068
renderingInfo.depthAttachmentFormat = mZActive ? vk::Format::eD32Sfloat : vk::Format::eUndefined;
10771069
pipelineInfo.pDepthStencilState = mZActive ? &depthStencil : nullptr;
@@ -1142,9 +1134,9 @@ void GPUDisplayBackendVulkan::clearPipeline()
11421134
// ---------------------------- VULKAN SHADERS ----------------------------
11431135

11441136
#define LOAD_SHADER(file, ext) \
1145-
mShaders[#file] = createShaderModule(_binary_vulkan_##file##_##ext##_spv_start, _binary_vulkan_##file##_##ext##_spv_len, mDevice)
1137+
mShaders[#file] = vk::ShaderModuleCreateInfo { {}, _binary_vulkan_##file##_##ext##_spv_len, reinterpret_cast<const uint32_t*>(_binary_vulkan_##file##_##ext##_spv_start) }
11461138

1147-
void GPUDisplayBackendVulkan::createShaders()
1139+
void GPUDisplayBackendVulkan::loadShaders()
11481140
{
11491141
LOAD_SHADER(vertex, vert);
11501142
LOAD_SHADER(fragment, frag);
@@ -1158,11 +1150,6 @@ void GPUDisplayBackendVulkan::createShaders()
11581150
LOAD_SHADER(fragmentText, frag);
11591151
}
11601152

1161-
void GPUDisplayBackendVulkan::clearShaders()
1162-
{
1163-
clearVector(mShaders, [&](auto& x) { mDevice.destroyShaderModule(x.second, nullptr); });
1164-
}
1165-
11661153
// ---------------------------- VULKAN BUFFERS ----------------------------
11671154

11681155
void GPUDisplayBackendVulkan::writeToBuffer(VulkanBuffer& buffer, size_t size, const void* srcData)
@@ -1299,7 +1286,7 @@ int32_t GPUDisplayBackendVulkan::InitBackendA()
12991286
mFramesInFlight = mDisplay->cfg().vulkan.nFramesInFlight;
13001287

13011288
createDevice();
1302-
createShaders();
1289+
loadShaders();
13031290
createTextureSampler();
13041291
createSwapChain();
13051292
createOffscreenBuffers();
@@ -1325,7 +1312,6 @@ void GPUDisplayBackendVulkan::ExitBackendA()
13251312
clearUniformLayoutsAndBuffers();
13261313
}
13271314
clearTextureSampler();
1328-
clearShaders();
13291315
clearDevice();
13301316
}
13311317

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.h‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
111111

112112
void updateSwapChainDetails(const vk::PhysicalDevice& device);
113113
void createDevice();
114-
void createShaders();
114+
void loadShaders();
115115
void createTextureSampler();
116116
void createCommandBuffers();
117117
void createSemaphores();
@@ -120,7 +120,6 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
120120
void createOffscreenBuffers(bool forScreenshot = false, bool forMixing = false);
121121
void createPipeline();
122122
void clearDevice();
123-
void clearShaders();
124123
void clearTextureSampler();
125124
void clearCommandBuffers();
126125
void clearSemaphores();
@@ -158,7 +157,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
158157
std::vector<VulkanImage> mDownsampleImages;
159158
std::vector<VulkanImage> mZImages;
160159
std::vector<VulkanImage> mMixImages;
161-
std::unordered_map<std::string, vk::ShaderModule> mShaders;
160+
std::unordered_map<std::string, vk::ShaderModuleCreateInfo> mShaders; // Embedded SPIR-V, chained into the pipeline shader stages (maintenance5, no shader modules)
162161
vk::PipelineLayout mPipelineLayout;
163162
vk::PipelineLayout mPipelineLayoutTexture;
164163
std::vector<vk::Pipeline> mPipelines;

0 commit comments

Comments
 (0)