i965/mesa/st: eliminate gl_geometry_program
authorTimothy Arceri <timothy.arceri@collabora.com>
Wed, 19 Oct 2016 00:59:12 +0000 (11:59 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Wed, 26 Oct 2016 03:29:36 +0000 (14:29 +1100)
We now get all the gs metadata from shader_info.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
20 files changed:
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/brw_gs_surface_state.c
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/i965/gen6_gs_state.c
src/mesa/main/context.c
src/mesa/main/mtypes.h
src/mesa/main/state.c
src/mesa/program/program.c
src/mesa/program/program.h
src/mesa/state_tracker/st_atom.c
src/mesa/state_tracker/st_atom_constbuf.c
src/mesa/state_tracker/st_atom_rasterizer.c
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_atom_shader.c
src/mesa/state_tracker/st_atom_texture.c
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index db48aa1fd7e7c2dd648225931e6db72a1267675f..5e68c501aaa8e432c121a140dfb3c08c3a9cab97 100644 (file)
@@ -351,7 +351,7 @@ struct brw_tess_eval_program {
 
 /** Subclass of Mesa geometry program */
 struct brw_geometry_program {
-   struct gl_geometry_program program;
+   struct gl_program program;
    unsigned id;  /**< serial no. to identify geom progs, never re-used */
 };
 
@@ -1007,7 +1007,7 @@ struct brw_context
    /* Active vertex program:
     */
    const struct gl_vertex_program *vertex_program;
-   const struct gl_geometry_program *geometry_program;
+   const struct gl_program *geometry_program;
    const struct gl_program *tess_ctrl_program;
    const struct gl_program *tess_eval_program;
    const struct gl_fragment_program *fragment_program;
@@ -1742,7 +1742,7 @@ brw_tess_eval_program(struct gl_program *p)
 }
 
 static inline struct brw_geometry_program *
-brw_geometry_program(struct gl_geometry_program *p)
+brw_geometry_program(struct gl_program *p)
 {
    return (struct brw_geometry_program *) p;
 }
index 2dbaddd800552cce19273691110e81f193e2ee28..a2e044275afe8e261c980d606a63a442beae6173 100644 (file)
@@ -454,7 +454,7 @@ brw_try_draw_prims(struct gl_context *ctx,
    brw->wm.base.sampler_count =
       util_last_bit(ctx->FragmentProgram._Current->Base.SamplersUsed);
    brw->gs.base.sampler_count = ctx->GeometryProgram._Current ?
-      util_last_bit(ctx->GeometryProgram._Current->Base.SamplersUsed) : 0;
+      util_last_bit(ctx->GeometryProgram._Current->SamplersUsed) : 0;
    brw->tes.base.sampler_count = ctx->TessEvalProgram._Current ?
       util_last_bit(ctx->TessEvalProgram._Current->SamplersUsed) : 0;
    brw->tcs.base.sampler_count = ctx->TessCtrlProgram._Current ?
index b493e6c3a2f34f9bfa2e14e015aa9dd1447b5dfe..8fba6fadd9b1e323f8a53ffb3e4d69e3fe6d6de7 100644 (file)
@@ -106,8 +106,7 @@ brw_codegen_gs_prog(struct brw_context *brw,
 
    memset(&prog_data, 0, sizeof(prog_data));
 
-   assign_gs_binding_table_offsets(devinfo, prog,
-                                   &gp->program.Base, &prog_data);
+   assign_gs_binding_table_offsets(devinfo, prog, &gp->program, &prog_data);
 
    /* Allocate the references to the uniforms that will end up in the
     * prog_data associated with the compiled program, and which will be freed
@@ -119,7 +118,7 @@ brw_codegen_gs_prog(struct brw_context *brw,
     */
    struct gl_linked_shader *gs = prog->_LinkedShaders[MESA_SHADER_GEOMETRY];
    struct brw_shader *bgs = (struct brw_shader *) gs;
-   int param_count = gp->program.Base.nir->num_uniforms / 4;
+   int param_count = gp->program.nir->num_uniforms / 4;
 
    prog_data.base.base.param =
       rzalloc_array(NULL, const gl_constant_value *, param_count);
@@ -130,15 +129,15 @@ brw_codegen_gs_prog(struct brw_context *brw,
    prog_data.base.base.nr_params = param_count;
    prog_data.base.base.nr_image_params = gs->NumImages;
 
-   brw_nir_setup_glsl_uniforms(gp->program.Base.nir, prog, &gp->program.Base,
+   brw_nir_setup_glsl_uniforms(gp->program.nir, prog, &gp->program,
                                &prog_data.base.base,
                                compiler->scalar_stage[MESA_SHADER_GEOMETRY]);
 
-   uint64_t outputs_written = gp->program.Base.info.outputs_written;
+   uint64_t outputs_written = gp->program.info.outputs_written;
 
    prog_data.base.cull_distance_mask =
-      ((1 << gp->program.Base.CullDistanceArraySize) - 1) <<
-      gp->program.Base.ClipDistanceArraySize;
+      ((1 << gp->program.CullDistanceArraySize) - 1) <<
+      gp->program.ClipDistanceArraySize;
 
    brw_compute_vue_map(devinfo,
                        &prog_data.base.vue_map, outputs_written,
@@ -213,14 +212,13 @@ brw_gs_populate_key(struct brw_context *brw,
    struct gl_context *ctx = &brw->ctx;
    struct brw_geometry_program *gp =
       (struct brw_geometry_program *) brw->geometry_program;
-   struct gl_program *prog = &gp->program.Base;
 
    memset(key, 0, sizeof(*key));
 
    key->program_string_id = gp->id;
 
    /* _NEW_TEXTURE */
-   brw_populate_sampler_prog_key_data(ctx, prog, &key->tex);
+   brw_populate_sampler_prog_key_data(ctx, &gp->program, &key->tex);
 }
 
 void
@@ -277,8 +275,7 @@ brw_gs_precompile(struct gl_context *ctx,
    struct brw_stage_prog_data *old_prog_data = brw->gs.base.prog_data;
    bool success;
 
-   struct gl_geometry_program *gp = (struct gl_geometry_program *) prog;
-   struct brw_geometry_program *bgp = brw_geometry_program(gp);
+   struct brw_geometry_program *bgp = brw_geometry_program(prog);
 
    memset(&key, 0, sizeof(key));
 
index 371255cfa60e7869272428fef14683b4644c1a2b..686ddb4b940994356d1bea00d22e23a865c382fb 100644 (file)
@@ -52,7 +52,7 @@ brw_upload_gs_pull_constants(struct brw_context *brw)
 
    _mesa_shader_write_subroutine_indices(&brw->ctx, MESA_SHADER_GEOMETRY);
    /* _NEW_PROGRAM_CONSTANTS */
-   brw_upload_pull_constants(brw, BRW_NEW_GS_CONSTBUF, &gp->program.Base,
+   brw_upload_pull_constants(brw, BRW_NEW_GS_CONSTBUF, &gp->program,
                              stage_state, prog_data);
 }
 
index 7c553c831e1fb05eea0e1bdac0e02d1a338e2f42..7151558a01bcf8425dcd2ddb50dcbfa04e3148fd 100644 (file)
@@ -157,7 +157,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
       if (prog) {
          prog->id = get_new_program_id(brw->screen);
 
-         return _mesa_init_gl_program(&prog->program.Base, target, id);
+         return _mesa_init_gl_program(&prog->program, target, id);
       } else {
          return NULL;
       }
index ca212c857fb52745d9a575334a93e837e702aafb..492376426c61f11848f56ea46c64815b8050e084 100644 (file)
@@ -45,8 +45,8 @@ gen6_upload_gs_push_constants(struct brw_context *brw)
       struct brw_stage_prog_data *prog_data = brw->gs.base.prog_data;
 
       _mesa_shader_write_subroutine_indices(&brw->ctx, MESA_SHADER_GEOMETRY);
-      gen6_upload_push_constants(brw, &gp->program.Base, prog_data,
-                                 stage_state, AUB_TRACE_VS_CONSTANTS);
+      gen6_upload_push_constants(brw, &gp->program, prog_data, stage_state,
+                                 AUB_TRACE_VS_CONSTANTS);
    }
 
    if (brw->gen >= 7)
index 5f00365cd0d81a8150ec829fef9e8cc1590cf7c9..757dbfc661342ec205b7567e5030b93005bea6e3 100644 (file)
@@ -1299,7 +1299,7 @@ _mesa_free_context_data( struct gl_context *ctx )
 
    _mesa_reference_program(ctx, &ctx->TessCtrlProgram._Current, NULL);
    _mesa_reference_program(ctx, &ctx->TessEvalProgram._Current, NULL);
-   _mesa_reference_geomprog(ctx, &ctx->GeometryProgram._Current, NULL);
+   _mesa_reference_program(ctx, &ctx->GeometryProgram._Current, NULL);
 
    _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current, NULL);
    _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);
index c0984f122b4e10f381f906055bbe744c65e0dcf4..65f73f4cc37b3a0be828839cac45a64acb6f4303 100644 (file)
@@ -1998,22 +1998,6 @@ struct gl_vertex_program
 };
 
 
-/** Geometry program object */
-struct gl_geometry_program
-{
-   struct gl_program Base;   /**< base class */
-
-   GLint VerticesIn;
-   GLint VerticesOut;
-   GLint Invocations;
-   GLenum InputType;  /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB,
-                           GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */
-   GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */
-   bool UsesEndPrimitive;
-   bool UsesStreams;
-};
-
-
 /** Fragment program object */
 struct gl_fragment_program
 {
@@ -2134,7 +2118,7 @@ struct gl_geometry_program_state
    /** Currently enabled and valid program (including internal programs
     * and compiled shader programs).
     */
-   struct gl_geometry_program *_Current;
+   struct gl_program *_Current;
 };
 
 /**
@@ -2770,7 +2754,7 @@ struct gl_shader_program
    } TessEval;
 
    /**
-    * Geometry shader state - copied into gl_geometry_program by
+    * Geometry shader state - copied into gl_program by
     * _mesa_copy_linked_program_data().
     */
    struct {
@@ -2778,7 +2762,7 @@ struct gl_shader_program
 
       /**
        * True if gl_ClipDistance is written to.  Copied into
-       * gl_geometry_program by _mesa_copy_linked_program_data().
+       * gl_program by _mesa_copy_linked_program_data().
        */
       GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
                                          0 if not present. */
index 10194a9f5caef93d49ba43463877a32402df9f3e..407ff38548224230644b64cf26bef1b19593082d 100644 (file)
@@ -109,7 +109,7 @@ update_program(struct gl_context *ctx)
       ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
    const struct gl_vertex_program *prevVP = ctx->VertexProgram._Current;
    const struct gl_fragment_program *prevFP = ctx->FragmentProgram._Current;
-   const struct gl_geometry_program *prevGP = ctx->GeometryProgram._Current;
+   const struct gl_program *prevGP = ctx->GeometryProgram._Current;
    const struct gl_program *prevTCP = ctx->TessCtrlProgram._Current;
    const struct gl_program *prevTEP = ctx->TessEvalProgram._Current;
    const struct gl_compute_program *prevCP = ctx->ComputeProgram._Current;
@@ -186,11 +186,11 @@ update_program(struct gl_context *ctx)
    if (gsProg && gsProg->LinkStatus
        && gsProg->_LinkedShaders[MESA_SHADER_GEOMETRY]) {
       /* Use GLSL geometry shader */
-      _mesa_reference_geomprog(ctx, &ctx->GeometryProgram._Current,
-                              gl_geometry_program(gsProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program));
+      _mesa_reference_program(ctx, &ctx->GeometryProgram._Current,
+                              gsProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program);
    } else {
       /* No geometry program */
-      _mesa_reference_geomprog(ctx, &ctx->GeometryProgram._Current, NULL);
+      _mesa_reference_program(ctx, &ctx->GeometryProgram._Current, NULL);
    }
 
    if (tesProg && tesProg->LinkStatus
@@ -266,7 +266,7 @@ update_program(struct gl_context *ctx)
       new_state |= _NEW_PROGRAM;
       if (ctx->Driver.BindProgram) {
          ctx->Driver.BindProgram(ctx, GL_GEOMETRY_PROGRAM_NV,
-                            (struct gl_program *) ctx->GeometryProgram._Current);
+                                 ctx->GeometryProgram._Current);
       }
    }
 
index 85c9b7b17116bed8ffbb2adef2f314a0a47be79c..28af5b5f21b4b02d6a0735b8af7edc0713b92fdd 100644 (file)
@@ -223,10 +223,7 @@ _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
       struct gl_fragment_program *prog = CALLOC_STRUCT(gl_fragment_program);
       return _mesa_init_gl_program(&prog->Base, target, id);
    }
-   case GL_GEOMETRY_PROGRAM_NV: {
-      struct gl_geometry_program *prog = CALLOC_STRUCT(gl_geometry_program);
-      return _mesa_init_gl_program(&prog->Base, target, id);
-   }
+   case GL_GEOMETRY_PROGRAM_NV:
    case GL_TESS_CONTROL_PROGRAM_NV:
    case GL_TESS_EVALUATION_PROGRAM_NV: {
       struct gl_program *prog = CALLOC_STRUCT(gl_program);
index 41806c218e458485e5befd9f5b8e3a4e1f151781..a909dcc28d1a39b6559903c6a3bb76b93569e3b7 100644 (file)
@@ -107,15 +107,6 @@ _mesa_reference_fragprog(struct gl_context *ctx,
                            (struct gl_program *) prog);
 }
 
-static inline void
-_mesa_reference_geomprog(struct gl_context *ctx,
-                         struct gl_geometry_program **ptr,
-                         struct gl_geometry_program *prog)
-{
-   _mesa_reference_program(ctx, (struct gl_program **) ptr,
-                           (struct gl_program *) prog);
-}
-
 static inline void
 _mesa_reference_compprog(struct gl_context *ctx,
                          struct gl_compute_program **ptr,
@@ -222,20 +213,6 @@ gl_vertex_program_const(const struct gl_program *prog)
    return (const struct gl_vertex_program *) prog;
 }
 
-
-static inline struct gl_geometry_program *
-gl_geometry_program(struct gl_program *prog)
-{
-   return (struct gl_geometry_program *) prog;
-}
-
-static inline const struct gl_geometry_program *
-gl_geometry_program_const(const struct gl_program *prog)
-{
-   return (const struct gl_geometry_program *) prog;
-}
-
-
 static inline struct gl_compute_program *
 gl_compute_program(struct gl_program *prog)
 {
index 231bdd95fa11f51228b308dd8fabb6bbd46ecbd5..dc4e1432eab4ade7e8798104d52daa0a11f60593 100644 (file)
@@ -72,7 +72,7 @@ static void check_program_state( struct st_context *st )
    struct gl_vertex_program *new_vp = ctx->VertexProgram._Current;
    struct gl_program *new_tcp = ctx->TessCtrlProgram._Current;
    struct gl_program *new_tep = ctx->TessEvalProgram._Current;
-   struct gl_geometry_program *new_gp = ctx->GeometryProgram._Current;
+   struct gl_program *new_gp = ctx->GeometryProgram._Current;
    struct gl_fragment_program *new_fp = ctx->FragmentProgram._Current;
    uint64_t dirty = 0;
 
index 77232f243239455b4790080f5e0dded967aafb7d..74d18e34ac99fed385789eabf5cd09c6d840a024 100644 (file)
@@ -178,7 +178,7 @@ static void update_gs_constants(struct st_context *st )
    struct gl_program_parameter_list *params;
 
    if (gp) {
-      params = gp->Base.Base.Parameters;
+      params = gp->Base.Parameters;
       st_upload_constants( st, params, MESA_SHADER_GEOMETRY );
    }
 }
index 8d22bfc3a635afeb0632fa8ef1f450f7088d7ba6..1598f5e260ef8681b9ec222316ca204a10269066 100644 (file)
@@ -209,7 +209,7 @@ static void update_raster_state( struct st_context *st )
          /* We have to check the last bound stage and see if it writes psize */
          struct gl_program *last = NULL;
          if (ctx->GeometryProgram._Current)
-            last = &ctx->GeometryProgram._Current->Base;
+            last = ctx->GeometryProgram._Current;
          else if (ctx->TessEvalProgram._Current)
             last = ctx->TessEvalProgram._Current;
          else if (ctx->VertexProgram._Current)
index c802ad56e91df0466a1668aeca25a8e2b8d6c872..f17029872dc974ae90d210e08f924771857fa437 100644 (file)
@@ -336,7 +336,7 @@ update_samplers(struct st_context *st)
    if (ctx->GeometryProgram._Current) {
       update_shader_samplers(st,
                              PIPE_SHADER_GEOMETRY,
-                             &ctx->GeometryProgram._Current->Base,
+                             ctx->GeometryProgram._Current,
                              ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits,
                              st->state.samplers[PIPE_SHADER_GEOMETRY],
                              &st->state.num_samplers[PIPE_SHADER_GEOMETRY]);
index 235303cfd24430986ae9acdabc87d470d49bc9db..02f789c50097e98f73510a3c440dfb5749a09491 100644 (file)
@@ -225,7 +225,7 @@ update_gp( struct st_context *st )
    }
 
    stgp = st_geometry_program(st->ctx->GeometryProgram._Current);
-   assert(stgp->Base.Base.Target == GL_GEOMETRY_PROGRAM_NV);
+   assert(stgp->Base.Target == GL_GEOMETRY_PROGRAM_NV);
 
    st->gp_variant = st_get_basic_variant(st, PIPE_SHADER_GEOMETRY,
                                          &stgp->tgsi, &stgp->variants);
index 613886e756411bfe84a1e0528ff43173b00353ee..df77a38c46e41d8beda9fc5dea2bc3e61e602051 100644 (file)
@@ -237,7 +237,7 @@ update_geometry_textures(struct st_context *st)
    if (ctx->GeometryProgram._Current) {
       update_textures(st,
                       MESA_SHADER_GEOMETRY,
-                      &ctx->GeometryProgram._Current->Base,
+                      ctx->GeometryProgram._Current,
                       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits,
                       st->state.sampler_views[PIPE_SHADER_GEOMETRY],
                       &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
index 9878e9c52fa6092e6374c1a032cc958b2d620b99..6dce2f61b9ede14712520c595811e1720164384e 100644 (file)
@@ -67,7 +67,7 @@ st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
    }
    case GL_GEOMETRY_PROGRAM_NV: {
       struct st_geometry_program *prog = ST_CALLOC_STRUCT(st_geometry_program);
-      return _mesa_init_gl_program(&prog->Base.Base, target, id);
+      return _mesa_init_gl_program(&prog->Base, target, id);
    }
    case GL_TESS_CONTROL_PROGRAM_NV: {
       struct st_tessctrl_program *prog = ST_CALLOC_STRUCT(st_tessctrl_program);
@@ -111,8 +111,8 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog)
          struct st_geometry_program *stgp =
             (struct st_geometry_program *) prog;
 
-         st_release_basic_variants(st, stgp->Base.Base.Target,
-                                   &stgp->variants, &stgp->tgsi);
+         st_release_basic_variants(st, stgp->Base.Target, &stgp->variants,
+                                   &stgp->tgsi);
          
          if (stgp->glsl_to_tgsi)
             free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi);
@@ -199,8 +199,8 @@ st_program_string_notify( struct gl_context *ctx,
    else if (target == GL_GEOMETRY_PROGRAM_NV) {
       struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
 
-      st_release_basic_variants(st, stgp->Base.Base.Target,
-                                &stgp->variants, &stgp->tgsi);
+      st_release_basic_variants(st, stgp->Base.Target, &stgp->variants,
+                                &stgp->tgsi);
       if (!st_translate_geometry_program(st, stgp))
          return false;
 
index 0a805683213ef2486f90ee548d8e19baaac1400d..9f90f6b3cc3df611c8b87c00926c1c0e6c5d43d5 100644 (file)
@@ -1521,15 +1521,15 @@ st_translate_geometry_program(struct st_context *st,
       return false;
 
    ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM,
-                 stgp->Base.Base.info.gs.input_primitive);
+                 stgp->Base.info.gs.input_primitive);
    ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM,
-                 stgp->Base.Base.info.gs.output_primitive);
+                 stgp->Base.info.gs.output_primitive);
    ureg_property(ureg, TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
-                 stgp->Base.Base.info.gs.vertices_out);
+                 stgp->Base.info.gs.vertices_out);
    ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS,
-                 stgp->Base.Base.info.gs.invocations);
+                 stgp->Base.info.gs.invocations);
 
-   st_translate_program_common(st, &stgp->Base.Base, stgp->glsl_to_tgsi, ureg,
+   st_translate_program_common(st, &stgp->Base, stgp->glsl_to_tgsi, ureg,
                                PIPE_SHADER_GEOMETRY, &stgp->tgsi);
 
    free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi);
index daea78128efb2c211c779c469d035e80aab9a386..ab01d7ba8d0776a24be14a7b33b042ad740861e5 100644 (file)
@@ -246,11 +246,11 @@ struct st_basic_variant
 
 
 /**
- * Derived from Mesa gl_geometry_program:
+ * Derived from Mesa gl_program:
  */
 struct st_geometry_program
 {
-   struct gl_geometry_program Base;  /**< The Mesa geometry program */
+   struct gl_program Base;  /**< The Mesa geometry program */
    struct pipe_shader_state tgsi;
    struct glsl_to_tgsi_visitor* glsl_to_tgsi;
    uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */
@@ -315,7 +315,7 @@ st_vertex_program( struct gl_vertex_program *vp )
 }
 
 static inline struct st_geometry_program *
-st_geometry_program( struct gl_geometry_program *gp )
+st_geometry_program( struct gl_program *gp )
 {
    return (struct st_geometry_program *)gp;
 }