static void check_program_state( struct st_context *st )
{
struct gl_context *ctx = st->ctx;
- struct st_vertex_program *old_vp = st->vp;
+ struct st_common_program *old_vp = st->vp;
struct st_common_program *old_tcp = st->tcp;
struct st_common_program *old_tep = st->tep;
struct st_common_program *old_gp = st->gp;
if (old_vp)
dirty |= old_vp->affected_states;
if (new_vp)
- dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(new_vp));
+ dirty |= ST_NEW_VERTEX_PROGRAM(st, st_common_program(new_vp));
}
if (unlikely(new_tcp != &old_tcp->Base)) {
if (vertdata_edgeflags != st->vertdata_edgeflags) {
st->vertdata_edgeflags = vertdata_edgeflags;
if (vp)
- st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(vp));
+ st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_common_program(vp));
}
edgeflag_culls_prims = edgeflags_enabled && !vertdata_edgeflags &&
#include "main/glheader.h"
struct st_context;
-struct st_vertex_program;
+struct st_common_program;
struct st_vp_variant;
struct pipe_vertex_buffer;
struct pipe_vertex_element;
void
st_setup_arrays(struct st_context *st,
- const struct st_vertex_program *vp,
+ const struct st_common_program *vp,
const struct st_vp_variant *vp_variant,
struct pipe_vertex_element *velements,
struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers);
void
st_setup_current(struct st_context *st,
- const struct st_vertex_program *vp,
+ const struct st_common_program *vp,
const struct st_vp_variant *vp_variant,
struct pipe_vertex_element *velements,
struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers);
void
st_setup_current_user(struct st_context *st,
- const struct st_vertex_program *vp,
+ const struct st_common_program *vp,
const struct st_vp_variant *vp_variant,
struct pipe_vertex_element *velements,
struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers);
assert(velement->src_format);
}
-static void init_velement_lowered(const struct st_vertex_program *vp,
+static void init_velement_lowered(const struct st_common_program *vp,
struct pipe_vertex_element *velements,
const struct gl_vertex_format *vformat,
int src_offset, int instance_divisor,
void
st_setup_arrays(struct st_context *st,
- const struct st_vertex_program *vp,
+ const struct st_common_program *vp,
const struct st_vp_variant *vp_variant,
struct pipe_vertex_element *velements,
struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers)
void
st_setup_current(struct st_context *st,
- const struct st_vertex_program *vp,
+ const struct st_common_program *vp,
const struct st_vp_variant *vp_variant,
struct pipe_vertex_element *velements,
struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers)
GLbitfield curmask = inputs_read & _mesa_draw_current_bits(ctx);
if (curmask) {
/* vertex program validation must be done before this */
- const struct st_vertex_program *vp = st->vp;
+ const struct st_common_program *vp = st->vp;
const ubyte *input_to_index = vp->input_to_index;
/* For each attribute, upload the maximum possible size. */
GLubyte data[VERT_ATTRIB_MAX * sizeof(GLdouble) * 4];
void
st_setup_current_user(struct st_context *st,
- const struct st_vertex_program *vp,
+ const struct st_common_program *vp,
const struct st_vp_variant *vp_variant,
struct pipe_vertex_element *velements,
struct pipe_vertex_buffer *vbuffer, unsigned *num_vbuffers)
{
/* vertex program validation must be done before this */
/* _NEW_PROGRAM, ST_NEW_VS_STATE */
- const struct st_vertex_program *vp = st->vp;
+ const struct st_common_program *vp = st->vp;
const struct st_vp_variant *vp_variant = st->vp_variant;
struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS];
void
st_update_vp( struct st_context *st )
{
- struct st_vertex_program *stvp;
+ struct st_common_program *stvp;
/* find active shader and params -- Should be covered by
* ST_NEW_VERTEX_PROGRAM
*/
assert(st->ctx->VertexProgram._Current);
- stvp = st_vertex_program(st->ctx->VertexProgram._Current);
+ stvp = st_common_program(st->ctx->VertexProgram._Current);
assert(stvp->Base.Target == GL_VERTEX_PROGRAM_ARB);
if (st->shader_has_one_variant[MESA_SHADER_VERTEX] &&
- stvp->variants &&
- stvp->variants->key.passthrough_edgeflags == st->vertdata_edgeflags) {
- st->vp_variant = stvp->variants;
+ stvp->vp_variants &&
+ stvp->vp_variants->key.passthrough_edgeflags == st->vertdata_edgeflags) {
+ st->vp_variant = stvp->vp_variants;
} else {
struct st_common_variant_key key;
st->vp_variant = st_get_vp_variant(st, stvp, &key);
}
- st_reference_vertprog(st, &st->vp, stvp);
+ st_reference_prog(st, &st->vp, stvp);
cso_set_vertex_shader_handle(st->cso_context,
st->vp_variant->driver_shader);
ctx->Driver.Draw = st_feedback_draw_vbo;
/* need to generate/use a vertex program that emits pos/color/tex */
if (vp)
- st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(vp));
+ st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_common_program(vp));
}
}
{
switch (target) {
case GL_VERTEX_PROGRAM_ARB: {
- struct st_vertex_program *prog = rzalloc(NULL,
- struct st_vertex_program);
+ struct st_common_program *prog = rzalloc(NULL,
+ struct st_common_program);
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
}
case GL_TESS_CONTROL_PROGRAM_NV:
switch( prog->Target ) {
case GL_VERTEX_PROGRAM_ARB:
{
- struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
+ struct st_common_program *stvp = (struct st_common_program *) prog;
st_release_vp_variants( st, stvp );
if (stvp->glsl_to_tgsi)
!st_translate_fragment_program(st, stfp))
return false;
} else if (target == GL_VERTEX_PROGRAM_ARB) {
- struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
+ struct st_common_program *stvp = (struct st_common_program *) prog;
st_release_vp_variants(st, stvp);
if (!stvp->shader_program && /* not GLSL->NIR */
switch (i) {
case MESA_SHADER_VERTEX:
- if (st_vertex_program(linked->Program)->variants)
- sh = st_vertex_program(linked->Program)->variants->driver_shader;
+ if (st_common_program(linked->Program)->vp_variants)
+ sh = st_common_program(linked->Program)->vp_variants->driver_shader;
break;
case MESA_SHADER_FRAGMENT:
if (st_common_program(linked->Program)->fp_variants)
static uint64_t
st_get_active_states(struct gl_context *ctx)
{
- struct st_vertex_program *vp =
- st_vertex_program(ctx->VertexProgram._Current);
+ struct st_common_program *vp =
+ st_common_program(ctx->VertexProgram._Current);
struct st_common_program *tcp =
st_common_program(ctx->TessCtrlProgram._Current);
struct st_common_program *tep =
st_reference_prog(st, &st->fp, NULL);
st_reference_prog(st, &st->gp, NULL);
- st_reference_vertprog(st, &st->vp, NULL);
+ st_reference_prog(st, &st->vp, NULL);
st_reference_prog(st, &st->tcp, NULL);
st_reference_prog(st, &st->tep, NULL);
st_reference_prog(st, &st->cp, NULL);
union {
struct {
- struct st_vertex_program *vp; /**< Currently bound vertex program */
+ struct st_common_program *vp; /**< Currently bound vertex program */
struct st_common_program *tcp; /**< Currently bound tess control program */
struct st_common_program *tep; /**< Currently bound tess eval program */
struct st_common_program *gp; /**< Currently bound geometry program */
struct st_context *st = st_context(ctx);
struct pipe_context *pipe = st->pipe;
struct draw_context *draw = st_get_draw_context(st);
- const struct st_vertex_program *vp;
+ const struct st_common_program *vp;
struct st_vp_variant *vp_variant;
struct pipe_vertex_buffer vbuffers[PIPE_MAX_SHADER_INPUTS];
unsigned num_vbuffers = 0;
struct gl_shader_program *shader_program,
nir_shader *nir)
{
- struct st_vertex_program *stvp;
+ struct st_common_program *stvp;
struct st_common_program *stp;
switch (prog->info.stage) {
case MESA_SHADER_VERTEX:
- stvp = (struct st_vertex_program *)prog;
+ stvp = (struct st_common_program *)prog;
stvp->shader_program = shader_program;
stvp->state.type = PIPE_SHADER_IR_NIR;
stvp->state.ir.nir = nir;
/* Initialize st_vertex_program members. */
if (i == MESA_SHADER_VERTEX)
- st_prepare_vertex_program(st_vertex_program(prog));
+ st_prepare_vertex_program(st_common_program(prog));
/* Get pipe_stream_output_info. */
if (i == MESA_SHADER_VERTEX ||
return NULL;
}
- struct st_vertex_program *stvp;
+ struct st_common_program *stvp;
struct st_common_program *stp;
switch (shader->Stage) {
case MESA_SHADER_VERTEX:
- stvp = (struct st_vertex_program *)prog;
+ stvp = (struct st_common_program *)prog;
stvp->glsl_to_tgsi = v;
break;
case MESA_SHADER_FRAGMENT:
switch (prog->info.stage) {
case MESA_SHADER_VERTEX:
- states = &((struct st_vertex_program*)prog)->affected_states;
+ states = &((struct st_common_program*)prog)->affected_states;
*states = ST_NEW_VS_STATE |
ST_NEW_RASTERIZER |
*/
void
st_release_vp_variants( struct st_context *st,
- struct st_vertex_program *stvp )
+ struct st_common_program *stvp )
{
struct st_vp_variant *vpv;
- for (vpv = stvp->variants; vpv; ) {
+ for (vpv = stvp->vp_variants; vpv; ) {
struct st_vp_variant *next = vpv->next;
delete_vp_variant(st, vpv);
vpv = next;
}
- stvp->variants = NULL;
+ stvp->vp_variants = NULL;
delete_ir(&stvp->state);
}
}
void
-st_prepare_vertex_program(struct st_vertex_program *stvp)
+st_prepare_vertex_program(struct st_common_program *stvp)
{
stvp->num_inputs = 0;
memset(stvp->input_to_index, ~0, sizeof(stvp->input_to_index));
/* Translate stream output info. */
struct pipe_stream_output_info *so_info = NULL;
if (prog->info.stage == MESA_SHADER_VERTEX)
- so_info = &((struct st_vertex_program*)prog)->state.stream_output;
+ so_info = &((struct st_common_program*)prog)->state.stream_output;
else
so_info = &((struct st_common_program*)prog)->state.stream_output;
*/
bool
st_translate_vertex_program(struct st_context *st,
- struct st_vertex_program *stvp)
+ struct st_common_program *stvp)
{
struct ureg_program *ureg;
enum pipe_error error;
static struct st_vp_variant *
st_create_vp_variant(struct st_context *st,
- struct st_vertex_program *stvp,
+ struct st_common_program *stvp,
const struct st_common_variant_key *key)
{
struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
*/
struct st_vp_variant *
st_get_vp_variant(struct st_context *st,
- struct st_vertex_program *stvp,
+ struct st_common_program *stvp,
const struct st_common_variant_key *key)
{
struct st_vp_variant *vpv;
/* Search for existing variant */
- for (vpv = stvp->variants; vpv; vpv = vpv->next) {
+ for (vpv = stvp->vp_variants; vpv; vpv = vpv->next) {
if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
break;
}
}
/* insert into list */
- vpv->next = stvp->variants;
- stvp->variants = vpv;
+ vpv->next = stvp->vp_variants;
+ stvp->vp_variants = vpv;
}
}
switch (target->Target) {
case GL_VERTEX_PROGRAM_ARB:
{
- struct st_vertex_program *stvp = (struct st_vertex_program *) target;
- struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
+ struct st_common_program *stvp = (struct st_common_program *) target;
+ struct st_vp_variant *vpv, **prevPtr = &stvp->vp_variants;
- for (vpv = stvp->variants; vpv; ) {
+ for (vpv = stvp->vp_variants; vpv; ) {
struct st_vp_variant *next = vpv->next;
if (vpv->key.st == st) {
/* unlink from list */
{
switch (prog->Target) {
case GL_VERTEX_PROGRAM_ARB: {
- struct st_vertex_program *p = (struct st_vertex_program *)prog;
+ struct st_common_program *p = (struct st_common_program *)prog;
struct st_common_variant_key key;
memset(&key, 0, sizeof(key));
{
if (st->current_program[prog->info.stage] == prog) {
if (prog->info.stage == MESA_SHADER_VERTEX)
- st->dirty |= ST_NEW_VERTEX_PROGRAM(st, (struct st_vertex_program *)prog);
+ st->dirty |= ST_NEW_VERTEX_PROGRAM(st, (struct st_common_program *)prog);
else
st->dirty |= ((struct st_common_program *)prog)->affected_states;
}
};
-/**
- * Derived from Mesa gl_program:
- */
-struct st_vertex_program
-{
- struct gl_program Base; /**< The Mesa vertex program */
- struct pipe_shader_state state;
- struct glsl_to_tgsi_visitor* glsl_to_tgsi;
- uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */
-
- /* used when bypassing glsl_to_tgsi: */
- struct gl_shader_program *shader_program;
-
- /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
- ubyte index_to_input[PIPE_MAX_ATTRIBS];
- ubyte num_inputs;
- /** Reverse mapping of the above */
- ubyte input_to_index[VERT_ATTRIB_MAX];
-
- /** Maps VARYING_SLOT_x to slot */
- ubyte result_to_output[VARYING_SLOT_MAX];
-
- /** List of translated variants of this vertex program.
- */
- struct st_vp_variant *variants;
-};
-
-
/**
* Geometry program variant.
*/
union {
struct st_common_variant *variants;
+ struct st_vp_variant *vp_variants;
struct st_fp_variant *fp_variants;
};
-};
+ /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
+ ubyte index_to_input[PIPE_MAX_ATTRIBS];
+ ubyte num_inputs;
+ /** Reverse mapping of the above */
+ ubyte input_to_index[VERT_ATTRIB_MAX];
+
+ /** Maps VARYING_SLOT_x to slot */
+ ubyte result_to_output[VARYING_SLOT_MAX];
+};
-static inline struct st_vertex_program *
-st_vertex_program( struct gl_program *vp )
-{
- return (struct st_vertex_program *)vp;
-}
static inline struct st_common_program *
st_common_program( struct gl_program *cp )
return (struct st_common_program *)cp;
}
-static inline void
-st_reference_vertprog(struct st_context *st,
- struct st_vertex_program **ptr,
- struct st_vertex_program *prog)
-{
- _mesa_reference_program(st->ctx,
- (struct gl_program **) ptr,
- (struct gl_program *) prog);
-}
-
static inline void
st_reference_prog(struct st_context *st,
struct st_common_program **ptr,
extern struct st_vp_variant *
st_get_vp_variant(struct st_context *st,
- struct st_vertex_program *stvp,
+ struct st_common_program *stvp,
const struct st_common_variant_key *key);
extern void
st_release_vp_variants( struct st_context *st,
- struct st_vertex_program *stvp );
+ struct st_common_program *stvp );
extern void
st_release_fp_variants( struct st_context *st,
st_finalize_nir_before_variants(struct nir_shader *nir);
extern void
-st_prepare_vertex_program(struct st_vertex_program *stvp);
+st_prepare_vertex_program(struct st_common_program *stvp);
extern void
st_translate_stream_output_info(struct gl_program *prog);
extern bool
st_translate_vertex_program(struct st_context *st,
- struct st_vertex_program *stvp);
+ struct st_common_program *stvp);
extern bool
st_translate_fragment_program(struct st_context *st,
switch (prog->info.stage) {
case MESA_SHADER_VERTEX: {
- struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
+ struct st_common_program *stvp = (struct st_common_program *) prog;
blob_write_uint32(&blob, stvp->num_inputs);
blob_write_bytes(&blob, stvp->index_to_input,
switch (prog->info.stage) {
case MESA_SHADER_VERTEX: {
- struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
+ struct st_common_program *stvp = (struct st_common_program *) prog;
st_release_vp_variants(st, stvp);