summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/ilo/ilo_state.c34
-rw-r--r--src/gallium/drivers/ilo/ilo_state.h3
2 files changed, 37 insertions, 0 deletions
diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c
index 217d22c614b..c68062adb03 100644
--- a/src/gallium/drivers/ilo/ilo_state.c
+++ b/src/gallium/drivers/ilo/ilo_state.c
@@ -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)
diff --git a/src/gallium/drivers/ilo/ilo_state.h b/src/gallium/drivers/ilo/ilo_state.h
index 7343b20e357..6f544e1f788 100644
--- a/src/gallium/drivers/ilo/ilo_state.h
+++ b/src/gallium/drivers/ilo/ilo_state.h
@@ -428,6 +428,9 @@ 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);