diff options
author | Keith Whitwell <[email protected]> | 2009-12-09 19:03:10 +0100 |
---|---|---|
committer | Roland Scheidegger <[email protected]> | 2009-12-09 19:03:10 +0100 |
commit | a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa (patch) | |
tree | 595ffc983588c5441c39ff11c3a089e521f94e53 /src/mesa/state_tracker/st_program.c | |
parent | 59f6af51b858340139fe2139e2698fef8a5ad62f (diff) |
gallium: first steps to treat edgeflags as regular vertex element
The idea here is to eliminate the set_edgeflags() call in pipe_context
by treating edgeflags as a regular vertex element.
Edgeflags provoke special treatment in hardware, which means we need to
label them in some way, in this case we'll be passing them through the
vertex shader and labelling the vertex shader output with a new TGSI
semantic (TGSI_SEMANTIC_EDGEFLAG).
Diffstat (limited to 'src/mesa/state_tracker/st_program.c')
-rw-r--r-- | src/mesa/state_tracker/st_program.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 5c81a033f9c..876d92539e9 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -192,10 +192,16 @@ st_translate_vertex_program(struct st_context *st, { struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient); struct pipe_context *pipe = st->pipe; + struct ureg_program *ureg; - vpv->state.tokens = + ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); + if (ureg == NULL) + return NULL; + + error = st_translate_mesa_program(st->ctx, TGSI_PROCESSOR_VERTEX, + ureg, &stvp->Base.Base, /* inputs */ stvp->num_inputs, @@ -209,6 +215,20 @@ st_translate_vertex_program(struct st_context *st, stvp->output_semantic_name, stvp->output_semantic_index ); + if (ret) + goto fail; + + /* Edgeflags will be the last input: + */ + if (key.passthrough_edgeflags) { + ureg_MOV( ureg, + ureg_DECL_output( ureg, TGSI_SEMANTIC_EDGEFLAG, 0 ), + ureg_DECL_next_vs_input(ureg)); + } + + tokens = ureg_get_tokens( ureg, NULL ); + ureg_destroy( ureg ); + vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->state); if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { @@ -222,6 +242,10 @@ st_translate_vertex_program(struct st_context *st, } return vpv; + +fail: + ureg_destroy( ureg ); + return NULL; } @@ -243,6 +267,7 @@ st_translate_fragment_program(struct st_context *st, GLuint interpMode[16]; /* XXX size? */ GLuint attr; const GLbitfield inputsRead = stfp->Base.Base.InputsRead; + struct ureg_program *ureg; GLuint vslot = 0; uint fs_num_inputs = 0; @@ -377,6 +402,11 @@ st_translate_fragment_program(struct st_context *st, if (!inputMapping) inputMapping = defaultInputMapping; + ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); + if (ureg == NULL) + return NULL; + + stfp->state.tokens = st_translate_mesa_program(st->ctx, TGSI_PROCESSOR_FRAGMENT, |