galahad: Support geometry shader / stream-output methods.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 7 Nov 2012 11:45:45 +0000 (11:45 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 9 Nov 2012 13:43:19 +0000 (13:43 +0000)
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/drivers/galahad/glhd_context.c

index 53e0b1731949d30fec75179792b88085edbd1ccc..ac666d45aa9f8c5bee96c742e349e50fa7e503cd 100644 (file)
@@ -204,6 +204,9 @@ galahad_context_bind_sampler_states(struct pipe_context *_pipe,
    case PIPE_SHADER_FRAGMENT:
       pipe->bind_fragment_sampler_states(pipe, num_samplers, samplers);
       break;
+   case PIPE_SHADER_GEOMETRY:
+      pipe->bind_geometry_sampler_states(pipe, num_samplers, samplers);
+      break;
    default:
       assert(0);
    }
@@ -227,6 +230,15 @@ galahad_context_bind_fragment_sampler_states(struct pipe_context *_pipe,
                                        0, num_samplers, samplers);
 }
 
+static void
+galahad_context_bind_geometry_sampler_states(struct pipe_context *_pipe,
+                                             unsigned num_samplers,
+                                             void **samplers)
+{
+   galahad_context_bind_sampler_states(_pipe, PIPE_SHADER_GEOMETRY,
+                                       0, num_samplers, samplers);
+}
+
 
 static void
 galahad_context_delete_sampler_state(struct pipe_context *_pipe,
@@ -315,72 +327,39 @@ galahad_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
                                           depth_stencil_alpha);
 }
 
-static void *
-galahad_context_create_fs_state(struct pipe_context *_pipe,
-                         const struct pipe_shader_state *fs)
-{
-   struct galahad_context *glhd_pipe = galahad_context(_pipe);
-   struct pipe_context *pipe = glhd_pipe->pipe;
-
-   return pipe->create_fs_state(pipe,
-                                fs);
-}
-
-static void
-galahad_context_bind_fs_state(struct pipe_context *_pipe,
-                       void *fs)
-{
-   struct galahad_context *glhd_pipe = galahad_context(_pipe);
-   struct pipe_context *pipe = glhd_pipe->pipe;
-
-   pipe->bind_fs_state(pipe,
-                       fs);
-}
-
-static void
-galahad_context_delete_fs_state(struct pipe_context *_pipe,
-                         void *fs)
-{
-   struct galahad_context *glhd_pipe = galahad_context(_pipe);
-   struct pipe_context *pipe = glhd_pipe->pipe;
-
-   pipe->delete_fs_state(pipe,
-                         fs);
-}
-
-static void *
-galahad_context_create_vs_state(struct pipe_context *_pipe,
-                         const struct pipe_shader_state *vs)
-{
-   struct galahad_context *glhd_pipe = galahad_context(_pipe);
-   struct pipe_context *pipe = glhd_pipe->pipe;
-
-   return pipe->create_vs_state(pipe,
-                                vs);
-}
-
-static void
-galahad_context_bind_vs_state(struct pipe_context *_pipe,
-                       void *vs)
-{
-   struct galahad_context *glhd_pipe = galahad_context(_pipe);
-   struct pipe_context *pipe = glhd_pipe->pipe;
-
-   pipe->bind_vs_state(pipe,
-                       vs);
-}
-
-static void
-galahad_context_delete_vs_state(struct pipe_context *_pipe,
-                         void *vs)
-{
-   struct galahad_context *glhd_pipe = galahad_context(_pipe);
-   struct pipe_context *pipe = glhd_pipe->pipe;
+#define GLHD_SHADER_STATE(shader_type) \
+   static void * \
+   galahad_context_create_##shader_type##_state(struct pipe_context *_pipe, \
+                            const struct pipe_shader_state *state) \
+   { \
+      struct galahad_context *glhd_pipe = galahad_context(_pipe); \
+      struct pipe_context *pipe = glhd_pipe->pipe; \
+      return pipe->create_##shader_type##_state(pipe, state); \
+   } \
+   \
+   static void \
+   galahad_context_bind_##shader_type##_state(struct pipe_context *_pipe, \
+                                              void *state) \
+   { \
+      struct galahad_context *glhd_pipe = galahad_context(_pipe); \
+      struct pipe_context *pipe = glhd_pipe->pipe; \
+      pipe->bind_##shader_type##_state(pipe, state); \
+   } \
+   \
+   static void \
+   galahad_context_delete_##shader_type##_state(struct pipe_context *_pipe, \
+                                                void *state) \
+   { \
+      struct galahad_context *glhd_pipe = galahad_context(_pipe); \
+      struct pipe_context *pipe = glhd_pipe->pipe; \
+      pipe->delete_##shader_type##_state(pipe, state); \
+   }
 
-   pipe->delete_vs_state(pipe,
-                         vs);
-}
+GLHD_SHADER_STATE(fs)
+GLHD_SHADER_STATE(vs)
+GLHD_SHADER_STATE(gs)
 
+#undef GLHD_SHADER_STATE
 
 static void *
 galahad_context_create_vertex_elements_state(struct pipe_context *_pipe,
@@ -595,6 +574,9 @@ galahad_context_set_sampler_views(struct pipe_context *_pipe,
    case PIPE_SHADER_FRAGMENT:
       pipe->set_fragment_sampler_views(pipe, num, views);
       break;
+   case PIPE_SHADER_GEOMETRY:
+      pipe->set_geometry_sampler_views(pipe, num, views);
+      break;
    default:
       assert(0);
    }
@@ -611,13 +593,21 @@ galahad_context_set_vertex_sampler_views(struct pipe_context *_pipe,
 
 static void
 galahad_context_set_fragment_sampler_views(struct pipe_context *_pipe,
-                                         unsigned num,
-                                         struct pipe_sampler_view **_views)
+                                           unsigned num,
+                                           struct pipe_sampler_view **_views)
 {
    galahad_context_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT,
                                      0, num, _views);
 }
 
+static void
+galahad_context_set_geometry_sampler_views(struct pipe_context *_pipe,
+                                           unsigned num,
+                                           struct pipe_sampler_view **_views)
+{
+   galahad_context_set_sampler_views(_pipe, PIPE_SHADER_GEOMETRY,
+                                     0, num, _views);
+}
 
 static void
 galahad_context_set_vertex_buffers(struct pipe_context *_pipe,
@@ -675,16 +665,54 @@ galahad_context_set_index_buffer(struct pipe_context *_pipe,
    pipe->set_index_buffer(pipe, ib);
 }
 
+static INLINE struct pipe_stream_output_target *
+galahad_context_create_stream_output_target(struct pipe_context *_pipe,
+                                            struct pipe_resource *_res,
+                                            unsigned buffer_offset,
+                                            unsigned buffer_size)
+{
+   struct galahad_context *glhd_pipe = galahad_context(_pipe);
+   struct galahad_resource *glhd_resource_res = galahad_resource(_res);
+   struct pipe_context *pipe = glhd_pipe->pipe;
+   struct pipe_resource *res = glhd_resource_res->resource;
+
+   return pipe->create_stream_output_target(pipe,
+                                            res, buffer_offset, buffer_size);
+}
+
+static INLINE void
+galahad_context_stream_output_target_destroy(
+   struct pipe_context *_pipe,
+   struct pipe_stream_output_target *target)
+{
+   struct galahad_context *glhd_pipe = galahad_context(_pipe);
+   struct pipe_context *pipe = glhd_pipe->pipe;
+
+   pipe->stream_output_target_destroy(pipe, target);
+}
+
+static INLINE void
+galahad_context_set_stream_output_targets(struct pipe_context *_pipe,
+                                          unsigned num_targets,
+                                          struct pipe_stream_output_target **tgs,
+                                          unsigned append_bitmask)
+{
+   struct galahad_context *glhd_pipe = galahad_context(_pipe);
+   struct pipe_context *pipe = glhd_pipe->pipe;
+
+   pipe->set_stream_output_targets(pipe, num_targets, tgs, append_bitmask);
+}
+
 static void
 galahad_context_resource_copy_region(struct pipe_context *_pipe,
-                              struct pipe_resource *_dst,
-                              unsigned dst_level,
-                              unsigned dstx,
-                              unsigned dsty,
-                              unsigned dstz,
-                              struct pipe_resource *_src,
-                              unsigned src_level,
-                              const struct pipe_box *src_box)
+                                     struct pipe_resource *_dst,
+                                     unsigned dst_level,
+                                     unsigned dstx,
+                                     unsigned dsty,
+                                     unsigned dstz,
+                                     struct pipe_resource *_src,
+                                     unsigned src_level,
+                                     const struct pipe_box *src_box)
 {
    struct galahad_context *glhd_pipe = galahad_context(_pipe);
    struct galahad_resource *glhd_resource_dst = galahad_resource(_dst);
@@ -1021,7 +1049,7 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
    GLHD_PIPE_INIT(create_sampler_state);
    GLHD_PIPE_INIT(bind_fragment_sampler_states);
    GLHD_PIPE_INIT(bind_vertex_sampler_states);
-   //GLHD_PIPE_INIT(bind_geometry_sampler_states);
+   GLHD_PIPE_INIT(bind_geometry_sampler_states);
    //GLHD_PIPE_INIT(bind_compute_sampler_states);
    GLHD_PIPE_INIT(delete_sampler_state);
    GLHD_PIPE_INIT(create_rasterizer_state);
@@ -1036,9 +1064,9 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
    GLHD_PIPE_INIT(create_vs_state);
    GLHD_PIPE_INIT(bind_vs_state);
    GLHD_PIPE_INIT(delete_vs_state);
-   //GLHD_PIPE_INIT(create_gs_state);
-   //GLHD_PIPE_INIT(bind_gs_state);
-   //GLHD_PIPE_INIT(delete_gs_state);
+   GLHD_PIPE_INIT(create_gs_state);
+   GLHD_PIPE_INIT(bind_gs_state);
+   GLHD_PIPE_INIT(delete_gs_state);
    GLHD_PIPE_INIT(create_vertex_elements_state);
    GLHD_PIPE_INIT(bind_vertex_elements_state);
    GLHD_PIPE_INIT(delete_vertex_elements_state);
@@ -1053,14 +1081,14 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
    GLHD_PIPE_INIT(set_viewport_state);
    GLHD_PIPE_INIT(set_fragment_sampler_views);
    GLHD_PIPE_INIT(set_vertex_sampler_views);
-   //GLHD_PIPE_INIT(set_geometry_sampler_views);
+   GLHD_PIPE_INIT(set_geometry_sampler_views);
    //GLHD_PIPE_INIT(set_compute_sampler_views);
    //GLHD_PIPE_INIT(set_shader_resources);
    GLHD_PIPE_INIT(set_vertex_buffers);
    GLHD_PIPE_INIT(set_index_buffer);
-   //GLHD_PIPE_INIT(create_stream_output_target);
-   //GLHD_PIPE_INIT(stream_output_target_destroy);
-   //GLHD_PIPE_INIT(set_stream_output_targets);
+   GLHD_PIPE_INIT(create_stream_output_target);
+   GLHD_PIPE_INIT(stream_output_target_destroy);
+   GLHD_PIPE_INIT(set_stream_output_targets);
    GLHD_PIPE_INIT(resource_copy_region);
    GLHD_PIPE_INIT(blit);
    GLHD_PIPE_INIT(clear);