... | ... | @@ -58,4 +58,27 @@ A single geometry shader runthrough only produces a single vertex's worth of dat |
|
|
|
|
|
There is an output map for these, same as for VPC. In addition there are explicit registers specifying the position of the vertex as well as a primitive information register. This contains whether a new primitive should be started, the target layer, and probably viewport index. The layer starts at bit 7, the new primitive request value is 4. Speculation is the viewport index is at bit 3. In order for the fragment shader to receive any of these special values, they must be passed as a regular varying.
|
|
|
|
|
|
It also appears that the point size goes into the register following the primitive info register. However there's no additional indication that the point size is being provided. |
|
|
\ No newline at end of file |
|
|
It also appears that the point size goes into the register following the primitive info register. However there's no additional indication that the point size is being provided.
|
|
|
|
|
|
Optimization
|
|
|
------------
|
|
|
By using the `EmitVertex` implementation as above, each shader will execute `O(n^2)` times. This may be undesirable. However if the computation for data of vertex n+1 does not depend on the computation for data of vertex n, it should be possible to rewrite the shader with a `switch` statement. For example a shader that looks like
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
gl_out[i].gl_Position = gl_in[i].gl_Position;
|
|
|
EmitVertex();
|
|
|
}
|
|
|
|
|
|
it should be possible to rewrite it as
|
|
|
|
|
|
switch (TheVertexForThisExecution) {
|
|
|
case 0: gl_Position = gl_in[0].gl_Position; break;
|
|
|
case 1: gl_Position = gl_in[1].gl_Position; break;
|
|
|
case 2: gl_Position = gl_in[2].gl_Position; break;
|
|
|
}
|
|
|
if (TheVertexForThisExecution == 2) kill;
|
|
|
|
|
|
or even better as
|
|
|
|
|
|
gl_Position = gl_in[TheVertexForThisExecution].gl_Position;
|
|
|
if (TheVertexForThisExecution == 2) kill; |
|
|
\ No newline at end of file |