X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fvc4%2Fvc4_emit.c;h=b45ffb75aa99ac6d5f0abe0a74c7f7279a91a0bd;hb=518537d1c8c8958db97bc08bf28182cc9e43921b;hp=8b192da47f29c687d254c878777a548ebb49ca0c;hpb=ce8504d196291452b42ed755ed3830ecb16febcd;p=mesa.git diff --git a/src/gallium/drivers/vc4/vc4_emit.c b/src/gallium/drivers/vc4/vc4_emit.c index 8b192da47f2..b45ffb75aa9 100644 --- a/src/gallium/drivers/vc4/vc4_emit.c +++ b/src/gallium/drivers/vc4/vc4_emit.c @@ -27,8 +27,8 @@ void vc4_emit_state(struct pipe_context *pctx) { struct vc4_context *vc4 = vc4_context(pctx); + struct vc4_job *job = vc4->job; - struct vc4_cl_out *bcl = cl_start(&vc4->bcl); if (vc4->dirty & (VC4_DIRTY_SCISSOR | VC4_DIRTY_VIEWPORT | VC4_DIRTY_RASTERIZER)) { float *vpscale = vc4->viewport.scale; @@ -50,8 +50,8 @@ vc4_emit_state(struct pipe_context *pctx) if (!vc4->rasterizer->base.scissor) { minx = MAX2(vp_minx, 0); miny = MAX2(vp_miny, 0); - maxx = MIN2(vp_maxx, vc4->draw_width); - maxy = MIN2(vp_maxy, vc4->draw_height); + maxx = MIN2(vp_maxx, job->draw_width); + maxy = MIN2(vp_maxy, job->draw_height); } else { minx = MAX2(vp_minx, vc4->scissor.minx); miny = MAX2(vp_miny, vc4->scissor.miny); @@ -59,23 +59,26 @@ vc4_emit_state(struct pipe_context *pctx) maxy = MIN2(vp_maxy, vc4->scissor.maxy); } - cl_u8(&bcl, VC4_PACKET_CLIP_WINDOW); - cl_u16(&bcl, minx); - cl_u16(&bcl, miny); - cl_u16(&bcl, maxx - minx); - cl_u16(&bcl, maxy - miny); + cl_emit(&job->bcl, CLIP_WINDOW, clip) { + clip.clip_window_left_pixel_coordinate = minx; + clip.clip_window_bottom_pixel_coordinate = miny; + clip.clip_window_height_in_pixels = maxy - miny; + clip.clip_window_width_in_pixels = maxx - minx; + } - vc4->draw_min_x = MIN2(vc4->draw_min_x, minx); - vc4->draw_min_y = MIN2(vc4->draw_min_y, miny); - vc4->draw_max_x = MAX2(vc4->draw_max_x, maxx); - vc4->draw_max_y = MAX2(vc4->draw_max_y, maxy); + job->draw_min_x = MIN2(job->draw_min_x, minx); + job->draw_min_y = MIN2(job->draw_min_y, miny); + job->draw_max_x = MAX2(job->draw_max_x, maxx); + job->draw_max_y = MAX2(job->draw_max_y, maxy); } if (vc4->dirty & (VC4_DIRTY_RASTERIZER | VC4_DIRTY_ZSA | VC4_DIRTY_COMPILED_FS)) { uint8_t ez_enable_mask_out = ~0; + uint8_t rasosm_mask_out = ~0; + struct vc4_cl_out *bcl = cl_start(&job->bcl); /* HW-2905: If the RCL ends up doing a full-res load when * multisampling, then early Z tracking may end up with values * from the previous tile due to a HW bug. Disable it to @@ -85,52 +88,64 @@ vc4_emit_state(struct pipe_context *pctx) * was seeing bad rendering on glxgears -samples 4 even in * that case. */ - if (vc4->msaa || vc4->prog.fs->disable_early_z) + if (job->msaa || vc4->prog.fs->disable_early_z) ez_enable_mask_out &= ~VC4_CONFIG_BITS_EARLY_Z; + /* Don't set the rasterizer to oversample if we're doing our + * binning and load/stores in single-sample mode. This is for + * the samples == 1 case, where vc4 doesn't do any + * multisampling behavior. + */ + if (!job->msaa) { + rasosm_mask_out &= + ~VC4_CONFIG_BITS_RASTERIZER_OVERSAMPLE_4X; + } + cl_u8(&bcl, VC4_PACKET_CONFIGURATION_BITS); cl_u8(&bcl, - vc4->rasterizer->config_bits[0] | - vc4->zsa->config_bits[0]); + (vc4->rasterizer->config_bits[0] | + vc4->zsa->config_bits[0]) & rasosm_mask_out); cl_u8(&bcl, vc4->rasterizer->config_bits[1] | vc4->zsa->config_bits[1]); cl_u8(&bcl, (vc4->rasterizer->config_bits[2] | vc4->zsa->config_bits[2]) & ez_enable_mask_out); + cl_end(&job->bcl, bcl); } if (vc4->dirty & VC4_DIRTY_RASTERIZER) { - cl_u8(&bcl, VC4_PACKET_DEPTH_OFFSET); - cl_u16(&bcl, vc4->rasterizer->offset_factor); - cl_u16(&bcl, vc4->rasterizer->offset_units); - - cl_u8(&bcl, VC4_PACKET_POINT_SIZE); - cl_f(&bcl, vc4->rasterizer->point_size); - - cl_u8(&bcl, VC4_PACKET_LINE_WIDTH); - cl_f(&bcl, vc4->rasterizer->base.line_width); + cl_emit_prepacked(&job->bcl, &vc4->rasterizer->packed); } if (vc4->dirty & VC4_DIRTY_VIEWPORT) { - cl_u8(&bcl, VC4_PACKET_CLIPPER_XY_SCALING); - cl_f(&bcl, vc4->viewport.scale[0] * 16.0f); - cl_f(&bcl, vc4->viewport.scale[1] * 16.0f); + cl_emit(&job->bcl, CLIPPER_XY_SCALING, clip) { + clip.viewport_half_width_in_1_16th_of_pixel = + vc4->viewport.scale[0] * 16.0f; + clip.viewport_half_height_in_1_16th_of_pixel = + vc4->viewport.scale[1] * 16.0f; + } - cl_u8(&bcl, VC4_PACKET_CLIPPER_Z_SCALING); - cl_f(&bcl, vc4->viewport.translate[2]); - cl_f(&bcl, vc4->viewport.scale[2]); + cl_emit(&job->bcl, CLIPPER_Z_SCALE_AND_OFFSET, clip) { + clip.viewport_z_offset_zc_to_zs = + vc4->viewport.translate[2]; + clip.viewport_z_scale_zc_to_zs = + vc4->viewport.scale[2]; + } - cl_u8(&bcl, VC4_PACKET_VIEWPORT_OFFSET); - cl_u16(&bcl, 16 * vc4->viewport.translate[0]); - cl_u16(&bcl, 16 * vc4->viewport.translate[1]); + cl_emit(&job->bcl, VIEWPORT_OFFSET, vp) { + vp.viewport_centre_x_coordinate = + vc4->viewport.translate[0]; + vp.viewport_centre_y_coordinate = + vc4->viewport.translate[1]; + } } if (vc4->dirty & VC4_DIRTY_FLAT_SHADE_FLAGS) { - cl_u8(&bcl, VC4_PACKET_FLAT_SHADE_FLAGS); - cl_u32(&bcl, vc4->rasterizer->base.flatshade ? - vc4->prog.fs->color_inputs : 0); + cl_emit(&job->bcl, FLAT_SHADE_FLAGS, flags) { + if (vc4->rasterizer->base.flatshade) + flags.flat_shading_flags = + vc4->prog.fs->color_inputs; + } } - - cl_end(&vc4->bcl, bcl); }