[require] shader model >= 4.0 geometry-shader [vertex shader] struct vs_data { float4 pos : SV_Position; float4 color : COLOR; }; void main(out struct vs_data vs_output) { vs_output.pos = float4(0.0, 0.0, 1.0, 1.0); vs_output.color = float4(0.0, 0.0, 1.0, 1.0); } [geometry shader] struct gs_data { float4 pos : SV_Position; float4 color : COLOR; }; struct gs_out { float4 pos : SV_Position; float4 color : COLOR; uint prim_id : SV_PrimitiveId; }; [maxvertexcount(4)] void main(point struct gs_data vin[1], in uint prim_id : SV_PrimitiveId, inout TriangleStream vout) { float offset = 0.2 * vin[0].pos.w; gs_out v; v.color = vin[0].color; /* This only confirms that prim_id is zero. */ v.color.x = prim_id * 0.25f; v.pos = float4(vin[0].pos.x - offset, vin[0].pos.y - offset, vin[0].pos.z, 1.0); v.prim_id = 0; vout.Append(v); v.pos = float4(vin[0].pos.x - offset, vin[0].pos.y + offset, vin[0].pos.z, 1.0); v.prim_id = 1; vout.Append(v); v.pos = float4(vin[0].pos.x + offset, vin[0].pos.y - offset, vin[0].pos.z, 1.0); vout.Append(v); v.pos = float4(vin[0].pos.x + offset, vin[0].pos.y + offset, vin[0].pos.z, 1.0); vout.Append(v); } [pixel shader] struct ps_data { float4 pos : SV_Position; float4 color : COLOR; uint prim_id : SV_PrimitiveId; }; float4 main(struct ps_data ps_input) : SV_Target { float4 color = ps_input.color; color.y = ps_input.prim_id * 0.25f; return color; } [test] todo(glsl) draw point list 1 probe rtv 0 (320, 190) f32(0.0, 0.0, 0.0, 0.0) probe rtv 0 (255, 240) f32(0.0, 0.0, 0.0, 0.0) probe rtv 0 (319, 241) f32(0.0, 0.0, 1.0, 1.0) probe rtv 0 (321, 239) f32(0.0, 0.25, 1.0, 1.0) probe rtv 0 (385, 240) f32(0.0, 0.0, 0.0, 0.0) probe rtv 0 (320, 290) f32(0.0, 0.0, 0.0, 0.0)