From e146e3a795ecd070679b8dfd1ad7f370e9ec5665 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 30 Jul 2018 13:44:40 -0700 Subject: [PATCH] v3d: Move depth offset packet setup to CSO creation time. This should be some simpler memcpying at draw time, and makes the next change easier. --- src/gallium/drivers/v3d/v3d_cl.h | 9 ++++++--- src/gallium/drivers/v3d/v3d_context.h | 17 ++--------------- src/gallium/drivers/v3d/v3dx_emit.c | 20 +++++++++----------- src/gallium/drivers/v3d/v3dx_state.c | 21 +++++++++++++++++---- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/gallium/drivers/v3d/v3d_cl.h b/src/gallium/drivers/v3d/v3d_cl.h index 1f3754f29f5..0b3058f4fdd 100644 --- a/src/gallium/drivers/v3d/v3d_cl.h +++ b/src/gallium/drivers/v3d/v3d_cl.h @@ -243,11 +243,14 @@ cl_get_emit_space(struct v3d_cl_out **cl, size_t size) _loop_terminate = NULL; \ })) \ -#define cl_emit_prepacked(cl, packet) do { \ - memcpy((cl)->next, packet, sizeof(*packet)); \ - cl_advance(&(cl)->next, sizeof(*packet)); \ +#define cl_emit_prepacked_sized(cl, packet, size) do { \ + memcpy((cl)->next, packet, size); \ + cl_advance(&(cl)->next, size); \ } while (0) +#define cl_emit_prepacked(cl, packet) \ + cl_emit_prepacked_sized(cl, packet, sizeof(*(packet))) + #define v3dx_pack(packed, packet, name) \ for (struct cl_packet_struct(packet) name = { \ cl_packet_header(packet) \ diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index b61dacf66c7..f6720e2ca93 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -433,21 +433,8 @@ struct v3d_rasterizer_state { float point_size; - /** - * Half-float (1/8/7 bits) value of polygon offset units for - * VC5_PACKET_DEPTH_OFFSET - */ - uint16_t offset_units; - /** - * The HW treats polygon offset units based on a Z24 buffer, so we - * need to scale up offset_units if we're only Z16. - */ - uint16_t z16_offset_units; - /** - * Half-float (1/8/7 bits) value of polygon offset scale for - * VC5_PACKET_DEPTH_OFFSET - */ - uint16_t offset_factor; + uint8_t depth_offset[9]; + uint8_t depth_offset_z16[9]; }; struct v3d_depth_stencil_alpha_state { diff --git a/src/gallium/drivers/v3d/v3dx_emit.c b/src/gallium/drivers/v3d/v3dx_emit.c index 4402218f404..ee4849a296f 100644 --- a/src/gallium/drivers/v3d/v3dx_emit.c +++ b/src/gallium/drivers/v3d/v3dx_emit.c @@ -522,17 +522,15 @@ v3dX(emit_state)(struct pipe_context *pctx) if (v3d->dirty & VC5_DIRTY_RASTERIZER && v3d->rasterizer->base.offset_tri) { - cl_emit(&job->bcl, DEPTH_OFFSET, depth) { - depth.depth_offset_factor = - v3d->rasterizer->offset_factor; - if (job->zsbuf && - job->zsbuf->format == PIPE_FORMAT_Z16_UNORM) { - depth.depth_offset_units = - v3d->rasterizer->z16_offset_units; - } else { - depth.depth_offset_units = - v3d->rasterizer->offset_units; - } + if (job->zsbuf && + job->zsbuf->format == PIPE_FORMAT_Z16_UNORM) { + cl_emit_prepacked_sized(&job->bcl, + v3d->rasterizer->depth_offset_z16, + cl_packet_length(DEPTH_OFFSET)); + } else { + cl_emit_prepacked_sized(&job->bcl, + v3d->rasterizer->depth_offset, + cl_packet_length(DEPTH_OFFSET)); } } diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 34b845730f6..6ee4a2a835f 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -104,10 +104,23 @@ v3d_create_rasterizer_state(struct pipe_context *pctx, */ so->point_size = MAX2(cso->point_size, .125f); - if (cso->offset_tri) { - so->offset_units = float_to_187_half(cso->offset_units); - so->z16_offset_units = float_to_187_half(cso->offset_units * 256.0); - so->offset_factor = float_to_187_half(cso->offset_scale); + STATIC_ASSERT(sizeof(so->depth_offset) >= + cl_packet_length(DEPTH_OFFSET)); + v3dx_pack(&so->depth_offset, DEPTH_OFFSET, depth) { + depth.depth_offset_factor = + float_to_187_half(cso->offset_scale); + depth.depth_offset_units = + float_to_187_half(cso->offset_units); + } + + /* The HW treats polygon offset units based on a Z24 buffer, so we + * need to scale up offset_units if we're only Z16. + */ + v3dx_pack(&so->depth_offset_z16, DEPTH_OFFSET, depth) { + depth.depth_offset_factor = + float_to_187_half(cso->offset_scale); + depth.depth_offset_units = + float_to_187_half(cso->offset_units * 256.0); } return so; -- 2.30.2