diff options
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state.c | 34 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state.h | 3 |
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); |