Pewarta Proxy

📋 Server Request & Proxy Logs

Loading active proxy settings...
Developed by Khairul Adha (adhexa.id)
Mengambil log server...

⚙️ Pengaturan Proxy Target

Skip to content

[SPIR-V] SPV_NV_mesh_shader can produce invalid SPIR-V #9037

Open

Description

Description
[SPIR-V] SPV_NV_mesh_shader accepts 2-D/3-D dispatch and SV_CullPrimitive, producing wrong or invalid SPIR-V
When DXC emits SPV_NV_mesh_shader, three inputs that NV can't represent are not diagnosed:

1. DispatchMesh(x, y, z)  with y or z != 1. GL_NV_mesh_shader launches a one-dimensional array of tasks, and TaskCountNV is a scalar. DXC's SPIR-V back-end flattens the arguments to  xyz , so the mesh shader's SV_GroupID is silently wrong whenever y - z > 1.
2. numthreads with Y or Z != 1 in mesh or amplification shaders. GL_NV_mesh_shader guarantees a work group size of only 1 in Y and Z, and calls its workgroups one-dimensional. glslang rejects NV local_size_y/local_size_z greater than 1, but DXC is emitting LocalSize 8 4 1 .
3. SV_CullPrimitive. NV has no per-primitive cull built-in. DXC emits BuiltIn CullPrimitiveEXT without the EXT capability and fails SPIR-V validation with a "please file a bug report" fatal error.

Steps to Reproduce

// as.hlsl — dxc -T as_6_5 -E main -spirv as.hlsl
struct Payload { uint x; };
groupshared Payload p;
[numthreads(1, 1, 1)]
void main() {
  p.x = 0;
  DispatchMesh(2, 3, 1, p);
}

// ms_nt.hlsl — dxc -T ms_6_5 -E main -spirv ms_nt.hlsl
struct VertOut { float4 pos : SV_Position; };
[outputtopology("triangle")]
[numthreads(8, 4, 1)]
void main(uint3 tid : SV_GroupThreadID,
          out vertices VertOut verts[32], out indices uint3 tris[32]) {
  SetMeshOutputCounts(32, 32);
  uint i = tid.y * 8 + tid.x;
  verts[i].pos = float4(tid, 1);
  tris[i] = uint3(0, 1, 2);
}

// ms_cull.hlsl — dxc -T ms_6_5 -E main -spirv ms_cull.hlsl
struct VertOut { float4 pos : SV_Position; };
struct PrimOut { bool cull : SV_CullPrimitive; };
[outputtopology("triangle")]
[numthreads(1, 1, 1)]
void main(out vertices VertOut verts[3], out indices uint3 tris[1],
          out primitives PrimOut prims[1]) {
  SetMeshOutputCounts(3, 1);
  verts[0].pos = float4(0, 0, 0, 1);
  tris[0] = uint3(0, 1, 2);
  prims[0].cull = false;
}

Actual Behavior

  1. Compiles. OpStore %TaskCountNV %uint_6 launches 6 tasks in one dimension, so the mesh shader sees SV_GroupID = (0..5, 0, 0) instead of a 2×3 grid.
  2. Compiles, emitting OpExecutionMode %main LocalSize 8 4 1 for MeshNV.
  3. Fails:
fatal error: generated SPIR-V is invalid: Operand 3 of Decorate requires one of these capabilities: MeshShadingEXT
  OpDecorate %4 BuiltIn CullPrimitiveEXT
note: please file a bug report on https://github.com/Microsoft/DirectXShaderCompiler/issues ...

Expected: clear errors under NV for all three. Each compiles with  -fspv-target-env=vulkan1.3 , which selects EXT.

Environment

  • DXC version 1.10.2609.0
  • Host Operating System Windows
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugBug, regression, crashneeds-triageAwaiting triagespirvWork related to SPIR-V

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions