{
assert(stage == MESA_SHADER_TESS_EVAL);
- /* R0: thread header, R1-3: gl_TessCoord.xyz, R4: URB handles */
- payload().num_regs = 5;
+ payload_ = new tes_thread_payload();
emit_nir_code();
fs_reg icp_handle_start;
};
+struct tes_thread_payload : public thread_payload {
+ tes_thread_payload();
+
+ fs_reg patch_urb_input;
+ fs_reg primitive_id;
+ fs_reg coords[3];
+ fs_reg urb_output;
+};
+
struct fs_thread_payload : public thread_payload {
fs_thread_payload(const fs_visitor &v,
bool &source_depth_to_render_target,
return *static_cast<tcs_thread_payload *>(this->payload_);
}
+ tes_thread_payload &tes_payload() {
+ assert(stage == MESA_SHADER_TESS_EVAL);
+ return *static_cast<tes_thread_payload *>(this->payload_);
+ }
+
fs_thread_payload &fs_payload() {
assert(stage == MESA_SHADER_FRAGMENT);
return *static_cast<fs_thread_payload *>(this->payload_);
switch (instr->intrinsic) {
case nir_intrinsic_load_primitive_id:
- bld.MOV(dest, fs_reg(brw_vec1_grf(0, 1)));
+ bld.MOV(dest, tes_payload().primitive_id);
break;
+
case nir_intrinsic_load_tess_coord:
- /* gl_TessCoord is part of the payload in g1-3 */
- for (unsigned i = 0; i < 3; i++) {
- bld.MOV(offset(dest, bld, i), fs_reg(brw_vec8_grf(1 + i, 0)));
- }
+ for (unsigned i = 0; i < 3; i++)
+ bld.MOV(offset(dest, bld, i), tes_payload().coords[i]);
break;
case nir_intrinsic_load_input:
} else {
/* Replicate the patch handle to all enabled channels */
fs_reg srcs[URB_LOGICAL_NUM_SRCS];
- srcs[URB_LOGICAL_SRC_HANDLE] =
- retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UD);
+ srcs[URB_LOGICAL_SRC_HANDLE] = tes_payload().patch_urb_input;
if (first_component != 0) {
unsigned read_components =
unsigned num_components = instr->num_components;
fs_reg srcs[URB_LOGICAL_NUM_SRCS];
- srcs[URB_LOGICAL_SRC_HANDLE] =
- retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UD);
+ srcs[URB_LOGICAL_SRC_HANDLE] = tes_payload().patch_urb_input;
srcs[URB_LOGICAL_SRC_PER_SLOT_OFFSETS] = indirect_offset;
if (first_component != 0) {
}
}
+tes_thread_payload::tes_thread_payload()
+{
+ /* R0: Thread Header. */
+ patch_urb_input = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UD);
+ primitive_id = brw_vec1_grf(0, 1);
+
+ /* R1-3: gl_TessCoord.xyz. */
+ for (unsigned i = 0; i < 3; i++)
+ coords[i] = brw_vec8_grf(1 + i, 0);
+
+ /* R4: URB output handles. */
+ urb_output = retype(brw_vec8_grf(4, 0), BRW_REGISTER_TYPE_UD);
+
+ num_regs = 5;
+}
+
static inline void
setup_fs_payload_gfx6(fs_thread_payload &payload,
const fs_visitor &v,
fs_reg urb_handle;
if (stage == MESA_SHADER_TESS_EVAL)
- urb_handle = fs_reg(retype(brw_vec8_grf(4, 0), BRW_REGISTER_TYPE_UD));
+ urb_handle = tes_payload().urb_output;
else
urb_handle = fs_reg(retype(brw_vec8_grf(1, 0), BRW_REGISTER_TYPE_UD));