i965/fs: Get rid of the early return in brw_compile_cs
[mesa.git] / src / intel / compiler / brw_vec4_gs_visitor.cpp
index d0236df091248dfead73c1aa4d08b4d1d074abfe..7848832e4128c59e692c0e2bfaade31b2b032c4e 100644 (file)
@@ -422,7 +422,7 @@ vec4_gs_visitor::set_stream_control_data_bits(unsigned stream_id)
    assert(c->control_data_bits_per_vertex == 2);
 
    /* Must be a valid stream */
-   assert(stream_id >= 0 && stream_id < MAX_VERTEX_STREAMS);
+   assert(stream_id < MAX_VERTEX_STREAMS);
 
    /* Control data bits are initialized to 0 so we don't have to set any
     * bits when sending vertices to stream 0.
@@ -618,7 +618,6 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
                const nir_shader *src_shader,
                struct gl_program *prog,
                int shader_time_index,
-               unsigned *final_assembly_size,
                char **error_str)
 {
    struct brw_gs_compile c;
@@ -817,10 +816,17 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
    /* URB entry sizes are stored as a multiple of 64 bytes in gen7+ and
     * a multiple of 128 bytes in gen6.
     */
-   if (compiler->devinfo->gen >= 7)
+   if (compiler->devinfo->gen >= 7) {
       prog_data->base.urb_entry_size = ALIGN(output_size_bytes, 64) / 64;
-   else
+      /* On Cannonlake software shall not program an allocation size that
+       * specifies a size that is a multiple of 3 64B (512-bit) cachelines.
+       */
+      if (compiler->devinfo->gen == 10 &&
+          prog_data->base.urb_entry_size % 3 == 0)
+         prog_data->base.urb_entry_size++;
+   } else {
       prog_data->base.urb_entry_size = ALIGN(output_size_bytes, 128) / 128;
+   }
 
    assert(shader->info.gs.output_primitive < ARRAY_SIZE(gl_prim_to_hw_prim));
    prog_data->output_topology =
@@ -861,7 +867,7 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
             g.enable_debug(name);
          }
          g.generate_code(v.cfg, 8);
-         return g.get_assembly(final_assembly_size);
+         return  g.get_assembly(&prog_data->base.base.program_size);
       }
    }
 
@@ -883,17 +889,17 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
           * values.
           */
          const unsigned param_count = prog_data->base.base.nr_params;
-         gl_constant_value **param = ralloc_array(NULL, gl_constant_value*,
-                                                  param_count);
+         uint32_t *param = ralloc_array(NULL, uint32_t, param_count);
          memcpy(param, prog_data->base.base.param,
-                sizeof(gl_constant_value*) * param_count);
+                sizeof(uint32_t) * param_count);
 
          if (v.run()) {
             /* Success! Backup is not needed */
             ralloc_free(param);
             return brw_vec4_generate_assembly(compiler, log_data, mem_ctx,
                                               shader, &prog_data->base, v.cfg,
-                                              final_assembly_size);
+                                              &prog_data->base.base.
+                                                  program_size);
          } else {
             /* These variables could be modified by the execution of the GS
              * visitor if it packed the uniforms in the push constant buffer.
@@ -903,8 +909,9 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
              * FIXME: Could more variables be modified by this execution?
              */
             memcpy(prog_data->base.base.param, param,
-                   sizeof(gl_constant_value*) * param_count);
+                   sizeof(uint32_t) * param_count);
             prog_data->base.base.nr_params = param_count;
+            prog_data->base.base.nr_pull_params = 0;
             ralloc_free(param);
          }
       }
@@ -956,7 +963,7 @@ brw_compile_gs(const struct brw_compiler *compiler, void *log_data,
    } else {
       ret = brw_vec4_generate_assembly(compiler, log_data, mem_ctx, shader,
                                        &prog_data->base, gs->cfg,
-                                       final_assembly_size);
+                                       &prog_data->base.base.program_size);
    }
 
    delete gs;