asahi: Defer viewport pack
Nontrivial interaction between viewport state and scissor state, so defer until draw time to deal with it. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11084>
This commit is contained in:
parent
f99f7e70d7
commit
b659c53f95
|
@ -431,8 +431,14 @@ agx_set_viewport_states(struct pipe_context *pctx,
|
||||||
assert(start_slot == 0 && "no geometry shaders");
|
assert(start_slot == 0 && "no geometry shaders");
|
||||||
assert(num_viewports == 1 && "no geometry shaders");
|
assert(num_viewports == 1 && "no geometry shaders");
|
||||||
|
|
||||||
if (!vp)
|
ctx->viewport = *vp;
|
||||||
return;
|
}
|
||||||
|
|
||||||
|
static uint64_t
|
||||||
|
agx_upload_viewport(struct agx_pool *pool,
|
||||||
|
const struct pipe_viewport_state *vp)
|
||||||
|
{
|
||||||
|
struct agx_ptr T = agx_pool_alloc_aligned(pool, AGX_VIEWPORT_LENGTH, 64);
|
||||||
|
|
||||||
float vp_minx = vp->translate[0] - fabsf(vp->scale[0]);
|
float vp_minx = vp->translate[0] - fabsf(vp->scale[0]);
|
||||||
float vp_maxx = vp->translate[0] + fabsf(vp->scale[0]);
|
float vp_maxx = vp->translate[0] + fabsf(vp->scale[0]);
|
||||||
|
@ -442,7 +448,7 @@ agx_set_viewport_states(struct pipe_context *pctx,
|
||||||
float near_z, far_z;
|
float near_z, far_z;
|
||||||
util_viewport_zmin_zmax(vp, false, &near_z, &far_z);
|
util_viewport_zmin_zmax(vp, false, &near_z, &far_z);
|
||||||
|
|
||||||
agx_pack(ctx->viewport, VIEWPORT, cfg) {
|
agx_pack(T.cpu, VIEWPORT, cfg) {
|
||||||
cfg.min_tile_x = vp_minx / 32;
|
cfg.min_tile_x = vp_minx / 32;
|
||||||
cfg.min_tile_y = vp_miny / 32;
|
cfg.min_tile_y = vp_miny / 32;
|
||||||
cfg.max_tile_x = MAX2(ceilf(vp_maxx / 32.0), 1.0);
|
cfg.max_tile_x = MAX2(ceilf(vp_maxx / 32.0), 1.0);
|
||||||
|
@ -456,6 +462,8 @@ agx_set_viewport_states(struct pipe_context *pctx,
|
||||||
cfg.near_z = near_z;
|
cfg.near_z = near_z;
|
||||||
cfg.z_range = far_z - near_z;
|
cfg.z_range = far_z - near_z;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return T.gpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A framebuffer state can be reused across batches, so it doesn't make sense
|
/* A framebuffer state can be reused across batches, so it doesn't make sense
|
||||||
|
@ -1115,7 +1123,7 @@ agx_encode_state(struct agx_context *ctx, uint8_t *out,
|
||||||
agx_push_record(&out, 4, demo_linkage(ctx->vs, pool));
|
agx_push_record(&out, 4, demo_linkage(ctx->vs, pool));
|
||||||
agx_push_record(&out, 7, demo_rasterizer(ctx, pool));
|
agx_push_record(&out, 7, demo_rasterizer(ctx, pool));
|
||||||
agx_push_record(&out, 5, demo_unk11(pool, is_lines, reads_tib));
|
agx_push_record(&out, 5, demo_unk11(pool, is_lines, reads_tib));
|
||||||
agx_push_record(&out, 10, agx_pool_upload(pool, ctx->viewport, sizeof(ctx->viewport)));
|
agx_push_record(&out, 10, agx_upload_viewport(pool, &ctx->viewport));
|
||||||
agx_push_record(&out, 3, demo_unk12(pool));
|
agx_push_record(&out, 3, demo_unk12(pool));
|
||||||
agx_push_record(&out, 2, agx_pool_upload(pool, ctx->rast->cull, sizeof(ctx->rast->cull)));
|
agx_push_record(&out, 2, agx_pool_upload(pool, ctx->rast->cull, sizeof(ctx->rast->cull)));
|
||||||
agx_push_record(&out, 2, demo_unk14(pool));
|
agx_push_record(&out, 2, demo_unk14(pool));
|
||||||
|
|
|
@ -132,8 +132,8 @@ struct agx_context {
|
||||||
struct agx_zsa zs;
|
struct agx_zsa zs;
|
||||||
struct agx_blend *blend;
|
struct agx_blend *blend;
|
||||||
struct pipe_blend_color blend_color;
|
struct pipe_blend_color blend_color;
|
||||||
|
struct pipe_viewport_state viewport;
|
||||||
|
|
||||||
uint8_t viewport[AGX_VIEWPORT_LENGTH];
|
|
||||||
uint8_t render_target[8][AGX_RENDER_TARGET_LENGTH];
|
uint8_t render_target[8][AGX_RENDER_TARGET_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue