mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 12:10:09 +01:00
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:
parent
8368939e5d
commit
a9f31a032b
4 changed files with 53 additions and 1 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue