unsigned local_size[3];
unsigned simd_size;
bool uses_barrier;
+
+ struct {
+ /** @{
+ * surface indices the CS-specific surfaces
+ */
+ uint32_t work_groups_start;
+ /** @} */
+ } binding_table;
};
/**
12 + /* ubo */ \
BRW_MAX_ABO + \
BRW_MAX_IMAGES + \
- 2 /* shader time, pull constants */)
+ 2 + /* shader time, pull constants */ \
+ 1 /* cs num work groups */)
#define SURF_INDEX_GEN6_SOL_BINDING(t) (t)
}
void
-fs_visitor::assign_binding_table_offsets()
+fs_visitor::assign_fs_binding_table_offsets()
{
assert(stage == MESA_SHADER_FRAGMENT);
brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
assign_common_binding_table_offsets(next_binding_table_offset);
}
+void
+fs_visitor::assign_cs_binding_table_offsets()
+{
+ assert(stage == MESA_SHADER_COMPUTE);
+ brw_cs_prog_data *prog_data = (brw_cs_prog_data*) this->prog_data;
+ uint32_t next_binding_table_offset = 0;
+
+ /* May not be used if the gl_NumWorkGroups variable is not accessed. */
+ prog_data->binding_table.work_groups_start = next_binding_table_offset;
+ next_binding_table_offset++;
+
+ assign_common_binding_table_offsets(next_binding_table_offset);
+}
+
void
fs_visitor::calculate_register_pressure()
{
sanity_param_count = prog->Parameters->NumParameters;
- assign_binding_table_offsets();
+ assign_fs_binding_table_offsets();
if (devinfo->gen >= 6)
setup_payload_gen6();
sanity_param_count = prog->Parameters->NumParameters;
- assign_common_binding_table_offsets(0);
+ assign_cs_binding_table_offsets();
setup_cs_payload();
bool run_cs();
void optimize();
void allocate_registers();
- void assign_binding_table_offsets();
+ void assign_fs_binding_table_offsets();
+ void assign_cs_binding_table_offsets();
void setup_payload_gen4();
void setup_payload_gen6();
void setup_vs_payload();