nir/spirv: Add support for multisampled textures

This commit is contained in:
Jason Ekstrand 2016-02-21 21:42:33 -08:00
parent f1dddeadc2
commit f49ba0f7d8
1 changed files with 19 additions and 12 deletions

View File

@ -739,7 +739,10 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
else
val->type->access_qualifier = SpvAccessQualifierReadWrite;
assert(!multisampled && "FIXME: Handl multi-sampled textures");
if (multisampled) {
assert(dim == GLSL_SAMPLER_DIM_2D);
dim = GLSL_SAMPLER_DIM_MS;
}
val->type->image_format = translate_image_format(format);
@ -1199,6 +1202,13 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
sampled.sampler = sampled_val->access_chain;
}
const struct glsl_type *image_type;
if (sampled.image) {
image_type = sampled.image->var->var->interface_type;
} else {
image_type = sampled.sampler->var->var->interface_type;
}
nir_tex_src srcs[8]; /* 8 should be enough */
nir_tex_src *p = srcs;
@ -1265,7 +1275,11 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
break;
case SpvOpImageFetch:
texop = nir_texop_txf;
if (glsl_get_sampler_dim(image_type) == GLSL_SAMPLER_DIM_MS) {
texop = nir_texop_txf_ms;
} else {
texop = nir_texop_txf;
}
break;
case SpvOpImageGather:
@ -1303,7 +1317,7 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
if (operands & SpvImageOperandsLodMask) {
assert(texop == nir_texop_txl || texop == nir_texop_txf ||
texop == nir_texop_txs);
texop == nir_texop_txf_ms || texop == nir_texop_txs);
(*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_lod);
}
@ -1322,7 +1336,7 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
assert(!"Constant offsets to texture gather not yet implemented");
if (operands & SpvImageOperandsSampleMask) {
assert(texop == nir_texop_txf);
assert(texop == nir_texop_txf_ms);
texop = nir_texop_txf_ms;
(*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_ms_index);
}
@ -1335,13 +1349,6 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
memcpy(instr->src, srcs, instr->num_srcs * sizeof(*instr->src));
const struct glsl_type *image_type;
if (sampled.image) {
image_type = sampled.image->var->var->interface_type;
} else {
image_type = sampled.sampler->var->var->interface_type;
}
instr->sampler_dim = glsl_get_sampler_dim(image_type);
instr->is_array = glsl_sampler_type_is_array(image_type);
instr->is_shadow = glsl_sampler_type_is_shadow(image_type);
@ -1355,11 +1362,11 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
break;
case GLSL_SAMPLER_DIM_2D:
case GLSL_SAMPLER_DIM_RECT:
case GLSL_SAMPLER_DIM_MS:
instr->coord_components = 2;
break;
case GLSL_SAMPLER_DIM_3D:
case GLSL_SAMPLER_DIM_CUBE:
case GLSL_SAMPLER_DIM_MS:
instr->coord_components = 3;
break;
default: