nir/spirv: Better handle constant offsets in texture lookups

This commit is contained in:
Jason Ekstrand 2016-02-08 22:12:18 -08:00
parent 209820739b
commit 1d65abfa58

View file

@ -1287,6 +1287,8 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
unreachable("Unhandled opcode");
}
nir_constant *const_offset = NULL;
/* Now we need to handle some number of optional arguments */
if (idx < count) {
uint32_t operands = w[idx++];
@ -1310,8 +1312,12 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
(*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_ddy);
}
if (operands & SpvImageOperandsOffsetMask ||
operands & SpvImageOperandsConstOffsetMask)
if (operands & SpvImageOperandsConstOffsetMask) {
const_offset =
vtn_value(b, w[idx++], vtn_value_type_constant)->constant;
}
if (operands & SpvImageOperandsOffsetMask)
(*p++) = vtn_tex_src(b, w[idx++], nir_tex_src_offset);
if (operands & SpvImageOperandsConstOffsetsMask)
@ -1343,6 +1349,11 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
instr->is_shadow = glsl_sampler_type_is_shadow(image_type);
instr->is_new_style_shadow = instr->is_shadow;
if (const_offset) {
for (unsigned i = 0; i < 4; i++)
instr->const_offset[i] = const_offset->value.u[i];
}
if (has_coord) {
switch (instr->sampler_dim) {
case GLSL_SAMPLER_DIM_1D: