i965/vs: implement ir_query_levels
authorChris Forbes <chrisf@ijw.co.nz>
Thu, 26 Sep 2013 17:52:20 +0000 (05:52 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Sat, 5 Oct 2013 06:16:33 +0000 (19:16 +1300)
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 9e6cc785ba92bf834f1ec69db094707e13de8be0..1112b23cc3b0c0c2035b1b090e2ba4c44f7e9a87 100644 (file)
@@ -2192,6 +2192,10 @@ vec4_visitor::visit(ir_texture *ir)
       lod = this->result;
       lod_type = ir->lod_info.lod->type;
       break;
+   case ir_query_levels:
+      lod = src_reg(0);
+      lod_type = glsl_type::int_type;
+      break;
    case ir_txf_ms:
       ir->lod_info.sample_index->accept(this);
       sample_index = this->result;
@@ -2232,6 +2236,8 @@ vec4_visitor::visit(ir_texture *ir)
       break;
    case ir_tg4:
       inst = new(mem_ctx) vec4_instruction(this, SHADER_OPCODE_TG4);
+   case ir_query_levels:
+      inst = new(mem_ctx) vec4_instruction(this, SHADER_OPCODE_TXS);
       break;
    case ir_txb:
       assert(!"TXB is not valid for vertex shaders.");
@@ -2264,7 +2270,7 @@ vec4_visitor::visit(ir_texture *ir)
    /* MRF for the first parameter */
    int param_base = inst->base_mrf + inst->header_present;
 
-   if (ir->op == ir_txs) {
+   if (ir->op == ir_txs || ir->op == ir_query_levels) {
       int writemask = brw->gen == 4 ? WRITEMASK_W : WRITEMASK_X;
       emit(MOV(dst_reg(MRF, param_base, lod_type, writemask), lod));
    } else {
@@ -2415,6 +2421,13 @@ vec4_visitor::swizzle_result(ir_texture *ir, src_reg orig_val, int sampler)
    this->result = src_reg(this, ir->type);
    dst_reg swizzled_result(this->result);
 
+   if (ir->op == ir_query_levels) {
+      /* # levels is in .w */
+      orig_val.swizzle = BRW_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W);
+      emit(MOV(swizzled_result, orig_val));
+      return;
+   }
+
    if (ir->op == ir_txs || ir->type == glsl_type::float_type
                        || s == SWIZZLE_NOOP || ir->op == ir_tg4) {
       emit(MOV(swizzled_result, orig_val));