[Mesa-dev] [PATCH] tgsi: support parsing texture offsets from text tgsi shaders
Roland Scheidegger
sroland at vmware.com
Tue May 13 11:02:37 PDT 2014
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Am 13.05.2014 19:12, schrieb Ilia Mirkin:
> ping? ran into this when trying to feed text shaders into
> nouveau_compiler that had texture offsets...
>
> On Wed, May 7, 2014 at 9:25 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>> src/gallium/auxiliary/tgsi/tgsi_text.c | 53 ++++++++++++++++++++++++++++++----
>> 1 file changed, 48 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c
>> index 2b2e7d5..7e50d8d 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
>> @@ -735,8 +735,9 @@ parse_dst_operand(
>> static boolean
>> parse_optional_swizzle(
>> struct translate_ctx *ctx,
>> - uint swizzle[4],
>> - boolean *parsed_swizzle )
>> + uint *swizzle,
>> + boolean *parsed_swizzle,
>> + int components)
>> {
>> const char *cur = ctx->cur;
>>
>> @@ -748,7 +749,7 @@ parse_optional_swizzle(
>>
>> cur++;
>> eat_opt_white( &cur );
>> - for (i = 0; i < 4; i++) {
>> + for (i = 0; i < components; i++) {
>> if (uprcase( *cur ) == 'X')
>> swizzle[i] = TGSI_SWIZZLE_X;
>> else if (uprcase( *cur ) == 'Y')
>> @@ -816,7 +817,7 @@ parse_src_operand(
>>
>> /* Parse optional swizzle.
>> */
>> - if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) {
>> + if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 4 )) {
>> if (parsed_swizzle) {
>> src->Register.SwizzleX = swizzle[0];
>> src->Register.SwizzleY = swizzle[1];
>> @@ -839,6 +840,35 @@ parse_src_operand(
>> }
>>
>> static boolean
>> +parse_texoffset_operand(
>> + struct translate_ctx *ctx,
>> + struct tgsi_texture_offset *src )
>> +{
>> + uint file;
>> + uint swizzle[3];
>> + boolean parsed_swizzle;
>> + struct parsed_bracket bracket;
>> +
>> + if (!parse_register_src(ctx, &file, &bracket))
>> + return FALSE;
>> +
>> + src->File = file;
>> + src->Index = bracket.index;
>> +
>> + /* Parse optional swizzle.
>> + */
>> + if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 3 )) {
>> + if (parsed_swizzle) {
>> + src->SwizzleX = swizzle[0];
>> + src->SwizzleY = swizzle[1];
>> + src->SwizzleZ = swizzle[2];
>> + }
>> + }
>> +
>> + return TRUE;
>> +}
>> +
>> +static boolean
>> match_inst(const char **pcur,
>> unsigned *saturate,
>> const struct tgsi_opcode_info *info)
>> @@ -904,7 +934,7 @@ parse_instruction(
>> if (!parse_register_1d( ctx, &file, &index ))
>> return FALSE;
>>
>> - if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) {
>> + if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle, 4 )) {
>> if (parsed_swizzle) {
>> inst.Predicate.SwizzleX = swizzle[0];
>> inst.Predicate.SwizzleY = swizzle[1];
>> @@ -1003,6 +1033,19 @@ parse_instruction(
>>
>> cur = ctx->cur;
>> eat_opt_white( &cur );
>> + for (i = 0; info->is_tex && *cur == ','; i++) {
>> + cur++;
>> + eat_opt_white( &cur );
>> + ctx->cur = cur;
>> + if (!parse_texoffset_operand( ctx, &inst.TexOffsets[i] ))
>> + return FALSE;
>> + cur = ctx->cur;
>> + eat_opt_white( &cur );
>> + }
>> + inst.Texture.NumOffsets = i;
>> +
>> + cur = ctx->cur;
>> + eat_opt_white( &cur );
>> if (info->is_branch && *cur == ':') {
>> uint target;
>>
>> --
>> 1.8.3.2
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=F4msKE2WxRzA%2BwN%2B25muztFm5TSPwE8HKJfWfR2NgfY%3D%0A&m=ORxpbHHoDwi1ik7s5giXNFhTQcdA3cY51AQn3zSzlVE%3D%0A&s=2511af27d2323756268f8cd3dde0edf680794eb2bcbbe5b6d3ed773921abc347
>
More information about the mesa-dev
mailing list