Yeah, I think that problem has been solved by using input index number in r300g driver. Thanks.
Cooper On Mon, Nov 2, 2009 at 7:15 AM, Keith Whitwell <[email protected]> wrote: > Hi Cooper, > > I'm not sure exactly what problem you're seeing, can you be more specific? > > Basically this change restores the behaviour that existed before switching > to tgsi_ureg.c for building Mesa's shaders -- vertex shader inputs didn't > have semantic tags before, and they don't now, but there were a few weeks in > the middle where we were emitting them. > > The purpose of semantics is as a tag to match vertex shader outputs to > fragment shader inputs, and for various special handling in between VS and > FS (eg clipping). We don't have them for vertex shader inputs because > there is (a) nothing to match them against, and (b) no special handling > prior to the vertex shader. > > We match vertex_element's to vertex shader inputs by number, ie vs INPUT[0] > matches vertex_element 0, INPUT[1] <--> ve[1], etc. > > What problem are you seeing exactly? What shaders work before and after? > Does any driver other than r300g have the same problem, eg softpipe or > llvmpipe? > > Keith > ________________________________________ > From: [email protected] [ > [email protected]] On Behalf Of Cooper Yuan [ > [email protected]] > Sent: Sunday, September 27, 2009 7:15 AM > To: Keith Whitwell > Cc: [email protected] > Subject: Re: Mesa (master): tgsi/ureg: VS inputs don't have any semantic > tags, just an index > > Hi Keith, > Will this patch only affect VS input declaration? it breaks r300 gallium > texture function, but both VS and PS seem OK. > > Cooper > On Sun, Sep 13, 2009 at 5:46 AM, Keith Whitwell < > [email protected]<mailto:[email protected]>> > wrote: > Module: Mesa > Branch: master > Commit: 6d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2b > URL: > http://cgit.freedesktop.org/mesa/mesa/commit/?id=6d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2b > > Author: Keith Whitwell <[email protected]<mailto:[email protected]>> > Date: Sat Sep 12 14:12:35 2009 -0700 > > tgsi/ureg: VS inputs don't have any semantic tags, just an index > > Fix ureg_DECL_vs_input to reflect this and fix up all callers. > > --- > > src/gallium/auxiliary/tgsi/tgsi_ureg.c | 72 > +++++++++++----------- > src/gallium/auxiliary/tgsi/tgsi_ureg.h | 3 +- > src/gallium/auxiliary/util/u_simple_shaders.c | 4 +- > src/gallium/state_trackers/xorg/xorg_exa_tgsi.c | 15 ++--- > 4 files changed, 44 insertions(+), 50 deletions(-) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c > b/src/gallium/auxiliary/tgsi/tgsi_ureg.c > index e24a0ad..55a4e5b 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c > @@ -87,8 +87,10 @@ struct ureg_program > unsigned semantic_name; > unsigned semantic_index; > unsigned interp; > - } input[UREG_MAX_INPUT]; > - unsigned nr_inputs; > + } fs_input[UREG_MAX_INPUT]; > + unsigned nr_fs_inputs; > + > + unsigned vs_inputs[UREG_MAX_INPUT/32]; > > struct { > unsigned semantic_name; > @@ -232,25 +234,25 @@ ureg_src_register( unsigned file, > > > > -static struct ureg_src > -ureg_DECL_input( struct ureg_program *ureg, > - unsigned name, > - unsigned index, > - unsigned interp_mode ) > +struct ureg_src > +ureg_DECL_fs_input( struct ureg_program *ureg, > + unsigned name, > + unsigned index, > + unsigned interp_mode ) > { > unsigned i; > > - for (i = 0; i < ureg->nr_inputs; i++) { > - if (ureg->input[i].semantic_name == name && > - ureg->input[i].semantic_index == index) > + for (i = 0; i < ureg->nr_fs_inputs; i++) { > + if (ureg->fs_input[i].semantic_name == name && > + ureg->fs_input[i].semantic_index == index) > goto out; > } > > - if (ureg->nr_inputs < UREG_MAX_INPUT) { > - ureg->input[i].semantic_name = name; > - ureg->input[i].semantic_index = index; > - ureg->input[i].interp = interp_mode; > - ureg->nr_inputs++; > + if (ureg->nr_fs_inputs < UREG_MAX_INPUT) { > + ureg->fs_input[i].semantic_name = name; > + ureg->fs_input[i].semantic_index = index; > + ureg->fs_input[i].interp = interp_mode; > + ureg->nr_fs_inputs++; > } > else { > set_bad( ureg ); > @@ -261,25 +263,14 @@ out: > } > > > - > -struct ureg_src > -ureg_DECL_fs_input( struct ureg_program *ureg, > - unsigned name, > - unsigned index, > - unsigned interp ) > -{ > - assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); > - return ureg_DECL_input( ureg, name, index, interp ); > -} > - > - > struct ureg_src > ureg_DECL_vs_input( struct ureg_program *ureg, > - unsigned name, > unsigned index ) > { > assert(ureg->processor == TGSI_PROCESSOR_VERTEX); > - return ureg_DECL_input( ureg, name, index, TGSI_INTERPOLATE_CONSTANT ); > + > + ureg->vs_inputs[index/32] |= 1 << (index % 32); > + return ureg_src_register( TGSI_FILE_INPUT, index ); > } > > > @@ -781,13 +772,22 @@ static void emit_decls( struct ureg_program *ureg ) > { > unsigned i; > > - for (i = 0; i < ureg->nr_inputs; i++) { > - emit_decl( ureg, > - TGSI_FILE_INPUT, > - i, > - ureg->input[i].semantic_name, > - ureg->input[i].semantic_index, > - ureg->input[i].interp ); > + if (ureg->processor == TGSI_PROCESSOR_VERTEX) { > + for (i = 0; i < UREG_MAX_INPUT; i++) { > + if (ureg->vs_inputs[i/32] & (1 << (i%32))) { > + emit_decl_range( ureg, TGSI_FILE_INPUT, i, 1 ); > + } > + } > + } > + else { > + for (i = 0; i < ureg->nr_fs_inputs; i++) { > + emit_decl( ureg, > + TGSI_FILE_INPUT, > + i, > + ureg->fs_input[i].semantic_name, > + ureg->fs_input[i].semantic_index, > + ureg->fs_input[i].interp ); > + } > } > > for (i = 0; i < ureg->nr_outputs; i++) { > diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h > b/src/gallium/auxiliary/tgsi/tgsi_ureg.h > index acbca59..3bc1b77 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h > +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h > @@ -116,8 +116,7 @@ ureg_DECL_fs_input( struct ureg_program *, > > struct ureg_src > ureg_DECL_vs_input( struct ureg_program *, > - unsigned semantic_name, > - unsigned semantic_index ); > + unsigned index ); > > struct ureg_dst > ureg_DECL_output( struct ureg_program *, > diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c > b/src/gallium/auxiliary/util/u_simple_shaders.c > index e5fc9b0..0d706f9 100644 > --- a/src/gallium/auxiliary/util/u_simple_shaders.c > +++ b/src/gallium/auxiliary/util/u_simple_shaders.c > @@ -61,9 +61,7 @@ util_make_vertex_passthrough_shader(struct pipe_context > *pipe, > struct ureg_src src; > struct ureg_dst dst; > > - src = ureg_DECL_vs_input( ureg, > - semantic_names[i], > - semantic_indexes[i]); > + src = ureg_DECL_vs_input( ureg, i ); > > dst = ureg_DECL_output( ureg, > semantic_names[i], > diff --git a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c > b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c > index 694eded..978dc20 100644 > --- a/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c > +++ b/src/gallium/state_trackers/xorg/xorg_exa_tgsi.c > @@ -241,6 +241,7 @@ create_vs(struct pipe_context *pipe, > boolean is_fill = vs_traits & VS_FILL; > boolean is_composite = vs_traits & VS_COMPOSITE; > boolean has_mask = vs_traits & VS_MASK; > + unsigned input_slot = 0; > > ureg = ureg_create(TGSI_PROCESSOR_VERTEX); > if (ureg == NULL) > @@ -252,30 +253,26 @@ create_vs(struct pipe_context *pipe, > /* it has to be either a fill or a composite op */ > debug_assert(is_fill ^ is_composite); > > - src = ureg_DECL_vs_input(ureg, > - TGSI_SEMANTIC_POSITION, 0); > + src = ureg_DECL_vs_input(ureg, input_slot++); > dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0); > src = vs_normalize_coords(ureg, src, > const0, const1); > ureg_MOV(ureg, dst, src); > > - > if (is_composite) { > - src = ureg_DECL_vs_input(ureg, > - TGSI_SEMANTIC_GENERIC, 1); > + src = ureg_DECL_vs_input(ureg, input_slot++); > dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 1); > ureg_MOV(ureg, dst, src); > } > + > if (is_fill) { > - src = ureg_DECL_vs_input(ureg, > - TGSI_SEMANTIC_COLOR, 0); > + src = ureg_DECL_vs_input(ureg, input_slot++); > dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0); > ureg_MOV(ureg, dst, src); > } > > if (has_mask) { > - src = ureg_DECL_vs_input(ureg, > - TGSI_SEMANTIC_GENERIC, 2); > + src = ureg_DECL_vs_input(ureg, input_slot++); > dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 2); > ureg_MOV(ureg, dst, src); > } > > _______________________________________________ > mesa-commit mailing list > [email protected]<mailto:[email protected] > > > http://lists.freedesktop.org/mailman/listinfo/mesa-commit > >
_______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
