iris: Refactor code to share 3DSTATE_URB_* packet
v2: 1) Set IRIS_DIRTY_URB bit (Caio) 2) Get rid of unnecessary function (Caio) Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com> Suggested-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
6e3d3f5b2c
commit
d0a8fba69a
|
@ -246,26 +246,11 @@ blorp_emit_urb_config(struct blorp_batch *blorp_batch,
|
||||||
{
|
{
|
||||||
struct iris_context *ice = blorp_batch->blorp->driver_ctx;
|
struct iris_context *ice = blorp_batch->blorp->driver_ctx;
|
||||||
struct iris_batch *batch = blorp_batch->driver_batch;
|
struct iris_batch *batch = blorp_batch->driver_batch;
|
||||||
const struct gen_device_info *devinfo = &batch->screen->devinfo;
|
|
||||||
|
|
||||||
// XXX: Track last URB config and avoid re-emitting it if it's good enough
|
|
||||||
const unsigned push_size_kB = 32;
|
|
||||||
unsigned entries[4];
|
|
||||||
unsigned start[4];
|
|
||||||
unsigned size[4] = { vs_entry_size, 1, 1, 1 };
|
unsigned size[4] = { vs_entry_size, 1, 1, 1 };
|
||||||
|
|
||||||
gen_get_urb_config(devinfo, 1024 * push_size_kB,
|
genX(emit_urb_setup)(ice, batch, size, false, false);
|
||||||
1024 * ice->shaders.urb_size,
|
ice->state.dirty |= IRIS_DIRTY_URB;
|
||||||
false, false, size, entries, start);
|
|
||||||
|
|
||||||
for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
|
|
||||||
blorp_emit(blorp_batch, GENX(3DSTATE_URB_VS), urb) {
|
|
||||||
urb._3DCommandSubOpcode += i;
|
|
||||||
urb.VSURBStartingAddress = start[i];
|
|
||||||
urb.VSURBEntryAllocationSize = size[i] - 1;
|
|
||||||
urb.VSNumberofURBEntries = entries[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -711,6 +711,22 @@ void gen8_init_state(struct iris_context *ice);
|
||||||
void gen9_init_state(struct iris_context *ice);
|
void gen9_init_state(struct iris_context *ice);
|
||||||
void gen10_init_state(struct iris_context *ice);
|
void gen10_init_state(struct iris_context *ice);
|
||||||
void gen11_init_state(struct iris_context *ice);
|
void gen11_init_state(struct iris_context *ice);
|
||||||
|
void gen8_emit_urb_setup(struct iris_context *ice,
|
||||||
|
struct iris_batch *batch,
|
||||||
|
const unsigned size[4],
|
||||||
|
bool tess_present, bool gs_present);
|
||||||
|
void gen9_emit_urb_setup(struct iris_context *ice,
|
||||||
|
struct iris_batch *batch,
|
||||||
|
const unsigned size[4],
|
||||||
|
bool tess_present, bool gs_present);
|
||||||
|
void gen10_emit_urb_setup(struct iris_context *ice,
|
||||||
|
struct iris_batch *batch,
|
||||||
|
const unsigned size[4],
|
||||||
|
bool tess_present, bool gs_present);
|
||||||
|
void gen11_emit_urb_setup(struct iris_context *ice,
|
||||||
|
struct iris_batch *batch,
|
||||||
|
const unsigned size[4],
|
||||||
|
bool tess_present, bool gs_present);
|
||||||
|
|
||||||
/* iris_program.c */
|
/* iris_program.c */
|
||||||
const struct shader_info *iris_get_shader_info(const struct iris_context *ice,
|
const struct shader_info *iris_get_shader_info(const struct iris_context *ice,
|
||||||
|
|
|
@ -3670,47 +3670,6 @@ iris_store_derived_program_state(struct iris_context *ice,
|
||||||
|
|
||||||
/* ------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------- */
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure the URB.
|
|
||||||
*
|
|
||||||
* XXX: write a real comment.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
iris_upload_urb_config(struct iris_context *ice, struct iris_batch *batch)
|
|
||||||
{
|
|
||||||
const struct gen_device_info *devinfo = &batch->screen->devinfo;
|
|
||||||
const unsigned push_size_kB = 32;
|
|
||||||
unsigned entries[4];
|
|
||||||
unsigned start[4];
|
|
||||||
unsigned size[4];
|
|
||||||
|
|
||||||
for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
|
|
||||||
if (!ice->shaders.prog[i]) {
|
|
||||||
size[i] = 1;
|
|
||||||
} else {
|
|
||||||
struct brw_vue_prog_data *vue_prog_data =
|
|
||||||
(void *) ice->shaders.prog[i]->prog_data;
|
|
||||||
size[i] = vue_prog_data->urb_entry_size;
|
|
||||||
}
|
|
||||||
assert(size[i] != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
gen_get_urb_config(devinfo, 1024 * push_size_kB,
|
|
||||||
1024 * ice->shaders.urb_size,
|
|
||||||
ice->shaders.prog[MESA_SHADER_TESS_EVAL] != NULL,
|
|
||||||
ice->shaders.prog[MESA_SHADER_GEOMETRY] != NULL,
|
|
||||||
size, entries, start);
|
|
||||||
|
|
||||||
for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
|
|
||||||
iris_emit_cmd(batch, GENX(3DSTATE_URB_VS), urb) {
|
|
||||||
urb._3DCommandSubOpcode += i;
|
|
||||||
urb.VSURBStartingAddress = start[i];
|
|
||||||
urb.VSURBEntryAllocationSize = size[i] - 1;
|
|
||||||
urb.VSNumberofURBEntries = entries[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const uint32_t push_constant_opcodes[] = {
|
static const uint32_t push_constant_opcodes[] = {
|
||||||
[MESA_SHADER_VERTEX] = 21,
|
[MESA_SHADER_VERTEX] = 21,
|
||||||
[MESA_SHADER_TESS_CTRL] = 25, /* HS */
|
[MESA_SHADER_TESS_CTRL] = 25, /* HS */
|
||||||
|
@ -4309,7 +4268,22 @@ iris_upload_dirty_render_state(struct iris_context *ice,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dirty & IRIS_DIRTY_URB) {
|
if (dirty & IRIS_DIRTY_URB) {
|
||||||
iris_upload_urb_config(ice, batch);
|
unsigned size[4];
|
||||||
|
|
||||||
|
for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
|
||||||
|
if (!ice->shaders.prog[i]) {
|
||||||
|
size[i] = 1;
|
||||||
|
} else {
|
||||||
|
struct brw_vue_prog_data *vue_prog_data =
|
||||||
|
(void *) ice->shaders.prog[i]->prog_data;
|
||||||
|
size[i] = vue_prog_data->urb_entry_size;
|
||||||
|
}
|
||||||
|
assert(size[i] != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
genX(emit_urb_setup)(ice, batch, size,
|
||||||
|
ice->shaders.prog[MESA_SHADER_TESS_EVAL] != NULL,
|
||||||
|
ice->shaders.prog[MESA_SHADER_GEOMETRY] != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dirty & IRIS_DIRTY_BLEND_STATE) {
|
if (dirty & IRIS_DIRTY_BLEND_STATE) {
|
||||||
|
@ -5881,6 +5855,32 @@ iris_emit_raw_pipe_control(struct iris_batch *batch, uint32_t flags,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
genX(emit_urb_setup)(struct iris_context *ice,
|
||||||
|
struct iris_batch *batch,
|
||||||
|
const unsigned size[4],
|
||||||
|
bool tess_present, bool gs_present)
|
||||||
|
{
|
||||||
|
const struct gen_device_info *devinfo = &batch->screen->devinfo;
|
||||||
|
const unsigned push_size_kB = 32;
|
||||||
|
unsigned entries[4];
|
||||||
|
unsigned start[4];
|
||||||
|
|
||||||
|
gen_get_urb_config(devinfo, 1024 * push_size_kB,
|
||||||
|
1024 * ice->shaders.urb_size,
|
||||||
|
tess_present, gs_present,
|
||||||
|
size, entries, start);
|
||||||
|
|
||||||
|
for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
|
||||||
|
iris_emit_cmd(batch, GENX(3DSTATE_URB_VS), urb) {
|
||||||
|
urb._3DCommandSubOpcode += i;
|
||||||
|
urb.VSURBStartingAddress = start[i];
|
||||||
|
urb.VSURBEntryAllocationSize = size[i] - 1;
|
||||||
|
urb.VSNumberofURBEntries = entries[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
genX(init_state)(struct iris_context *ice)
|
genX(init_state)(struct iris_context *ice)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue