|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool needs_temp_coord = |
|
|
bool needs_temp_coord = |
|
|
(midgard_texop == TEXTURE_OP_TEXEL_FETCH) || |
|
|
(midgard_texop == TEXTURE_OP_TEXEL_FETCH) || |
|
|
|
|
|
(instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) || |
|
|
(instr->is_shadow); |
|
|
(instr->is_shadow); |
|
|
|
|
|
|
|
|
unsigned coords = needs_temp_coord ? make_compiler_temp_reg(ctx) : 0; |
|
|
unsigned coords = needs_temp_coord ? make_compiler_temp_reg(ctx) : 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned coord_mask = mask_of(instr->coord_components); |
|
|
unsigned coord_mask = mask_of(instr->coord_components); |
|
|
|
|
|
|
|
|
if (needs_temp_coord) { |
|
|
|
|
|
|
|
|
if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) { |
|
|
|
|
|
/* texelFetch is undefined on samplerCube */ |
|
|
|
|
|
assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH); |
|
|
|
|
|
|
|
|
|
|
|
/* For cubemaps, we use a special ld/st op to |
|
|
|
|
|
* select the face and copy the xy into the |
|
|
|
|
|
* texture register */ |
|
|
|
|
|
|
|
|
|
|
|
midgard_instruction ld = m_ld_cubemap_coords(coords, 0); |
|
|
|
|
|
ld.src[1] = index; |
|
|
|
|
|
ld.mask = 0x3; /* xy */ |
|
|
|
|
|
ld.load_store.arg_1 = 0x20; |
|
|
|
|
|
ld.swizzle[1][3] = COMPONENT_X; |
|
|
|
|
|
emit_mir_instruction(ctx, ld); |
|
|
|
|
|
|
|
|
|
|
|
/* xyzw -> xyxx */ |
|
|
|
|
|
ins.swizzle[1][2] = instr->is_shadow ? COMPONENT_Z : COMPONENT_X; |
|
|
|
|
|
ins.swizzle[1][3] = COMPONENT_X; |
|
|
|
|
|
} else if (needs_temp_coord) { |
|
|
/* mov coord_temp, coords */ |
|
|
/* mov coord_temp, coords */ |
|
|
midgard_instruction mov = v_mov(index, coords); |
|
|
midgard_instruction mov = v_mov(index, coords); |
|
|
mov.mask = coord_mask; |
|
|
mov.mask = coord_mask; |
|
|
|
|
|
|
|
|
coords = index; |
|
|
coords = index; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ins.src[1] = coords; |
|
|
|
|
|
|
|
|
/* Texelfetch coordinates uses all four elements |
|
|
/* Texelfetch coordinates uses all four elements |
|
|
* (xyz/index) regardless of texture dimensionality, |
|
|
* (xyz/index) regardless of texture dimensionality, |
|
|
* which means it's necessary to zero the unused |
|
|
* which means it's necessary to zero the unused |
|
|
|
|
|
|
|
|
emit_mir_instruction(ctx, mov); |
|
|
emit_mir_instruction(ctx, mov); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) { |
|
|
|
|
|
/* texelFetch is undefined on samplerCube */ |
|
|
|
|
|
assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH); |
|
|
|
|
|
|
|
|
|
|
|
/* For cubemaps, we use a special ld/st op to |
|
|
|
|
|
* select the face and copy the xy into the |
|
|
|
|
|
* texture register */ |
|
|
|
|
|
|
|
|
|
|
|
unsigned temp = make_compiler_temp(ctx); |
|
|
|
|
|
midgard_instruction ld = m_ld_cubemap_coords(temp, 0); |
|
|
|
|
|
ld.src[1] = coords; |
|
|
|
|
|
ld.mask = 0x3; /* xy */ |
|
|
|
|
|
ld.load_store.arg_1 = 0x20; |
|
|
|
|
|
ld.swizzle[1][3] = COMPONENT_X; |
|
|
|
|
|
emit_mir_instruction(ctx, ld); |
|
|
|
|
|
|
|
|
|
|
|
ins.src[1] = temp; |
|
|
|
|
|
/* xyzw -> xyxx */ |
|
|
|
|
|
ins.swizzle[1][2] = COMPONENT_X; |
|
|
|
|
|
ins.swizzle[1][3] = COMPONENT_X; |
|
|
|
|
|
} else { |
|
|
|
|
|
ins.src[1] = coords; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (instr->sampler_dim == GLSL_SAMPLER_DIM_2D) { |
|
|
if (instr->sampler_dim == GLSL_SAMPLER_DIM_2D) { |
|
|
/* Array component in w but NIR wants it in z */ |
|
|
/* Array component in w but NIR wants it in z */ |
|
|
if (nr_components == 3) { |
|
|
if (nr_components == 3) { |
|
|
|
|
|
|
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
case nir_tex_src_comparator: { |
|
|
case nir_tex_src_comparator: { |
|
|
/* TODO: generalize */ |
|
|
|
|
|
unsigned comp = COMPONENT_Z; |
|
|
unsigned comp = COMPONENT_Z; |
|
|
|
|
|
|
|
|
/* mov coord_temp.foo, coords */ |
|
|
/* mov coord_temp.foo, coords */ |