static inline void brw_upload_programs(struct brw_context *brw, enum brw_pipeline pipeline) { if (pipeline == BRW_RENDER_PIPELINE) { brw_upload_vs_prog(brw); brw_upload_tess_programs(brw); if (brw->gen < 6) brw_upload_ff_gs_prog(brw); else brw_upload_gs_prog(brw); /* Update the VUE map for data exiting the GS stage of the pipeline. * This comes from the last enabled shader stage. */ GLbitfield64 old_slots = brw->vue_map_geom_out.slots_valid; bool old_separate = brw->vue_map_geom_out.separate; if (brw->geometry_program) brw->vue_map_geom_out = brw->gs.prog_data->base.vue_map; else if (brw->tess_eval_program) brw->vue_map_geom_out = brw->tes.prog_data->base.vue_map; else brw->vue_map_geom_out = brw->vs.prog_data->base.vue_map; /* If the layout has changed, signal BRW_NEW_VUE_MAP_GEOM_OUT. */ if (old_slots != brw->vue_map_geom_out.slots_valid || old_separate != brw->vue_map_geom_out.separate) brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; brw_upload_wm_prog(brw); } else if (pipeline == BRW_COMPUTE_PIPELINE) { brw_upload_cs_prog(brw); } }
static inline void brw_upload_programs(struct brw_context *brw, enum brw_pipeline pipeline) { struct gl_context *ctx = &brw->ctx; const struct gen_device_info *devinfo = &brw->screen->devinfo; if (pipeline == BRW_RENDER_PIPELINE) { brw_upload_vs_prog(brw); brw_upload_tess_programs(brw); if (brw->programs[MESA_SHADER_GEOMETRY]) { brw_upload_gs_prog(brw); } else { brw->gs.base.prog_data = NULL; if (devinfo->gen < 7) brw_upload_ff_gs_prog(brw); } /* Update the VUE map for data exiting the GS stage of the pipeline. * This comes from the last enabled shader stage. */ GLbitfield64 old_slots = brw->vue_map_geom_out.slots_valid; bool old_separate = brw->vue_map_geom_out.separate; struct brw_vue_prog_data *vue_prog_data; if (brw->programs[MESA_SHADER_GEOMETRY]) vue_prog_data = brw_vue_prog_data(brw->gs.base.prog_data); else if (brw->programs[MESA_SHADER_TESS_EVAL]) vue_prog_data = brw_vue_prog_data(brw->tes.base.prog_data); else vue_prog_data = brw_vue_prog_data(brw->vs.base.prog_data); brw->vue_map_geom_out = vue_prog_data->vue_map; /* If the layout has changed, signal BRW_NEW_VUE_MAP_GEOM_OUT. */ if (old_slots != brw->vue_map_geom_out.slots_valid || old_separate != brw->vue_map_geom_out.separate) brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; if ((old_slots ^ brw->vue_map_geom_out.slots_valid) & VARYING_BIT_VIEWPORT) { ctx->NewDriverState |= BRW_NEW_VIEWPORT_COUNT; brw->clip.viewport_count = (brw->vue_map_geom_out.slots_valid & VARYING_BIT_VIEWPORT) ? ctx->Const.MaxViewports : 1; } brw_upload_wm_prog(brw); if (devinfo->gen < 6) { brw_upload_clip_prog(brw); brw_upload_sf_prog(brw); } brw_disk_cache_write_render_programs(brw); } else if (pipeline == BRW_COMPUTE_PIPELINE) { brw_upload_cs_prog(brw); brw_disk_cache_write_compute_program(brw); } }
static inline void brw_upload_programs(struct brw_context *brw, enum brw_pipeline pipeline) { struct gl_context *ctx = &brw->ctx; if (pipeline == BRW_RENDER_PIPELINE) { brw_upload_vs_prog(brw); brw_upload_tess_programs(brw); if (brw->gen < 6) brw_upload_ff_gs_prog(brw); else brw_upload_gs_prog(brw); /* Update the VUE map for data exiting the GS stage of the pipeline. * This comes from the last enabled shader stage. */ GLbitfield64 old_slots = brw->vue_map_geom_out.slots_valid; bool old_separate = brw->vue_map_geom_out.separate; struct brw_vue_prog_data *vue_prog_data; if (brw->geometry_program) vue_prog_data = brw_vue_prog_data(brw->gs.base.prog_data); else if (brw->tess_eval_program) vue_prog_data = brw_vue_prog_data(brw->tes.base.prog_data); else vue_prog_data = brw_vue_prog_data(brw->vs.base.prog_data); brw->vue_map_geom_out = vue_prog_data->vue_map; /* If the layout has changed, signal BRW_NEW_VUE_MAP_GEOM_OUT. */ if (old_slots != brw->vue_map_geom_out.slots_valid || old_separate != brw->vue_map_geom_out.separate) brw->ctx.NewDriverState |= BRW_NEW_VUE_MAP_GEOM_OUT; if ((old_slots ^ brw->vue_map_geom_out.slots_valid) & VARYING_BIT_VIEWPORT) { ctx->NewDriverState |= BRW_NEW_VIEWPORT_COUNT; brw->clip.viewport_count = (brw->vue_map_geom_out.slots_valid & VARYING_BIT_VIEWPORT) ? ctx->Const.MaxViewports : 1; } brw_upload_wm_prog(brw); if (brw->gen < 6) { brw_upload_clip_prog(brw); brw_upload_sf_prog(brw); } } else if (pipeline == BRW_COMPUTE_PIPELINE) { brw_upload_cs_prog(brw); } }