Zack Rusin pisze: > On Wednesday 09 December 2009 15:07:45 michal wrote: > >> Keith Whitwell pisze: >> >>> On Wed, 2009-12-09 at 10:19 -0800, Keith Whitwell wrote: >>> >>>> On Wed, 2009-12-09 at 07:18 -0800, Zack Rusin wrote: >>>> >>>>> On Wednesday 09 December 2009 10:05:13 michal wrote: >>>>> >>>>>> Zack Rusin pisze: >>>>>> >>>>>>> On Wednesday 09 December 2009 08:55:09 michal wrote: >>>>>>> >>>>>>>> Zack Rusin pisze: >>>>>>>> >>>>>>>>> On Wednesday 09 December 2009 08:44:20 Keith Whitwell wrote: >>>>>>>>> >>>>>>>>>> On Wed, 2009-12-09 at 04:41 -0800, michal wrote: >>>>>>>>>> >>>>>>>>>>> Zack Rusin pisze: >>>>>>>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> currently Gallium3d shaders predefine all their inputs/outputs. >>>>>>>>>>>> We've handled all inputs/outputs the same way. e.g. >>>>>>>>>>>> VERT >>>>>>>>>>>> DCL IN[0] >>>>>>>>>>>> DCL OUT[0], POSITION >>>>>>>>>>>> DCL OUT[1], COLOR >>>>>>>>>>>> DCL CONST[0..9] >>>>>>>>>>>> DCL TEMP[0..3] >>>>>>>>>>>> or >>>>>>>>>>>> FRAG >>>>>>>>>>>> DCL IN[0], COLOR, LINEAR >>>>>>>>>>>> DCL OUT[0], COLOR >>>>>>>>>>>> >>>>>>>>>>>> There are certain inputs/output which don't really follow the >>>>>>>>>>>> typical rules for inputs/outputs though and we've been imitating >>>>>>>>>>>> those with extra normal semantics (e.g. front face). >>>>>>>>>>>> >>>>>>>>>>>> It all falls apart a bit on anything with shader model 4.x and >>>>>>>>>>>> up. That's because in there we've got what Microsoft calls >>>>>>>>>>>> system-value semantics. ( >>>>>>>>>>>> http://msdn.microsoft.com/en-us/library/ee418355(VS.85).aspx#Sys >>>>>>>>>>>> tem_ Va l ue ). They all represent system-generated >>>>>>>>>>>> inputs/outputs for shaders. And while so far we only really had >>>>>>>>>>>> to handle front-face since shader model 4.x we have to deal with >>>>>>>>>>>> lots of them (geometry shaders, domain shaders, computer >>>>>>>>>>>> shaders... they all have system generated inputs/outputs) >>>>>>>>>>>> >>>>>>>>>>>> I'm thinking of adding something similar to what D3D does to >>>>>>>>>>>> Gallium3d. So just adding a new DCL type, e.g. DCL_SV which >>>>>>>>>>>> takes the vector name and the system-value semantic as its >>>>>>>>>>>> inputs, so FRAG DCL IN[0], COLOR, LINEAR >>>>>>>>>>>> DCL IN[1], COLOR[1], LINEAR >>>>>>>>>>>> DCL IN[2], FACE, CONSTANT >>>>>>>>>>>> would become >>>>>>>>>>>> FRAG >>>>>>>>>>>> DCL IN[0], COLOR, LINEAR >>>>>>>>>>>> DCL IN[1], COLOR[1], LINEAR >>>>>>>>>>>> DCL_SV IN[2], FACE >>>>>>>>>>>> >>>>>>>>>>>> It likely could be done in a more generic fashion though. >>>>>>>>>>>> Opinions? >>>>>>>>>>>> >>>>>>>>>>> Zack, >>>>>>>>>>> >>>>>>>>>>> What would be the difference between >>>>>>>>>>> >>>>>>>>>>> DCL IN[2], FACE, CONSTANT >>>>>>>>>>> >>>>>>>>>>> and >>>>>>>>>>> >>>>>>>>>>> DCL_SV IN[2], FACE >>>>>>>>>>> >>>>>>>>>>> then? Maybe the example is bad, but I don't see what DCL_SV would >>>>>>>>>>> give us the existing DCL doesn't. >>>>>>>>>>> >>>>>>>>>> I'd have proposed something slightly different where the SV values >>>>>>>>>> don't land in the INPUT file but some new register file. >>>>>>>>>> >>>>>>>>>> The reason is that when we start looking at geometry shaders, the >>>>>>>>>> INPUT register file becomes two-dimensional, but these SV values >>>>>>>>>> remain single-dimensional. That means that for current TGSI we'd >>>>>>>>>> have stuff like: >>>>>>>>>> >>>>>>>>>> DCL IN[0..3][0] POSITION >>>>>>>>>> DCL IN[0..3][1] COLOR >>>>>>>>>> DCL IN[2] SOME_SYSTEM_VALUE >>>>>>>>>> >>>>>>>>>> Which is pretty nasty - half of the input file is one dimensional, >>>>>>>>>> half two-dimensional, and you need to look at the index of the >>>>>>>>>> first dimension to figure out whether the input reg is legal or >>>>>>>>>> not. >>>>>>>>>> >>>>>>>>>> So, I'm think some new register file to handle these >>>>>>>>>> system-generated values is one possiblility, as in: >>>>>>>>>> >>>>>>>>>> DCL SV[0], FACE >>>>>>>>>> >>>>>>>>>> or >>>>>>>>>> >>>>>>>>>> DCL SV[1], PRIMITIVE_ID >>>>>>>>>> >>>>>>>>>> Thoughts? >>>>>>>>>> >>>>>>>>> Yea, I like that. >>>>>>>>> >>>>>>>>> And then separate syntax to handle the properties or overloading >>>>>>>>> DCL? i.e. DCL GS_INFO PRIM_IN TRIANGLES >>>>>>>>> vs >>>>>>>>> PROPERTY GS_INFO PRIM_IN TRIANGLES >>>>>>>>> ? >>>>>>>>> >>>>>>>> I think a geometry shader should have its own GS_INFO token that >>>>>>>> would convey the information it needs, i.e. no overloading of the >>>>>>>> DCL token. >>>>>>>> >>>>>>>> GS_INFO PRIM_IN TRIANGLES >>>>>>>> GS_INFO PRIM_OUT TRIANGLE_STRIP >>>>>>>> GS_INFO MAX_VERTEX_COUNT 3 /* vertices_out for gl */ >>>>>>>> >>>>>>> We'll be adding more of those then. Basically we'll need an extra >>>>>>> token for every shader we have. >>>>>>> >>>>>>> COMPUTE_INFO WORK_GROUP_SIZE 4 4 4 /*x, y, z*/ >>>>>>> DS_INFO DOMAIN 3 /*domain shader*/ >>>>>>> HS_INFO MAXTESSFACTOR 3 /*hull shader*/ >>>>>>> FS_INFO EARLYDEPTSTENCIL 1 >>>>>>> etc. >>>>>>> >>>>>>> To me it looks uglier than a special decleration token that could >>>>>>> handle all of them. >>>>>>> >>>>>> Can you propose a patch against p_shader_tokens.h that introduces a >>>>>> PROPERTY token? >>>>>> >>>>> I could do that but only if we agree it's in the name of love. >>>>> >>>>> So is everyone ok with a new register SV for system generated values >>>>> and new declaration token called PROPERTY for shader specific >>>>> properties (btw, d3d calls those attributes, but since attributes >>>>> already have a meaning in glsl I think it'd probably wise to not try to >>>>> redefine it). >>>>> >>>> I'm OK with this general plan, though I'm not sure about these FS >>>> properties - early depth/stencil depends on more than just the shader as >>>> long as we continue to support legacy alphatest, for instance. This is >>>> probably something the driver has to figure out for itself based on the >>>> peculiarities of the hardware - some hardware may not even have such a >>>> concept. >>>> >>>> In terms of the SV register file, what do we do with the existing system >>>> values -- I'm guessing things like the FACE input semantic in fragment >>>> shaders is now a SV, right? >>>> >>>> Also, how are the semantics of the SV regs specified? Is it with the >>>> existing semantic tags? >>>> >>>> Finally, some APIs distinguish between system-generated values (like >>>> face, vertex-id, etc) and system-consumed values. We use semantics tags >>>> on outputs to denote system-consumed values, and these SVs are more like >>>> system-generated values, right? >>>> >>> Another question is whether it's really a problem to have some GS inputs >>> be 2-dimensional and some be only 1-dimensional. It looks ugly to me, >>> but I'm a bit concerned about introducing a new register file as a >>> response to that. >>> >>> Michal - do you have any feeling on how other APIs handle this? >>> >> For geometry shaders to work, you just need a separate register file for >> PRIMITIVE_ID. Everything else is either 2D (and can overload existing >> register files) or doesn't make sense in GS (can we have FACE semantic >> there?). >> >> Unless Zack knows about other 1D registers that can be used in GS that >> he will need, I say rename the new SYSTEM_VALUE register file to >> PRIMITIVE_ID and be done with it. >> > > There's gs_instance_id which specifies the id of the instance of the geometry > shader (which is different than the global draw instance). There's also the > number of vertices that the geometry shader works on (1 points, 2 lines, 3 > triangles, 6 triangle adjacency etc) (which although is a readable variable > in > glsl, is something that is encoded in D3D by the way of encoding the input > primitive in the shader). (plus of course there are the properties of the > shader e.g. input primitive, output primitive and max number of vertices that > it emits). > > What Keith is referring though is the fact that our input layout is going to > be a bit difficult because for geometry shader it's > DCL SV[0].x, PRIMITIVE_ID > DCL SV[1].y, GS_INSTANCE_ID > DCL IN[0][0..n], POSITION > DCL IN[1][0..n], COLOR > so whether you have SV or not is not the issue, it's the fact that we have > different dimensional inputs that is not ideal. Right now I don't really see > a > way of getting rid of that. > > And I agree with that. Since you provided more SV examples that make sense (though GS_INSTANCE_ID is something SM5 introduces), you should stick with SYSTEM_VALUE register file. There is nothing gross about having INPUT registers two-dimensional, and SYSTEM_VALUE one-dimensional.
------------------------------------------------------------------------------ Return on Information: Google Enterprise Search pays you back Get the facts. http://p.sf.net/sfu/google-dev2dev _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev