st/mesa: translate geometry shaders into TGSI when we get them
authorMarek Olšák <marek.olsak@amd.com>
Mon, 5 Oct 2015 01:26:48 +0000 (03:26 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 9 Oct 2015 20:02:18 +0000 (22:02 +0200)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Tested-by: Brian Paul <brianp@vmware.com>
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index 40eeb0f703ee754b53a027898ff944ca2f5068ea..dff06dd260857e4dc8bb819cef7aa42391fc33e9 100644 (file)
@@ -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;
index 5eded93650c604360fe22008de5751d133592126..37e7a09daf7cc5f37dec303d2cfffc01c52c1a43 100644 (file)
@@ -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;
index d4b5c1f427a6149f9f507ffe89ea020b455d06ee..3a4c2604812c9f3e601d40639add03e5f70c1c1a 100644 (file)
@@ -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);