X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Fa6xx%2Ffd6_rasterizer.c;h=2225ea0b2eb0b94c422dc9355e39669899be372a;hb=36612c96bd2a354b4c31eeb331d2f4bbad2f210e;hp=26bb567f65ce0dc37b7582e1fe7b019533aa4170;hpb=edc0f1b10f04a4c4ea0f324b3dd95a7c17aebf69;p=mesa.git diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_rasterizer.c b/src/gallium/drivers/freedreno/a6xx/fd6_rasterizer.c index 26bb567f65c..2225ea0b2eb 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_rasterizer.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_rasterizer.c @@ -33,21 +33,15 @@ #include "fd6_rasterizer.h" #include "fd6_context.h" #include "fd6_format.h" +#include "fd6_pack.h" -void * -fd6_rasterizer_state_create(struct pipe_context *pctx, - const struct pipe_rasterizer_state *cso) +struct fd_ringbuffer * +__fd6_setup_rasterizer_stateobj(struct fd_context *ctx, + const struct pipe_rasterizer_state *cso, bool primitive_restart) { - struct fd_context *ctx = fd_context(pctx); - struct fd6_rasterizer_stateobj *so; + struct fd_ringbuffer *ring = fd_ringbuffer_new_object(ctx->pipe, 14 * 4); float psize_min, psize_max; - so = CALLOC_STRUCT(fd6_rasterizer_stateobj); - if (!so) - return NULL; - - so->base = *cso; - if (cso->point_size_per_vertex) { psize_min = util_get_min_point_size(cso); psize_max = 4092; @@ -57,80 +51,60 @@ fd6_rasterizer_state_create(struct pipe_context *pctx, psize_max = cso->point_size; } - so->gras_su_point_minmax = - A6XX_GRAS_SU_POINT_MINMAX_MIN(psize_min) | - A6XX_GRAS_SU_POINT_MINMAX_MAX(psize_max); - so->gras_su_point_size = A6XX_GRAS_SU_POINT_SIZE(cso->point_size); - so->gras_su_poly_offset_scale = - A6XX_GRAS_SU_POLY_OFFSET_SCALE(cso->offset_scale); - so->gras_su_poly_offset_offset = - A6XX_GRAS_SU_POLY_OFFSET_OFFSET(cso->offset_units); - so->gras_su_poly_offset_clamp = - A6XX_GRAS_SU_POLY_OFFSET_OFFSET_CLAMP(cso->offset_clamp); - - so->gras_su_cntl = - A6XX_GRAS_SU_CNTL_LINEHALFWIDTH(cso->line_width/2.0); -#if 0 - so->pc_raster_cntl = - A6XX_PC_RASTER_CNTL_POLYMODE_FRONT_PTYPE(fd_polygon_mode(cso->fill_front)) | - A6XX_PC_RASTER_CNTL_POLYMODE_BACK_PTYPE(fd_polygon_mode(cso->fill_back)); -#endif - -#if 0 - if (cso->fill_front != PIPE_POLYGON_MODE_FILL || - cso->fill_back != PIPE_POLYGON_MODE_FILL) - so->pc_raster_cntl |= A6XX_PC_RASTER_CNTL_POLYMODE_ENABLE; -#endif - - if (cso->cull_face & PIPE_FACE_FRONT) - so->gras_su_cntl |= A6XX_GRAS_SU_CNTL_CULL_FRONT; - if (cso->cull_face & PIPE_FACE_BACK) - so->gras_su_cntl |= A6XX_GRAS_SU_CNTL_CULL_BACK; - if (!cso->front_ccw) - so->gras_su_cntl |= A6XX_GRAS_SU_CNTL_FRONT_CW; - if (cso->offset_tri) - so->gras_su_cntl |= A6XX_GRAS_SU_CNTL_POLY_OFFSET; - - if (!cso->flatshade_first) - so->pc_primitive_cntl |= A6XX_PC_PRIMITIVE_CNTL_0_PROVOKING_VTX_LAST; - -// if (!cso->depth_clip) -// so->gras_cl_clip_cntl |= A6XX_GRAS_CL_CLIP_CNTL_ZNEAR_CLIP_DISABLE | -// A6XX_GRAS_CL_CLIP_CNTL_ZFAR_CLIP_DISABLE; -#if 0 - if (cso->clip_halfz) - so->gras_cl_clip_cntl |= A6XX_GRAS_CL_CNTL_ZERO_GB_SCALE_Z; -#endif - - so->stateobj = fd_ringbuffer_new_object(ctx->pipe, 15 * 4); - struct fd_ringbuffer *ring = so->stateobj; - - OUT_PKT4(ring, REG_A6XX_GRAS_UNKNOWN_8000, 1); - OUT_RING(ring, 0x80); - OUT_PKT4(ring, REG_A6XX_GRAS_UNKNOWN_8001, 1); - OUT_RING(ring, 0x0); - OUT_PKT4(ring, REG_A6XX_GRAS_UNKNOWN_8004, 1); - OUT_RING(ring, 0x0); - - OUT_PKT4(ring, REG_A6XX_GRAS_SU_CNTL, 1); - OUT_RING(ring, so->gras_su_cntl); - - OUT_PKT4(ring, REG_A6XX_GRAS_SU_POINT_MINMAX, 2); - OUT_RING(ring, so->gras_su_point_minmax); - OUT_RING(ring, so->gras_su_point_size); - - OUT_PKT4(ring, REG_A6XX_GRAS_SU_POLY_OFFSET_SCALE, 3); - OUT_RING(ring, so->gras_su_poly_offset_scale); - OUT_RING(ring, so->gras_su_poly_offset_offset); - OUT_RING(ring, so->gras_su_poly_offset_clamp); - -#if 0 - OUT_PKT4(ring, REG_A6XX_PC_RASTER_CNTL, 1); - OUT_RING(ring, so->pc_raster_cntl); - - OUT_PKT4(ring, REG_A6XX_GRAS_CL_CNTL, 1); - OUT_RING(ring, so->gras_cl_clip_cntl); -#endif + OUT_REG(ring, + A6XX_GRAS_CL_CNTL(.vp_clip_code_ignore = 1), + A6XX_GRAS_UNKNOWN_8001()); + + OUT_REG(ring, + A6XX_GRAS_SU_CNTL( + .linehalfwidth = cso->line_width / 2.0, + .poly_offset = cso->offset_tri, + .msaa_enable = cso->multisample, + .cull_front = cso->cull_face & PIPE_FACE_FRONT, + .cull_back = cso->cull_face & PIPE_FACE_BACK, + .front_cw = !cso->front_ccw, + )); + + OUT_REG(ring, + A6XX_GRAS_SU_POINT_MINMAX( + .min = psize_min, + .max = psize_max, + ), + A6XX_GRAS_SU_POINT_SIZE( + cso->point_size + )); + + OUT_REG(ring, + A6XX_GRAS_SU_POLY_OFFSET_SCALE( + cso->offset_scale + ), + A6XX_GRAS_SU_POLY_OFFSET_OFFSET( + cso->offset_units + ), + A6XX_GRAS_SU_POLY_OFFSET_OFFSET_CLAMP( + cso->offset_clamp + )); + + OUT_REG(ring, + A6XX_PC_PRIMITIVE_CNTL_0( + .provoking_vtx_last = !cso->flatshade_first, + .primitive_restart = primitive_restart, + )); + + return ring; +} + +void * +fd6_rasterizer_state_create(struct pipe_context *pctx, + const struct pipe_rasterizer_state *cso) +{ + struct fd6_rasterizer_stateobj *so; + + so = CALLOC_STRUCT(fd6_rasterizer_stateobj); + if (!so) + return NULL; + + so->base = *cso; return so; } @@ -140,7 +114,10 @@ fd6_rasterizer_state_delete(struct pipe_context *pctx, void *hwcso) { struct fd6_rasterizer_stateobj *so = hwcso; - fd_ringbuffer_del(so->stateobj); + for (unsigned i = 0; i < ARRAY_SIZE(so->stateobjs); i++) + if (so->stateobjs[i]) + fd_ringbuffer_del(so->stateobjs[i]); + FREE(hwcso); }