prog_data = ice->shaders.prog[MESA_SHADER_VERTEX]->prog_data;
struct brw_vue_prog_data *vue_prog_data = (void *) prog_data;
+ struct brw_vue_map *vue_map = &vue_prog_data->vue_map;
+ struct brw_vue_map *old_map = ice->shaders.last_vue_map;
+ const uint64_t changed_slots =
+ (old_map ? old_map->slots_valid : 0ull) ^ vue_map->slots_valid;
+
+ if (changed_slots & VARYING_BIT_VIEWPORT) {
+ // XXX: could use ctx->Const.MaxViewports for old API efficiency
+ ice->state.num_viewports =
+ (vue_map->slots_valid & VARYING_BIT_VIEWPORT) ? IRIS_MAX_VIEWPORTS : 1;
+ ice->state.dirty |= IRIS_DIRTY_CLIP | IRIS_DIRTY_SF_CL_VIEWPORT;
+ // XXX: CC_VIEWPORT?
+ }
+
ice->shaders.last_vue_map = &vue_prog_data->vue_map;
}
vp_map += GENX(SF_CLIP_VIEWPORT_length);
}
- unsigned num_viewports = start_slot + count;
-
- if (num_viewports != ice->state.num_viewports) {
- ice->state.num_viewports = num_viewports;
- ice->state.dirty |= IRIS_DIRTY_CLIP;
- }
-
ice->state.dirty |= IRIS_DIRTY_SF_CL_VIEWPORT;
}