summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-07-30 13:44:40 -0700
committerEric Anholt <[email protected]>2018-07-30 14:29:01 -0700
commite146e3a795ecd070679b8dfd1ad7f370e9ec5665 (patch)
treedb232dd04f29139c301fc6d2bd4804d4ce970266 /src
parent9039cf70fa0b785f390c649486e12d6c10e9142b (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/v3d/v3d_cl.h9
-rw-r--r--src/gallium/drivers/v3d/v3d_context.h17
-rw-r--r--src/gallium/drivers/v3d/v3dx_emit.c20
-rw-r--r--src/gallium/drivers/v3d/v3dx_state.c21
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;