mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 22:20:09 +01:00
blorp: Add blorp_get_surface_address to the driver interface.
Currently, BLORP expects drivers to provide two functions for dealing with buffers: blorp_emit_reloc and blorp_surface_reloc. Both record a relocation and combine the BO address and offset into a full 64-bit address. Traditionally, blorp_surface_reloc has written that combined address to an implicitly-known buffer where surface states are stored. (In contrast, blorp_emit_reloc returns the value.) The upcoming Iris driver stores surface states in multiple buffers, which makes it impossible for blorp_surface_reloc to write the combined address - it only takes an offset, not the actual buffer to write to. This commit adds a third function, blorp_get_surface_address, which combines and returns an address, which is then passed to ISL's surface state fill functions. Softpin-only drivers can return a real address here and skip writing it in blorp_surface_reloc. Relocation-based drivers are have options. They can simply return 0 from the new function, and continue writing the address from blorp_surface_reloc. Or, they can return a presumed address from blorp_get_surface_address, and have other relocation processing write the real value later. For now, i965 and anv simply return 0. Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
2165636e9c
commit
084a1cdbb7
3 changed files with 27 additions and 0 deletions
|
|
@ -82,6 +82,10 @@ static void
|
|||
blorp_surface_reloc(struct blorp_batch *batch, uint32_t ss_offset,
|
||||
struct blorp_address address, uint32_t delta);
|
||||
|
||||
static uint64_t
|
||||
blorp_get_surface_address(struct blorp_batch *batch,
|
||||
struct blorp_address address);
|
||||
|
||||
#if GEN_GEN >= 7 && GEN_GEN < 10
|
||||
static struct blorp_address
|
||||
blorp_get_surface_base_address(struct blorp_batch *batch);
|
||||
|
|
@ -1363,6 +1367,13 @@ blorp_emit_surface_state(struct blorp_batch *batch,
|
|||
isl_surf_fill_state(batch->blorp->isl_dev, state,
|
||||
.surf = &surf, .view = &surface->view,
|
||||
.aux_surf = &surface->aux_surf, .aux_usage = aux_usage,
|
||||
.address =
|
||||
blorp_get_surface_address(batch, surface->addr),
|
||||
.aux_address = aux_usage == ISL_AUX_USAGE_NONE ? 0 :
|
||||
blorp_get_surface_address(batch, surface->aux_addr),
|
||||
.clear_address = !use_clear_address ? 0 :
|
||||
blorp_get_surface_address(batch,
|
||||
surface->clear_color_addr),
|
||||
.mocs = surface->addr.mocs,
|
||||
.clear_color = surface->clear_color,
|
||||
.use_clear_address = use_clear_address,
|
||||
|
|
|
|||
|
|
@ -70,6 +70,14 @@ blorp_surface_reloc(struct blorp_batch *batch, uint32_t ss_offset,
|
|||
write_reloc(cmd_buffer->device, dest, val, false);
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
blorp_get_surface_address(struct blorp_batch *blorp_batch,
|
||||
struct blorp_address address)
|
||||
{
|
||||
/* We'll let blorp_surface_reloc write the address. */
|
||||
return 0ull;
|
||||
}
|
||||
|
||||
#if GEN_GEN >= 7 && GEN_GEN < 10
|
||||
static struct blorp_address
|
||||
blorp_get_surface_base_address(struct blorp_batch *batch)
|
||||
|
|
|
|||
|
|
@ -94,6 +94,14 @@ blorp_surface_reloc(struct blorp_batch *batch, uint32_t ss_offset,
|
|||
#endif
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
blorp_get_surface_address(struct blorp_batch *blorp_batch,
|
||||
struct blorp_address address)
|
||||
{
|
||||
/* We'll let blorp_surface_reloc write the address. */
|
||||
return 0ull;
|
||||
}
|
||||
|
||||
#if GEN_GEN >= 7 && GEN_GEN < 10
|
||||
static struct blorp_address
|
||||
blorp_get_surface_base_address(struct blorp_batch *batch)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue