intel/compiler: Add a flag for pull constant support
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 29 Sep 2017 05:16:55 +0000 (22:16 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 13 Oct 2017 05:39:30 +0000 (22:39 -0700)
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 <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/compiler/brw_compiler.h
src/intel/compiler/brw_fs.cpp
src/intel/compiler/brw_vec4_visitor.cpp
src/intel/vulkan/anv_device.c
src/mesa/drivers/dri/i965/intel_screen.c

index 94fe63e46f1e8af6e437e744d324d042145b9c95..26e8f464ef6069e3c94b09e0c8959f43db70c709 100644 (file)
@@ -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;
 };
 
 
index c1d67750a3a69b881df133e17bbd9bd8e8f71139..6f5f21ddcdfdf7789d1859882d8726c99a1b075f 100644 (file)
@@ -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);
    }
 
index 88e80aaa3af28a8e1c9bd9d5600bc9fb57e125b6..ff5cd2d4334e11c23213432d6096d3cb5965562f 100644 (file)
@@ -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;
    }
index 70db6f88beb5b39acc47c67ca524b44a9f4c76dd..9a74efcbad36ca823f13d4e201b51f9dcfda784d 100644 (file)
@@ -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);
 
index 93f4f9fba4e4e1993127c9de43a91f2f8deef2eb..d3bef25cd5fd6fbc69a44437d767854e95c3006b 100644 (file)
@@ -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);