asahi: Identify partial render pipeline

Needed if a partial render is incurred from overflowing the parameter
buffer (too much geometry).

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16512>
This commit is contained in:
Alyssa Rosenzweig 2022-05-08 21:03:31 -04:00
parent 65500b19df
commit 6e59474ced
5 changed files with 37 additions and 37 deletions

View File

@ -631,12 +631,12 @@
<field name="Unk 4" start="7:0" size="32" type="hex" default="0xffffffff"/>
<field name="Unk 5" start="8:0" size="32" type="hex" default="0xffffffff"/>
<field name="Visibility result buffer" start="10:0" size="64" type="address"/>
<field name="Depth clear pipeline bind" start="20:0" size="32" type="hex"/>
<field name="Depth clear pipeline unk" start="22:0" size="4" default="4" type="hex"/>
<field name="Depth clear pipeline" start="22:4" size="28" type="address" modifier="shr(4)"/>
<field name="Depth store pipeline bind" start="28:0" size="32" type="hex"/>
<field name="Depth store pipeline unk" start="30:0" size="4" default="4" type="hex"/>
<field name="Depth store pipeline" start="30:4" size="28" type="address" modifier="shr(4)"/>
<field name="Partial reload pipeline bind" start="20:0" size="32" type="hex"/>
<field name="Partial reload pipeline unk" start="22:0" size="4" default="4" type="hex"/>
<field name="Partial reload pipeline" start="22:4" size="28" type="address" modifier="shr(4)"/>
<field name="Partial store pipeline bind" start="28:0" size="32" type="hex"/>
<field name="Partial store pipeline unk" start="30:0" size="4" default="4" type="hex"/>
<field name="Partial store pipeline" start="30:4" size="28" type="address" modifier="shr(4)"/>
</struct>
<struct name="IOGPU Misc" size="288">

View File

@ -493,15 +493,15 @@ agxdecode_cmdstream(unsigned cmdbuf_handle, unsigned map_handle, bool verbose)
agxdecode_pipeline, verbose);
}
assert((clearzs.depth_clear_pipeline_unk & 0xF) == 0x4);
if (clearzs.depth_clear_pipeline) {
agxdecode_stateful(clearzs.depth_clear_pipeline,
"Depth clear pipeline", agxdecode_pipeline, verbose);
assert((clearzs.partial_reload_pipeline_unk & 0xF) == 0x4);
if (clearzs.partial_reload_pipeline) {
agxdecode_stateful(clearzs.partial_reload_pipeline,
"Partial reload pipeline", agxdecode_pipeline, verbose);
}
if (clearzs.depth_store_pipeline) {
agxdecode_stateful(clearzs.depth_store_pipeline,
"Depth store pipeline", agxdecode_pipeline, verbose);
if (clearzs.partial_store_pipeline) {
agxdecode_stateful(clearzs.partial_store_pipeline,
"Partial store pipeline", agxdecode_pipeline, verbose);
}
agxdecode_map_read_write();

View File

@ -434,32 +434,34 @@ agx_flush(struct pipe_context *pctx,
memcpy(ctx->batch->encoder_current, stop, sizeof(stop));
/* Emit the commandbuffer */
uint64_t pipeline_clear = 0;
uint64_t pipeline_clear = 0, pipeline_reload = 0;
bool clear_pipeline_textures = false;
struct agx_device *dev = agx_device(pctx->screen);
if ((ctx->batch->clear & PIPE_CLEAR_COLOR0) || !ctx->batch->cbufs[0]) {
uint16_t clear_colour[4] = {
_mesa_float_to_half(ctx->batch->clear_color[0]),
_mesa_float_to_half(ctx->batch->clear_color[1]),
_mesa_float_to_half(ctx->batch->clear_color[2]),
_mesa_float_to_half(ctx->batch->clear_color[3])
};
uint16_t clear_colour[4] = {
_mesa_float_to_half(ctx->batch->clear_color[0]),
_mesa_float_to_half(ctx->batch->clear_color[1]),
_mesa_float_to_half(ctx->batch->clear_color[2]),
_mesa_float_to_half(ctx->batch->clear_color[3])
};
pipeline_clear = agx_build_clear_pipeline(ctx,
dev->internal.clear,
agx_pool_upload(&ctx->batch->pool, clear_colour, sizeof(clear_colour)));
pipeline_clear = agx_build_clear_pipeline(ctx,
dev->internal.clear,
agx_pool_upload(&ctx->batch->pool, clear_colour, sizeof(clear_colour)));
} else {
if (ctx->batch->cbufs[0]) {
enum pipe_format fmt = ctx->batch->cbufs[0]->format;
enum agx_format internal = agx_pixel_format[fmt].internal;
uint32_t shader = dev->reload.format[internal];
pipeline_clear = agx_build_reload_pipeline(ctx, shader,
pipeline_reload = agx_build_reload_pipeline(ctx, shader,
ctx->batch->cbufs[0]);
}
if (ctx->batch->cbufs[0] && !(ctx->batch->clear & PIPE_CLEAR_COLOR0)) {
clear_pipeline_textures = true;
pipeline_clear = pipeline_reload;
}
uint64_t pipeline_store = 0;
@ -472,10 +474,6 @@ agx_flush(struct pipe_context *pctx,
}
/* Pipelines must 64 aligned */
struct agx_ptr pipeline_null =
agx_pool_alloc_aligned(&ctx->batch->pipeline_pool, 64, 64);
memset(pipeline_null.cpu, 0, 64);
for (unsigned i = 0; i < ctx->batch->nr_cbufs; ++i) {
struct agx_resource *rt = agx_resource(ctx->batch->cbufs[i]->texture);
BITSET_SET(rt->data_valid, 0);
@ -554,8 +552,8 @@ agx_flush(struct pipe_context *pctx,
encoder_id,
ctx->batch->scissor.bo->ptr.gpu,
ctx->batch->depth_bias.bo->ptr.gpu,
pipeline_null.gpu,
pipeline_clear,
pipeline_reload,
pipeline_store,
clear_pipeline_textures,
ctx->batch->clear_depth,

View File

@ -163,8 +163,8 @@ demo_cmdbuf(uint64_t *buf, size_t size,
uint64_t encoder_id,
uint64_t scissor_ptr,
uint64_t depth_bias_ptr,
uint32_t pipeline_null,
uint32_t pipeline_clear,
uint32_t pipeline_load,
uint32_t pipeline_store,
bool clear_pipeline_textures,
double clear_depth,
@ -185,6 +185,8 @@ demo_cmdbuf(uint64_t *buf, size_t size,
agx_pack(map + 160, IOGPU_INTERNAL_PIPELINES, cfg) {
cfg.clear_pipeline_bind = 0xffff8002 | (clear_pipeline_textures ? 0x210 : 0);
cfg.clear_pipeline = pipeline_clear;
/* store pipeline used when entire frame completes */
cfg.store_pipeline_bind = 0x12;
cfg.store_pipeline = pipeline_store;
cfg.scissor_array = scissor_ptr;
@ -230,11 +232,11 @@ demo_cmdbuf(uint64_t *buf, size_t size,
cfg.depth_clear_value = fui(clear_depth);
cfg.stencil_clear_value = clear_stencil;
cfg.depth_clear_pipeline_bind = 0xffff8002 | (clear_pipeline_textures ? 0x210 : 0);
cfg.depth_clear_pipeline = pipeline_null;
cfg.partial_reload_pipeline_bind = 0xffff8212;
cfg.partial_reload_pipeline = pipeline_load;
cfg.depth_store_pipeline_bind = 0x12;
cfg.depth_store_pipeline = pipeline_store;
cfg.partial_store_pipeline_bind = 0x12;
cfg.partial_store_pipeline = pipeline_store;
}
agx_pack(map + 356, IOGPU_MISC, cfg) {

View File

@ -32,8 +32,8 @@ demo_cmdbuf(uint64_t *buf, size_t size,
uint64_t encoder_id,
uint64_t scissor_ptr,
uint64_t depth_bias_ptr,
uint32_t pipeline_null,
uint32_t pipeline_clear,
uint32_t pipeline_load,
uint32_t pipeline_store,
bool clear_pipeline_textures,
double clear_depth,