i965/fs: Define logical framebuffer write opcode.

The logical variant is largely equivalent to the original opcode but
instead of taking a single payload source it expects its arguments
that make up the payload separately as individual sources, like:

 fb_write_logical null, color0, color1, src0_alpha,
                        src_depth, dst_depth, sample_mask, num_components

This patch defines the opcode and usual instruction boilerplate,
including a placeholder lowering function provided mainly as
self-documentation.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Francisco Jerez 2015-07-27 16:14:36 +03:00
parent 8368939e5d
commit a9f31a032b
4 changed files with 53 additions and 1 deletions

View file

@ -875,6 +875,21 @@ enum opcode {
* instructions.
*/
FS_OPCODE_FB_WRITE = 128,
/**
* Same as FS_OPCODE_FB_WRITE but expects its arguments separately as
* individual sources instead of as a single payload blob:
*
* Source 0: [required] Color 0.
* Source 1: [optional] Color 1 (for dual source blend messages).
* Source 2: [optional] Src0 Alpha.
* Source 3: [optional] Source Depth (passthrough from the thread payload).
* Source 4: [optional] Destination Depth (gl_FragDepth).
* Source 5: [optional] Sample Mask (gl_SampleMask).
* Source 6: [required] Number of color components (as a UD immediate).
*/
FS_OPCODE_FB_WRITE_LOGICAL,
FS_OPCODE_BLORP_FB_WRITE,
FS_OPCODE_REP_FB_WRITE,
SHADER_OPCODE_RCP,

View file

@ -678,6 +678,14 @@ fs_inst::components_read(unsigned i) const
assert(i == 0);
return 2;
case FS_OPCODE_FB_WRITE_LOGICAL:
assert(src[6].file == IMM);
/* First/second FB write color. */
if (i < 2)
return src[6].fixed_hw_reg.dw1.ud;
else
return 1;
default:
return 1;
}
@ -3199,6 +3207,25 @@ fs_visitor::lower_integer_multiplication()
return progress;
}
static void
lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
const brw_wm_prog_data *prog_data,
const brw_wm_prog_key *key,
const fs_visitor::thread_payload &payload)
{
assert(inst->src[6].file == IMM);
const brw_device_info *devinfo = bld.shader->devinfo;
const fs_reg &color0 = inst->src[0];
const fs_reg &color1 = inst->src[1];
const fs_reg &src0_alpha = inst->src[2];
const fs_reg &src_depth = inst->src[3];
const fs_reg &dst_depth = inst->src[4];
fs_reg sample_mask = inst->src[5];
const unsigned components = inst->src[6].fixed_hw_reg.dw1.ud;
assert(!"Not implemented");
}
bool
fs_visitor::lower_logical_sends()
{
@ -3210,6 +3237,14 @@ fs_visitor::lower_logical_sends()
.at(block, inst);
switch (inst->opcode) {
case FS_OPCODE_FB_WRITE_LOGICAL:
assert(stage == MESA_SHADER_FRAGMENT);
lower_fb_write_logical_send(ibld, inst,
(const brw_wm_prog_data *)prog_data,
(const brw_wm_prog_key *)key,
payload);
break;
default:
continue;
}

View file

@ -386,7 +386,7 @@ public:
fs_reg result;
/** Register numbers for thread payload fields. */
struct {
struct thread_payload {
uint8_t source_depth_reg;
uint8_t source_w_reg;
uint8_t aa_dest_stencil_reg;

View file

@ -537,6 +537,8 @@ brw_instruction_name(enum opcode op)
return opcode_descs[op].name;
case FS_OPCODE_FB_WRITE:
return "fb_write";
case FS_OPCODE_FB_WRITE_LOGICAL:
return "fb_write_logical";
case FS_OPCODE_BLORP_FB_WRITE:
return "blorp_fb_write";
case FS_OPCODE_REP_FB_WRITE: