static void vs_lower_opcode_tgsi_sampling(struct vs_compile_context *vcc, struct toy_inst *inst) { struct toy_compiler *tc = &vcc->tc; struct toy_src desc; struct toy_dst dst, tmp; unsigned sampler_index; int swizzles[4], i; unsigned swizzle_zero_mask, swizzle_one_mask, swizzle_normal_mask; bool need_filter; desc = vs_prepare_tgsi_sampling(vcc, inst, vcc->first_free_mrf, &sampler_index); switch (inst->opcode) { case TOY_OPCODE_TGSI_TXF: case TOY_OPCODE_TGSI_TXQ: case TOY_OPCODE_TGSI_TXQ_LZ: need_filter = false; break; default: need_filter = true; break; } toy_compiler_lower_to_send(tc, inst, false, GEN6_SFID_SAMPLER); inst->src[0] = tsrc(TOY_FILE_MRF, vcc->first_free_mrf, 0); inst->src[1] = desc; /* write to a temp first */ tmp = tc_alloc_tmp(tc); tmp.type = inst->dst.type; dst = inst->dst; inst->dst = tmp; tc_move_inst(tc, inst); if (need_filter) { assert(sampler_index < vcc->variant->num_sampler_views); swizzles[0] = vcc->variant->sampler_view_swizzles[sampler_index].r; swizzles[1] = vcc->variant->sampler_view_swizzles[sampler_index].g; swizzles[2] = vcc->variant->sampler_view_swizzles[sampler_index].b; swizzles[3] = vcc->variant->sampler_view_swizzles[sampler_index].a; } else { swizzles[0] = PIPE_SWIZZLE_RED; swizzles[1] = PIPE_SWIZZLE_GREEN; swizzles[2] = PIPE_SWIZZLE_BLUE; swizzles[3] = PIPE_SWIZZLE_ALPHA; } swizzle_zero_mask = 0; swizzle_one_mask = 0; swizzle_normal_mask = 0; for (i = 0; i < 4; i++) { switch (swizzles[i]) { case PIPE_SWIZZLE_ZERO: swizzle_zero_mask |= 1 << i; swizzles[i] = i; break; case PIPE_SWIZZLE_ONE: swizzle_one_mask |= 1 << i; swizzles[i] = i; break; default: swizzle_normal_mask |= 1 << i; break; } } /* swizzle the results */ if (swizzle_normal_mask) { tc_MOV(tc, tdst_writemask(dst, swizzle_normal_mask), tsrc_swizzle(tsrc_from(tmp), swizzles[0], swizzles[1], swizzles[2], swizzles[3])); } if (swizzle_zero_mask) tc_MOV(tc, tdst_writemask(dst, swizzle_zero_mask), tsrc_imm_f(0.0f)); if (swizzle_one_mask) tc_MOV(tc, tdst_writemask(dst, swizzle_one_mask), tsrc_imm_f(1.0f)); }
static void fs_lower_opcode_tgsi_sampling(struct fs_compile_context *fcc, struct toy_inst *inst) { struct toy_compiler *tc = &fcc->tc; struct toy_dst dst[4], tmp[4]; struct toy_src desc; unsigned sampler_index; int swizzles[4], i; bool need_filter; desc = fs_prepare_tgsi_sampling(tc, inst, fcc->first_free_mrf, fcc->variant->saturate_tex_coords, &sampler_index); switch (inst->opcode) { case TOY_OPCODE_TGSI_TXF: case TOY_OPCODE_TGSI_TXQ: case TOY_OPCODE_TGSI_TXQ_LZ: need_filter = false; break; default: need_filter = true; break; } toy_compiler_lower_to_send(tc, inst, false, BRW_SFID_SAMPLER); inst->src[0] = tsrc(TOY_FILE_MRF, fcc->first_free_mrf, 0); inst->src[1] = desc; for (i = 2; i < Elements(inst->src); i++) inst->src[i] = tsrc_null(); /* write to temps first */ tc_alloc_tmp4(tc, tmp); tdst_transpose(inst->dst, dst); inst->dst = tmp[0]; tc_move_inst(tc, inst); if (need_filter) { assert(sampler_index < fcc->variant->num_sampler_views); swizzles[0] = fcc->variant->sampler_view_swizzles[sampler_index].r; swizzles[1] = fcc->variant->sampler_view_swizzles[sampler_index].g; swizzles[2] = fcc->variant->sampler_view_swizzles[sampler_index].b; swizzles[3] = fcc->variant->sampler_view_swizzles[sampler_index].a; } else { swizzles[0] = PIPE_SWIZZLE_RED; swizzles[1] = PIPE_SWIZZLE_GREEN; swizzles[2] = PIPE_SWIZZLE_BLUE; swizzles[3] = PIPE_SWIZZLE_ALPHA; } /* swizzle the results */ for (i = 0; i < 4; i++) { switch (swizzles[i]) { case PIPE_SWIZZLE_ZERO: tc_MOV(tc, dst[i], tsrc_imm_f(0.0f)); break; case PIPE_SWIZZLE_ONE: tc_MOV(tc, dst[i], tsrc_imm_f(1.0f)); break; default: tc_MOV(tc, dst[i], tsrc_from(tmp[swizzles[i]])); break; } } }