[Mesa-dev] [PATCH] tgsi: collect texture sampler target info in tgsi_scan_shader()

Brian Paul brianp at vmware.com
Tue Mar 29 17:35:30 UTC 2016


On 03/29/2016 09:28 AM, Roland Scheidegger wrote:
> Am 29.03.2016 um 03:43 schrieb Brian Paul:
>> Texture sample instructions specify a sampler unit and texture target
>> such as "1D", "2D", "CUBE", etc.  Sampler view declarations also specify
>> the sampler unit and texture target.
>>
>> This patch checks that the texture instructions agree with the declarations
>> and collects the texture target type for each sampler unit.
>> ---
>>   src/gallium/auxiliary/tgsi/tgsi_scan.c | 33 +++++++++++++++++++++++++++++++--
>>   src/gallium/auxiliary/tgsi/tgsi_scan.h |  1 +
>>   2 files changed, 32 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
>> index d32c3a1..796101d 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
>> @@ -181,11 +181,28 @@ scan_instruction(struct tgsi_shader_info *info,
>>            info->indirect_files_read |= (1 << src->Register.File);
>>         }
>>
>> -      /* MSAA samplers */
>> +      /* Texture samplers */
>>         if (src->Register.File == TGSI_FILE_SAMPLER) {
>> +         const unsigned index = src->Register.Index;
>> +         const unsigned target = fullinst->Texture.Texture;
>> +
>>            assert(fullinst->Instruction.Texture);
>> -         assert(src->Register.Index < Elements(info->is_msaa_sampler));
>> +         assert(index < Elements(info->is_msaa_sampler));
>> +         assert(index < PIPE_MAX_SAMPLERS);
>> +         assert(target < TGSI_TEXTURE_UNKNOWN);
>> +
>> +         /* check/save target */
>> +         if (info->sampler_targets[index] == TGSI_TEXTURE_UNKNOWN) {
>> +            /* probably no sampler view declaration */
>> +            info->sampler_targets[index] = target;
>> +         } else {
>> +            /* Make sure the texture instruction's sampler/target info
>> +             * agrees with the sampler view declaration.
>> +             */
>> +            assert(info->sampler_targets[index] == target);
>> +         }
>>
>> +         /* MSAA samplers */
>>            if (fullinst->Instruction.Texture &&
>>                (fullinst->Texture.Texture == TGSI_TEXTURE_2D_MSAA ||
>>                 fullinst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY_MSAA)) {
>> @@ -431,6 +448,16 @@ scan_declaration(struct tgsi_shader_info *info,
>>            }
>>         } else if (file == TGSI_FILE_SAMPLER) {
>>            info->samplers_declared |= 1 << reg;
>> +      } else if (file == TGSI_FILE_SAMPLER_VIEW) {
>> +         unsigned target = fulldecl->SamplerView.Resource;
>> +         assert(target < TGSI_TEXTURE_UNKNOWN);
>> +         if (info->sampler_targets[reg] == TGSI_TEXTURE_UNKNOWN) {
>> +            /* Save sampler target for this sampler index */
>> +            info->sampler_targets[reg] = target;
>> +         } else {
>> +            /* if previously declared, make sure targets agree */
>> +            assert(info->sampler_targets[reg] == target);
>> +         }
>>         } else if (file == TGSI_FILE_IMAGE) {
>>            if (fulldecl->Image.Resource == TGSI_TEXTURE_BUFFER)
>>               info->images_buffers |= 1 << reg;
>> @@ -493,6 +520,8 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
>>      for (i = 0; i < Elements(info->const_file_max); i++)
>>         info->const_file_max[i] = -1;
>>      info->properties[TGSI_PROPERTY_GS_INVOCATIONS] = 1;
>> +   for (i = 0; i < Elements(info->sampler_targets); i++)
>> +      info->sampler_targets[i] = TGSI_TEXTURE_UNKNOWN;
>>
>>      /**
>>       ** Setup to begin parsing input shader
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h
>> index 76d8925..25855c8 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h
>> @@ -65,6 +65,7 @@ struct tgsi_shader_info
>>      int file_max[TGSI_FILE_COUNT];  /**< highest index of declared registers */
>>      int const_file_max[PIPE_MAX_CONSTANT_BUFFERS];
>>      unsigned samplers_declared; /**< bitmask of declared samplers */
>> +   ubyte sampler_targets[PIPE_MAX_SAMPLERS];  /**< TGSI_TEXTURE_x values */
>>
>>      ubyte input_array_first[PIPE_MAX_SHADER_INPUTS];
>>      ubyte input_array_last[PIPE_MAX_SHADER_INPUTS];
>>
>
> This patch will likely assert all the time with other state trackers,
> which use sample instructions (because the sampler index you get in such
> instructions can and will be different to what you declared with the
> "corresponding" sampler view, as they are in no way linked together).
> Thus the targets will not match. (And, IIRC, you don't get a valid
> target out of these instructions anyway, it will be encoded but might
> just be TGSI_TEXTURE_UNKNOWN). I think the only way to make this work
> would be to verify that stuff with the "classic" texture instructions,
> but not the sample ones.

Yes, you're right.  I'll post a v2 patch which checks that the 
instruction is a texture instruction and not a sample instruction.

-Brian



More information about the mesa-dev mailing list