title: Metal emulate geometry shaders using compute shaders
body: <p>I'm trying to implement voxel cone tracing in Metal. One of the steps in the algorithm is to voxelize the geometry using a geometry shader. Metal does not have geometry shaders so I was looking into emulating them using a compute shader. I pass in my vertex buffer into the compute shader, do what a geometry shader would normally do, and write the result to an output buffer. I also add a draw command to an indirect buffer. I use the output buffer as the vertex buffer for my vertex shader. This works fine, but I need twice as much memory for my vertices, one for the vertex buffer and one for the output buffer. Is there any way to directly pass the output of the compute shader to the vertex shader without storing it in an intermediate buffer? I don't need to save the contents of the output buffer of the compute shader. I just need to give the results to the vertex shader.</p>
  
  <p>Is this possible? Thanks</p>
  
  <p>EDIT</p>
  
  <p>Essentially, I'm trying to emulate the following shader from glsl:</p>
  
  <pre><code>#version 450
  
  layout(triangles) in;
  layout(triangle_strip, max_vertices = 3) out;
  
  layout(location = 0) in vec3 in_position[];
  layout(location = 1) in vec3 in_normal[];
  layout(location = 2) in vec2 in_uv[];
  
  layout(location = 0) out vec3 out_position;
  layout(location = 1) out vec3 out_normal;
  layout(location = 2) out vec2 out_uv;
  
  void main()
  {
      vec3 p = abs(cross(in_position[1] - in_position[0], in_position[2] - in_position[0]));
  
      for (uint i = 0; i &lt; 3; ++i)
      {
          out_position = in_position[i];
          out_normal = in_normal[i];
          out_uv = in_uv[i];
  
          if (p.z &gt; p.x &amp;&amp; p.z &gt; p.y)
          {
              gl_Position = vec4(out_position.x, out_position.y, 0, 1);
          }
          else if (p.x &gt; p.y &amp;&amp; p.x &gt; p.z)
          {
              gl_Position = vec4(out_position.y, out_position.z, 0, 1);
          }
          else
          {
              gl_Position = vec4(out_position.x, out_position.z, 0, 1);
          }
  
          EmitVertex();
      }
  
      EndPrimitive();
  }
  </code></pre>
  
  <p>For each triangle, I need to output a triangle with vertices at these new positions instead. The triangle vertices come from a vertex buffer and is drawn using an index buffer. I also plan on adding code that will do conservative rasterization (just increase the size of the triangle by a little bit) but it's not shown here. Currently what I'm doing in the Metal compute shader is using the index buffer to get the vertex, do the same code in the geometry shader above, and outputting the new vertex in another buffer which I then use to draw.</p>