From 4ea0febcb005d6447a6ae4d19ca1de8de44f3da9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 2 Jan 2016 23:09:58 +0100 Subject: [PATCH] radeonsi: move POSITION and FACE fragment shader inputs to system values And FACE becomes integer instead of float. Reviewed-by: Edward O'Callaghan --- src/gallium/drivers/radeonsi/si_pipe.c | 4 +- src/gallium/drivers/radeonsi/si_shader.c | 58 +++++++------------ .../drivers/radeonsi/si_state_shaders.c | 8 +-- 3 files changed, 25 insertions(+), 45 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index c2ca94339ac..4e23cb19da8 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -301,6 +301,8 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_TXQS: case PIPE_CAP_FORCE_PERSAMPLE_INTERP: case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: + case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: + case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: return 1; case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: @@ -344,8 +346,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_PACK_HALF_FLOAT: case PIPE_CAP_MULTI_DRAW_INDIRECT: case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: - case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: - case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT: return 0; diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 1db3e484915..cc9718e42d3 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -911,36 +911,6 @@ static void declare_input_fs( unsigned chan; - if (decl->Semantic.Name == TGSI_SEMANTIC_POSITION) { - for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { - unsigned soa_index = - radeon_llvm_reg_index_soa(input_index, chan); - radeon_bld->inputs[soa_index] = - LLVMGetParam(main_fn, SI_PARAM_POS_X_FLOAT + chan); - - if (chan == 3) - /* RCP for fragcoord.w */ - radeon_bld->inputs[soa_index] = - LLVMBuildFDiv(gallivm->builder, - lp_build_const_float(gallivm, 1.0f), - radeon_bld->inputs[soa_index], - ""); - } - return; - } - - if (decl->Semantic.Name == TGSI_SEMANTIC_FACE) { - radeon_bld->inputs[radeon_llvm_reg_index_soa(input_index, 0)] = - LLVMGetParam(main_fn, SI_PARAM_FRONT_FACE); - radeon_bld->inputs[radeon_llvm_reg_index_soa(input_index, 1)] = - radeon_bld->inputs[radeon_llvm_reg_index_soa(input_index, 2)] = - lp_build_const_float(gallivm, 0.0f); - radeon_bld->inputs[radeon_llvm_reg_index_soa(input_index, 3)] = - lp_build_const_float(gallivm, 1.0f); - - return; - } - shader->ps_input_param_offset[input_index] = shader->nparam++; attr_number = lp_build_const_int32(gallivm, shader->ps_input_param_offset[input_index]); @@ -975,10 +945,8 @@ static void declare_input_fs( face = LLVMGetParam(main_fn, SI_PARAM_FRONT_FACE); - is_face_positive = LLVMBuildFCmp(gallivm->builder, - LLVMRealOGT, face, - lp_build_const_float(gallivm, 0.0f), - ""); + is_face_positive = LLVMBuildICmp(gallivm->builder, LLVMIntNE, + face, uint->zero, ""); args[2] = params; args[3] = interp_param; @@ -1129,6 +1097,24 @@ static void declare_system_value( assert(!"INVOCATIONID not implemented"); break; + case TGSI_SEMANTIC_POSITION: + { + LLVMValueRef pos[4] = { + LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_X_FLOAT), + LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_Y_FLOAT), + LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_Z_FLOAT), + lp_build_emit_llvm_unary(&radeon_bld->soa.bld_base, TGSI_OPCODE_RCP, + LLVMGetParam(radeon_bld->main_fn, + SI_PARAM_POS_W_FLOAT)), + }; + value = lp_build_gather_values(gallivm, pos, 4); + break; + } + + case TGSI_SEMANTIC_FACE: + value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_FRONT_FACE); + break; + case TGSI_SEMANTIC_SAMPLEID: value = get_sample_id(radeon_bld); break; @@ -3506,7 +3492,7 @@ static void create_function(struct si_shader_context *si_shader_ctx) params[SI_PARAM_POS_Y_FLOAT] = f32; params[SI_PARAM_POS_Z_FLOAT] = f32; params[SI_PARAM_POS_W_FLOAT] = f32; - params[SI_PARAM_FRONT_FACE] = f32; + params[SI_PARAM_FRONT_FACE] = i32; params[SI_PARAM_ANCILLARY] = i32; params[SI_PARAM_SAMPLE_COVERAGE] = f32; params[SI_PARAM_POS_FIXED_PT] = f32; @@ -4067,7 +4053,7 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm, if (poly_stipple) { tokens = util_pstipple_create_fragment_shader(tokens, NULL, SI_POLY_STIPPLE_SAMPLER, - TGSI_FILE_INPUT); + TGSI_FILE_SYSTEM_VALUE); tgsi_scan_shader(tokens, &stipple_shader_info); } diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 460dda51b97..35b226f0157 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -390,7 +390,7 @@ static void si_shader_ps(struct si_shader *shader) unsigned spi_shader_col_format = 0, cb_shader_mask = 0; unsigned colors_written, export_16bpc; unsigned num_sgprs, num_user_sgprs; - unsigned spi_baryc_cntl = 0; + unsigned spi_baryc_cntl = S_0286E0_FRONT_FACE_ALL_BITS(1); uint64_t va; bool has_centroid; @@ -979,12 +979,6 @@ static void si_emit_spi_map(struct si_context *sctx, struct r600_atom *atom) unsigned index = psinfo->input_semantic_index[i]; unsigned interpolate = psinfo->input_interpolate[i]; unsigned param_offset = ps->ps_input_param_offset[i]; - - if (name == TGSI_SEMANTIC_POSITION || - name == TGSI_SEMANTIC_FACE) - /* Read from preloaded VGPRs, not parameters */ - continue; - bcolor: tmp = 0; -- 2.30.2