intel/fs: Add FS_OPCODE_SCHEDULING_FENCE
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Thu, 2 Jan 2020 23:27:58 +0000 (15:27 -0800)
committerMarge Bot <eric+marge@anholt.net>
Tue, 21 Jan 2020 23:41:35 +0000 (23:41 +0000)
Like a SHADER_OPCODE_MEMORY_FENCE but doesn't doesn't generate any
assembly code.

Will be used when the compiler shouldn't reorder certain instructions
but there's no need to generate code for the HW to do it -- as the
ordering will be guaranteed by other means.

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3226>

src/intel/compiler/brw_eu_defines.h
src/intel/compiler/brw_fs_generator.cpp
src/intel/compiler/brw_shader.cpp

index d2d8d877e2cedc0368724cd30bc2a535fb862dd4..1b56903e213bacc9b1d8ddb0ab4a329c55afaca0 100644 (file)
@@ -462,6 +462,11 @@ enum opcode {
     */
    SHADER_OPCODE_MEMORY_FENCE,
 
+   /**
+    * Scheduling-only fence.
+    */
+   FS_OPCODE_SCHEDULING_FENCE,
+
    SHADER_OPCODE_GEN4_SCRATCH_READ,
    SHADER_OPCODE_GEN4_SCRATCH_WRITE,
    SHADER_OPCODE_GEN7_SCRATCH_READ,
index 65beebf6d095751e9164c70424dd23629f7840e1..e8bbce5b2903263c8eae368a1a36bed411e4f238 100644 (file)
@@ -2177,6 +2177,11 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width,
          send_count++;
          break;
 
+      case FS_OPCODE_SCHEDULING_FENCE:
+         if (unlikely(debug_flag))
+            disasm_info->use_tail = true;
+         break;
+
       case SHADER_OPCODE_INTERLOCK:
          assert(devinfo->gen >= 9);
          /* The interlock is basically a memory fence issued via sendc */
index f95fcd99e67ac43435cfdf919ad49041b927421c..71f3e79a45429bbe3c005a0144734aa940decf8a 100644 (file)
@@ -323,6 +323,8 @@ brw_instruction_name(const struct gen_device_info *devinfo, enum opcode op)
       return "typed_surface_write_logical";
    case SHADER_OPCODE_MEMORY_FENCE:
       return "memory_fence";
+   case FS_OPCODE_SCHEDULING_FENCE:
+      return "scheduling_fence";
    case SHADER_OPCODE_INTERLOCK:
       /* For an interlock we actually issue a memory fence via sendc. */
       return "interlock";
@@ -1076,6 +1078,7 @@ backend_instruction::has_side_effects() const
    case TCS_OPCODE_RELEASE_INPUT:
    case SHADER_OPCODE_RND_MODE:
    case SHADER_OPCODE_FLOAT_CONTROL_MODE:
+   case FS_OPCODE_SCHEDULING_FENCE:
       return true;
    default:
       return eot;