tgsi/text: parse _PRECISE modifier

v2: use str_match_no_case to fix _SAT_PRECISE detection
v4: usd is_digit_alpha_underscore to match end of mods

Signed-off-by: Karol Herbst <karolherbst@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>

[cherry-picked from 4611343bcc05c75bcc9697243dabbb083f7078de in mesa]

Signed-off-by: Dave Airlie <airlied@redhat.com>
macos/master
Karol Herbst 7 years ago committed by Dave Airlie
parent 46d2cf85d1
commit ef70cef58b
  1. 17
      src/gallium/auxiliary/tgsi/tgsi_text.c

@ -986,6 +986,7 @@ parse_texoffset_operand(
static boolean static boolean
match_inst(const char **pcur, match_inst(const char **pcur,
unsigned *saturate, unsigned *saturate,
unsigned *precise,
const struct tgsi_opcode_info *info) const struct tgsi_opcode_info *info)
{ {
const char *cur = *pcur; const char *cur = *pcur;
@ -994,16 +995,24 @@ match_inst(const char **pcur,
if (str_match_nocase_whole(&cur, info->mnemonic)) { if (str_match_nocase_whole(&cur, info->mnemonic)) {
*pcur = cur; *pcur = cur;
*saturate = 0; *saturate = 0;
*precise = 0;
return TRUE; return TRUE;
} }
if (str_match_no_case(&cur, info->mnemonic)) { if (str_match_no_case(&cur, info->mnemonic)) {
/* the instruction has a suffix, figure it out */ /* the instruction has a suffix, figure it out */
if (str_match_nocase_whole(&cur, "_SAT")) { if (str_match_no_case(&cur, "_SAT")) {
*pcur = cur; *pcur = cur;
*saturate = 1; *saturate = 1;
return TRUE;
} }
if (str_match_no_case(&cur, "_PRECISE")) {
*pcur = cur;
*precise = 1;
}
if (!is_digit_alpha_underscore(cur))
return TRUE;
} }
return FALSE; return FALSE;
@ -1016,6 +1025,7 @@ parse_instruction(
{ {
uint i; uint i;
uint saturate = 0; uint saturate = 0;
uint precise = 0;
const struct tgsi_opcode_info *info; const struct tgsi_opcode_info *info;
struct tgsi_full_instruction inst; struct tgsi_full_instruction inst;
const char *cur; const char *cur;
@ -1030,7 +1040,7 @@ parse_instruction(
cur = ctx->cur; cur = ctx->cur;
info = tgsi_get_opcode_info( i ); info = tgsi_get_opcode_info( i );
if (match_inst(&cur, &saturate, info)) { if (match_inst(&cur, &saturate, &precise, info)) {
if (info->num_dst + info->num_src + info->is_tex == 0) { if (info->num_dst + info->num_src + info->is_tex == 0) {
ctx->cur = cur; ctx->cur = cur;
break; break;
@ -1051,6 +1061,7 @@ parse_instruction(
inst.Instruction.Opcode = i; inst.Instruction.Opcode = i;
inst.Instruction.Saturate = saturate; inst.Instruction.Saturate = saturate;
inst.Instruction.Precise = precise;
inst.Instruction.NumDstRegs = info->num_dst; inst.Instruction.NumDstRegs = info->num_dst;
inst.Instruction.NumSrcRegs = info->num_src; inst.Instruction.NumSrcRegs = info->num_src;

Loading…
Cancel
Save