From f1d29099b4eedafb0302a21c0673d12a6610c369 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 5 Apr 2016 16:22:26 -0700 Subject: [PATCH] i965: Push everything if pull_param == NULL Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_fs.cpp | 10 ++++++++-- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 6464579..aedb5a2 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -2019,8 +2019,14 @@ fs_visitor::assign_constant_locations() if (!contiguous[u]) { unsigned chunk_size = u - chunk_start + 1; - if (num_push_constants + chunk_size <= max_push_components && - chunk_size <= max_chunk_size) { + /* Decide whether we should push or pull this parameter. In the + * Vulkan driver, push constants are explicitly exposed via the API + * so we push everything. In GL, we only push small arrays. + */ + if (stage_prog_data->pull_param == NULL || + (num_push_constants + chunk_size <= max_push_components && + chunk_size <= max_chunk_size)) { + assert(num_push_constants + chunk_size <= max_push_components); for (unsigned j = chunk_start; j <= u; j++) push_constant_loc[j] = num_push_constants++; } else { diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 29bdacc..4b12a72 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1629,6 +1629,12 @@ vec4_visitor::emit_pull_constant_load(bblock_t *block, vec4_instruction *inst, void vec4_visitor::move_uniform_array_access_to_pull_constants() { + /* The vulkan dirver doesn't support pull constants other than UBOs so + * everything has to be pushed regardless. + */ + if (stage_prog_data->pull_param == NULL) + return; + int pull_constant_loc[this->uniforms]; memset(pull_constant_loc, -1, sizeof(pull_constant_loc)); -- 2.7.4