+ draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
+
+ for (i = 0; i < num_targets; i++)
+ draw->so.targets[i] = targets[i];
+ for (i = num_targets; i < PIPE_MAX_SO_BUFFERS; i++)
+ draw->so.targets[i] = NULL;
+
+ draw->so.num_targets = num_targets;
+}
+
+void
+draw_set_sampler_views(struct draw_context *draw,
+ enum pipe_shader_type shader_stage,
+ struct pipe_sampler_view **views,
+ unsigned num)
+{
+ unsigned i;
+
+ debug_assert(shader_stage < PIPE_SHADER_TYPES);
+ debug_assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
+
+ draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
+
+ for (i = 0; i < num; ++i)
+ draw->sampler_views[shader_stage][i] = views[i];
+ for (i = num; i < draw->num_sampler_views[shader_stage]; ++i)
+ draw->sampler_views[shader_stage][i] = NULL;
+
+ draw->num_sampler_views[shader_stage] = num;
+}
+
+void
+draw_set_samplers(struct draw_context *draw,
+ enum pipe_shader_type shader_stage,
+ struct pipe_sampler_state **samplers,
+ unsigned num)
+{
+ unsigned i;
+
+ debug_assert(shader_stage < PIPE_SHADER_TYPES);
+ debug_assert(num <= PIPE_MAX_SAMPLERS);
+
+ draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
+
+ for (i = 0; i < num; ++i)
+ draw->samplers[shader_stage][i] = samplers[i];
+ for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
+ draw->samplers[shader_stage][i] = NULL;
+
+ draw->num_samplers[shader_stage] = num;
+
+#ifdef HAVE_LLVM
+ if (draw->llvm)
+ draw_llvm_set_sampler_state(draw, shader_stage);
+#endif
+}
+
+void
+draw_set_images(struct draw_context *draw,
+ enum pipe_shader_type shader_stage,
+ struct pipe_image_view *views,
+ unsigned num)
+{
+ unsigned i;
+
+ debug_assert(shader_stage < PIPE_SHADER_TYPES);
+ debug_assert(num <= PIPE_MAX_SHADER_IMAGES);
+
+ draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
+
+ for (i = 0; i < num; ++i)
+ draw->images[shader_stage][i] = &views[i];
+ for (i = num; i < draw->num_sampler_views[shader_stage]; ++i)
+ draw->images[shader_stage][i] = NULL;
+
+ draw->num_images[shader_stage] = num;
+}
+
+void
+draw_set_mapped_texture(struct draw_context *draw,
+ enum pipe_shader_type shader_stage,
+ unsigned sview_idx,
+ uint32_t width, uint32_t height, uint32_t depth,
+ uint32_t first_level, uint32_t last_level,
+ const void *base_ptr,
+ uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
+ uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
+ uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
+{
+#ifdef HAVE_LLVM
+ if (draw->llvm)
+ draw_llvm_set_mapped_texture(draw,
+ shader_stage,
+ sview_idx,
+ width, height, depth, first_level,
+ last_level, base_ptr,
+ row_stride, img_stride, mip_offsets);
+#endif
+}
+
+void
+draw_set_mapped_image(struct draw_context *draw,
+ enum pipe_shader_type shader_stage,
+ unsigned idx,
+ uint32_t width, uint32_t height, uint32_t depth,
+ const void *base_ptr,
+ uint32_t row_stride,
+ uint32_t img_stride)
+{
+#ifdef HAVE_LLVM
+ if (draw->llvm)
+ draw_llvm_set_mapped_image(draw,
+ shader_stage,
+ idx,
+ width, height, depth,
+ base_ptr,
+ row_stride, img_stride);
+#endif
+}
+
+/**
+ * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
+ * different ways of setting textures, and drivers typically only support one.
+ */
+int
+draw_get_shader_param_no_llvm(enum pipe_shader_type shader,
+ enum pipe_shader_cap param)
+{
+ switch(shader) {
+ case PIPE_SHADER_VERTEX:
+ case PIPE_SHADER_GEOMETRY:
+ return tgsi_exec_get_shader_param(param);
+ default:
+ return 0;
+ }
+}
+
+/**
+ * XXX: Results for PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS because there are two
+ * different ways of setting textures, and drivers typically only support one.
+ * Drivers requesting a draw context explicitly without llvm must call
+ * draw_get_shader_param_no_llvm instead.
+ */
+int
+draw_get_shader_param(enum pipe_shader_type shader, enum pipe_shader_cap param)
+{
+
+#ifdef HAVE_LLVM
+ if (draw_get_option_use_llvm()) {
+ switch(shader) {
+ case PIPE_SHADER_VERTEX:
+ case PIPE_SHADER_GEOMETRY:
+ return gallivm_get_shader_param(param);
+ default:
+ return 0;
+ }