diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 11 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 20 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.h | 3 |
3 files changed, 29 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index a65cac10d98..e407dec8eab 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -497,6 +497,14 @@ struct brw_cs_prog_data { unsigned local_size[3]; unsigned simd_size; bool uses_barrier; + + struct { + /** @{ + * surface indices the CS-specific surfaces + */ + uint32_t work_groups_start; + /** @} */ + } binding_table; }; /** @@ -758,7 +766,8 @@ struct brw_vs_prog_data { 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) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 49dc7f65b48..64215ae5a6a 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -4750,7 +4750,7 @@ fs_visitor::setup_cs_payload() } 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; @@ -4767,6 +4767,20 @@ fs_visitor::assign_binding_table_offsets() } 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() { invalidate_live_intervals(); @@ -5020,7 +5034,7 @@ fs_visitor::run_fs(bool do_rep_send) sanity_param_count = prog->Parameters->NumParameters; - assign_binding_table_offsets(); + assign_fs_binding_table_offsets(); if (devinfo->gen >= 6) setup_payload_gen6(); @@ -5108,7 +5122,7 @@ fs_visitor::run_cs() sanity_param_count = prog->Parameters->NumParameters; - assign_common_binding_table_offsets(0); + assign_cs_binding_table_offsets(); setup_cs_payload(); diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 50ce4155f16..a8b6726b9f0 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -128,7 +128,8 @@ public: 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(); |