diff options
author | Nicolai Hähnle <[email protected]> | 2016-06-01 13:17:29 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2016-06-07 23:45:17 +0200 |
commit | d3a584defec988faa09960adea90545399440827 (patch) | |
tree | 973e7efd0b1f1271fa9795961a7b9fc9c19768ac | |
parent | b7a0c0ec7f5626bbec4904e6754f27087120ec54 (diff) |
tgsi/scan: add uses_derivatives (v2)
v2:
- TG4 does not calculate derivatives (Ilia)
- also handle SAMPLE* instructions (Roland)
Cc: 12.0 <[email protected]>
Reviewed-by: Marek Olšák <[email protected]> (v1)
Reviewed-by: Brian Paul <[email protected]> (v1)
Reviewed-by: Ilia Mirkin <[email protected]>
Reviewed-by: Roland Scheidegger <[email protected]>
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.c | 30 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_scan.h | 1 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index 1baf031d73e..98d86fc37a6 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -68,6 +68,33 @@ is_texture_inst(unsigned opcode) tgsi_get_opcode_info(opcode)->is_tex); } + +/** + * Is the opcode an instruction which computes a derivative explicitly or + * implicitly? + */ +static bool +computes_derivative(unsigned opcode) +{ + if (tgsi_get_opcode_info(opcode)->is_tex) { + return opcode != TGSI_OPCODE_TG4 && + opcode != TGSI_OPCODE_TXD && + opcode != TGSI_OPCODE_TXF && + opcode != TGSI_OPCODE_TXL && + opcode != TGSI_OPCODE_TXL2 && + opcode != TGSI_OPCODE_TXQ && + opcode != TGSI_OPCODE_TXQ_LZ && + opcode != TGSI_OPCODE_TXQS; + } + + return opcode == TGSI_OPCODE_DDX || opcode == TGSI_OPCODE_DDX_FINE || + opcode == TGSI_OPCODE_DDY || opcode == TGSI_OPCODE_DDY_FINE || + opcode == TGSI_OPCODE_SAMPLE || + opcode == TGSI_OPCODE_SAMPLE_B || + opcode == TGSI_OPCODE_SAMPLE_C; +} + + static void scan_instruction(struct tgsi_shader_info *info, const struct tgsi_full_instruction *fullinst, @@ -263,6 +290,9 @@ scan_instruction(struct tgsi_shader_info *info, if (is_mem_inst) info->num_memory_instructions++; + if (computes_derivative(fullinst->Instruction.Opcode)) + info->uses_derivatives = true; + info->num_instructions++; } diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index 31adce7a603..f7eefa4d186 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -115,6 +115,7 @@ struct tgsi_shader_info boolean writes_memory; /**< contains stores or atomics to buffers or images */ boolean is_msaa_sampler[PIPE_MAX_SAMPLERS]; boolean uses_doubles; /**< uses any of the double instructions */ + boolean uses_derivatives; unsigned clipdist_writemask; unsigned culldist_writemask; unsigned num_written_culldistance; |