summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2016-12-30 14:24:10 +1000
committerDave Airlie <[email protected]>2017-01-10 12:59:31 +1000
commitada66480b29be5730b217943e626b246ce6c67fd (patch)
tree92eef30b893c702d6972e3f8e9508c8c82456571
parent41b1d9a558d620df339738aa4aa569fe14298b83 (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]>
-rw-r--r--src/amd/common/ac_nir_to_llvm.c17
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;