On Monday, April 24, 2017 3:19:21 PM PDT Rafael Antognolli wrote: [snip] > diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c > b/src/mesa/drivers/dri/i965/genX_state_upload.c > index 1b9dedf..0f7a222 100644 > --- a/src/mesa/drivers/dri/i965/genX_state_upload.c > +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c > @@ -28,6 +28,7 @@ > > #include "brw_context.h" > #include "brw_state.h" > +#include "brw_wm.h" > #include "brw_util.h" > > #include "intel_batchbuffer.h" > @@ -39,6 +40,8 @@ > #include "main/stencil.h" > #include "main/transformfeedback.h" > > +#include "compiler/brw_defines_common.h" > + > UNUSED static void * > emit_dwords(struct brw_context *brw, unsigned n) > { > @@ -788,6 +791,189 @@ static const struct brw_tracked_state genX(sf_state) = { > .emit = genX(upload_sf), > }; > > +/* ---------------------------------------------------------------------- */ > + > +static void > +genX(upload_wm)(struct brw_context *brw) > +{ > + struct gl_context *ctx = &brw->ctx; > + > + /* BRW_NEW_FS_PROG_DATA */ > + const struct brw_wm_prog_data *wm_prog_data = > + brw_wm_prog_data(brw->wm.base.prog_data); > +#if GEN_GEN < 8 > + bool writes_depth = wm_prog_data->computed_depth_mode != BRW_PSCDEPTH_OFF; > + /* _NEW_BUFFERS */ > + const bool multisampled_fbo = _mesa_geometric_samples(ctx->DrawBuffer) > > 1; > +#endif
I think you can declare these in the GEN_GEN < 8 block below and save yourself an #if...#endif block. > + > +#if GEN_GEN < 7 > + const struct brw_stage_state *stage_state = &brw->wm.base; > + const bool enable_dual_src_blend = wm_prog_data->dual_src_blend && > + (ctx->Color.BlendEnabled & 1) && > + ctx->Color.Blend[0]._UsesDualSrc; Let's get rid of enable_dual_src_blend and just put the expression in the wm.DualSourceBlendEnable assignment below. Then this whole block is about constant packets, which reads nicely. > + const struct gen_device_info *devinfo = &brw->screen->devinfo; > + > + /* We can't fold this into gen6_upload_wm_push_constants(), because > + * according to the SNB PRM, vol 2 part 1 section 7.2.2 > + * (3DSTATE_CONSTANT_PS [DevSNB]): > + * > + * "[DevSNB]: This packet must be followed by WM_STATE." > + */ > + brw_batch_emit(brw, GENX(3DSTATE_CONSTANT_PS), wmcp) { > + if (wm_prog_data->base.nr_params != 0) { > + wmcp.Buffer0Valid = true; > + /* Pointer to the WM constant buffer. Covered by the set of > + * state flags from gen6_upload_wm_push_constants. > + */ > + wmcp.PointertoPSConstantBuffer0 = stage_state->push_const_offset; > + wmcp.PSConstantBuffer0ReadLength = stage_state->push_const_size - 1; > + } > + } > +#endif > + > + brw_batch_emit(brw, GENX(3DSTATE_WM), wm) { > + wm.StatisticsEnable = true; > + wm.LineAntialiasingRegionWidth = _10pixels; > + wm.LineEndCapAntialiasingRegionWidth = _05pixels; > + > +#if GEN_GEN < 7 > + if (wm_prog_data->base.use_alt_mode) > + wm.FloatingPointMode = Alternate; > + > + wm.SamplerCount |= ALIGN(stage_state->sampler_count, 4) / 4; You want =, not |=. Also, let's use DIV_ROUND_UP: wm.SamplerCount = DIV_ROUND_UP(stage_state->sampler_count, 4); > + wm.BindingTableEntryCount = > wm_prog_data->base.binding_table.size_bytes / 4; > + wm.MaximumNumberofThreads = devinfo->max_wm_threads - 1; > + wm._8PixelDispatchEnable = !!wm_prog_data->dispatch_8; > + wm._16PixelDispatchEnable = !!wm_prog_data->dispatch_16; I don't think you need !! - these are bools, they turn into 0 or 1 automatically. > + wm.DispatchGRFStartRegisterForConstantSetupData0 = > + wm_prog_data->base.dispatch_grf_start_reg; > + wm.DispatchGRFStartRegisterForConstantSetupData2 = > + wm_prog_data->dispatch_grf_start_reg_2; > + wm.KernelStartPointer0 = stage_state->prog_offset; > + wm.KernelStartPointer2 = stage_state->prog_offset + > + wm_prog_data->prog_offset_2; > + wm.DualSourceBlendEnable = enable_dual_src_blend; > + wm.oMaskPresenttoRenderTarget = wm_prog_data->uses_omask; > + wm.NumberofSFOutputAttributes = wm_prog_data->num_varying_inputs; > + > + /* From the SNB PRM, volume 2 part 1, page 281: > + * "If the PS kernel does not need the Position XY Offsets > + * to compute a Position XY value, then this field should be > + * programmed to POSOFFSET_NONE." > + * > + * "SW Recommendation: If the PS kernel needs the Position Offsets > + * to compute a Position XY value, this field should match Position > + * ZW Interpolation Mode to ensure a consistent position.xyzw > + * computation." > + * We only require XY sample offsets. So, this recommendation doesn't > + * look useful at the moment. We might need this in future. > + */ > + if (wm_prog_data->uses_pos_offset) > + wm.PositionXYOffsetSelect = POSOFFSET_SAMPLE; > + else > + wm.PositionXYOffsetSelect = POSOFFSET_NONE; > + > + if (wm_prog_data->base.total_scratch) { > + wm.ScratchSpaceBasePointer = > + render_bo(stage_state->scratch_bo, > + ffs(stage_state->per_thread_scratch) - 11); > + } > + > + wm.PixelShaderComputedDepth = writes_depth; > +#endif > + > +#if GEN_GEN >= 8 > + wm.PointRasterizationRule = RASTRULE_UPPER_RIGHT; > +#endif Let's enable this unconditionally - the fact that we didn't on Gen6-7.5 seems like a bug. I sent a patch to fix that. With those changes, Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev