NIR_PASS_V(nir, st_nir_lower_wpos_ytransform, prog, screen);
NIR_PASS_V(nir, nir_lower_system_values);
+ NIR_PASS_V(nir, nir_lower_compute_system_values, NULL);
/* Optimise NIR */
NIR_PASS_V(nir, nir_opt_constant_folding);
stp->affected_states |= ST_NEW_VS_CONSTANTS;
/* Translate to NIR if preferred. */
- if (st->pipe->screen->get_shader_param(st->pipe->screen,
+ if (PIPE_SHADER_IR_NIR ==
+ st->pipe->screen->get_shader_param(st->pipe->screen,
PIPE_SHADER_VERTEX,
PIPE_SHADER_CAP_PREFERRED_IR)) {
assert(!stp->glsl_to_tgsi);
/* For st_draw_feedback, we need to generate TGSI too if draw doesn't
* use LLVM.
*/
- if (draw_has_llvm()) {
+ /* TODO: Draw can't handle lowered IO. */
+ if (draw_has_llvm() && !stp->Base.info.io_lowered) {
st_prepare_vertex_program(stp);
return true;
}
return nir_deserialize(NULL, options, &blob_reader);
}
+static void
+lower_ucp(struct st_context *st,
+ struct nir_shader *nir,
+ unsigned ucp_enables,
+ struct gl_program_parameter_list *params)
+{
+ if (nir->info.outputs_written & VARYING_BIT_CLIP_DIST0)
+ NIR_PASS_V(nir, nir_lower_clip_disable, ucp_enables);
+ else {
+ struct pipe_screen *screen = st->pipe->screen;
+ bool can_compact = screen->get_param(screen,
+ PIPE_CAP_NIR_COMPACT_ARRAYS);
+ bool use_eye = st->ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX] != NULL;
+
+ gl_state_index16 clipplane_state[MAX_CLIP_PLANES][STATE_LENGTH];
+ for (int i = 0; i < MAX_CLIP_PLANES; ++i) {
+ if (use_eye) {
+ clipplane_state[i][0] = STATE_CLIPPLANE;
+ clipplane_state[i][1] = i;
+ } else {
+ clipplane_state[i][0] = STATE_INTERNAL;
+ clipplane_state[i][1] = STATE_CLIP_INTERNAL;
+ clipplane_state[i][2] = i;
+ }
+ _mesa_add_state_reference(params, clipplane_state[i]);
+ }
+
+ if (nir->info.stage == MESA_SHADER_VERTEX) {
+ NIR_PASS_V(nir, nir_lower_clip_vs, ucp_enables,
+ true, can_compact, clipplane_state);
+ } else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
+ NIR_PASS_V(nir, nir_lower_clip_gs, ucp_enables,
+ can_compact, clipplane_state);
+ }
+
+ NIR_PASS_V(nir, nir_lower_io_to_temporaries,
+ nir_shader_get_entrypoint(nir), true, false);
+ NIR_PASS_V(nir, nir_lower_global_vars_to_local);
+ }
+}
+
static const gl_state_index16 depth_range_state[STATE_LENGTH] =
{ STATE_DEPTH_RANGE };
{
struct st_common_variant *vpv = CALLOC_STRUCT(st_common_variant);
struct pipe_context *pipe = st->pipe;
- struct pipe_screen *screen = pipe->screen;
struct pipe_shader_state state = {0};
static const gl_state_index16 point_size_state[STATE_LENGTH] =
state.stream_output = stvp->state.stream_output;
if (stvp->state.type == PIPE_SHADER_IR_NIR &&
- (!key->is_draw_shader || draw_has_llvm())) {
+ (!key->is_draw_shader ||
+ /* TODO: Draw can't handle lowered IO. */
+ (draw_has_llvm() && !stvp->Base.info.io_lowered))) {
bool finalize = false;
state.type = PIPE_SHADER_IR_NIR;
}
if (key->lower_ucp) {
- bool can_compact = screen->get_param(screen,
- PIPE_CAP_NIR_COMPACT_ARRAYS);
-
- bool use_eye = st->ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX] != NULL;
- struct nir_shader *nir = state.ir.nir;
-
- if (nir->info.outputs_written & VARYING_BIT_CLIP_DIST0)
- NIR_PASS_V(state.ir.nir, nir_lower_clip_disable, key->lower_ucp);
- else {
- gl_state_index16 clipplane_state[MAX_CLIP_PLANES][STATE_LENGTH];
- for (int i = 0; i < MAX_CLIP_PLANES; ++i) {
- if (use_eye) {
- clipplane_state[i][0] = STATE_CLIPPLANE;
- clipplane_state[i][1] = i;
- } else {
- clipplane_state[i][0] = STATE_INTERNAL;
- clipplane_state[i][1] = STATE_CLIP_INTERNAL;
- clipplane_state[i][2] = i;
- }
- _mesa_add_state_reference(params, clipplane_state[i]);
- }
-
- NIR_PASS_V(state.ir.nir, nir_lower_clip_vs, key->lower_ucp,
- true, can_compact, clipplane_state);
- NIR_PASS_V(state.ir.nir, nir_lower_io_to_temporaries,
- nir_shader_get_entrypoint(state.ir.nir), true, false);
- NIR_PASS_V(state.ir.nir, nir_lower_global_vars_to_local);
- }
+ lower_ucp(st, state.ir.nir, key->lower_ucp, params);
finalize = true;
}
/* Translate to NIR. */
if (!stfp->ati_fs &&
+ PIPE_SHADER_IR_NIR ==
st->pipe->screen->get_shader_param(st->pipe->screen,
PIPE_SHADER_FRAGMENT,
PIPE_SHADER_CAP_PREFERRED_IR)) {
}
if (key->lower_two_sided_color) {
- NIR_PASS_V(state.ir.nir, nir_lower_two_sided_color);
+ bool face_sysval = st->ctx->Const.GLSLFrontFacingIsSysVal;
+ NIR_PASS_V(state.ir.nir, nir_lower_two_sided_color, face_sysval);
finalize = true;
}
if (key->persample_shading) {
nir_shader *shader = state.ir.nir;
- nir_foreach_variable(var, &shader->inputs)
+ nir_foreach_shader_in_variable(var, shader)
var->data.sample = true;
finalize = true;
}
struct pipe_context *pipe = st->pipe;
struct st_variant *v;
struct pipe_shader_state state = {0};
+ struct gl_program_parameter_list *params = prog->Base.Parameters;
/* Search for existing variant */
for (v = prog->variants; v; v = v->next) {
finalize = true;
}
+ if (key->lower_ucp) {
+ lower_ucp(st, state.ir.nir, key->lower_ucp, params);
+ finalize = true;
+ }
+
state.stream_output = prog->state.stream_output;
if (finalize || !st->allow_st_finalize_nir_twice) {