v3d: implement geometry shader instancing
v2: - Remove unused field uses_iid from v3d_gs_prog_data (Alejandro) Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
This commit is contained in:
@@ -2327,6 +2327,10 @@ ntq_emit_intrinsic(struct v3d_compile *c, nir_intrinsic_instr *instr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case nir_intrinsic_load_invocation_id:
|
||||||
|
ntq_store_dest(c, &instr->dest, 0, vir_IID(c));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Unknown intrinsic: ");
|
fprintf(stderr, "Unknown intrinsic: ");
|
||||||
nir_print_instr(&instr->instr, stderr);
|
nir_print_instr(&instr->instr, stderr);
|
||||||
|
@@ -718,6 +718,9 @@ struct v3d_gs_prog_data {
|
|||||||
|
|
||||||
/* Output primitive type */
|
/* Output primitive type */
|
||||||
uint8_t out_prim_type;
|
uint8_t out_prim_type;
|
||||||
|
|
||||||
|
/* Number of GS invocations */
|
||||||
|
uint8_t num_invocations;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct v3d_fs_prog_data {
|
struct v3d_fs_prog_data {
|
||||||
@@ -1037,6 +1040,7 @@ VIR_A_ALU2(LDVPMG_IN)
|
|||||||
VIR_A_ALU2(LDVPMG_OUT)
|
VIR_A_ALU2(LDVPMG_OUT)
|
||||||
VIR_A_ALU0(TMUWT)
|
VIR_A_ALU0(TMUWT)
|
||||||
|
|
||||||
|
VIR_A_ALU0(IID)
|
||||||
VIR_A_ALU0(FXCD)
|
VIR_A_ALU0(FXCD)
|
||||||
VIR_A_ALU0(XCD)
|
VIR_A_ALU0(XCD)
|
||||||
VIR_A_ALU0(FYCD)
|
VIR_A_ALU0(FYCD)
|
||||||
|
@@ -681,6 +681,7 @@ v3d_gs_set_prog_data(struct v3d_compile *c,
|
|||||||
prog_data->vpm_output_size = align(c->vpm_output_size, 8) / 8;
|
prog_data->vpm_output_size = align(c->vpm_output_size, 8) / 8;
|
||||||
|
|
||||||
prog_data->out_prim_type = c->s->info.gs.output_primitive;
|
prog_data->out_prim_type = c->s->info.gs.output_primitive;
|
||||||
|
prog_data->num_invocations = c->s->info.gs.invocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -377,7 +377,8 @@ v3d_gs_output_primitive(uint32_t prim_type)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
v3d_emit_tes_gs_common_params(struct v3d_job *job,
|
v3d_emit_tes_gs_common_params(struct v3d_job *job,
|
||||||
uint8_t gs_out_prim_type)
|
uint8_t gs_out_prim_type,
|
||||||
|
uint8_t gs_num_invocations)
|
||||||
{
|
{
|
||||||
/* This, and v3d_emit_tes_gs_shader_params below, fill in default
|
/* This, and v3d_emit_tes_gs_shader_params below, fill in default
|
||||||
* values for tessellation fields even though we don't support
|
* values for tessellation fields even though we don't support
|
||||||
@@ -393,7 +394,7 @@ v3d_emit_tes_gs_common_params(struct v3d_job *job,
|
|||||||
|
|
||||||
shader.geometry_shader_output_format =
|
shader.geometry_shader_output_format =
|
||||||
v3d_gs_output_primitive(gs_out_prim_type);
|
v3d_gs_output_primitive(gs_out_prim_type);
|
||||||
shader.geometry_shader_instances = 1; /* FIXME */
|
shader.geometry_shader_instances = gs_num_invocations & 0x1F;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,7 +507,9 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d,
|
|||||||
struct v3d_gs_prog_data *gs = v3d->prog.gs->prog_data.gs;
|
struct v3d_gs_prog_data *gs = v3d->prog.gs->prog_data.gs;
|
||||||
struct v3d_gs_prog_data *gs_bin = v3d->prog.gs_bin->prog_data.gs;
|
struct v3d_gs_prog_data *gs_bin = v3d->prog.gs_bin->prog_data.gs;
|
||||||
|
|
||||||
v3d_emit_tes_gs_common_params(v3d->job, gs->out_prim_type);
|
v3d_emit_tes_gs_common_params(v3d->job,
|
||||||
|
gs->out_prim_type,
|
||||||
|
gs->num_invocations);
|
||||||
v3d_emit_tes_gs_shader_params(v3d->job, gs_bin);
|
v3d_emit_tes_gs_shader_params(v3d->job, gs_bin);
|
||||||
v3d_emit_tes_gs_shader_params(v3d->job, gs);
|
v3d_emit_tes_gs_shader_params(v3d->job, gs);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user