Hmm that commit message doesn't quite look right, I should have said explicitly that it doesn't work for ordinary dx10 sampling instructions, since the tgsi sample interface doesn't pass separate sampler and sampler_view ids for fetch_texel neither, not just for get_dims and get_texels (so unlike the latter two there is a sampler associated with the instruction, but all the resource info will come from the wrong resource). But anyway the broken code at least seems to look less broken -).
Roland Am 06.02.2013 04:20, schrieb srol...@vmware.com: > From: Roland Scheidegger <srol...@vmware.com> > > There were several bugs how this was handled, most opcodes wouldn't even > have fetched the right arguments. > Also, the tex "target" is coming from the sampler view, hence it cannot > have information about shadow comparisons - fortunately this is not only > sampler state but also needs to have matching instruction, so just use this > instead to identify shadow comparisons. > Still untested (compiles...). > Note that sample_i and sviewinfo are still busted (just assert). > (The problem is that the interface for doing the opengl-equivalent functions > txf and txq is tied to the specific the sampler itself but these opcodes > have no sampler associated with them. Oops...) > --- > src/gallium/auxiliary/tgsi/tgsi_exec.c | 156 > ++++++++++++++++++-------------- > 1 file changed, 89 insertions(+), 67 deletions(-) > > diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c > b/src/gallium/auxiliary/tgsi/tgsi_exec.c > index 9f226c4..6d04cdc 100644 > --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c > +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c > @@ -1733,6 +1733,7 @@ fetch_texel( struct tgsi_sampler *sampler, > #define TEX_MODIFIER_PROJECTED 1 > #define TEX_MODIFIER_LOD_BIAS 2 > #define TEX_MODIFIER_EXPLICIT_LOD 3 > +#define TEX_MODIFIER_LEVEL_ZERO 4 > > /* > * execute a texture instruction. > @@ -2122,7 +2123,7 @@ exec_txq(struct tgsi_exec_machine *mach, > static void > exec_sample(struct tgsi_exec_machine *mach, > const struct tgsi_full_instruction *inst, > - uint modifier) > + uint modifier, boolean compare) > { > const uint resource_unit = inst->Src[1].Register.Index; > const uint sampler_unit = inst->Src[2].Register.Index; > @@ -2131,95 +2132,112 @@ exec_sample(struct tgsi_exec_machine *mach, > enum tgsi_sampler_control control; > uint chan; > > + assert(modifier != TEX_MODIFIER_PROJECTED); > + > if (modifier != TEX_MODIFIER_NONE) { > - if (modifier == TEX_MODIFIER_LOD_BIAS) > + if (modifier == TEX_MODIFIER_LOD_BIAS) { > FETCH(&r[3], 3, TGSI_CHAN_X); > - else /*TEX_MODIFIER_LOD*/ > + lod = &r[3]; > + } > + else if (modifier == TEX_MODIFIER_EXPLICIT_LOD) { > FETCH(&r[3], 0, TGSI_CHAN_W); > - > - if (modifier != TEX_MODIFIER_PROJECTED) { > lod = &r[3]; > } > + else > + assert(modifier == TEX_MODIFIER_LEVEL_ZERO); > } > > - if (modifier == TEX_MODIFIER_EXPLICIT_LOD) { > + if (modifier == TEX_MODIFIER_EXPLICIT_LOD || > + modifier == TEX_MODIFIER_LEVEL_ZERO) { > control = tgsi_sampler_lod_explicit; > } else { > control = tgsi_sampler_lod_bias; > } > > + FETCH(&r[0], 0, TGSI_CHAN_X); > + > switch (mach->SamplerViews[resource_unit].Resource) { > case TGSI_TEXTURE_1D: > - case TGSI_TEXTURE_SHADOW1D: > - FETCH(&r[0], 0, TGSI_CHAN_X); > - > - if (modifier == TEX_MODIFIER_PROJECTED) { > - micro_div(&r[0], &r[0], &r[3]); > + if (compare) { > + FETCH(&r[2], 3, TGSI_CHAN_X); > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &ZeroVec, &r[2], lod, &ZeroVec, /* S, T, P, LOD > */ > + control, > + &r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */ > + } > + else { > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &ZeroVec, &ZeroVec, lod, &ZeroVec, /* S, T, P, > LOD */ > + control, > + &r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */ > } > - > - fetch_texel(mach->Samplers[sampler_unit], > - &r[0], &ZeroVec, &ZeroVec, lod, &ZeroVec, /* S, T, P, LOD > */ > - control, > - &r[0], &r[1], &r[2], &r[3]); /* R, G, B, A */ > break; > > case TGSI_TEXTURE_1D_ARRAY: > case TGSI_TEXTURE_2D: > case TGSI_TEXTURE_RECT: > - case TGSI_TEXTURE_SHADOW1D_ARRAY: > - case TGSI_TEXTURE_SHADOW2D: > - case TGSI_TEXTURE_SHADOWRECT: > - FETCH(&r[0], 0, TGSI_CHAN_X); > FETCH(&r[1], 0, TGSI_CHAN_Y); > - FETCH(&r[2], 0, TGSI_CHAN_Z); > - > - if (modifier == TEX_MODIFIER_PROJECTED) { > - micro_div(&r[0], &r[0], &r[3]); > - micro_div(&r[1], &r[1], &r[3]); > - micro_div(&r[2], &r[2], &r[3]); > + if (compare) { > + FETCH(&r[2], 3, TGSI_CHAN_X); > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &r[2], lod, &ZeroVec, /* S, T, P, LOD > */ > + control, > + &r[0], &r[1], &r[2], &r[3]); /* outputs */ > + } > + else { > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &ZeroVec, lod, &ZeroVec, /* S, T, P, > LOD */ > + control, > + &r[0], &r[1], &r[2], &r[3]); /* outputs */ > } > - > - fetch_texel(mach->Samplers[sampler_unit], > - &r[0], &r[1], &r[2], lod, &ZeroVec, /* S, T, P, LOD */ > - control, > - &r[0], &r[1], &r[2], &r[3]); /* outputs */ > break; > > case TGSI_TEXTURE_2D_ARRAY: > case TGSI_TEXTURE_3D: > case TGSI_TEXTURE_CUBE: > - case TGSI_TEXTURE_CUBE_ARRAY: > - FETCH(&r[0], 0, TGSI_CHAN_X); > FETCH(&r[1], 0, TGSI_CHAN_Y); > FETCH(&r[2], 0, TGSI_CHAN_Z); > - > - if (modifier == TEX_MODIFIER_PROJECTED) { > - micro_div(&r[0], &r[0], &r[3]); > - micro_div(&r[1], &r[1], &r[3]); > - micro_div(&r[2], &r[2], &r[3]); > + if(compare) { > + FETCH(&r[3], 3, TGSI_CHAN_X); > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &r[2], &r[3], &ZeroVec, > + control, > + &r[0], &r[1], &r[2], &r[3]); > + } > + else { > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &r[2], lod, &ZeroVec, > + control, > + &r[0], &r[1], &r[2], &r[3]); > } > - > - fetch_texel(mach->Samplers[sampler_unit], > - &r[0], &r[1], &r[2], lod, &ZeroVec, > - control, > - &r[0], &r[1], &r[2], &r[3]); > break; > > - case TGSI_TEXTURE_SHADOW2D_ARRAY: > - case TGSI_TEXTURE_SHADOWCUBE: > - FETCH(&r[0], 0, TGSI_CHAN_X); > + case TGSI_TEXTURE_CUBE_ARRAY: > FETCH(&r[1], 0, TGSI_CHAN_Y); > FETCH(&r[2], 0, TGSI_CHAN_Z); > FETCH(&r[3], 0, TGSI_CHAN_W); > - > - assert(modifier != TEX_MODIFIER_PROJECTED); > - > - fetch_texel(mach->Samplers[sampler_unit], > - &r[0], &r[1], &r[2], &r[3], &ZeroVec, > - control, > - &r[0], &r[1], &r[2], &r[3]); > + if(compare) { > + assert(modifier == TEX_MODIFIER_NONE); > + /* > + * FIXME: lod bias and explicit lod are prohibited but > + * for sample_c_lz we pass the level zero info as explicit > + * lod 0. > + */ > + FETCH(&r[4], 3, TGSI_CHAN_X); > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &r[2], &r[3], &r[4], > + control, > + &r[0], &r[1], &r[2], &r[3]); > + } > + else { > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &r[2], &r[3], lod, > + control, > + &r[0], &r[1], &r[2], &r[3]); > + } > break; > > + > default: > assert(0); > } > @@ -2245,8 +2263,6 @@ exec_sample_d(struct tgsi_exec_machine *mach, > > switch (mach->SamplerViews[resource_unit].Resource) { > case TGSI_TEXTURE_1D: > - case TGSI_TEXTURE_SHADOW1D: > - > FETCH(&r[0], 0, TGSI_CHAN_X); > > fetch_texel(mach->Samplers[sampler_unit], > @@ -2257,23 +2273,17 @@ exec_sample_d(struct tgsi_exec_machine *mach, > > case TGSI_TEXTURE_2D: > case TGSI_TEXTURE_RECT: > - case TGSI_TEXTURE_SHADOW2D: > - case TGSI_TEXTURE_SHADOWRECT: > - > FETCH(&r[0], 0, TGSI_CHAN_X); > FETCH(&r[1], 0, TGSI_CHAN_Y); > - FETCH(&r[2], 0, TGSI_CHAN_Z); > > fetch_texel(mach->Samplers[sampler_unit], > - &r[0], &r[1], &r[2], &ZeroVec, &ZeroVec, /* inputs */ > + &r[0], &r[1], &ZeroVec, &ZeroVec, &ZeroVec, /* inputs */ > tgsi_sampler_lod_bias, > &r[0], &r[1], &r[2], &r[3]); /* outputs */ > break; > > case TGSI_TEXTURE_3D: > case TGSI_TEXTURE_CUBE: > - case TGSI_TEXTURE_CUBE_ARRAY: > - > FETCH(&r[0], 0, TGSI_CHAN_X); > FETCH(&r[1], 0, TGSI_CHAN_Y); > FETCH(&r[2], 0, TGSI_CHAN_Z); > @@ -2284,6 +2294,18 @@ exec_sample_d(struct tgsi_exec_machine *mach, > &r[0], &r[1], &r[2], &r[3]); > break; > > + case TGSI_TEXTURE_CUBE_ARRAY: > + FETCH(&r[0], 0, TGSI_CHAN_X); > + FETCH(&r[1], 0, TGSI_CHAN_Y); > + FETCH(&r[2], 0, TGSI_CHAN_Z); > + FETCH(&r[3], 0, TGSI_CHAN_W); > + > + fetch_texel(mach->Samplers[sampler_unit], > + &r[0], &r[1], &r[2], &r[3], &ZeroVec, > + tgsi_sampler_lod_bias, > + &r[0], &r[1], &r[2], &r[3]); > + break; > + > default: > assert(0); > } > @@ -4192,19 +4214,19 @@ exec_instruction( > break; > > case TGSI_OPCODE_SAMPLE: > - exec_sample(mach, inst, TEX_MODIFIER_NONE); > + exec_sample(mach, inst, TEX_MODIFIER_NONE, FALSE); > break; > > case TGSI_OPCODE_SAMPLE_B: > - exec_sample(mach, inst, TEX_MODIFIER_LOD_BIAS); > + exec_sample(mach, inst, TEX_MODIFIER_LOD_BIAS, FALSE); > break; > > case TGSI_OPCODE_SAMPLE_C: > - exec_sample(mach, inst, TEX_MODIFIER_NONE); > + exec_sample(mach, inst, TEX_MODIFIER_NONE, TRUE); > break; > > case TGSI_OPCODE_SAMPLE_C_LZ: > - exec_sample(mach, inst, TEX_MODIFIER_LOD_BIAS); > + exec_sample(mach, inst, TEX_MODIFIER_LEVEL_ZERO, TRUE); > break; > > case TGSI_OPCODE_SAMPLE_D: > @@ -4212,7 +4234,7 @@ exec_instruction( > break; > > case TGSI_OPCODE_SAMPLE_L: > - exec_sample(mach, inst, TEX_MODIFIER_EXPLICIT_LOD); > + exec_sample(mach, inst, TEX_MODIFIER_EXPLICIT_LOD, FALSE); > break; > > case TGSI_OPCODE_GATHER4: > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev