On Fri, Jan 29, 2010 at 8:49 PM, Keith Whitwell <kei...@vmware.com> wrote: > So the nv40 code is doing the wrong thing... :) > > The rule currently is that the generic tags are just tags and are used only > to establish mapping between fragment shader and vertex shader. Additionaly > the vertex shader should always supply at least the inputs required by the > fragment shader. Taking a guess, without specific hardware support for > routing, nv40 should translate the fragment shader inputs into successive > SRC_TC slots, and build a mapping from semantic-index -> SRC_TC slot that can > be applied when translating the vertex shader. > > You might complain that in this world a vertex shader will require multiple > translations depending on which fragment shader is bound, as one taking fewer > inputs will have different numberings. That's true, but you also get the > opportunity to specialize the vertex shader as a result, eliminating dead > code in each case - which may be worth the effort. > > Anyway, it sounds like what you really want is to change the linkage rules. > This is possible, of course, but we should discuss it in those terms. > And > then if we do revisit those rules, we should take a deeper look at linkage > and figure out if anything else can be changed.
Yes, this is what I'm proposing. Actually, those rules do not seem to be documented, so I was not sure whether they were a requirement or were just a "bonus" feature of some drivers. Right now it seems to me that no users of Gallium require this functionality. In particular: 1. GLSL and anything with similar link-by-name can of course be modified to use sequential indices 2. ARB fragment program and vertex program use index-limited texcoord slots 3. g3dvl needs and uses 8 texcoord slots, indices 0-7 4. vega and xorg use indices 0-1 5. DX10 seems to restrict semantics to 0-N range, if I'm not mistaken 6. The GL_EXT_separate_shader_objects extension does not provide arbitrary index matching for GLSL, but merely lets it use a model similar to ARB fp/vp Thus, unless I am mistaken, no current API needs this feature. In addition, note that current rules do *not* allow to bind inputs and outputs by name, since the semantic index is an integer and not a screen. However, the hardware implementation could probably allow that, since it most likely works by specifying the fragment shader input a given vertex shader output maps to. Thus, I propose to: 1. Change the rules to require semantic indices to be in a 0-N range. Document this appropriately. 2. Fix GLSL to respect that using the patch I posted. Everything else should be already fine. 3. If necessary, add a ->set_routing_table function that takes pairs of vertex shader outputs and fragment shader inputs to associate This allows to state tracker to support seamless "link by variable name string" by packing the indices in sequential numbers, and then using a dictionary kept in the state tracker to build an appropriate routing table. There are also geometry programs, so both vs->gs and gs->fs routing tables are probably needed. What do you think? As an aside, regarding shader optimization, I would suggest a driver-independent LLVM-based middle layer that takes TGSI as input and can provide either optimized LLVM bytecode or optimized TGSI to the driver (letting the driver choose with appropriate caps). ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev