radv: Implement bc optimize.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 15 Aug 2017 16:09:21 +0000 (18:09 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Wed, 23 Aug 2017 22:57:03 +0000 (00:57 +0200)
Seems like we actually enabled it already, but did not implement
the shader part. With this patch we do.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_nir_to_llvm.h
src/amd/vulkan/radv_pipeline.c

index 88f2203316c5909a4edb4fabb3137632de436d15..846840b7b064fbc5dcc2be90793b8d06f855cd98 100644 (file)
@@ -5009,10 +5009,39 @@ handle_vs_inputs(struct nir_to_llvm_context *ctx,
                handle_vs_input_decl(ctx, variable);
 }
 
+static void
+prepare_interp_optimize(struct nir_to_llvm_context *ctx,
+                        struct nir_shader *nir)
+{
+       if (!ctx->options->key.fs.multisample)
+               return;
+
+       bool uses_center = false;
+       bool uses_centroid = false;
+       nir_foreach_variable(variable, &nir->inputs) {
+               if (glsl_get_base_type(glsl_without_array(variable->type)) != GLSL_TYPE_FLOAT ||
+                   variable->data.sample)
+                       continue;
+
+               if (variable->data.centroid)
+                       uses_centroid = true;
+               else
+                       uses_center = true;
+       }
+
+       if (uses_center && uses_centroid) {
+               LLVMValueRef sel = LLVMBuildICmp(ctx->builder, LLVMIntSLT, ctx->prim_mask, ctx->ac.i32_0, "");
+               ctx->persp_centroid = LLVMBuildSelect(ctx->builder, sel, ctx->persp_center, ctx->persp_centroid, "");
+               ctx->linear_centroid = LLVMBuildSelect(ctx->builder, sel, ctx->linear_center, ctx->linear_centroid, "");
+       }
+}
+
 static void
 handle_fs_inputs(struct nir_to_llvm_context *ctx,
                  struct nir_shader *nir)
 {
+       prepare_interp_optimize(ctx, nir);
+
        nir_foreach_variable(variable, &nir->inputs)
                handle_fs_input_decl(ctx, variable);
 
index 376db1387a46e6935d0f5b0855bca1367aec1e07..53ea238c3c96c9b121ef319c817b5e9284cd6c20 100644 (file)
@@ -60,6 +60,7 @@ struct ac_fs_variant_key {
        uint32_t col_format;
        uint32_t is_int8;
        uint32_t is_int10;
+       uint32_t multisample : 1;
 };
 
 union ac_shader_variant_key {
index bd5eeb776c4b0308141c73838b7d9447c6370253..75371a0be5af5d8e48bc0712c20558d2a3c9c185 100644 (file)
@@ -2069,6 +2069,9 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
        if (modules[MESA_SHADER_FRAGMENT]) {
                union ac_shader_variant_key key = {0};
                key.fs.col_format = pipeline->graphics.blend.spi_shader_col_format;
+               if (pCreateInfo->pMultisampleState &&
+                   pCreateInfo->pMultisampleState->rasterizationSamples > 1)
+                       key.fs.multisample = true;
 
                if (pipeline->device->physical_device->rad_info.chip_class < VI)
                        radv_pipeline_compute_get_int_clamp(pCreateInfo, &key.fs.is_int8, &key.fs.is_int10);