--- src/mesa/drivers/dri/i965/brw_shader_cache.c | 41 +++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 4 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_shader_cache.c b/src/mesa/drivers/dri/i965/brw_shader_cache.c index 5326c52..f9e1374 100644 --- a/src/mesa/drivers/dri/i965/brw_shader_cache.c +++ b/src/mesa/drivers/dri/i965/brw_shader_cache.c @@ -138,10 +138,18 @@ fallback_to_full_recompile(struct brw_context *brw, static void load_program_data(struct gl_shader_program *prog, struct blob_reader *binary, struct brw_stage_prog_data *prog_data, - gl_shader_stage stage, struct gl_context *ctx) + gl_shader_stage stage, struct gl_context *ctx, + const struct brw_vs_prog_key *vs_key) { static const gl_constant_value zero = { 0 }; + intptr_t eye_user_plane_base = 0; + intptr_t clip_user_plane_base = 0; + if (vs_key) { + eye_user_plane_base = blob_read_intptr(binary); + clip_user_plane_base = blob_read_intptr(binary); + } + intptr_t parameter_values_base = blob_read_intptr(binary); intptr_t uniform_data_slots_base = blob_read_intptr(binary); @@ -177,15 +185,26 @@ load_program_data(struct gl_shader_program *prog, struct blob_reader *binary, } } + unsigned cp_upper_boundary = + vs_key ? vs_key->nr_userclip_plane_consts * 4 : 0; + for (unsigned i = 0; i < nr_params; i++) { intptr_t param = blob_read_intptr(binary); - ptrdiff_t p_offset, u_offset, i_offset; + ptrdiff_t p_offset, u_offset, i_offset, eye_offset, clip_offset; + struct gl_program_parameter_list *param_list = prog->_LinkedShaders[stage]->Program->Parameters; p_offset = (param - parameter_values_base) / sizeof(gl_constant_value); u_offset = (param - uniform_data_slots_base) / sizeof(gl_constant_value); i_offset = (param - image_params_base) / sizeof(gl_constant_value); + + if (vs_key) { + eye_offset = + (param - eye_user_plane_base) / sizeof(gl_constant_value); + clip_offset = + (param - clip_user_plane_base) / sizeof(gl_constant_value); + } if (p_offset >= 0 && p_offset < 4 * param_list->NumParameters) { prog_data->param[i] = @@ -195,6 +214,15 @@ load_program_data(struct gl_shader_program *prog, struct blob_reader *binary, } else if (i_offset >= 0 && i_offset < image_upper_boundary) { prog_data->param[i] = ((gl_constant_value *) prog_data->image_param) + i_offset; + } else if (vs_key && + eye_offset >= 0 && eye_offset < cp_upper_boundary) { + prog_data->param[i] = + ((gl_constant_value *) ctx->Transform.EyeUserPlane) + eye_offset; + } else if (vs_key && + clip_offset >= 0 && clip_offset < cp_upper_boundary) { + prog_data->param[i] = + ((gl_constant_value *) ctx->Transform._ClipUserPlane) + + clip_offset; } else { prog_data->param[i] = &zero; } @@ -253,7 +281,8 @@ upload_cached_vs(struct brw_context *brw, struct blob_reader *binary, vs_prog_data = blob_read_bytes(binary, vs_prog_data_size); prog_data = &vs_prog_data->base.base; - load_program_data(prog, binary, prog_data, MESA_SHADER_VERTEX, &brw->ctx); + load_program_data(prog, binary, prog_data, MESA_SHADER_VERTEX, &brw->ctx, + vs_key); struct brw_vertex_program *vp = (struct brw_vertex_program *)brw->vertex_program; @@ -289,7 +318,7 @@ upload_cached_wm(struct brw_context *brw, struct blob_reader *binary, prog_data = &wm_prog_data->base; load_program_data(prog, binary, prog_data, MESA_SHADER_FRAGMENT, - &brw->ctx); + &brw->ctx, NULL); struct brw_fragment_program *wp = (struct brw_fragment_program *)brw->fragment_program; @@ -479,6 +508,10 @@ write_cached_program(struct brw_context *brw) blob_write_uint32(binary, sizeof *brw->vs.prog_data); blob_write_bytes(binary, brw->vs.prog_data, sizeof *brw->vs.prog_data); + /* Cache clip plane pointers */ + blob_write_intptr(binary, (intptr_t) brw->ctx.Transform.EyeUserPlane); + blob_write_intptr(binary, (intptr_t) brw->ctx.Transform._ClipUserPlane); + write_program_data(prog, binary, &brw->vs.prog_data->base.base, MESA_SHADER_VERTEX); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev