+ cb.buffer = st_obj->buffer;
+
+ if (cb.buffer) {
+ cb.buffer_offset = binding->Offset;
+ cb.buffer_size = cb.buffer->width0 - binding->Offset;
+
+ /* AutomaticSize is FALSE if the buffer was set with BindBufferRange.
+ * Take the minimum just to be sure.
+ */
+ if (!binding->AutomaticSize)
+ cb.buffer_size = MIN2(cb.buffer_size, (unsigned) binding->Size);
+ }
+ else {
+ cb.buffer_offset = 0;
+ cb.buffer_size = 0;
+ }
+
+ cso_set_constant_buffer(st->cso_context, shader_type, 1 + i, &cb);
+ }
+}
+
+void
+st_bind_vs_ubos(struct st_context *st)
+{
+ struct gl_program *prog =
+ st->ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX];
+
+ st_bind_ubos(st, prog, PIPE_SHADER_VERTEX);
+}
+
+void
+st_bind_fs_ubos(struct st_context *st)
+{
+ struct gl_program *prog =
+ st->ctx->_Shader->CurrentProgram[MESA_SHADER_FRAGMENT];
+
+ st_bind_ubos(st, prog, PIPE_SHADER_FRAGMENT);
+}
+
+void
+st_bind_gs_ubos(struct st_context *st)
+{
+ struct gl_program *prog =
+ st->ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY];
+
+ st_bind_ubos(st, prog, PIPE_SHADER_GEOMETRY);
+}
+
+void
+st_bind_tcs_ubos(struct st_context *st)
+{
+ struct gl_program *prog =
+ st->ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_CTRL];
+
+ st_bind_ubos(st, prog, PIPE_SHADER_TESS_CTRL);
+}
+
+void
+st_bind_tes_ubos(struct st_context *st)
+{
+ struct gl_program *prog =
+ st->ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_EVAL];
+
+ st_bind_ubos(st, prog, PIPE_SHADER_TESS_EVAL);
+}
+
+void
+st_bind_cs_ubos(struct st_context *st)
+{
+ struct gl_program *prog =
+ st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
+
+ st_bind_ubos(st, prog, PIPE_SHADER_COMPUTE);
+}