diff options
author | Dave Airlie <[email protected]> | 2016-12-30 14:24:10 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-01-10 12:59:31 +1000 |
commit | ada66480b29be5730b217943e626b246ce6c67fd (patch) | |
tree | 92eef30b893c702d6972e3f8e9508c8c82456571 /src/amd | |
parent | 41b1d9a558d620df339738aa4aa569fe14298b83 (diff) |
radv/ac: add support for multi sample image coords
This just adds the nir->llvm support, enabling
the extension causes some failures on llvm 3.9 at least,
but this code seems fine.
NIR passes the sampler in src[1].x, and we LLVM/SI requires
it as the last parameters in the coords (coord[2] for 2D,
coord[3] for 2DArray).
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index f214fcd006a..bc3a3456220 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -2386,12 +2386,16 @@ static int image_type_to_components_count(enum glsl_sampler_dim dim, bool array) return array ? 2 : 1; case GLSL_SAMPLER_DIM_2D: return array ? 3 : 2; + case GLSL_SAMPLER_DIM_MS: + return array ? 4 : 3; case GLSL_SAMPLER_DIM_3D: case GLSL_SAMPLER_DIM_CUBE: return 3; case GLSL_SAMPLER_DIM_RECT: case GLSL_SAMPLER_DIM_SUBPASS: return 2; + case GLSL_SAMPLER_DIM_SUBPASS_MS: + return 3; default: break; } @@ -2413,7 +2417,11 @@ static LLVMValueRef get_image_coords(struct nir_to_llvm_context *ctx, }; LLVMValueRef res; int count; - count = image_type_to_components_count(glsl_get_sampler_dim(type), + enum glsl_sampler_dim dim = glsl_get_sampler_dim(type); + bool is_ms = (dim == GLSL_SAMPLER_DIM_MS || + dim == GLSL_SAMPLER_DIM_SUBPASS_MS); + + count = image_type_to_components_count(dim, glsl_sampler_type_is_array(type)); if (count == 1) { @@ -2423,6 +2431,8 @@ static LLVMValueRef get_image_coords(struct nir_to_llvm_context *ctx, res = src0; } else { int chan; + if (is_ms) + count--; for (chan = 0; chan < count; ++chan) { coords[chan] = LLVMBuildExtractElement(ctx->builder, src0, masks[chan], ""); } @@ -2431,6 +2441,11 @@ static LLVMValueRef get_image_coords(struct nir_to_llvm_context *ctx, for (chan = 0; chan < count; ++chan) coords[chan] = LLVMBuildAdd(ctx->builder, coords[chan], LLVMBuildFPToUI(ctx->builder, ctx->frag_pos[chan], ctx->i32, ""), ""); } + if (is_ms) { + coords[count] = llvm_extract_elem(ctx, get_src(ctx, instr->src[1]), 0); + count++; + } + if (count == 3) { coords[3] = LLVMGetUndef(ctx->i32); count = 4; |