.op = V3D_TMU_OP_REGULAR,
};
-/*
- * This method returns if the texture operation requires a sampler as
- * a general rule, see the documentation of
- * nir_tex_instr::sampler_index. Note that the specific hw would
- * require a sampler in any case, for some other reason.
- */
-static bool
-texture_instr_need_sampler(nir_tex_instr *instr)
-{
- switch(instr->op) {
- case nir_texop_txf:
- case nir_texop_txf_ms:
- case nir_texop_txs:
- case nir_texop_lod:
- case nir_texop_query_levels:
- case nir_texop_texture_samples:
- case nir_texop_samples_identical:
- return false;
- default:
- return true;
- }
-}
-
void
v3d40_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr)
{
struct V3D41_TMU_CONFIG_PARAMETER_0 p0_unpacked = {
};
+ assert(instr->op != nir_texop_lod || c->devinfo->ver >= 42);
+
struct V3D41_TMU_CONFIG_PARAMETER_2 p2_unpacked = {
.op = V3D_TMU_OP_REGULAR,
.disable_autolod = instr->op == nir_texop_tg4
};
- int non_array_components = instr->coord_components - instr->is_array;
+ int non_array_components =
+ instr->op != nir_texop_lod ?
+ instr->coord_components - instr->is_array :
+ instr->coord_components;
+
struct qreg s;
for (unsigned i = 0; i < instr->num_srcs; i++) {
(uint8_t *)&p2_packed,
&p2_unpacked);
+ /* We manually set the LOD Query bit (see
+ * V3D42_TMU_CONFIG_PARAMETER_2) as right now is the only V42 specific
+ * feature over V41 we are using
+ */
+ if (instr->op == nir_texop_lod)
+ p2_packed |= 1UL << 24;
+
/* Load unit number into the high bits of the texture address field,
* which will be be used by the driver to decide which texture to put
* in the actual address field.
* p1 is optional, but we can skip it only if p2 can be skipped too
*/
bool needs_p2_config =
- memcmp(&p2_unpacked, &p2_unpacked_default, sizeof(p2_unpacked)) != 0;
+ (instr->op == nir_texop_lod ||
+ memcmp(&p2_unpacked, &p2_unpacked_default, sizeof(p2_unpacked)) != 0);
if (needs_p2_config || output_type_32_bit ||
- texture_instr_need_sampler(instr)) {
+ nir_tex_instr_need_sampler(instr)) {
struct V3D41_TMU_CONFIG_PARAMETER_1 p1_unpacked = {
.output_type_32_bit = output_type_32_bit,
case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
case PIPE_CAP_VERTEX_SHADER_SATURATE:
- case PIPE_CAP_TEXTURE_QUERY_LOD:
case PIPE_CAP_PRIMITIVE_RESTART:
case PIPE_CAP_OCCLUSION_QUERY:
case PIPE_CAP_POINT_SPRITE:
case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
return 1;
+ case PIPE_CAP_TEXTURE_QUERY_LOD:
+ return screen->devinfo.ver >= 42;
+ break;
+
case PIPE_CAP_PACKED_UNIFORMS:
/* We can't enable this flag, because it results in load_ubo
* intrinsics across a 16b boundary, but v3d's TMU general