aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2020-05-13 06:49:07 +1000
committerDave Airlie <[email protected]>2020-05-19 10:26:46 +1000
commit06c10fa3a50cdefd95512f0c6b9060834f9dd33c (patch)
tree443809c79c43d5db1d5593176f93fea475541af8 /src
parentc1f5a23a4dfc6f3346a78e560dbeb3dcb8cca31d (diff)
llvmpipe/interp: refactor out centroid calculations
These will be reused in the interp instruction code. Reviewed-by: Roland Scheidegger <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5050>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_bld_interp.c69
1 files changed, 39 insertions, 30 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_interp.c b/src/gallium/drivers/llvmpipe/lp_bld_interp.c
index 3ebc277646d..a1bdd13c733 100644
--- a/src/gallium/drivers/llvmpipe/lp_bld_interp.c
+++ b/src/gallium/drivers/llvmpipe/lp_bld_interp.c
@@ -151,6 +151,43 @@ calc_offsets(struct lp_build_context *coeff_bld,
}
}
+static void
+calc_centroid_offsets(struct lp_build_interp_soa_context *bld,
+ struct gallivm_state *gallivm,
+ LLVMValueRef loop_iter,
+ LLVMValueRef mask_store,
+ LLVMValueRef pix_center_offset,
+ LLVMValueRef *centroid_x, LLVMValueRef *centroid_y)
+{
+ struct lp_build_context *coeff_bld = &bld->coeff_bld;
+ LLVMBuilderRef builder = gallivm->builder;
+ LLVMValueRef s_mask_and = NULL;
+ LLVMValueRef centroid_x_offset = pix_center_offset;
+ LLVMValueRef centroid_y_offset = pix_center_offset;
+ for (int s = bld->coverage_samples - 1; s >= 0; s--) {
+ LLVMValueRef sample_cov;
+ LLVMValueRef s_mask_idx = LLVMBuildMul(builder, bld->num_loop, lp_build_const_int32(gallivm, s), "");
+
+ s_mask_idx = LLVMBuildAdd(builder, s_mask_idx, loop_iter, "");
+ sample_cov = lp_build_pointer_get(builder, mask_store, s_mask_idx);
+ if (s == bld->coverage_samples - 1)
+ s_mask_and = sample_cov;
+ else
+ s_mask_and = LLVMBuildAnd(builder, s_mask_and, sample_cov, "");
+
+ LLVMValueRef x_val_idx = lp_build_const_int32(gallivm, s * 2);
+ LLVMValueRef y_val_idx = lp_build_const_int32(gallivm, s * 2 + 1);
+
+ x_val_idx = lp_build_array_get(gallivm, bld->sample_pos_array, x_val_idx);
+ y_val_idx = lp_build_array_get(gallivm, bld->sample_pos_array, y_val_idx);
+ x_val_idx = lp_build_broadcast_scalar(coeff_bld, x_val_idx);
+ y_val_idx = lp_build_broadcast_scalar(coeff_bld, y_val_idx);
+ centroid_x_offset = lp_build_select(coeff_bld, sample_cov, x_val_idx, centroid_x_offset);
+ centroid_y_offset = lp_build_select(coeff_bld, sample_cov, y_val_idx, centroid_y_offset);
+ }
+ *centroid_x = lp_build_select(coeff_bld, s_mask_and, pix_center_offset, centroid_x_offset);
+ *centroid_y = lp_build_select(coeff_bld, s_mask_and, pix_center_offset, centroid_y_offset);
+}
/* Much easier, and significantly less instructions in the per-stamp
* part (less than half) but overall more instructions so a loss if
@@ -332,36 +369,8 @@ attribs_update_simple(struct lp_build_interp_soa_context *bld,
xoffset = lp_build_broadcast_scalar(coeff_bld, x_val_idx);
yoffset = lp_build_broadcast_scalar(coeff_bld, y_val_idx);
} else if (loc == TGSI_INTERPOLATE_LOC_CENTROID) {
- LLVMValueRef centroid_x_offset = pix_center_offset;
- LLVMValueRef centroid_y_offset = pix_center_offset;
-
- /* for centroid find covered samples for this quad. */
- /* if all samples are covered use pixel centers */
- LLVMValueRef s_mask_and = NULL;
- for (int s = bld->coverage_samples - 1; s >= 0; s--) {
- LLVMValueRef sample_cov;
- LLVMValueRef s_mask_idx = LLVMBuildMul(builder, bld->num_loop, lp_build_const_int32(gallivm, s), "");
-
- s_mask_idx = LLVMBuildAdd(builder, s_mask_idx, loop_iter, "");
- sample_cov = lp_build_pointer_get(builder, mask_store, s_mask_idx);
- if (s == bld->coverage_samples - 1)
- s_mask_and = sample_cov;
- else
- s_mask_and = LLVMBuildAnd(builder, s_mask_and, sample_cov, "");
-
- LLVMValueRef x_val_idx = lp_build_const_int32(gallivm, s * 2);
- LLVMValueRef y_val_idx = lp_build_const_int32(gallivm, s * 2 + 1);
-
- x_val_idx = lp_build_array_get(gallivm, bld->sample_pos_array, x_val_idx);
- y_val_idx = lp_build_array_get(gallivm, bld->sample_pos_array, y_val_idx);
-
- x_val_idx = lp_build_broadcast_scalar(coeff_bld, x_val_idx);
- y_val_idx = lp_build_broadcast_scalar(coeff_bld, y_val_idx);
- centroid_x_offset = lp_build_select(coeff_bld, sample_cov, x_val_idx, centroid_x_offset);
- centroid_y_offset = lp_build_select(coeff_bld, sample_cov, y_val_idx, centroid_y_offset);
- }
- xoffset = lp_build_select(coeff_bld, s_mask_and, xoffset, centroid_x_offset);
- yoffset = lp_build_select(coeff_bld, s_mask_and, yoffset, centroid_y_offset);
+ calc_centroid_offsets(bld, gallivm, loop_iter, mask_store,
+ pix_center_offset, &xoffset, &yoffset);
}
chan_pixoffx = lp_build_add(coeff_bld, chan_pixoffx, xoffset);
chan_pixoffy = lp_build_add(coeff_bld, chan_pixoffy, yoffset);