//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 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 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