mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 11:48:06 +02:00
i965/fs: Define logical typed and untyped surface opcodes.
Each logical variant is largely equivalent to the original opcode but
instead of taking a single payload source it expects its arguments
separately as individual sources, like:
typed_surface_write_logical null, coordinates, source, surface,
num_coordinates, num_components
This patch defines the opcodes and usual instruction boilerplate,
including a placeholder lowering function provided mainly as
documentation for their source registers.
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
3af2623da5
commit
7a594a95a9
3 changed files with 129 additions and 0 deletions
|
|
@ -963,13 +963,33 @@ enum opcode {
|
|||
|
||||
SHADER_OPCODE_SHADER_TIME_ADD,
|
||||
|
||||
/**
|
||||
* Typed and untyped surface access opcodes.
|
||||
*
|
||||
* LOGICAL opcodes are eventually translated to the matching non-LOGICAL
|
||||
* opcode but instead of taking a single payload blob they expect their
|
||||
* arguments separately as individual sources:
|
||||
*
|
||||
* Source 0: [required] Surface coordinates.
|
||||
* Source 1: [optional] Operation source.
|
||||
* Source 2: [required] Surface index.
|
||||
* Source 3: [required] Number of coordinate components (as UD immediate).
|
||||
* Source 4: [required] Opcode-specific control immediate, same as source 2
|
||||
* of the matching non-LOGICAL opcode.
|
||||
*/
|
||||
SHADER_OPCODE_UNTYPED_ATOMIC,
|
||||
SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL,
|
||||
SHADER_OPCODE_UNTYPED_SURFACE_READ,
|
||||
SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL,
|
||||
SHADER_OPCODE_UNTYPED_SURFACE_WRITE,
|
||||
SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL,
|
||||
|
||||
SHADER_OPCODE_TYPED_ATOMIC,
|
||||
SHADER_OPCODE_TYPED_ATOMIC_LOGICAL,
|
||||
SHADER_OPCODE_TYPED_SURFACE_READ,
|
||||
SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL,
|
||||
SHADER_OPCODE_TYPED_SURFACE_WRITE,
|
||||
SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL,
|
||||
|
||||
SHADER_OPCODE_MEMORY_FENCE,
|
||||
|
||||
|
|
|
|||
|
|
@ -711,6 +711,49 @@ fs_inst::components_read(unsigned i) const
|
|||
else
|
||||
return 1;
|
||||
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL:
|
||||
case SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL:
|
||||
assert(src[3].file == IMM);
|
||||
/* Surface coordinates. */
|
||||
if (i == 0)
|
||||
return src[3].fixed_hw_reg.dw1.ud;
|
||||
/* Surface operation source (ignored for reads). */
|
||||
else if (i == 1)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL:
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL:
|
||||
assert(src[3].file == IMM &&
|
||||
src[4].file == IMM);
|
||||
/* Surface coordinates. */
|
||||
if (i == 0)
|
||||
return src[3].fixed_hw_reg.dw1.ud;
|
||||
/* Surface operation source. */
|
||||
else if (i == 1)
|
||||
return src[4].fixed_hw_reg.dw1.ud;
|
||||
else
|
||||
return 1;
|
||||
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
|
||||
case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL: {
|
||||
assert(src[3].file == IMM &&
|
||||
src[4].file == IMM);
|
||||
const unsigned op = src[4].fixed_hw_reg.dw1.ud;
|
||||
/* Surface coordinates. */
|
||||
if (i == 0)
|
||||
return src[3].fixed_hw_reg.dw1.ud;
|
||||
/* Surface operation source. */
|
||||
else if (i == 1 && op == BRW_AOP_CMPWR)
|
||||
return 2;
|
||||
else if (i == 1 && (op == BRW_AOP_INC || op == BRW_AOP_DEC ||
|
||||
op == BRW_AOP_PREDEC))
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -3847,6 +3890,20 @@ lower_sampler_logical_send(const fs_builder &bld, fs_inst *inst, opcode op)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
lower_surface_logical_send(const fs_builder &bld, fs_inst *inst, opcode op,
|
||||
const fs_reg &sample_mask)
|
||||
{
|
||||
/* Get the logical send arguments. */
|
||||
const fs_reg &addr = inst->src[0];
|
||||
const fs_reg &src = inst->src[1];
|
||||
const fs_reg &surface = inst->src[2];
|
||||
const fs_reg &dims = inst->src[3];
|
||||
const fs_reg &arg = inst->src[4];
|
||||
|
||||
assert(!"Not implemented");
|
||||
}
|
||||
|
||||
bool
|
||||
fs_visitor::lower_logical_sends()
|
||||
{
|
||||
|
|
@ -3914,6 +3971,42 @@ fs_visitor::lower_logical_sends()
|
|||
lower_sampler_logical_send(ibld, inst, SHADER_OPCODE_TG4_OFFSET);
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL:
|
||||
lower_surface_logical_send(ibld, inst,
|
||||
SHADER_OPCODE_UNTYPED_SURFACE_READ,
|
||||
fs_reg());
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL:
|
||||
lower_surface_logical_send(ibld, inst,
|
||||
SHADER_OPCODE_UNTYPED_SURFACE_WRITE,
|
||||
fs_reg());
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
|
||||
lower_surface_logical_send(ibld, inst,
|
||||
SHADER_OPCODE_UNTYPED_ATOMIC,
|
||||
fs_reg());
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL:
|
||||
lower_surface_logical_send(ibld, inst,
|
||||
SHADER_OPCODE_TYPED_SURFACE_READ,
|
||||
fs_reg());
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL:
|
||||
lower_surface_logical_send(ibld, inst,
|
||||
SHADER_OPCODE_TYPED_SURFACE_WRITE,
|
||||
fs_reg());
|
||||
break;
|
||||
|
||||
case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL:
|
||||
lower_surface_logical_send(ibld, inst,
|
||||
SHADER_OPCODE_TYPED_ATOMIC,
|
||||
fs_reg());
|
||||
break;
|
||||
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -619,16 +619,28 @@ brw_instruction_name(enum opcode op)
|
|||
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC:
|
||||
return "untyped_atomic";
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
|
||||
return "untyped_atomic_logical";
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ:
|
||||
return "untyped_surface_read";
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL:
|
||||
return "untyped_surface_read_logical";
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE:
|
||||
return "untyped_surface_write";
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL:
|
||||
return "untyped_surface_write_logical";
|
||||
case SHADER_OPCODE_TYPED_ATOMIC:
|
||||
return "typed_atomic";
|
||||
case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL:
|
||||
return "typed_atomic_logical";
|
||||
case SHADER_OPCODE_TYPED_SURFACE_READ:
|
||||
return "typed_surface_read";
|
||||
case SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL:
|
||||
return "typed_surface_read_logical";
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
|
||||
return "typed_surface_write";
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL:
|
||||
return "typed_surface_write_logical";
|
||||
case SHADER_OPCODE_MEMORY_FENCE:
|
||||
return "memory_fence";
|
||||
|
||||
|
|
@ -1181,10 +1193,14 @@ backend_instruction::has_side_effects() const
|
|||
{
|
||||
switch (opcode) {
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC:
|
||||
case SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL:
|
||||
case SHADER_OPCODE_GEN4_SCRATCH_WRITE:
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE:
|
||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL:
|
||||
case SHADER_OPCODE_TYPED_ATOMIC:
|
||||
case SHADER_OPCODE_TYPED_ATOMIC_LOGICAL:
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE:
|
||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL:
|
||||
case SHADER_OPCODE_MEMORY_FENCE:
|
||||
case SHADER_OPCODE_URB_WRITE_SIMD8:
|
||||
case FS_OPCODE_FB_WRITE:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue