On Wed, Jan 24, 2018 at 12:00 AM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@redhat.com> > > This is ported from radeonsi and fixes: > dEQP-VK.pipeline.multisample_shader_builtin.sample_mask.bit_* > > v2: don't call this path for radeonsi, it does it in the epilog. > use the radeonsi code path. > v3: handle NULL pCreateInfo->pMultisampleState properly (Samuel) > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/amd/common/ac_nir_to_llvm.c | 29 ++++++++++++++++++++++++++++- > src/amd/common/ac_nir_to_llvm.h | 2 ++ > src/amd/vulkan/radv_pipeline.c | 29 ++++++++++++++++++++++++----- > src/amd/vulkan/radv_private.h | 2 ++ > 4 files changed, 56 insertions(+), 6 deletions(-) > > diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c > index cc3af77..8ae8650 100644 > --- a/src/amd/common/ac_nir_to_llvm.c > +++ b/src/amd/common/ac_nir_to_llvm.c > @@ -4049,6 +4049,30 @@ static LLVMValueRef load_sample_pos(struct > ac_nir_context *ctx) > return ac_build_gather_values(&ctx->ac, values, 2); > } > > +static LLVMValueRef load_sample_mask_in(struct ac_nir_context *ctx) > +{ > + uint8_t log2_ps_iter_samples = > ctx->nctx->shader_info->info.ps.force_persample ? > ctx->nctx->options->key.fs.log2_num_samples : > ctx->nctx->options->key.fs.log2_ps_iter_samples; > + > + /* The bit pattern matches that used by fixed function fragment > + * processing. */ > + static const uint16_t ps_iter_masks[] = { > + 0xffff, /* not used */ > + 0x5555, > + 0x1111, > + 0x0101, > + 0x0001, > + }; > + assert(log2_ps_iter_samples < ARRAY_SIZE(ps_iter_masks)); > + > + uint32_t ps_iter_mask = ps_iter_masks[log2_ps_iter_samples]; > + > + LLVMValueRef result, sample_id; > + sample_id = unpack_param(&ctx->ac, ctx->abi->ancillary, 8, 4); > + sample_id = LLVMBuildShl(ctx->ac.builder, LLVMConstInt(ctx->ac.i32, > ps_iter_mask, false), sample_id, ""); > + result = LLVMBuildAnd(ctx->ac.builder, sample_id, > ctx->abi->sample_coverage, ""); > + return result; > +} > + > static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx, > const nir_intrinsic_instr *instr) > { > @@ -4353,7 +4377,10 @@ static void visit_intrinsic(struct ac_nir_context *ctx, > result = load_sample_pos(ctx); > break; > case nir_intrinsic_load_sample_mask_in: > - result = ctx->abi->sample_coverage; > + if (ctx->nctx) > + result = load_sample_mask_in(ctx); > + else > + result = ctx->abi->sample_coverage; > break; > case nir_intrinsic_load_frag_coord: { > LLVMValueRef values[4] = { > diff --git a/src/amd/common/ac_nir_to_llvm.h b/src/amd/common/ac_nir_to_llvm.h > index 62ea38b..1656289 100644 > --- a/src/amd/common/ac_nir_to_llvm.h > +++ b/src/amd/common/ac_nir_to_llvm.h > @@ -60,6 +60,8 @@ struct ac_tcs_variant_key { > > struct ac_fs_variant_key { > uint32_t col_format; > + uint8_t log2_ps_iter_samples; > + uint8_t log2_num_samples; > uint32_t is_int8; > uint32_t is_int10; > uint32_t multisample : 1; > diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c > index a49fe05..416b80f 100644 > --- a/src/amd/vulkan/radv_pipeline.c > +++ b/src/amd/vulkan/radv_pipeline.c > @@ -798,6 +798,18 @@ radv_pipeline_init_raster_state(struct radv_pipeline > *pipeline, > > } > > +static uint8_t radv_pipeline_get_ps_iter_samples(const > VkPipelineMultisampleStateCreateInfo *vkms) > +{ > + uint32_t num_samples = vkms->rasterizationSamples; > + uint32_t ps_iter_samples = num_samples;
I think ps_iter_samples should default to 1 without vkm->sampleShadingEnable. (It will be overridden anyway when forcing per sample shading). With that: Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> > + > + if (vkms->sampleShadingEnable) { > + ps_iter_samples = ceil(vkms->minSampleShading * num_samples); > + ps_iter_samples = util_next_power_of_two(ps_iter_samples); > + } > + return ps_iter_samples; > +} > + > static void > radv_pipeline_init_multisample_state(struct radv_pipeline *pipeline, > const VkGraphicsPipelineCreateInfo > *pCreateInfo) > @@ -813,9 +825,9 @@ radv_pipeline_init_multisample_state(struct radv_pipeline > *pipeline, > else > ms->num_samples = 1; > > - if (vkms && vkms->sampleShadingEnable) { > - ps_iter_samples = ceil(vkms->minSampleShading * > ms->num_samples); > - } else if > (pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.force_persample) { > + if (vkms) > + ps_iter_samples = radv_pipeline_get_ps_iter_samples(vkms); > + if (vkms && !vkms->sampleShadingEnable && > pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.force_persample) { > ps_iter_samples = ms->num_samples; > } > > @@ -838,7 +850,7 @@ radv_pipeline_init_multisample_state(struct radv_pipeline > *pipeline, > > if (ms->num_samples > 1) { > unsigned log_samples = util_logbase2(ms->num_samples); > - unsigned log_ps_iter_samples = > util_logbase2(util_next_power_of_two(ps_iter_samples)); > + unsigned log_ps_iter_samples = util_logbase2(ps_iter_samples); > ms->pa_sc_mode_cntl_0 |= S_028A48_MSAA_ENABLE(1); > ms->pa_sc_line_cntl |= S_028BDC_EXPAND_LINE_WIDTH(1); /* > CM_R_028BDC_PA_SC_LINE_CNTL */ > ms->db_eqaa |= S_028804_MAX_ANCHOR_SAMPLES(log_samples) | > @@ -1745,8 +1757,13 @@ radv_generate_graphics_pipeline_key(struct > radv_pipeline *pipeline, > > > if (pCreateInfo->pMultisampleState && > - pCreateInfo->pMultisampleState->rasterizationSamples > 1) > + pCreateInfo->pMultisampleState->rasterizationSamples > 1) { > + uint32_t num_samples = > pCreateInfo->pMultisampleState->rasterizationSamples; > + uint32_t ps_iter_samples = > radv_pipeline_get_ps_iter_samples(pCreateInfo->pMultisampleState); > key.multisample = true; > + key.log2_num_samples = util_logbase2(num_samples); > + key.log2_ps_iter_samples = util_logbase2(ps_iter_samples); > + } > > key.col_format = pipeline->graphics.blend.spi_shader_col_format; > if (pipeline->device->physical_device->rad_info.chip_class < VI) > @@ -1784,6 +1801,8 @@ radv_fill_shader_keys(struct ac_shader_variant_key > *keys, > keys[MESA_SHADER_FRAGMENT].fs.col_format = key->col_format; > keys[MESA_SHADER_FRAGMENT].fs.is_int8 = key->is_int8; > keys[MESA_SHADER_FRAGMENT].fs.is_int10 = key->is_int10; > + keys[MESA_SHADER_FRAGMENT].fs.log2_ps_iter_samples = > key->log2_ps_iter_samples; > + keys[MESA_SHADER_FRAGMENT].fs.log2_num_samples = > key->log2_num_samples; > } > > static void > diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h > index 808db00..711ae71 100644 > --- a/src/amd/vulkan/radv_private.h > +++ b/src/amd/vulkan/radv_private.h > @@ -331,6 +331,8 @@ struct radv_pipeline_key { > uint32_t col_format; > uint32_t is_int8; > uint32_t is_int10; > + uint8_t log2_ps_iter_samples; > + uint8_t log2_num_samples; > uint32_t multisample : 1; > uint32_t has_multiview_view_index : 1; > }; > -- > 2.9.5 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev