gallium: utility helper functions for stream output
authorMarek Olšák <maraeo@gmail.com>
Fri, 9 Dec 2011 17:12:55 +0000 (18:12 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 15 Dec 2011 17:51:48 +0000 (18:51 +0100)
src/gallium/auxiliary/tgsi/tgsi_ureg.c
src/gallium/auxiliary/tgsi/tgsi_ureg.h
src/gallium/auxiliary/util/u_debug_describe.c
src/gallium/auxiliary/util/u_debug_describe.h
src/gallium/auxiliary/util/u_inlines.h
src/gallium/auxiliary/util/u_simple_shaders.c
src/gallium/auxiliary/util/u_simple_shaders.h

index 33d285cb64c90557a69c8a67a537e962d25bbdb8..17f9ce25227bd65053dc90df14107db0b80de31e 100644 (file)
@@ -1590,14 +1590,19 @@ const struct tgsi_token *ureg_finalize( struct ureg_program *ureg )
 
 
 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 );
index a70d30f873f86975d73da199e514883dae163129..bf55d54e5433d94a92aee9a63e7067e8ea6a32b7 100644 (file)
@@ -37,6 +37,7 @@ extern "C" {
 #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].
@@ -97,7 +98,8 @@ ureg_finalize( struct ureg_program * );
  */
 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
@@ -120,14 +122,22 @@ ureg_destroy( struct ureg_program * );
  * 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:
index 3574accc0043e3b46cd65940f62e6b620218288b..df73ed83ef612b52b6b48bc037d6c1959969478d 100644 (file)
@@ -79,3 +79,13 @@ debug_describe_sampler_view(char* buf, const struct pipe_sampler_view *ptr)
    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);
+}
index 26d1f803bf0d68595edc5f4fb7e3bf98a2505927..4f7882b0b377bd79c2d41fec7fcdbdf19447f825 100644 (file)
@@ -41,6 +41,8 @@ void debug_describe_reference(char* buf, const struct pipe_reference*ptr);
 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
 }
index ddb81b5b95700df0f9c768507524b83d996886e4..44283909aec42559feaefa1f7d76b68faeeb20e7 100644 (file)
@@ -135,6 +135,18 @@ pipe_sampler_view_reference(struct pipe_sampler_view **ptr, struct pipe_sampler_
    *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,
index b0f2dd8aa29e8173c9620140c180fa2f6c5a4238..320c0f7a830247edbf510b230100dbd09c04b9ec 100644 (file)
@@ -55,6 +55,18 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
                                     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;
@@ -78,7 +90,7 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
 
    ureg_END( ureg );
 
-   return ureg_create_shader_and_destroy( ureg, pipe );
+   return ureg_create_shader_with_so_and_destroy( ureg, pipe, so );
 }
 
 
index 1bfec183e3471579adb3c4b85822efbf6da77fd0..5f31b72c4d77b70d172584bc81b3da3906192ddc 100644 (file)
@@ -35,6 +35,7 @@
 
 struct pipe_context;
 struct pipe_shader_state;
+struct pipe_stream_output_info;
 
 
 #ifdef __cplusplus
@@ -48,6 +49,13 @@ util_make_vertex_passthrough_shader(struct pipe_context *pipe,
                                     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,