v3d: implement geometry shader instancing
[mesa.git] / src / gallium / drivers / v3d / v3dx_draw.c
index d582c6538191ebc45abb8c7559d181cbadd10716..07d2749a87a0ffeef63dd496e9c054b08e4981c4 100644 (file)
@@ -377,7 +377,8 @@ v3d_gs_output_primitive(uint32_t prim_type)
 
 static void
 v3d_emit_tes_gs_common_params(struct v3d_job *job,
-                              uint8_t gs_out_prim_type)
+                              uint8_t gs_out_prim_type,
+                              uint8_t gs_num_invocations)
 {
         /* This, and v3d_emit_tes_gs_shader_params below, fill in default
          * values for tessellation fields even though we don't support
@@ -393,7 +394,7 @@ v3d_emit_tes_gs_common_params(struct v3d_job *job,
 
                 shader.geometry_shader_output_format =
                         v3d_gs_output_primitive(gs_out_prim_type);
-                shader.geometry_shader_instances = 1; /* FIXME */
+                shader.geometry_shader_instances = gs_num_invocations & 0x1F;
         }
 }
 
@@ -506,7 +507,9 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d,
             struct v3d_gs_prog_data *gs = v3d->prog.gs->prog_data.gs;
             struct v3d_gs_prog_data *gs_bin = v3d->prog.gs_bin->prog_data.gs;
 
-            v3d_emit_tes_gs_common_params(v3d->job, gs->out_prim_type);
+            v3d_emit_tes_gs_common_params(v3d->job,
+                                          gs->out_prim_type,
+                                          gs->num_invocations);
             v3d_emit_tes_gs_shader_params(v3d->job, gs_bin);
             v3d_emit_tes_gs_shader_params(v3d->job, gs);
         }