macOS上的金属着色器中的结构数组(Intel-GPU?)

Jay*_*Tee 7 macos shader intel metal

我正在为macOS和iOS编写一个多平台应用程序来使用Metal渲染矢量图形.在我的着色器中,顶点ID用作结构数组的偏移量(程序范围内的const,位于常量地址空间中):

//Simplified!
constant const WrapperStruct directionVectors[] =
{
    //Vertex data (const):
    { float2(-1, -1) },
    { float2(1, -1) },
    { float2(-1, 1) },
    { float2(1, 1) }
};

//...

vertex Vertex vertexShader(const InstanceAttributes attr [[ stage_in ]], const ushort vid [[ vertex_id ]])
{
    Vertex vert;

    vert.position = float4(attr.position + (attr.size * directionVectors[vid].value), 0, 1);
    vert.color = attr.color;

    return vert;
}

//...
Run Code Online (Sandbox Code Playgroud)

这适用于:

  • iOS设备
  • 带有专用GPU的MacBook.

但是在特定的MacBook Pro(13英寸,2017年,High Sierra,集成的Intel GPU)上,存在一个很大的问题:没有绘制图形,我只能在背景中获得清晰的颜色.没有记录错误,我也没有遇到任何崩溃.

如果我"解包"包装器结构并直接使用float2数组,一切都很好.问题似乎集中在使用顶点ID索引到struct的程序范围数组(在Intel GPU上?).

为了测试目的,我已将所有内容都删除到最小的macOS示例项目中:下载示例项目.

它使用实例在随机位置绘制一些矩形.在有问题的Intel-GPU系统上,仅绘制红色背景.

谁能证实这个问题?它是否与英特尔驱动程序中的Metal实现相关联?或者我的代码中出现了错误/未定义的内容?

提前致谢!

更新

通过gfxCardStatus,我试图缩小问题的范围.实际上,它似乎与集成的英特尔GPU相关联:

  • MacBook Pro(Retina,15',2015):

    • 离散(AMD Radeon R9 M370X):没问题
    • 集成(Intel Iris Pro 1536 MB):没问题
  • MacBook Pro(15英寸,2017年):

    • 离散(Radeon Pro 560 4 GB):没问题
    • 集成(Intel HD Graphics 630 1536 MB):受影响
  • MacBook Pro(13英寸,2017年)

    • 集成(Intel Iris Plus Graphics 640 1536 MB):受影响