summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-09-28 22:16:55 -0700
committerJason Ekstrand <[email protected]>2017-10-12 22:39:30 -0700
commit4efd079aba165d5a046868ec77a27605724da858 (patch)
tree96e71c5bab325d158d4c7ffbf084cd2dc136c651
parent9df64b56663c3ffaee081aa608db9e5163a4eeae (diff)
intel/compiler: Add a flag for pull constant support
The Vulkan driver does not support pull constants. It simply limits things such that we can always push everything. Previously, we were determining whether or not to push things based on whether or not the prog_data::pull_param array is non-null. This is rather hackish and about to stop working. Reviewed-by: Jordan Justen <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/intel/compiler/brw_compiler.h6
-rw-r--r--src/intel/compiler/brw_fs.cpp5
-rw-r--r--src/intel/compiler/brw_vec4_visitor.cpp2
-rw-r--r--src/intel/vulkan/anv_device.c1
-rw-r--r--src/mesa/drivers/dri/i965/intel_screen.c1
5 files changed, 13 insertions, 2 deletions
diff --git a/src/intel/compiler/brw_compiler.h b/src/intel/compiler/brw_compiler.h
index 94fe63e46f1..26e8f464ef6 100644
--- a/src/intel/compiler/brw_compiler.h
+++ b/src/intel/compiler/brw_compiler.h
@@ -105,6 +105,12 @@ struct brw_compiler {
* Base Address? (If not, it's a normal GPU address.)
*/
bool constant_buffer_0_is_relative;
+
+ /**
+ * Whether or not the driver supports pull constants. If not, the compiler
+ * will attempt to push everything.
+ */
+ bool supports_pull_constants;
};
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index c1d67750a3a..6f5f21ddcdf 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -1889,6 +1889,7 @@ set_push_pull_constant_loc(unsigned uniform, int *chunk_start,
unsigned *num_pull_constants,
const unsigned max_push_components,
const unsigned max_chunk_size,
+ bool allow_pull_constants,
struct brw_stage_prog_data *stage_prog_data)
{
/* This is the first live uniform in the chunk */
@@ -1918,7 +1919,7 @@ set_push_pull_constant_loc(unsigned uniform, int *chunk_start,
* 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 ||
+ if (!allow_pull_constants ||
(*num_push_constants + chunk_size <= max_push_components &&
chunk_size <= max_chunk_size)) {
assert(*num_push_constants + chunk_size <= max_push_components);
@@ -2054,6 +2055,7 @@ fs_visitor::assign_constant_locations()
push_constant_loc, pull_constant_loc,
&num_push_constants, &num_pull_constants,
max_push_components, max_chunk_size,
+ compiler->supports_pull_constants,
stage_prog_data);
}
@@ -2074,6 +2076,7 @@ fs_visitor::assign_constant_locations()
push_constant_loc, pull_constant_loc,
&num_push_constants, &num_pull_constants,
max_push_components, max_chunk_size,
+ compiler->supports_pull_constants,
stage_prog_data);
}
diff --git a/src/intel/compiler/brw_vec4_visitor.cpp b/src/intel/compiler/brw_vec4_visitor.cpp
index 88e80aaa3af..ff5cd2d4334 100644
--- a/src/intel/compiler/brw_vec4_visitor.cpp
+++ b/src/intel/compiler/brw_vec4_visitor.cpp
@@ -1777,7 +1777,7 @@ 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) {
+ if (!compiler->supports_pull_constants) {
split_uniform_registers();
return;
}
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 70db6f88beb..9a74efcbad3 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -390,6 +390,7 @@ anv_physical_device_init(struct anv_physical_device *device,
}
device->compiler->shader_debug_log = compiler_debug_log;
device->compiler->shader_perf_log = compiler_perf_log;
+ device->compiler->supports_pull_constants = false;
isl_device_init(&device->isl_dev, &device->info, swizzled);
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 93f4f9fba4e..d3bef25cd5f 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -2511,6 +2511,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *dri_screen)
screen->compiler->shader_debug_log = shader_debug_log_mesa;
screen->compiler->shader_perf_log = shader_perf_log_mesa;
screen->compiler->constant_buffer_0_is_relative = devinfo->gen < 8;
+ screen->compiler->supports_pull_constants = true;
screen->has_exec_fence =
intel_get_boolean(screen, I915_PARAM_HAS_EXEC_FENCE);