boolean has_geometry_shader;
boolean vertex_has_integers;
+ boolean has_stream_out;
};
static void blitter_draw_rectangle(struct blitter_context *blitter,
ctx->base.saved_num_sampler_views = ~0;
ctx->base.saved_num_sampler_states = ~0;
ctx->base.saved_num_vertex_buffers = ~0;
+ ctx->base.saved_num_so_targets = ~0;
ctx->has_geometry_shader =
pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY,
ctx->vertex_has_integers =
pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX,
PIPE_SHADER_CAP_INTEGERS);
+ ctx->has_stream_out =
+ pipe->screen->get_param(pipe->screen,
+ PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0;
/* blend state objects */
memset(&blend, 0, sizeof(blend));
ctx->base.saved_velem_state != INVALID_PTR &&
ctx->base.saved_vs != INVALID_PTR &&
(!ctx->has_geometry_shader || ctx->base.saved_gs != INVALID_PTR) &&
+ (!ctx->has_stream_out || ctx->base.saved_num_so_targets != ~0) &&
ctx->base.saved_rs_state != INVALID_PTR);
}
ctx->base.saved_gs = INVALID_PTR;
}
+ /* Stream outputs. */
+ if (ctx->has_stream_out) {
+ pipe->set_stream_output_targets(pipe,
+ ctx->base.saved_num_so_targets,
+ ctx->base.saved_so_targets, ~0);
+
+ for (i = 0; i < ctx->base.saved_num_so_targets; i++)
+ pipe_so_target_reference(&ctx->base.saved_so_targets[i], NULL);
+
+ ctx->base.saved_num_so_targets = ~0;
+ }
+
/* Rasterizer. */
pipe->bind_rasterizer_state(pipe, ctx->base.saved_rs_state);
ctx->base.saved_rs_state = INVALID_PTR;
int saved_num_vertex_buffers;
struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
+
+ int saved_num_so_targets;
+ struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
};
/**
* - vertex elements
* - vertex shader
* - geometry shader (if supported)
+ * - stream output targets (if supported)
* - rasterizer state
*/
num_vertex_buffers);
}
+static INLINE void
+util_blitter_save_so_targets(struct blitter_context *blitter,
+ int num_targets,
+ struct pipe_stream_output_target **targets)
+{
+ unsigned i;
+ assert(num_targets <= Elements(blitter->saved_so_targets));
+
+ blitter->saved_num_so_targets = num_targets;
+ for (i = 0; i < num_targets; i++)
+ pipe_so_target_reference(&blitter->saved_so_targets[i],
+ targets[i]);
+}
+
#ifdef __cplusplus
}
#endif