[Mesa-dev] [PATCH 1/2] tgsi: collect texture sampler target info in tgsi_scan_shader()
Jose Fonseca
jfonseca at vmware.com
Tue Mar 29 20:39:44 UTC 2016
On 29/03/16 21:22, Roland Scheidegger wrote:
> I actually think "is_tex" is a bit confusing (because there's lots of
> other parts in the code where we don't really distinguish between
> "texture" and "sample" class of instructions and refer to them by the
> same name), but it certainly should work here (I think originally it
> actually meant there'd be a texture token but we have that with sample
> instructions as well...)
>
> Roland
>
> For the series:
> Reviewed-by: Roland Scheidegger <sroland at vmware.com>
>
> Am 29.03.2016 um 21:41 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.
>>
>> v2: only compare instruction's texture target to the sampler view declaration
>> target if the instruction is a TEX instruction, not a SAMPLE instruction.
>> ---
>> src/gallium/auxiliary/tgsi/tgsi_scan.c | 38 ++++++++++++++++++++++++++++++++--
>> src/gallium/auxiliary/tgsi/tgsi_scan.h | 1 +
>> 2 files changed, 37 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
>> index d32c3a1..6d4b00d 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
>> @@ -181,11 +181,33 @@ 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);
>> +
>> + if (tgsi_get_opcode_info(fullinst->Instruction.Opcode)->is_tex) {
>> + /* for texture instructions, check that the texture instruction
>> + * target matches the previous sampler view declaration (if there
>> + * was one.)
>> + */
>> + 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 +453,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 +525,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];
>>
>
Should it be PIPE_MAX_SHADER_SAMPLER_VIEWS instead of PIPE_MAX_SAMPLERS?
It might not make difference for Mesa state tracker, but these are not
generally the same thing.
Jose
More information about the mesa-dev
mailing list