From 190bde39697c2f596ce35129426e1ecbd4274c94 Mon Sep 17 00:00:00 2001 From: Sagar Ghuge Date: Thu, 21 Sep 2023 22:01:43 -0700 Subject: [PATCH] iris: Use 3DSTATE_URB_ALLOC_* instructions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use 3DSTATE_URB_ALLOC_* instruction to program URB for multislice device config. In case only one slice is available in the device, SliceN fields will be ignored by HW. Signed-off-by: Sagar Ghuge Reviewed-by: José Roberto de Souza Part-of: --- src/gallium/drivers/iris/iris_state.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 846a99ae6c3..317a492d853 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -902,12 +902,23 @@ genX(emit_urb_config)(struct iris_batch *batch, genX(urb_workaround)(batch, &ice->shaders.urb.cfg); for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) { +#if GFX_VER >= 12 + iris_emit_cmd(batch, GENX(3DSTATE_URB_ALLOC_VS), urb) { + urb._3DCommandSubOpcode += i; + urb.VSURBEntryAllocationSize = ice->shaders.urb.cfg.size[i] - 1; + urb.VSURBStartingAddressSlice0 = ice->shaders.urb.cfg.start[i]; + urb.VSURBStartingAddressSliceN = ice->shaders.urb.cfg.start[i]; + urb.VSNumberofURBEntriesSlice0 = ice->shaders.urb.cfg.entries[i]; + urb.VSNumberofURBEntriesSliceN = ice->shaders.urb.cfg.entries[i]; + } +#else iris_emit_cmd(batch, GENX(3DSTATE_URB_VS), urb) { urb._3DCommandSubOpcode += i; urb.VSURBStartingAddress = ice->shaders.urb.cfg.start[i]; urb.VSURBEntryAllocationSize = ice->shaders.urb.cfg.size[i] - 1; urb.VSNumberofURBEntries = ice->shaders.urb.cfg.entries[i]; } +#endif } } @@ -8360,6 +8371,19 @@ genX(urb_workaround)(struct iris_batch *batch, MESA_SHADER_TESS_EVAL) && batch->ice->shaders.last_urb.size[0] != 0) { for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) { +#if GFX_VER >= 12 + iris_emit_cmd(batch, GENX(3DSTATE_URB_ALLOC_VS), urb) { + urb._3DCommandSubOpcode += i; + urb.VSURBEntryAllocationSize = + batch->ice->shaders.last_urb.size[i] - 1; + urb.VSURBStartingAddressSlice0 = + batch->ice->shaders.last_urb.start[i]; + urb.VSURBStartingAddressSliceN = + batch->ice->shaders.last_urb.start[i]; + urb.VSNumberofURBEntriesSlice0 = i == 0 ? 256 : 0; + urb.VSNumberofURBEntriesSliceN = i == 0 ? 256 : 0; + } +#else iris_emit_cmd(batch, GENX(3DSTATE_URB_VS), urb) { urb._3DCommandSubOpcode += i; urb.VSURBStartingAddress = @@ -8368,6 +8392,7 @@ genX(urb_workaround)(struct iris_batch *batch, batch->ice->shaders.last_urb.size[i] - 1; urb.VSNumberofURBEntries = i == 0 ? 256 : 0; } +#endif } iris_emit_cmd(batch, GENX(PIPE_CONTROL), pc) { pc.HDCPipelineFlushEnable = true;