#include "intel_batchbuffer.h"
#include "intel_buffer_objects.h"
#include "program/prog_parameter.h"
+#include "main/shaderapi.h"
static uint32_t
f_as_u32(float f)
{
- return *(uint32_t *)&f;
+ union fi fi = { .f = f };
+ return fi.ui;
}
static uint32_t
brw_param_value(struct brw_context *brw,
const struct gl_program *prog,
- const struct brw_stage_prog_data *prog_data,
+ const struct brw_stage_state *stage_state,
uint32_t param)
{
struct gl_context *ctx = &brw->ctx;
case BRW_PARAM_DOMAIN_PARAMETER: {
unsigned idx = BRW_PARAM_PARAMETER_IDX(param);
+ unsigned offset = prog->Parameters->ParameterValueOffset[idx];
unsigned comp = BRW_PARAM_PARAMETER_COMP(param);
assert(idx < prog->Parameters->NumParameters);
- return prog->Parameters->ParameterValues[idx][comp].u;
+ return prog->Parameters->ParameterValues[offset + comp].u;
}
case BRW_PARAM_DOMAIN_UNIFORM: {
case BRW_PARAM_DOMAIN_IMAGE: {
unsigned idx = BRW_PARAM_IMAGE_IDX(param);
unsigned offset = BRW_PARAM_IMAGE_OFFSET(param);
- assert(idx < prog_data->nr_image_params);
- assert(offset < sizeof(struct brw_image_param));
- return ((uint32_t *)&prog_data->image_param[idx])[offset];
+ assert(offset < ARRAY_SIZE(stage_state->image_param));
+ return ((uint32_t *)&stage_state->image_param[idx])[offset];
}
default:
void
brw_populate_constant_data(struct brw_context *brw,
const struct gl_program *prog,
- const struct brw_stage_prog_data *prog_data,
+ const struct brw_stage_state *stage_state,
void *void_dst,
const uint32_t *param,
unsigned nr_params)
{
uint32_t *dst = void_dst;
for (unsigned i = 0; i < nr_params; i++)
- dst[i] = brw_param_value(brw, prog, prog_data, param[i]);
+ dst[i] = brw_param_value(brw, prog, stage_state, param[i]);
}
const struct gen_device_info *devinfo = &brw->screen->devinfo;
struct gl_context *ctx = &brw->ctx;
- if (prog_data->nr_params == 0) {
+ bool active = prog_data &&
+ (stage_state->stage != MESA_SHADER_TESS_CTRL ||
+ brw->programs[MESA_SHADER_TESS_EVAL]);
+
+ if (active)
+ _mesa_shader_write_subroutine_indices(ctx, stage_state->stage);
+
+ if (!active || prog_data->nr_params == 0) {
stage_state->push_const_size = 0;
} else {
/* Updates the ParamaterValues[i] pointers for all parameters of the
const int size = prog_data->nr_params * sizeof(gl_constant_value);
gl_constant_value *param;
if (devinfo->gen >= 8 || devinfo->is_haswell) {
- param = intel_upload_space(brw, size, 32,
- &stage_state->push_const_bo,
- &stage_state->push_const_offset);
+ param = brw_upload_space(&brw->upload, size, 32,
+ &stage_state->push_const_bo,
+ &stage_state->push_const_offset);
} else {
param = brw_state_batch(brw, size, 32,
&stage_state->push_const_offset);
* side effect of dereferencing uniforms, so _NEW_PROGRAM_CONSTANTS
* wouldn't be set for them.
*/
- brw_populate_constant_data(brw, prog, prog_data, param,
+ brw_populate_constant_data(brw, prog, stage_state, param,
prog_data->param,
prog_data->nr_params);
uint32_t size = prog_data->nr_pull_params * 4;
struct brw_bo *const_bo = NULL;
uint32_t const_offset;
- gl_constant_value *constants = intel_upload_space(brw, size, 64,
- &const_bo, &const_offset);
+ gl_constant_value *constants = brw_upload_space(&brw->upload, size, 64,
+ &const_bo, &const_offset);
STATIC_ASSERT(sizeof(gl_constant_value) == sizeof(float));
- brw_populate_constant_data(brw, prog, prog_data, constants,
+ brw_populate_constant_data(brw, prog, stage_state, constants,
prog_data->pull_param,
prog_data->nr_pull_params);
}
}
- brw_create_constant_surface(brw, const_bo, const_offset, size,
- &stage_state->surf_offset[surf_index]);
+ brw_emit_buffer_surface_state(brw, &stage_state->surf_offset[surf_index],
+ const_bo, const_offset,
+ ISL_FORMAT_R32G32B32A32_FLOAT,
+ size, 1, 0);
+
brw_bo_unreference(const_bo);
brw->ctx.NewDriverState |= brw_new_constbuf;
if (cs_prog_data->push.cross_thread.size > 0) {
uint32_t *param_copy = param;
- assert(cs_prog_data->thread_local_id_index < 0 ||
- cs_prog_data->thread_local_id_index >=
- cs_prog_data->push.cross_thread.dwords);
for (unsigned i = 0;
i < cs_prog_data->push.cross_thread.dwords;
i++) {
- param_copy[i] = brw_param_value(brw, prog, prog_data,
+ assert(prog_data->param[i] != BRW_PARAM_BUILTIN_SUBGROUP_ID);
+ param_copy[i] = brw_param_value(brw, prog, stage_state,
prog_data->param[i]);
}
}
cs_prog_data->push.cross_thread.regs);
unsigned src = cs_prog_data->push.cross_thread.dwords;
for ( ; src < prog_data->nr_params; src++, dst++) {
- if (src != cs_prog_data->thread_local_id_index) {
- param[dst] = brw_param_value(brw, prog, prog_data,
- prog_data->param[src]);
+ if (prog_data->param[src] == BRW_PARAM_BUILTIN_SUBGROUP_ID) {
+ param[dst] = t;
} else {
- param[dst] = t * cs_prog_data->simd_size;
+ param[dst] = brw_param_value(brw, prog, stage_state,
+ prog_data->param[src]);
}
}
}