40 lines
1.6 KiB
C++
40 lines
1.6 KiB
C++
//SPDX-License-Identifier: LGPL-3.0-only
|
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
module;
|
|
#ifndef CRAFTER_GRAPHICS_WINDOW_DOM
|
|
#include "vulkan/vulkan.h"
|
|
#endif // !CRAFTER_GRAPHICS_WINDOW_DOM
|
|
export module Crafter.Graphics:ShaderBindingTableVulkan;
|
|
#ifndef CRAFTER_GRAPHICS_WINDOW_DOM
|
|
import std;
|
|
import :Device;
|
|
import :VulkanBuffer;
|
|
import :ShaderVulkan;
|
|
import :Types;
|
|
|
|
export namespace Crafter {
|
|
class ShaderBindingTableVulkan {
|
|
public:
|
|
std::vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
|
// NVIDIA descriptor-heap AS-read workaround (issue #15 / #7): true when
|
|
// any stage in this table reads an acceleration structure and was
|
|
// rewritten to fetch the TLAS address from a push constant, with the
|
|
// byte offset that stage expects it at. PipelineRTVulkan copies these so
|
|
// RTPass can push the address without consulting a clobber-prone global.
|
|
// Both inert (false/0) on every other driver.
|
|
bool workaroundNeedsTlas = false;
|
|
std::uint32_t workaroundTlasPushOffset = 0;
|
|
void Init(const std::span<const VulkanShader> shaders) {
|
|
shaderStages.reserve(shaders.size());
|
|
for(const VulkanShader& shader: shaders) {
|
|
shaderStages.emplace_back(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0, shader.stage, shader.shader, shader.entrypoint.c_str(), shader.specilizationInfo);
|
|
if (shader.patchedAS) {
|
|
workaroundNeedsTlas = true;
|
|
workaroundTlasPushOffset = shader.tlasPushOffset;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
#endif // !CRAFTER_GRAPHICS_WINDOW_DOM
|