We now get all the gs metadata from shader_info.
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
/** 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 */
};
/* 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;
}
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;
}
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 ?
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
*/
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);
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,
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
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));
_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);
}
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;
}
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)
_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);
};
-/** 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
{
/** Currently enabled and valid program (including internal programs
* and compiled shader programs).
*/
- struct gl_geometry_program *_Current;
+ struct gl_program *_Current;
};
/**
} TessEval;
/**
- * Geometry shader state - copied into gl_geometry_program by
+ * Geometry shader state - copied into gl_program by
* _mesa_copy_linked_program_data().
*/
struct {
/**
* 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. */
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;
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
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);
}
}
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);
(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,
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)
{
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;
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 );
}
}
/* 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)
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]);
}
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);
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]);
}
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);
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);
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;
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);
/**
- * 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 */
}
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;
}