From: Dave Airlie <airl...@redhat.com> Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/amd/common/ac_nir_to_llvm.c | 38 +++++++++++++++++++++++++++++++++++++- src/amd/common/ac_nir_to_llvm.h | 1 + 2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index a095613..92e2b44 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -4538,6 +4538,39 @@ handle_vs_outputs_post(struct nir_to_llvm_context *ctx) } static void +handle_es_outputs_post(struct nir_to_llvm_context *ctx) +{ + int j; + uint64_t max_output_written = 0; + for (unsigned i = 0; i < RADEON_LLVM_MAX_OUTPUTS; ++i) { + LLVMValueRef *out_ptr = &ctx->outputs[i * 4]; + int param_index; + if (!(ctx->output_mask & (1ull << i))) + continue; + + param_index = shader_io_get_unique_index(i); + + if (param_index > max_output_written) + max_output_written = param_index; + + for (j = 0; j < 4; j++) { + LLVMValueRef out_val = LLVMBuildLoad(ctx->builder, out_ptr[j], ""); + out_val = LLVMBuildBitCast(ctx->builder, out_val, ctx->i32, ""); + + build_tbuffer_store(ctx, + ctx->esgs_ring, + out_val, 1, + LLVMGetUndef(ctx->i32), ctx->es2gs_offset, + (4 * param_index + j) * 4, + V_008F0C_BUF_DATA_FORMAT_32, + V_008F0C_BUF_NUM_FORMAT_UINT, + 0, 0, 1, 1, 0); + } + } + ctx->shader_info->vs.esgs_itemsize = (max_output_written + 1) * 16; +} + +static void si_export_mrt_color(struct nir_to_llvm_context *ctx, LLVMValueRef *color, unsigned param, bool is_last) { @@ -4658,7 +4691,10 @@ handle_shader_outputs_post(struct nir_to_llvm_context *ctx) { switch (ctx->stage) { case MESA_SHADER_VERTEX: - handle_vs_outputs_post(ctx); + if (ctx->options->key.vs.as_es) + handle_es_outputs_post(ctx); + else + handle_vs_outputs_post(ctx); break; case MESA_SHADER_FRAGMENT: handle_fs_outputs_post(ctx); diff --git a/src/amd/common/ac_nir_to_llvm.h b/src/amd/common/ac_nir_to_llvm.h index f0235fb..ab66108 100644 --- a/src/amd/common/ac_nir_to_llvm.h +++ b/src/amd/common/ac_nir_to_llvm.h @@ -104,6 +104,7 @@ struct ac_shader_variant_info { bool as_es; uint8_t clip_dist_mask; uint8_t cull_dist_mask; + uint32_t esgs_itemsize; } vs; struct { unsigned num_interp; -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev