mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
542 lines
7.7 KiB
Plaintext
542 lines
7.7 KiB
Plaintext
[require]
|
|
shader model >= 4.0
|
|
% SM6 requires that an output stream is declared and written to.
|
|
shader model < 6.0
|
|
geometry-shader
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(line gs_data vin[2])
|
|
{
|
|
}
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(triangle gs_data vin[3])
|
|
{
|
|
}
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(lineadj gs_data vin[4])
|
|
{
|
|
}
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(triangleadj gs_data vin[6])
|
|
{
|
|
}
|
|
|
|
% InputPatch is not supported in SM < 5.
|
|
[geometry shader fail(sm<5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(InputPatch<gs_data, 8> vin)
|
|
{
|
|
}
|
|
|
|
% Input primitives must be arrays.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(point gs_data vin)
|
|
{
|
|
}
|
|
|
|
% InputPatch types take precedence over geometry primitive modifiers.
|
|
% However, the specified primitive modifiers restrict the sizes of the patches for entry point parameters.
|
|
[geometry shader fail(sm<5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(line InputPatch<gs_data, 2> vin)
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(line InputPatch<gs_data, 3> vin)
|
|
{
|
|
}
|
|
|
|
[geometry shader fail(sm<5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
float4 f(line InputPatch<gs_data, 3> patch)
|
|
{
|
|
return patch[0].pos;
|
|
}
|
|
|
|
[maxvertexcount(4)]
|
|
void main(InputPatch<gs_data, 3> vin)
|
|
{
|
|
f(vin);
|
|
}
|
|
|
|
% Geometry shaders must have an input geometry primitive.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main()
|
|
{
|
|
}
|
|
|
|
% Input parameters must be geometry primitives.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(gs_data2 data2, line gs_data vin[2])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(gs_data2 data2, line gs_data vin[2])
|
|
{
|
|
}
|
|
|
|
% Multiple input parameters are allowed. They must have the same primitive types and dimensions.
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
struct gs_data3
|
|
{
|
|
float4 y : Y;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(line gs_data data[2], line gs_data2 data2[2], line gs_data3 data3[2])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
struct gs_data3
|
|
{
|
|
float4 y : Y;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(line gs_data data[2], triangle gs_data2 data2[3], line gs_data3 data3[2])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail(sm<5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
struct gs_data3
|
|
{
|
|
float4 y : Y;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(InputPatch<gs_data, 3> data, InputPatch<gs_data2, 3> data2, InputPatch<gs_data3, 3> data3)
|
|
{
|
|
}
|
|
|
|
[geometry shader fail todo(sm>=5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
struct gs_data3
|
|
{
|
|
float4 y : Y;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(InputPatch<gs_data, 3> data, InputPatch<gs_data2, 4> data2, InputPatch<gs_data3, 3> data3)
|
|
{
|
|
}
|
|
|
|
[geometry shader fail todo(sm>=5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct gs_data2
|
|
{
|
|
float4 x : X;
|
|
};
|
|
|
|
struct gs_data3
|
|
{
|
|
float4 y : Y;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(InputPatch<gs_data, 3> data, InputPatch<gs_data2, 3> data2, triangle gs_data3 data3[3])
|
|
{
|
|
}
|
|
|
|
% Geometry input parameters can be written to.
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(line gs_data vin[2])
|
|
{
|
|
vin[0].pos += 1;
|
|
}
|
|
|
|
% Geometry modifiers can only be used in parameter declarations.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
line float4 x[2];
|
|
|
|
[maxvertexcount(4)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct s
|
|
{
|
|
line float4 val[2];
|
|
};
|
|
struct s x;
|
|
|
|
[maxvertexcount(4)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
% Geometry primitive inputs cannot be used in other shader types.
|
|
[pixel shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
float4 main(point gs_data vin[1]) : sv_target
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
% Geometry shaders must have a maxvertexcount attribute.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float val : VAL;
|
|
};
|
|
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
% maxvertexcount must be between 1 and 1024.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float val : VAL;
|
|
};
|
|
|
|
[maxvertexcount(0)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float val : VAL;
|
|
};
|
|
|
|
[maxvertexcount(1)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float val : VAL;
|
|
};
|
|
|
|
[maxvertexcount(1024)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float val : VAL;
|
|
};
|
|
|
|
[maxvertexcount(1025)]
|
|
void main(point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
% Any single-element objects that contain a stream output object
|
|
% are considered valid stream output objects.
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout TriangleStream<gs_data> vout[1], point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout TriangleStream<gs_data> vout[2], point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail(sm<5) todo(sm<5)]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct s1
|
|
{
|
|
TriangleStream<gs_data> so;
|
|
};
|
|
|
|
struct s2
|
|
{
|
|
struct s1 s;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout struct s2 vout[1], point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct s
|
|
{
|
|
TriangleStream<gs_data> so;
|
|
float4 val;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout struct s vout, point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
% Stream output objects cannot be declared globally.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
TriangleStream<gs_data> so;
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout TriangleStream<gs_data> vout, point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
struct s
|
|
{
|
|
TriangleStream<gs_data> so;
|
|
};
|
|
|
|
struct s x;
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout TriangleStream<gs_data> vout, point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
% Output streams must be declared as inout.
|
|
[geometry shader]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(inout TriangleStream<gs_data> vout, point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(out TriangleStream<gs_data> vout, point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(in TriangleStream<gs_data> vout, point gs_data vin[1])
|
|
{
|
|
}
|
|
|
|
% out parameters and return values are not allowed.
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
void main(out gs_data data, point gs_data vin[1], inout TriangleStream<gs_data> vout)
|
|
{
|
|
data.pos = 0;
|
|
}
|
|
|
|
[geometry shader fail]
|
|
struct gs_data
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
[maxvertexcount(4)]
|
|
gs_data main(point gs_data vin[1], inout TriangleStream<gs_data> vout)
|
|
{
|
|
return (gs_data)0;
|
|
}
|