<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Thu, May 17, 2018 at 4:32 PM Dave Airlie <<a href="mailto:airlied@gmail.com">airlied@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> I assume we're trying to implement the shadow variants of textureGather:<br>
><br>
> vec4 textureGather( gsampler2DShadow sampler, vec2 P, float refZ);<br>
><br>
> TGSI specifies src[1], not src[0] should be source for the refZ argument.<br>
<br>
you missed this line:<br>
(with SM5 - cube array shadow)<br>
><br>
>      coord = src0<br>
>      compare = src1<br>
>      dst = texture_gather (uint, coord, compare)<br>
><br>
This only applies to the cube array shadow case which needs 5 values<br>
so needs 2 srcs.<br>
<br>
><br>
> The new case for TGSI_TEXTURE_SHADOWCUBE_ARRAY makes sense, but the older<br>
> code does not.  Why are we using src[0] (especially with different<br>
> swizzling depending on the shadow texture type) for some shadow cases?<br>
<br>
The refZ will get stuck in the src0 Z or W depending on other things:<br>
         if ((sampler_type->sampler_dimensionality == GLSL_SAMPLER_DIM_2D &&<br>
              sampler_type->sampler_array) ||<br>
             sampler_type->sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE) {<br>
            coord_dst.writemask = WRITEMASK_W;<br>
         } else {<br>
            coord_dst.writemask = WRITEMASK_Z;<br>
         }<br></blockquote><div><br></div><div>Ah, that makes sense  -- TGSI uses the remaining portion of src[0] if (sizeof(GLSL arg1) + sizeof(GLSL arg2) <= sizeof(src[0])) and types match.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
is the code from the state tracker. <br></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
><br>
>> +      } else if (tg4_has_component) {<br>
>> +         if (inst->Texture.NumOffsets == 0) {<br>
>> +            if (inst->Texture.Texture == TGSI_TEXTURE_2D ||<br>
>> +                inst->Texture.Texture == TGSI_TEXTURE_RECT ||<br>
>> +                inst->Texture.Texture == TGSI_TEXTURE_CUBE ||<br>
>> +                inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||<br>
>> +                inst->Texture.Texture == TGSI_TEXTURE_CUBE_ARRAY)<br>
>> +               snprintf(bias, 64, ", int(%s)", srcs[1]);<br>
>> +         } else if (inst->Texture.NumOffsets) {<br>
>> +            if (inst->Texture.Texture == TGSI_TEXTURE_2D ||<br>
>> +                inst->Texture.Texture == TGSI_TEXTURE_RECT ||<br>
>> +                inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)<br>
>> +               snprintf(bias, 64, ", int(%s)", srcs[1]);<br>
>> +         }<br>
><br>
> The cases for inst->Texture.NumOffsets == 0 and inst->Texture.NumOffsets<br>
> result in the same bias -- int(src[1]) -- do we need separate cases for<br>
> them?<br>
><br>
<br>
The result is the name, but the numoffsets case doesn't apply to<br>
cube/cube_array,<br>
so it might be possible to write it a bit cleaner, but I'm guessing it<br>
could also end<br>
up ugly writiing it in one if statement.<br>
<br></blockquote><div><br></div><div>Fair enough.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thanks,<br>
Dave.<br>
</blockquote></div></div>