i965: Compile brw_cs_fill_local_id_payload() as C.
It's only called from C, it compiles as C, so just compile it as C. Notice the missing extern "C" on the definition of the function, which would screw things up if the prototype wasn't parsed before the definition. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -33,6 +33,42 @@
|
||||
#include "brw_nir.h"
|
||||
#include "brw_program.h"
|
||||
|
||||
void
|
||||
brw_cs_fill_local_id_payload(const struct brw_cs_prog_data *prog_data,
|
||||
void *buffer, uint32_t threads, uint32_t stride)
|
||||
{
|
||||
if (prog_data->local_invocation_id_regs == 0)
|
||||
return;
|
||||
|
||||
/* 'stride' should be an integer number of registers, that is, a multiple
|
||||
* of 32 bytes.
|
||||
*/
|
||||
assert(stride % 32 == 0);
|
||||
|
||||
unsigned x = 0, y = 0, z = 0;
|
||||
for (unsigned t = 0; t < threads; t++) {
|
||||
uint32_t *param = (uint32_t *) buffer + stride * t / 4;
|
||||
|
||||
for (unsigned i = 0; i < prog_data->simd_size; i++) {
|
||||
param[0 * prog_data->simd_size + i] = x;
|
||||
param[1 * prog_data->simd_size + i] = y;
|
||||
param[2 * prog_data->simd_size + i] = z;
|
||||
|
||||
x++;
|
||||
if (x == prog_data->local_size[0]) {
|
||||
x = 0;
|
||||
y++;
|
||||
if (y == prog_data->local_size[1]) {
|
||||
y = 0;
|
||||
z++;
|
||||
if (z == prog_data->local_size[2])
|
||||
z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
assign_cs_binding_table_offsets(const struct brw_device_info *devinfo,
|
||||
const struct gl_shader_program *shader_prog,
|
||||
|
||||
@@ -5518,42 +5518,6 @@ brw_compile_fs(const struct brw_compiler *compiler, void *log_data,
|
||||
return g.get_assembly(final_assembly_size);
|
||||
}
|
||||
|
||||
void
|
||||
brw_cs_fill_local_id_payload(const struct brw_cs_prog_data *prog_data,
|
||||
void *buffer, uint32_t threads, uint32_t stride)
|
||||
{
|
||||
if (prog_data->local_invocation_id_regs == 0)
|
||||
return;
|
||||
|
||||
/* 'stride' should be an integer number of registers, that is, a multiple
|
||||
* of 32 bytes.
|
||||
*/
|
||||
assert(stride % 32 == 0);
|
||||
|
||||
unsigned x = 0, y = 0, z = 0;
|
||||
for (unsigned t = 0; t < threads; t++) {
|
||||
uint32_t *param = (uint32_t *) buffer + stride * t / 4;
|
||||
|
||||
for (unsigned i = 0; i < prog_data->simd_size; i++) {
|
||||
param[0 * prog_data->simd_size + i] = x;
|
||||
param[1 * prog_data->simd_size + i] = y;
|
||||
param[2 * prog_data->simd_size + i] = z;
|
||||
|
||||
x++;
|
||||
if (x == prog_data->local_size[0]) {
|
||||
x = 0;
|
||||
y++;
|
||||
if (y == prog_data->local_size[1]) {
|
||||
y = 0;
|
||||
z++;
|
||||
if (z == prog_data->local_size[2])
|
||||
z = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fs_reg *
|
||||
fs_visitor::emit_cs_local_invocation_id_setup()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user