summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2021-03-30 11:48:10 +0200
committerMarge Bot <eric+marge@anholt.net>2021-03-31 05:51:22 +0000
commitf33ca092daf0e6303b3f7cd0786998da9f0d71c1 (patch)
tree0667b84200de92f43ba267da7c20d6cb80565996
parent062eee7d33cba0c89b29c1b8d198f36b2f2bf579 (diff)
broadcom/compiler: add a NOP count stat to shader-db
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9918>
-rw-r--r--src/broadcom/compiler/v3d_compiler.h1
-rw-r--r--src/broadcom/compiler/vir.c5
-rw-r--r--src/broadcom/compiler/vir_to_qpu.c3
-rw-r--r--src/broadcom/qpu/qpu_instr.c17
-rw-r--r--src/broadcom/qpu/qpu_instr.h1
5 files changed, 25 insertions, 2 deletions
diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h
index 1a2134c6137..a741c1785ec 100644
--- a/src/broadcom/compiler/v3d_compiler.h
+++ b/src/broadcom/compiler/v3d_compiler.h
@@ -760,6 +760,7 @@ struct v3d_compile {
uint32_t qpu_inst_count;
uint32_t qpu_inst_size;
uint32_t qpu_inst_stalled_count;
+ uint32_t nop_count;
/* For the FS, the number of varying inputs not counting the
* point/line varyings payload
diff --git a/src/broadcom/compiler/vir.c b/src/broadcom/compiler/vir.c
index 45453a6b42e..e4fbf1b880e 100644
--- a/src/broadcom/compiler/vir.c
+++ b/src/broadcom/compiler/vir.c
@@ -1238,7 +1238,7 @@ int v3d_shaderdb_dump(struct v3d_compile *c,
return asprintf(shaderdb_str,
"%s shader: %d inst, %d threads, %d loops, "
"%d uniforms, %d max-temps, %d:%d spills:fills, "
- "%d sfu-stalls, %d inst-and-stalls",
+ "%d sfu-stalls, %d inst-and-stalls, %d nops",
vir_get_stage_name(c),
c->qpu_inst_count,
c->threads,
@@ -1248,7 +1248,8 @@ int v3d_shaderdb_dump(struct v3d_compile *c,
c->spills,
c->fills,
c->qpu_inst_stalled_count,
- c->qpu_inst_count + c->qpu_inst_stalled_count);
+ c->qpu_inst_count + c->qpu_inst_stalled_count,
+ c->nop_count);
}
uint64_t *v3d_compile(const struct v3d_compiler *compiler,
diff --git a/src/broadcom/compiler/vir_to_qpu.c b/src/broadcom/compiler/vir_to_qpu.c
index 1332f2e9163..aa33545420e 100644
--- a/src/broadcom/compiler/vir_to_qpu.c
+++ b/src/broadcom/compiler/vir_to_qpu.c
@@ -425,6 +425,9 @@ v3d_vir_to_qpu(struct v3d_compile *c, struct qpu_reg *temp_registers)
c->compilation_result = V3D_COMPILATION_FAILED;
return;
}
+
+ if (v3d_qpu_is_nop(&inst->qpu))
+ c->nop_count++;
}
assert(i == c->qpu_inst_count);
diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c
index 9f517874d1f..0bda9a42c51 100644
--- a/src/broadcom/qpu/qpu_instr.c
+++ b/src/broadcom/qpu/qpu_instr.c
@@ -22,6 +22,7 @@
*/
#include <stdlib.h>
+#include <string.h>
#include "util/macros.h"
#include "broadcom/common/v3d_device_info.h"
#include "qpu_instr.h"
@@ -1017,3 +1018,19 @@ v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst)
return false;
}
+
+bool
+v3d_qpu_is_nop(struct v3d_qpu_instr *inst)
+{
+ static const struct v3d_qpu_sig nosig = { 0 };
+
+ if (inst->type != V3D_QPU_INSTR_TYPE_ALU)
+ return false;
+ if (inst->alu.add.op != V3D_QPU_A_NOP)
+ return false;
+ if (inst->alu.mul.op != V3D_QPU_M_NOP)
+ return false;
+ if (memcmp(&inst->sig, &nosig, sizeof(nosig)))
+ return false;
+ return true;
+}
diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h
index c2885d73525..a87ed9ff3a9 100644
--- a/src/broadcom/qpu/qpu_instr.h
+++ b/src/broadcom/qpu/qpu_instr.h
@@ -479,4 +479,5 @@ bool v3d_qpu_sig_writes_address(const struct v3d_device_info *devinfo,
bool v3d_qpu_unpacks_f32(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
bool v3d_qpu_unpacks_f16(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
+bool v3d_qpu_is_nop(struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
#endif