panfrost/midgard: Add perspective division opcodes
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 10 Jun 2019 18:05:40 +0000 (11:05 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 11 Jun 2019 15:44:18 +0000 (08:44 -0700)
...on the load/store unit, not the ALUs. Looks goofy but hey.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/midgard/midgard.h
src/gallium/drivers/panfrost/midgard/midgard_ops.c

index 68e969ccf9c8265337925b60faf0c7b62a71c096..980a968cbe9cdbf483debd8839eb3e7ee3aebb8f 100644 (file)
@@ -371,6 +371,13 @@ typedef enum {
         /* Used in OpenCL. Probably can ld other things as well */
         midgard_op_ld_global_id = 0x10,
 
+        /* The L/S unit can do perspective division a clock faster than the ALU
+         * if you're lucky. Put the vec4 in r27, and call with 0x24 as the
+         * unknown state; the output will be <x/w, y/w, z/w, 1>. Replace w with
+         * z for the z version */
+        midgard_op_ldst_perspective_division_z = 0x12,
+        midgard_op_ldst_perspective_division_w = 0x13,
+
         /* val in r27.y, address embedded, outputs result to argument. Invert val for sub. Let val = +-1 for inc/dec. */
         midgard_op_atomic_add = 0x40,
         midgard_op_atomic_and = 0x44,
index 693fb56124ddd2f97f2d6706fb1df6d44ecbfdc9..85981dbef5b2f0a8bcef55d4ce1a9e0f4e381254 100644 (file)
@@ -153,6 +153,8 @@ struct mir_op_props alu_opcode_props[256] = {
 const char *load_store_opcode_names[256] = {
         [midgard_op_st_cubemap_coords] = "st_cubemap_coords",
         [midgard_op_ld_global_id] = "ld_global_id",
+        [midgard_op_ldst_perspective_division_z] = "ldst_perspective_division_z",
+        [midgard_op_ldst_perspective_division_w] = "ldst_perspective_division_w",
 
         [midgard_op_atomic_add] = "atomic_add",
         [midgard_op_atomic_and] = "atomic_and",