如何将 Metal Performance Shader 与 MTLBlitCommandEncoder 同步?

2024-02-27

我试图更好地理解使用时的同步要求Metal Performance Shaders and an MTLBlitCommandEncoder.

我有一个MTLCommandBuffer设置如下:

  • Use MTLBlitCommandEncoder将纹理 A 的区域复制到纹理 B 中。纹理 A 比纹理 B 大。我从纹理 A 中提取“图块”并将其复制到纹理 B 中。

  • Use an MPSImageBilinearScale金属性能着色器,将纹理 B 作为源纹理,将第三个纹理纹理 C 作为目标。该金属性能着色器将缩放并可能将纹理 B 的内容转换为纹理 C。

如何确保 blit 编码器在金属性能着色器开始尝试缩放纹理 B 之前完全完成将数据从纹理 A 复制到纹理 B?我是否需要担心这个问题,或者命令缓冲区的串行性质是否已经为我解决了这个问题?

金属有栅栏的概念,使用MTLFence用于同步对资源的访问,但无论如何我都不认为金属性能着色器会等待。 (然而waitForFence:存在于编码器上。)

如果我不能使用栅栏并且确实需要同步,建议的做法是将 blit 编码器排入队列,然后调用waitUntilCompleted在将着色器排队并调用之前在命令缓冲区上waitUntilCompleted第二次?前任:

id<MTLCommandBuffer> commandBuffer;

// Enqueue blit encoder to copy Texture A -> Texture B
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
[blitEncoder copyFromTexture:...];
[blitEncoder endEncoding];

// Wait for blit encoder to complete.
[commandBuffer commit];
[commandBuffer waitUntilCompleted];

// Scale Texture B -> Texture C
MPSImageBilinearScale *imageScaleShader = [[MPSImageBilinearScale alloc] initWithDevice:...];  
[imageScaleShader encodeToCommandBuffer:commandBuffer...];

// Wait for scaling shader to complete.
[commandBuffer commit];
[commandBuffer waitUntilCompleted];

The reason I think I need to do the intermediary copy into Texture B is because MPSImageBilinearScale appears to scale its entire source texture. The clipOffset is useful for output, but it doesn't apply to the actual scaling or transform. So the tile needs to be extracted from Texture A into Texture B that is the same size as the tile itself. Then the scaling and transform will "make sense". Disregard this footnote because I had forgotten some basic math principles and have since figured out how to make the scale transform's translate properties work with the clipRect.


Metal 会为您解决这个问题。驱动程序和 GPU 在命令缓冲区中执行命令,就像以串行方式一样。 (“好像”允许并行运行或无序运行以提高效率,但前提是结果与串行执行时相同。)

当 CPU 和 GPU 处理相同的对象时,就会出现同步问题。还可以在屏幕上呈现纹理。 (您不应该渲染到屏幕上呈现的纹理。)

有一个Metal 编程指南部分 https://developer.apple.com/library/archive/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/WhatsNewiniOS10tvOS10andOSX1012/WhatsNewiniOS10tvOS10andOSX1012.html#//apple_ref/doc/uid/TP40014221-CH14-DontLinkElementID_73它处理着色器对资源的读写访问,这并不完全相同,但应该让您放心:

内存屏障

命令编码器之间

在给定命令编码器中执行的所有资源写入都是可见的 在下一个命令编码器中。对于渲染和计算都是如此 命令编码器。

在渲染命令编码器内

对于缓冲区,原子写入对后续原子读取可见 跨多个线程。

对于纹理,textureBarrier方法确保写入 在给定的绘制调用中执行的操作对于后续读取是可见的 下一次抽奖电话。

在计算命令编码器内

在给定内核函数中执行的所有资源写入都是可见的 在下一个核函数中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Metal Performance Shader 与 MTLBlitCommandEncoder 同步? 的相关文章

随机推荐

  • 在带有数字的文本框中自动添加逗号 (,)

    我当前的编码在有 4 个或更多数字时添加逗号 但不是 1101 1 101 我的代码正在这样做 1101 110 1 我希望它格式化并将逗号放在前面 我的 JavaScript
  • 无法在 Windows 7 / OSX 上安装 jasmine-core

    我正在尝试安装karma jasmine在 Windows 7 Git Bash 上 根据以下指南 http karma runner github io 0 13 intro installation html http karma ru
  • Bing Api 针对简单单词“游戏”返回 41 个结果

    我正在尝试在我的网站中实施 bing 搜索 我需要 JSON 格式的搜索结果 这是我正在使用的网址 我正在尝试搜索一个简单的文字游戏 我应该得到数百万个结果 但我总共得到 41 以下是我的结果的一部分 SearchResponse Vers
  • ASP.NET DropDownList 上的 FindByValue

    我在自定义用户控件中有以下代码 其中包含名为 ddlAggerationUnitId 的 DropDownList DropDownList 在 Page Load 事件上进行数据绑定 值 设置为 40 并且它确实存在 如果我删除 set
  • 线程安全枚举单例

    枚举非常适合创建单例 我知道枚举方法不是线程安全的 所以我尝试使其成为线程安全的 任何人都可以确认此实施是否正确 这么多地方用static和volatile好不好 可以优化吗 由于内部类是私有的 所以我必须在枚举中创建函数来访问内部类功能
  • 如何检查 PostgreSQL 公共模式是否存在?

    运行以下查询 SELECT exists SELECT schema name FROM information schema schemata WHERE schema name public AS schema exists 我总是越来
  • R中按距离聚类

    我有一个整数向量 我希望将其分成簇 以便任何两个簇之间的距离大于下限 并且在任何簇内 两个元素之间的距离小于上限 例如 假设我们有以下向量 1 4 5 6 9 29 32 36 并将上述下界和上限分别设置为 19 和 9 下面的两个向量应该
  • Team Foundation Server 合并未合并

    为什么 TFS 不想归还我的旧文件 Dev Branch Main Branch Merging Dev to Main Edit 鉴于下面的第一个答案和更多调查 我相信我正在尝试完成整个分支覆盖 这可能吗 这是一件好事 我认为最好的办法是
  • 编译 SASS 时出现预期换行错误

    我遇到的问题是我的 SASS 无法编译并且它向我显示相同的错误 Expected NewLine topper h3 text align center text decoration underline list group active
  • 在自定义 keras 损失中使用 keras 模型

    我有一个名为的常规 keras 模型e我想比较两者的输出y pred and y true在我的自定义损失函数中 from keras import backend as K def custom loss y true y pred re
  • (iPhone) selectedRange 用于不可编辑的 UITextView (或其他点击处理方法?)

    我正在使用一个UITextView保存静态内容 中文意思是字符都是固定宽度的 我想让用户单击文本中的某个字符并显示该字符的字典信息 我知道所有与缺乏复制和粘贴相关的问题 但我希望有一种方法可以做到这一点 而无需等待 iPhone 3 0 固
  • 是否有可能在源代码中抑制 sonarcloud 的警告?

    我面临一些声纳云警告的问题 这些警告在最近的将来不会得到解决 现在应该被禁用 这些警告是由 sonarcloud 在 CI 构建过程中发出的 没有任何本地分析器 有没有办法在项目 文件 类和 或方法级别上抑制源代码中的某些特定警告 官方文档
  • 在 NativeModules 中添加对象

    我想用https github com dgladkov react native image rotate https github com dgladkov react native image rotate在反应本机项目中 我用它下载
  • Java JTextPane RTF 保存

    我有以下代码尝试将 JTextPane 的内容保存为 RTF 虽然下面的代码创建了一个文件 但它是空的 关于我做错了什么有什么建议吗 像往常一样 不要忘记我是初学者 if option JFileChooser APPROVE OPTION
  • 在python中计算直方图峰值

    在Python中 如何计算直方图的峰值 我试过这个 import numpy as np from scipy signal import argrelextrema data 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 1
  • 如何在Python中将元组转换为多层嵌套字典?

    我有一个以下格式的元组 639283 298290710 1385 639283 298290712 1389 639283 298290715 1395 745310 470212995 2061 745310 470213821 371
  • 将 MySql 从 Windows 服务器迁移到 Linux

    从旧的 Win2003 服务器迁移到新的 VM 服务器 我们选择 Win 或 Linux 如果我们使用 Linux 转换当前表会有任何问题吗 将 MySQL Windows 迁移到相同版本的 MySQL Linux 您可以按如下方式 mys
  • 不可变对象的真正好处是什么

    我总是听到人们说 在使用多个线程时管理不可变对象更容易 因为当一个线程访问不可变对象时 不必担心另一个线程正在更改它 那么 如果我有一个公司所有员工的不可变列表并且雇用了一名新员工 会发生什么情况 在这种情况下 必须复制不可变列表 并且它的
  • 从 T-sql 设置肥皂请求属性

    下面是我用来连接到我的 api 服务器的代码 对于其他调用来说一切正常 但是当涉及到上传图像时 它就不起作用了 如果我将代码复制到 SoapUI 并从那里运行 它确实可以工作 但在 SoapUI 中我必须将请求属性 启用内联文件 更改为 t
  • 如何将 Metal Performance Shader 与 MTLBlitCommandEncoder 同步?

    我试图更好地理解使用时的同步要求Metal Performance Shaders and an MTLBlitCommandEncoder 我有一个MTLCommandBuffer设置如下 Use MTLBlitCommandEncode