Merge remote-tracking branch 'mesa-public/master' into vulkan
[mesa.git] / src / mesa / drivers / dri / i965 / gen8_gs_state.c
index 526a8267e4a518296f55265b688251a7c9ff808a..d766ca7bebf6269aa649e2e7683e0e6cdd1929a2 100644 (file)
@@ -34,7 +34,7 @@ gen8_upload_gs_state(struct brw_context *brw)
    /* BRW_NEW_GEOMETRY_PROGRAM */
    bool active = brw->geometry_program;
    /* BRW_NEW_GS_PROG_DATA */
-   const struct brw_vec4_prog_data *prog_data = &brw->gs.prog_data->base;
+   const struct brw_vue_prog_data *prog_data = &brw->gs.prog_data->base;
 
    if (active) {
       int urb_entry_write_offset = 1;
@@ -48,8 +48,7 @@ gen8_upload_gs_state(struct brw_context *brw)
       OUT_BATCH(_3DSTATE_GS << 16 | (10 - 2));
       OUT_BATCH(stage_state->prog_offset);
       OUT_BATCH(0);
-      OUT_BATCH(GEN6_GS_VECTOR_MASK_ENABLE |
-                brw->geometry_program->VerticesIn |
+      OUT_BATCH(brw->geometry_program->VerticesIn |
                 ((ALIGN(stage_state->sampler_count, 4)/4) <<
                  GEN6_GS_SAMPLER_COUNT_SHIFT) |
                 ((prog_data->base.binding_table.size_bytes / 4) <<
@@ -59,10 +58,6 @@ gen8_upload_gs_state(struct brw_context *brw)
          OUT_RELOC64(stage_state->scratch_bo,
                      I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
                      ffs(brw->gs.prog_data->base.base.total_scratch) - 11);
-         WARN_ONCE(true,
-                   "May need to implement a temporary workaround: GS Number of "
-                   "URB Entries must be less than or equal to the GS Maximum "
-                   "Number of Threads.\n");
       } else {
          OUT_BATCH(0);
          OUT_BATCH(0);
@@ -79,20 +74,36 @@ gen8_upload_gs_state(struct brw_context *brw)
                 (prog_data->base.dispatch_grf_start_reg <<
                  GEN6_GS_DISPATCH_START_GRF_SHIFT));
 
+      uint32_t dw7 = (brw->gs.prog_data->control_data_header_size_hwords <<
+                      GEN7_GS_CONTROL_DATA_HEADER_SIZE_SHIFT) |
+                     SET_FIELD(prog_data->dispatch_mode,
+                               GEN7_GS_DISPATCH_MODE) |
+                     ((brw->gs.prog_data->invocations - 1) <<
+                      GEN7_GS_INSTANCE_CONTROL_SHIFT) |
+                      GEN6_GS_STATISTICS_ENABLE |
+                      (brw->gs.prog_data->include_primitive_id ?
+                       GEN7_GS_INCLUDE_PRIMITIVE_ID : 0) |
+                      GEN7_GS_REORDER_TRAILING |
+                      GEN7_GS_ENABLE;
+      uint32_t dw8 = brw->gs.prog_data->control_data_format <<
+                     HSW_GS_CONTROL_DATA_FORMAT_SHIFT;
+
+      if (brw->gs.prog_data->static_vertex_count != -1) {
+         dw8 |= GEN8_GS_STATIC_OUTPUT |
+                SET_FIELD(brw->gs.prog_data->static_vertex_count,
+                          GEN8_GS_STATIC_VERTEX_COUNT);
+      }
+
+      if (brw->gen < 9)
+         dw7 |= (brw->max_gs_threads / 2 - 1) << HSW_GS_MAX_THREADS_SHIFT;
+      else
+         dw8 |= brw->max_gs_threads - 1;
+
       /* DW7 */
-      OUT_BATCH(((brw->max_gs_threads / 2 - 1) << HSW_GS_MAX_THREADS_SHIFT) |
-                (brw->gs.prog_data->control_data_header_size_hwords <<
-                 GEN7_GS_CONTROL_DATA_HEADER_SIZE_SHIFT) |
-                brw->gs.prog_data->dispatch_mode |
-                GEN6_GS_STATISTICS_ENABLE |
-                (brw->gs.prog_data->include_primitive_id ?
-                 GEN7_GS_INCLUDE_PRIMITIVE_ID : 0) |
-                GEN7_GS_REORDER_TRAILING |
-                GEN7_GS_ENABLE);
+      OUT_BATCH(dw7);
 
       /* DW8 */
-      OUT_BATCH(brw->gs.prog_data->control_data_format <<
-                HSW_GS_CONTROL_DATA_FORMAT_SHIFT);
+      OUT_BATCH(dw8);
 
       /* DW9 / _NEW_TRANSFORM */
       OUT_BATCH((ctx->Transform.ClipPlanesEnabled <<