[Mesa-dev] [PATCH 15/17] st/mesa: translate geometry shaders into TGSI when we get them

Marek Olšák maraeo at gmail.com
Mon Oct 5 18:26:28 PDT 2015


From: Marek Olšák <marek.olsak at amd.com>

---
 src/mesa/state_tracker/st_cb_program.c |  2 ++
 src/mesa/state_tracker/st_program.c    | 38 ++++++++++++++++++++--------------
 src/mesa/state_tracker/st_program.h    |  5 +++++
 3 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index 40eeb0f..dff06dd 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -244,6 +244,8 @@ st_program_string_notify( struct gl_context *ctx,
       struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
 
       st_release_gp_variants(st, stgp);
+      if (!st_translate_geometry_program(st, stgp))
+         return false;
 
       if (st->gp == stgp)
 	 st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 5eded93..37e7a09 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -170,6 +170,11 @@ st_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
    }
 
    stgp->variants = NULL;
+
+   if (stgp->tgsi.tokens) {
+      ureg_free_tokens(stgp->tgsi.tokens);
+      stgp->tgsi.tokens = NULL;
+   }
 }
 
 
@@ -1276,19 +1281,15 @@ st_translate_program_common(struct st_context *st,
 /**
  * Translate a geometry program to create a new variant.
  */
-static struct st_gp_variant *
+bool
 st_translate_geometry_program(struct st_context *st,
-                              struct st_geometry_program *stgp,
-                              const struct st_gp_variant_key *key)
+                              struct st_geometry_program *stgp)
 {
-   struct pipe_context *pipe = st->pipe;
    struct ureg_program *ureg;
-   struct st_gp_variant *gpv;
-   struct pipe_shader_state state;
 
    ureg = ureg_create_with_screen(TGSI_PROCESSOR_GEOMETRY, st->pipe->screen);
    if (ureg == NULL)
-      return NULL;
+      return false;
 
    ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, stgp->Base.InputType);
    ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM, stgp->Base.OutputType);
@@ -1297,19 +1298,26 @@ st_translate_geometry_program(struct st_context *st,
    ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS, stgp->Base.Invocations);
 
    st_translate_program_common(st, &stgp->Base.Base, stgp->glsl_to_tgsi, ureg,
-                               TGSI_PROCESSOR_GEOMETRY, &state);
+                               TGSI_PROCESSOR_GEOMETRY, &stgp->tgsi);
+   return true;
+}
+
+
+static struct st_gp_variant *
+st_create_gp_variant(struct st_context *st,
+                     struct st_geometry_program *stgp,
+                     const struct st_gp_variant_key *key)
+{
+   struct pipe_context *pipe = st->pipe;
+   struct st_gp_variant *gpv;
 
    gpv = CALLOC_STRUCT(st_gp_variant);
-   if (!gpv) {
-      ureg_free_tokens(state.tokens);
+   if (!gpv)
       return NULL;
-   }
 
    /* fill in new variant */
-   gpv->driver_shader = pipe->create_gs_state(pipe, &state);
+   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
    gpv->key = *key;
-
-   ureg_free_tokens(state.tokens);
    return gpv;
 }
 
@@ -1333,7 +1341,7 @@ st_get_gp_variant(struct st_context *st,
 
    if (!gpv) {
       /* create new */
-      gpv = st_translate_geometry_program(st, stgp, key);
+      gpv = st_create_gp_variant(st, stgp, key);
       if (gpv) {
          /* insert into list */
          gpv->next = stgp->variants;
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index d4b5c1f..3a4c260 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -200,6 +200,7 @@ struct st_gp_variant
 struct st_geometry_program
 {
    struct gl_geometry_program Base;  /**< The Mesa geometry program */
+   struct pipe_shader_state tgsi;
    struct glsl_to_tgsi_visitor* glsl_to_tgsi;
 
    struct st_gp_variant *variants;
@@ -442,6 +443,10 @@ extern bool
 st_translate_fragment_program(struct st_context *st,
                               struct st_fragment_program *stfp);
 
+extern bool
+st_translate_geometry_program(struct st_context *st,
+                              struct st_geometry_program *stgp);
+
 extern void
 st_print_current_vertex_program(void);
 
-- 
2.1.4



More information about the mesa-dev mailing list