mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 15:10:10 +01:00
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.
This commit is contained in:
parent
9039cf70fa
commit
e146e3a795
4 changed files with 34 additions and 33 deletions
|
|
@ -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) \
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue