radeonsi: add shader code for smoothing
The fragment shader multiplies the alpha channel with gl_SampleMaskIn. If blending is enabled, it looks like MSAA. Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
parent
4f20a8f278
commit
303d23e10d
|
@ -41,6 +41,7 @@
|
||||||
* the number shouldn't be a commonly-used one. */
|
* the number shouldn't be a commonly-used one. */
|
||||||
#define SI_BASE_VERTEX_UNKNOWN INT_MIN
|
#define SI_BASE_VERTEX_UNKNOWN INT_MIN
|
||||||
#define SI_RESTART_INDEX_UNKNOWN INT_MIN
|
#define SI_RESTART_INDEX_UNKNOWN INT_MIN
|
||||||
|
#define SI_NUM_SMOOTH_AA_SAMPLES 8
|
||||||
|
|
||||||
#define SI_TRACE_CS 0
|
#define SI_TRACE_CS 0
|
||||||
#define SI_TRACE_CS_DWORDS 6
|
#define SI_TRACE_CS_DWORDS 6
|
||||||
|
|
|
@ -644,7 +644,12 @@ static void declare_system_value(
|
||||||
}
|
}
|
||||||
|
|
||||||
case TGSI_SEMANTIC_SAMPLEMASK:
|
case TGSI_SEMANTIC_SAMPLEMASK:
|
||||||
value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_SAMPLE_COVERAGE);
|
/* Smoothing isn't MSAA in GL, but it's MSAA in hardware.
|
||||||
|
* Therefore, force gl_SampleMaskIn to 1 for GL. */
|
||||||
|
if (si_shader_ctx->shader->key.ps.poly_line_smoothing)
|
||||||
|
value = uint_bld->one;
|
||||||
|
else
|
||||||
|
value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_SAMPLE_COVERAGE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -828,6 +833,34 @@ static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
|
||||||
si_shader_ctx->shader->db_shader_control |= S_02880C_KILL_ENABLE(1);
|
si_shader_ctx->shader->db_shader_control |= S_02880C_KILL_ENABLE(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void si_scale_alpha_by_sample_mask(struct lp_build_tgsi_context *bld_base,
|
||||||
|
LLVMValueRef alpha_ptr)
|
||||||
|
{
|
||||||
|
struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
|
||||||
|
struct gallivm_state *gallivm = bld_base->base.gallivm;
|
||||||
|
LLVMValueRef coverage, alpha;
|
||||||
|
|
||||||
|
/* alpha = alpha * popcount(coverage) / SI_NUM_SMOOTH_AA_SAMPLES */
|
||||||
|
coverage = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn,
|
||||||
|
SI_PARAM_SAMPLE_COVERAGE);
|
||||||
|
coverage = bitcast(bld_base, TGSI_TYPE_SIGNED, coverage);
|
||||||
|
|
||||||
|
coverage = build_intrinsic(gallivm->builder, "llvm.ctpop.i32",
|
||||||
|
bld_base->int_bld.elem_type,
|
||||||
|
&coverage, 1, LLVMReadNoneAttribute);
|
||||||
|
|
||||||
|
coverage = LLVMBuildUIToFP(gallivm->builder, coverage,
|
||||||
|
bld_base->base.elem_type, "");
|
||||||
|
|
||||||
|
coverage = LLVMBuildFMul(gallivm->builder, coverage,
|
||||||
|
lp_build_const_float(gallivm,
|
||||||
|
1.0 / SI_NUM_SMOOTH_AA_SAMPLES), "");
|
||||||
|
|
||||||
|
alpha = LLVMBuildLoad(gallivm->builder, alpha_ptr, "");
|
||||||
|
alpha = LLVMBuildFMul(gallivm->builder, alpha, coverage, "");
|
||||||
|
LLVMBuildStore(gallivm->builder, alpha, alpha_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context * bld_base,
|
static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context * bld_base,
|
||||||
LLVMValueRef (*pos)[9], LLVMValueRef *out_elts)
|
LLVMValueRef (*pos)[9], LLVMValueRef *out_elts)
|
||||||
{
|
{
|
||||||
|
@ -1361,6 +1394,9 @@ static void si_llvm_emit_fs_epilogue(struct lp_build_tgsi_context * bld_base)
|
||||||
if (semantic_index == 0 &&
|
if (semantic_index == 0 &&
|
||||||
si_shader_ctx->shader->key.ps.alpha_func != PIPE_FUNC_ALWAYS)
|
si_shader_ctx->shader->key.ps.alpha_func != PIPE_FUNC_ALWAYS)
|
||||||
si_alpha_test(bld_base, alpha_ptr);
|
si_alpha_test(bld_base, alpha_ptr);
|
||||||
|
|
||||||
|
if (si_shader_ctx->shader->key.ps.poly_line_smoothing)
|
||||||
|
si_scale_alpha_by_sample_mask(bld_base, alpha_ptr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
target = 0;
|
target = 0;
|
||||||
|
|
|
@ -126,6 +126,7 @@ union si_shader_key {
|
||||||
unsigned alpha_func:3;
|
unsigned alpha_func:3;
|
||||||
unsigned alpha_to_one:1;
|
unsigned alpha_to_one:1;
|
||||||
unsigned poly_stipple:1;
|
unsigned poly_stipple:1;
|
||||||
|
unsigned poly_line_smoothing:1;
|
||||||
} ps;
|
} ps;
|
||||||
struct {
|
struct {
|
||||||
unsigned instance_divisors[SI_NUM_VERTEX_BUFFERS];
|
unsigned instance_divisors[SI_NUM_VERTEX_BUFFERS];
|
||||||
|
|
Loading…
Reference in New Issue