c++ - Vulkan 计算着色器不会在无限循环上停止

标签 c++ graphics glsl vulkan compute-shader

我正在尝试制作一个使我的程序停止的着色器:

#version 450

layout (local_size_x = 16, local_size_y = 16) in;

void main()
{
    while(true) {}
}
我正在尝试像这样调用与着色器关联的管道:
static void GpuCompute(
    EffectFramework& frame_work,
    const std::string& shader_path)
{
    auto& pipeline = frame_work.GetPipeline(shader_path);
    auto h_interface = HardwareInterface::h_interface;
    auto& device = h_interface->GetDevice();
    auto& cmd_pool = h_interface->GetCommandPool();
    auto& cmd_buffer = h_interface->GetCmdBufferTmp();
    auto& queue = h_interface->GetQueue();

    vk::CommandBufferAllocateInfo alloc_info(
        cmd_pool, vk::CommandBufferLevel::ePrimary, 1);

    auto [result, buffers] = device.allocateCommandBuffersUnique(alloc_info);
    if(result != vk::Result::eSuccess)
        Log::RecordLogError("Failed to create command buffers");

    cmd_buffer = std::move(buffers[0]);

    vk::CommandBufferBeginInfo begin_info(
        vk::CommandBufferUsageFlagBits::eSimultaneousUse, nullptr);

    vk::FenceCreateInfo fence_create_info = {};
    fence_create_info.flags = {};
    auto[result_f, fence] = device.createFenceUnique(fence_create_info);

    if(result_f != vk::Result::eSuccess)
        Log::RecordLogError("Failed to create compute fence");

    result = cmd_buffer->begin(&begin_info);
    if(result != vk::Result::eSuccess)
        Log::RecordLogError("Failed to begin recording command buffer!");
    _SetName(device, *cmd_buffer, "compute_cmd_buffer");

    cmd_buffer->bindPipeline(vk::PipelineBindPoint::eCompute, pipeline.GetPipeline());
    cmd_buffer->dispatch(1920 / 16, 1440 / 16, 1);

    cmd_buffer->end();

    vk::SubmitInfo submit_info = {};
    submit_info.commandBufferCount = 1;
    submit_info.pCommandBuffers = &*cmd_buffer;
    queue.submit(1, &submit_info, *fence);

    device.waitForFences(1,
        &*fence,
        VK_TRUE,
        std::numeric_limits<uint64_t>::max());
}
但是,当我运行我的程序时,它不会停止。我使用 renderdoc 来确保我正在调用着色器:
enter image description here
调度调用似乎使用了正确的着色器。
enter image description here
那么为什么我的代码会运行呢?它应该在计算该循环时卡住,直到宇宙热死。
我知道它没有停止的方式是,在调用计算着色器后,我还在同一队列和同一线程上渲染图形。据我了解,提交到同一队列的命令按顺序执行,因此该着色器应该停止整个管道。但我仍然可以很好地与我的程序进行交互。

最佳答案

make a shader that stalls my program



当负责主要用户界面的设备停止响应时,您的操作系统和图形驱动程序不喜欢它。所述操作系统或所述图形驱动程序的用户也没有。因此,他们不允许您这样做。

任何运行“太久”(无论他们如何定义)的着色器操作都将被毫不客气地终止。您的应用程序可能会继续执行,就好像调度执行完成一样。或者您可能会丢失图形上下文。或者可能会发生硬 GPU 重置。

或者,您的着色器编译器可能只是检测到您的着色器没有可见的副作用(即:不写任何东西),因此它完全优化了所有代码。死代码消除倾向于通过从着色器的输出向后工作来起作用。由于这是一个计算着色器,其输出将写入 SSBO,imageStore调用或原子更新。您的代码不执行这些操作,因此其代码都没有任何输出,因此着色器什么也不做。

关键是,如果你想让你的 GPU 崩溃,你必须比这聪明得多。

关于c++ - Vulkan 计算着色器不会在无限循环上停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62440242/

相关文章:

c++ - Eigen 能否在其线性代数 Ax=b 中使用超过 Double 的精度

c++ - Boost.Spirit.X3如何防止token被之前的规则解析?

android - 渲染大量四边形的有效方法 (LibGDX/OpenGL ES)

java - 如何在 jGraphx 中响应鼠标事件?

c++ - 如何在应用程序中将 com.apple.security.smartcard entitlement 设置为 yes

c++ - 运行时函数模板类型推导

ios - 如何产生类似于 iOS 7 模糊 View 的效果?

c++ - 在计算着色器中计算帧缓冲区的颜色直方图

android - Android 设备上 OpenGL fragment 着色器中的 SIGSEGV

ios - 使用 OpenGL ES 2.0/cocos2d 2.0 绘制圆的最佳方法?