i965/fs: Define logical framebuffer read opcode and lower it to physical reads.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 21 Jul 2016 23:55:45 +0000 (16:55 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 26 Aug 2016 01:36:08 +0000 (18:36 -0700)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs_cse.cpp
src/mesa/drivers/dri/i965/brw_shader.cpp

index f043661eda20189cc072e2cfe62f095c481f0037..c142d42248a91c7fc108843a7d81b9a520a8721d 100644 (file)
@@ -953,6 +953,7 @@ enum opcode {
    FS_OPCODE_REP_FB_WRITE,
 
    FS_OPCODE_FB_READ,
+   FS_OPCODE_FB_READ_LOGICAL,
 
    SHADER_OPCODE_RCP,
    SHADER_OPCODE_RSQ,
index cfbd66d297bbac554230ee1446915f5694a42b1b..80c2e5fd80ee670d29543bb5637aea103eaf1d55 100644 (file)
@@ -3825,6 +3825,23 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
    inst->header_size = header_size;
 }
 
+static void
+lower_fb_read_logical_send(const fs_builder &bld, fs_inst *inst)
+{
+   const fs_builder &ubld = bld.exec_all();
+   const unsigned length = 2;
+   const fs_reg header = ubld.group(8, 0).vgrf(BRW_REGISTER_TYPE_UD, length);
+
+   ubld.group(16, 0)
+       .MOV(header, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
+
+   inst->resize_sources(1);
+   inst->src[0] = header;
+   inst->opcode = FS_OPCODE_FB_READ;
+   inst->mlen = length;
+   inst->header_size = length;
+}
+
 static void
 lower_sampler_logical_send_gen4(const fs_builder &bld, fs_inst *inst, opcode op,
                                 const fs_reg &coordinate,
@@ -4418,6 +4435,10 @@ fs_visitor::lower_logical_sends()
                                      payload);
          break;
 
+      case FS_OPCODE_FB_READ_LOGICAL:
+         lower_fb_read_logical_send(ibld, inst);
+         break;
+
       case SHADER_OPCODE_TEX_LOGICAL:
          lower_sampler_logical_send(ibld, inst, SHADER_OPCODE_TEX);
          break;
@@ -4912,6 +4933,9 @@ get_lowered_simd_width(const struct brw_device_info *devinfo,
       return (inst->src[FB_WRITE_LOGICAL_SRC_COLOR1].file != BAD_FILE ?
               8 : MIN2(16, inst->exec_size));
 
+   case FS_OPCODE_FB_READ_LOGICAL:
+      return MIN2(16, inst->exec_size);
+
    case SHADER_OPCODE_TEX_LOGICAL:
    case SHADER_OPCODE_TXF_CMS_LOGICAL:
    case SHADER_OPCODE_TXF_UMS_LOGICAL:
index 410a60069a7194b3522becd1de666905a271070f..befbf140a5ec0b3ccee9c3ce47f668ad3c3b8fde 100644 (file)
@@ -71,6 +71,7 @@ is_expression(const fs_visitor *v, const fs_inst *const inst)
    case BRW_OPCODE_PLN:
    case BRW_OPCODE_MAD:
    case BRW_OPCODE_LRP:
+   case FS_OPCODE_FB_READ_LOGICAL:
    case FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD:
    case FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_LOGICAL:
    case FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7:
index efe3d0ff0c378c193d0964cbc8122c64de4f4044..b1632a66af3b0d61c66c159e7a42829857b67924 100644 (file)
@@ -167,6 +167,8 @@ brw_instruction_name(const struct brw_device_info *devinfo, enum opcode op)
       return "rep_fb_write";
    case FS_OPCODE_FB_READ:
       return "fb_read";
+   case FS_OPCODE_FB_READ_LOGICAL:
+      return "fb_read_logical";
 
    case SHADER_OPCODE_RCP:
       return "rcp";