Просмотр исходного кода

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>
master
Iago Toral Quiroga 7 лет назад
Родитель
Сommit
4f5fbd6490

+ 4
- 0
src/broadcom/compiler/nir_to_vir.c Просмотреть файл

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);

+ 4
- 0
src/broadcom/compiler/v3d_compiler.h Просмотреть файл



/* 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 {
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)

+ 1
- 0
src/broadcom/compiler/vir.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

+ 6
- 3
src/gallium/drivers/v3d/v3dx_draw.c Просмотреть файл



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


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;
} }
} }


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);
} }

Загрузка…
Отмена
Сохранить