ilo: add ilo_finalize_compute_states()
authorChia-I Wu <olvaffe@gmail.com>
Thu, 30 Oct 2014 07:45:05 +0000 (15:45 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Thu, 6 Nov 2014 02:43:31 +0000 (10:43 +0800)
It updates the handles of the global bindings.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/gallium/drivers/ilo/ilo_state.c
src/gallium/drivers/ilo/ilo_state.h

index 217d22c614b8cb65d65f9c096225d8634b124848..c68062adb03f61568d2756ab416739758dd58a98 100644 (file)
@@ -262,6 +262,40 @@ ilo_finalize_3d_states(struct ilo_context *ilo,
    u_upload_unmap(ilo->uploader);
 }
 
+static void
+finalize_global_binding(struct ilo_state_vector *vec)
+{
+   struct ilo_shader_state *cs = vec->cs;
+   int base, count, shift;
+   int i;
+
+   count = ilo_shader_get_kernel_param(cs,
+         ILO_KERNEL_CS_SURFACE_GLOBAL_COUNT);
+   if (!count)
+      return;
+
+   base = ilo_shader_get_kernel_param(cs, ILO_KERNEL_CS_SURFACE_GLOBAL_BASE);
+   shift = 32 - util_last_bit(base + count - 1);
+
+   if (count > vec->global_binding.count)
+      count = vec->global_binding.count;
+
+   for (i = 0; i < count; i++) {
+      struct ilo_global_binding_cso *cso =
+         util_dynarray_element(&vec->global_binding.bindings,
+               struct ilo_global_binding_cso, i);
+      const uint32_t offset = *cso->handle & ((1 << shift) - 1);
+
+      *cso->handle = ((base + i) << shift) | offset;
+   }
+}
+
+void
+ilo_finalize_compute_states(struct ilo_context *ilo)
+{
+   finalize_global_binding(&ilo->state_vector);
+}
+
 static void *
 ilo_create_blend_state(struct pipe_context *pipe,
                        const struct pipe_blend_state *state)
index 7343b20e3572a888c23984e0d0af2319b0411798..6f544e1f7885dab3cda09aa65898786cdf8bd443 100644 (file)
@@ -427,6 +427,9 @@ void
 ilo_finalize_3d_states(struct ilo_context *ilo,
                        const struct pipe_draw_info *draw);
 
+void
+ilo_finalize_compute_states(struct ilo_context *ilo);
+
 void
 ilo_state_vector_init(const struct ilo_dev_info *dev,
                       struct ilo_state_vector *vec);