mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 02:28:10 +02:00
i965: Move brw_cs_fill_local_id_payload() to libi965_compiler
This is a helper function for setting up the local invocation ID payload according to the cs_prog_data generated by the compiler. It's intended to be available to users of libi965_compiler so move it there.
This commit is contained in:
parent
076551116e
commit
c51f133197
4 changed files with 43 additions and 40 deletions
|
|
@ -701,6 +701,13 @@ brw_compile_cs(const struct brw_compiler *compiler, void *log_data,
|
|||
unsigned *final_assembly_size,
|
||||
char **error_str);
|
||||
|
||||
/**
|
||||
* Fill out local id payload for compute shader according to cs_prog_data.
|
||||
*/
|
||||
void
|
||||
brw_cs_fill_local_id_payload(const struct brw_cs_prog_data *cs_prog_data,
|
||||
void *buffer, uint32_t threads, uint32_t stride);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,42 +34,6 @@
|
|||
#include "brw_program.h"
|
||||
#include "glsl/ir_uniform.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,
|
||||
|
|
|
|||
|
|
@ -32,10 +32,6 @@ extern "C" {
|
|||
void
|
||||
brw_upload_cs_prog(struct brw_context *brw);
|
||||
|
||||
void
|
||||
brw_cs_fill_local_id_payload(const struct brw_cs_prog_data *cs_prog_data,
|
||||
void *buffer, uint32_t threads, uint32_t stride);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -5690,3 +5690,39 @@ brw_compile_cs(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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue