void *ureg_create_shader( struct ureg_program *ureg,
- struct pipe_context *pipe )
+ struct pipe_context *pipe,
+ const struct pipe_stream_output_info *so )
{
struct pipe_shader_state state;
state.tokens = ureg_finalize(ureg);
if(!state.tokens)
return NULL;
- memset(&state.stream_output, 0, sizeof(state.stream_output));
+
+ if (so)
+ state.stream_output = *so;
+ else
+ memset(&state.stream_output, 0, sizeof(state.stream_output));
if (ureg->processor == TGSI_PROCESSOR_VERTEX)
return pipe->create_vs_state( pipe, &state );
#endif
struct ureg_program;
+struct pipe_stream_output_info;
/* Almost a tgsi_src_register, but we need to pull in the Absolute
* flag from the _ext token. Indirect flag always implies ADDR[0].
*/
void *
ureg_create_shader( struct ureg_program *,
- struct pipe_context *pipe );
+ struct pipe_context *pipe,
+ const struct pipe_stream_output_info *so );
/* Alternately, return the built token stream and hand ownership of
* Convenience routine:
*/
static INLINE void *
-ureg_create_shader_and_destroy( struct ureg_program *p,
- struct pipe_context *pipe )
+ureg_create_shader_with_so_and_destroy( struct ureg_program *p,
+ struct pipe_context *pipe,
+ const struct pipe_stream_output_info *so )
{
- void *result = ureg_create_shader( p, pipe );
+ void *result = ureg_create_shader( p, pipe, so );
ureg_destroy( p );
return result;
}
+static INLINE void *
+ureg_create_shader_and_destroy( struct ureg_program *p,
+ struct pipe_context *pipe )
+{
+ return ureg_create_shader_with_so_and_destroy(p, pipe, NULL);
+}
+
/***********************************************************************
* Build shader properties:
debug_describe_resource(res, ptr->texture);
util_sprintf(buf, "pipe_sampler_view<%s,%s>", res, util_format_short_name(ptr->format));
}
+
+void
+debug_describe_so_target(char* buf,
+ const struct pipe_stream_output_target *ptr)
+{
+ char res[128];
+ debug_describe_resource(res, ptr->buffer);
+ util_sprintf(buf, "pipe_stream_output_target<%s,%u,%u>", res,
+ ptr->buffer_offset, ptr->buffer_size);
+}
void debug_describe_resource(char* buf, const struct pipe_resource *ptr);
void debug_describe_surface(char* buf, const struct pipe_surface *ptr);
void debug_describe_sampler_view(char* buf, const struct pipe_sampler_view *ptr);
+void debug_describe_so_target(char* buf,
+ const struct pipe_stream_output_target *ptr);
#ifdef __cplusplus
}
*ptr = view;
}
+static INLINE void
+pipe_so_target_reference(struct pipe_stream_output_target **ptr,
+ struct pipe_stream_output_target *target)
+{
+ struct pipe_stream_output_target *old = *ptr;
+
+ if (pipe_reference_described(&(*ptr)->reference, &target->reference,
+ (debug_reference_descriptor)debug_describe_so_target))
+ old->context->stream_output_target_destroy(old->context, old);
+ *ptr = target;
+}
+
static INLINE void
pipe_surface_reset(struct pipe_context *ctx, struct pipe_surface* ps,
struct pipe_resource *pt, unsigned level, unsigned layer,
uint num_attribs,
const uint *semantic_names,
const uint *semantic_indexes)
+{
+ return util_make_vertex_passthrough_shader_with_so(pipe, num_attribs,
+ semantic_names,
+ semantic_indexes, NULL);
+}
+
+void *
+util_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe,
+ uint num_attribs,
+ const uint *semantic_names,
+ const uint *semantic_indexes,
+ const struct pipe_stream_output_info *so)
{
struct ureg_program *ureg;
uint i;
ureg_END( ureg );
- return ureg_create_shader_and_destroy( ureg, pipe );
+ return ureg_create_shader_with_so_and_destroy( ureg, pipe, so );
}
struct pipe_context;
struct pipe_shader_state;
+struct pipe_stream_output_info;
#ifdef __cplusplus
const uint *semantic_names,
const uint *semantic_indexes);
+extern void *
+util_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe,
+ uint num_attribs,
+ const uint *semantic_names,
+ const uint *semantic_indexes,
+ const struct pipe_stream_output_info *so);
+
extern void *
util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,