mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-21 10:50:23 +01:00
i965/cs: Add a binding table entry for gl_NumWorkGroups
If glDispatchComputeIndirect is used, then the value for this variable must be read from the indirect BO. To allow the same generated code to support indirect and glDispatchCompute, we will also setup a BO for the number of work groups using the intel_upload_data mechanism. This will only be required if the gl_NumWorkGroups variable is accessed. Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
This commit is contained in:
parent
d57a85f32b
commit
d1be9d2126
3 changed files with 29 additions and 5 deletions
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -4766,6 +4766,20 @@ fs_visitor::assign_binding_table_offsets()
|
|||
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()
|
||||
{
|
||||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue