anv: Push constants are relative to dynamic state on IVB
authorJason Ekstrand <jason@jlekstrand.net>
Mon, 25 Nov 2019 17:05:42 +0000 (11:05 -0600)
committerJason Ekstrand <jason@jlekstrand.net>
Tue, 26 Nov 2019 22:15:54 +0000 (22:15 +0000)
Fixes: aecde2351 "anv: Pre-compute push ranges for graphics pipelines"
Closes: #2136
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/vulkan/genX_cmd_buffer.c

index 7c48938fca68de50079c22f43d103cee4c4a9983..42d5b4526990ab4a1108b524b09cde702a1c14e8 100644 (file)
@@ -2535,6 +2535,7 @@ cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer,
             const struct anv_pipeline_bind_map *bind_map =
                &pipeline->shaders[stage]->bind_map;
 
+#if GEN_GEN >= 8 || GEN_IS_HASWELL
             for (unsigned i = 0; i < 4; i++) {
                const struct anv_push_range *range = &bind_map->push_ranges[i];
                if (range->length == 0)
@@ -2588,6 +2589,22 @@ cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer,
                c.ConstantBody.Buffer[i] =
                   anv_address_add(addr, range->start * 32);
             }
+#else
+            /* For Ivy Bridge, push constants are relative to dynamic state
+             * base address and we only ever push actual push constants.
+             */
+            if (bind_map->push_ranges[0].length > 0) {
+               assert(bind_map->push_ranges[0].set ==
+                      ANV_DESCRIPTOR_SET_PUSH_CONSTANTS);
+               struct anv_state state =
+                  anv_cmd_buffer_push_constants(cmd_buffer, stage);
+               c.ConstantBody.ReadLength[0] = bind_map->push_ranges[0].length;
+               c.ConstantBody.Buffer[0].offset = state.offset;
+            }
+            assert(bind_map->push_ranges[1].length == 0);
+            assert(bind_map->push_ranges[2].length == 0);
+            assert(bind_map->push_ranges[3].length == 0);
+#endif
          }
       }