Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright 2013 Vadim Girlin <vadimgirlin@gmail.com>
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * on the rights to use, copy, modify, merge, publish, distribute, sub
  8.  * license, and/or sell copies of the Software, and to permit persons to whom
  9.  * the Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  18.  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
  19.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  20.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  21.  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  22.  *
  23.  * Authors:
  24.  *      Vadim Girlin
  25.  */
  26.  
  27. #include "sb_bc.h"
  28.  
  29. namespace r600_sb {
  30.  
  31. int bc_decoder::decode_cf(unsigned &i, bc_cf& bc) {
  32.         int r = 0;
  33.         uint32_t dw0 = dw[i];
  34.         uint32_t dw1 = dw[i+1];
  35.  
  36.         if ((dw1 >> 29) & 1) { // CF_ALU
  37.                 return decode_cf_alu(i, bc);
  38.         } else {
  39.                 // CF_INST field encoding on cayman is the same as on evergreen
  40.                 unsigned opcode = ctx.is_egcm() ?
  41.                                 CF_WORD1_EG(dw1).get_CF_INST() :
  42.                                 CF_WORD1_R6R7(dw1).get_CF_INST();
  43.  
  44.                 bc.set_op(r600_isa_cf_by_opcode(ctx.isa, opcode, 0));
  45.  
  46.                 if (bc.op_ptr->flags & CF_EXP) {
  47.                         return decode_cf_exp(i, bc);
  48.                 } else if (bc.op_ptr->flags & CF_MEM) {
  49.                         return decode_cf_mem(i, bc);
  50.                 }
  51.  
  52.                 if (ctx.is_egcm()) {
  53.                         CF_WORD0_EGCM w0(dw0);
  54.                         bc.addr = w0.get_ADDR();
  55.                         bc.jumptable_sel = w0.get_JUMPTABLE_SEL();
  56.  
  57.                         if (ctx.is_evergreen()) {
  58.                                 CF_WORD1_EG w1(dw1);
  59.  
  60.                                 bc.barrier = w1.get_BARRIER();
  61.                                 bc.cf_const = w1.get_CF_CONST();
  62.                                 bc.cond = w1.get_COND();
  63.                                 bc.count = w1.get_COUNT();
  64.                                 bc.end_of_program = w1.get_END_OF_PROGRAM();
  65.                                 bc.pop_count = w1.get_POP_COUNT();
  66.                                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  67.                                 bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  68.  
  69.                         } else { // cayman
  70.                                 CF_WORD1_CM w1(dw1);
  71.  
  72.                                 bc.barrier = w1.get_BARRIER();
  73.                                 bc.cf_const = w1.get_CF_CONST();
  74.                                 bc.cond = w1.get_COND();
  75.                                 bc.count = w1.get_COUNT();
  76.                                 bc.pop_count = w1.get_POP_COUNT();
  77.                                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  78.                         }
  79.  
  80.  
  81.                 } else {
  82.                         CF_WORD0_R6R7 w0(dw0);
  83.                         bc.addr = w0.get_ADDR();
  84.  
  85.                         CF_WORD1_R6R7 w1(dw1);
  86.                         bc.barrier = w1.get_BARRIER();
  87.                         bc.cf_const = w1.get_CF_CONST();
  88.                         bc.cond = w1.get_COND();
  89.  
  90.                         if (ctx.is_r600())
  91.                                 bc.count = w1.get_COUNT();
  92.                         else
  93.                                 bc.count = w1.get_COUNT() + (w1.get_COUNT_3() << 3);
  94.  
  95.                         bc.end_of_program = w1.get_END_OF_PROGRAM();
  96.                         bc.pop_count = w1.get_POP_COUNT();
  97.                         bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  98.                         bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  99.                         bc.call_count = w1.get_CALL_COUNT();
  100.                 }
  101.         }
  102.  
  103.         i += 2;
  104.  
  105.         return r;
  106. }
  107.  
  108. int bc_decoder::decode_cf_alu(unsigned & i, bc_cf& bc) {
  109.         int r = 0;
  110.         uint32_t dw0 = dw[i++];
  111.         uint32_t dw1 = dw[i++];
  112.  
  113.         assert(i <= ndw);
  114.  
  115.         CF_ALU_WORD0_ALL w0(dw0);
  116.  
  117.         bc.kc[0].bank = w0.get_KCACHE_BANK0();
  118.         bc.kc[1].bank = w0.get_KCACHE_BANK1();
  119.         bc.kc[0].mode = w0.get_KCACHE_MODE0();
  120.  
  121.         bc.addr = w0.get_ADDR();
  122.  
  123.         if (ctx.is_r600()) {
  124.                 CF_ALU_WORD1_R6 w1(dw1);
  125.  
  126.                 bc.set_op(r600_isa_cf_by_opcode(ctx.isa, w1.get_CF_INST(), 1));
  127.  
  128.                 bc.kc[0].addr = w1.get_KCACHE_ADDR0();
  129.                 bc.kc[1].mode = w1.get_KCACHE_MODE1();
  130.                 bc.kc[1].addr = w1.get_KCACHE_ADDR1();
  131.  
  132.                 bc.barrier = w1.get_BARRIER();
  133.                 bc.count = w1.get_COUNT();
  134.                 bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  135.  
  136.                 bc.uses_waterfall = w1.get_USES_WATERFALL();
  137.         } else {
  138.                 CF_ALU_WORD1_R7EGCM w1(dw1);
  139.  
  140.                 bc.set_op(r600_isa_cf_by_opcode(ctx.isa, w1.get_CF_INST(), 1));
  141.  
  142.                 if (bc.op == CF_OP_ALU_EXT) {
  143.                         CF_ALU_WORD0_EXT_EGCM w0(dw0);
  144.                         CF_ALU_WORD1_EXT_EGCM w1(dw1);
  145.  
  146.                         bc.kc[0].index_mode = w0.get_KCACHE_BANK_INDEX_MODE0();
  147.                         bc.kc[1].index_mode = w0.get_KCACHE_BANK_INDEX_MODE1();
  148.                         bc.kc[2].index_mode = w0.get_KCACHE_BANK_INDEX_MODE2();
  149.                         bc.kc[3].index_mode = w0.get_KCACHE_BANK_INDEX_MODE3();
  150.                         bc.kc[2].bank = w0.get_KCACHE_BANK2();
  151.                         bc.kc[3].bank = w0.get_KCACHE_BANK3();
  152.                         bc.kc[2].mode = w0.get_KCACHE_MODE2();
  153.                         bc.kc[3].mode = w1.get_KCACHE_MODE3();
  154.                         bc.kc[2].addr = w1.get_KCACHE_ADDR2();
  155.                         bc.kc[3].addr = w1.get_KCACHE_ADDR3();
  156.  
  157.                         r = decode_cf_alu(i, bc);
  158.  
  159.                 } else {
  160.  
  161.                         bc.kc[0].addr = w1.get_KCACHE_ADDR0();
  162.                         bc.kc[1].mode = w1.get_KCACHE_MODE1();
  163.                         bc.kc[1].addr = w1.get_KCACHE_ADDR1();
  164.                         bc.barrier = w1.get_BARRIER();
  165.                         bc.count = w1.get_COUNT();
  166.                         bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  167.  
  168.                         bc.alt_const = w1.get_ALT_CONST();
  169.                 }
  170.         }
  171.         return r;
  172. }
  173.  
  174. int bc_decoder::decode_cf_exp(unsigned & i, bc_cf& bc) {
  175.         int r = 0;
  176.         uint32_t dw0 = dw[i++];
  177.         uint32_t dw1 = dw[i++];
  178.         assert(i <= ndw);
  179.  
  180.         CF_ALLOC_EXPORT_WORD0_ALL w0(dw0);
  181.         bc.array_base = w0.get_ARRAY_BASE();
  182.         bc.elem_size = w0.get_ELEM_SIZE();
  183.         bc.index_gpr = w0.get_INDEX_GPR();
  184.         bc.rw_gpr = w0.get_RW_GPR();
  185.         bc.rw_rel = w0.get_RW_REL();
  186.         bc.type = w0.get_TYPE();
  187.  
  188.         if (ctx.is_evergreen()) {
  189.                 CF_ALLOC_EXPORT_WORD1_SWIZ_EG w1(dw1);
  190.                 bc.barrier = w1.get_BARRIER();
  191.                 bc.burst_count = w1.get_BURST_COUNT();
  192.                 bc.end_of_program = w1.get_END_OF_PROGRAM();
  193.                 bc.sel[0] = w1.get_SEL_X();
  194.                 bc.sel[1] = w1.get_SEL_Y();
  195.                 bc.sel[2] = w1.get_SEL_Z();
  196.                 bc.sel[3] = w1.get_SEL_W();
  197.                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  198.                 bc.mark = w1.get_MARK();
  199.  
  200.         } else if (ctx.is_cayman()) {
  201.                 CF_ALLOC_EXPORT_WORD1_SWIZ_CM w1(dw1);
  202.                 bc.barrier = w1.get_BARRIER();
  203.                 bc.burst_count = w1.get_BURST_COUNT();
  204.                 bc.mark = w1.get_MARK();
  205.                 bc.sel[0] = w1.get_SEL_X();
  206.                 bc.sel[1] = w1.get_SEL_Y();
  207.                 bc.sel[2] = w1.get_SEL_Z();
  208.                 bc.sel[3] = w1.get_SEL_W();
  209.                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  210.  
  211.         } else { // r67
  212.                 CF_ALLOC_EXPORT_WORD1_SWIZ_R6R7 w1(dw1);
  213.                 bc.barrier = w1.get_BARRIER();
  214.                 bc.burst_count = w1.get_BURST_COUNT();
  215.                 bc.end_of_program = w1.get_END_OF_PROGRAM();
  216.                 bc.sel[0] = w1.get_SEL_X();
  217.                 bc.sel[1] = w1.get_SEL_Y();
  218.                 bc.sel[2] = w1.get_SEL_Z();
  219.                 bc.sel[3] = w1.get_SEL_W();
  220.                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  221.                 bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  222.         }
  223.  
  224.         return r;
  225. }
  226.  
  227.  
  228. int bc_decoder::decode_cf_mem(unsigned & i, bc_cf& bc) {
  229.         int r = 0;
  230.         uint32_t dw0 = dw[i++];
  231.         uint32_t dw1 = dw[i++];
  232.         assert(i <= ndw);
  233.  
  234.         if (!(bc.op_ptr->flags & CF_RAT)) {
  235.                 CF_ALLOC_EXPORT_WORD0_ALL w0(dw0);
  236.                 bc.array_base = w0.get_ARRAY_BASE();
  237.                 bc.elem_size = w0.get_ELEM_SIZE();
  238.                 bc.index_gpr = w0.get_INDEX_GPR();
  239.                 bc.rw_gpr = w0.get_RW_GPR();
  240.                 bc.rw_rel = w0.get_RW_REL();
  241.                 bc.type = w0.get_TYPE();
  242.         } else {
  243.                 assert(ctx.is_egcm());
  244.                 CF_ALLOC_EXPORT_WORD0_RAT_EGCM w0(dw0);
  245.                 bc.elem_size = w0.get_ELEM_SIZE();
  246.                 bc.index_gpr = w0.get_INDEX_GPR();
  247.                 bc.rw_gpr = w0.get_RW_GPR();
  248.                 bc.rw_rel = w0.get_RW_REL();
  249.                 bc.type = w0.get_TYPE();
  250.                 bc.rat_id = w0.get_RAT_ID();
  251.                 bc.rat_inst = w0.get_RAT_INST();
  252.                 bc.rat_index_mode = w0.get_RAT_INDEX_MODE();
  253.         }
  254.  
  255.         if (ctx.is_evergreen()) {
  256.                 CF_ALLOC_EXPORT_WORD1_BUF_EG w1(dw1);
  257.                 bc.barrier = w1.get_BARRIER();
  258.                 bc.burst_count = w1.get_BURST_COUNT();
  259.                 bc.end_of_program = w1.get_END_OF_PROGRAM();
  260.                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  261.                 bc.mark = w1.get_MARK();
  262.                 bc.array_size = w1.get_ARRAY_SIZE();
  263.                 bc.comp_mask = w1.get_COMP_MASK();
  264.  
  265.         } else if (ctx.is_cayman()) {
  266.                 CF_ALLOC_EXPORT_WORD1_BUF_CM w1(dw1);
  267.                 bc.barrier = w1.get_BARRIER();
  268.                 bc.burst_count = w1.get_BURST_COUNT();
  269.                 bc.mark = w1.get_MARK();
  270.                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  271.                 bc.array_size = w1.get_ARRAY_SIZE();
  272.                 bc.comp_mask = w1.get_COMP_MASK();
  273.  
  274.         } else { // r67
  275.                 CF_ALLOC_EXPORT_WORD1_BUF_R6R7 w1(dw1);
  276.                 bc.barrier = w1.get_BARRIER();
  277.                 bc.burst_count = w1.get_BURST_COUNT();
  278.                 bc.end_of_program = w1.get_END_OF_PROGRAM();
  279.                 bc.valid_pixel_mode = w1.get_VALID_PIXEL_MODE();
  280.                 bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  281.                 bc.array_size = w1.get_ARRAY_SIZE();
  282.                 bc.comp_mask = w1.get_COMP_MASK();
  283.                 bc.whole_quad_mode = w1.get_WHOLE_QUAD_MODE();
  284.         }
  285.  
  286.         return r;
  287. }
  288.  
  289. int bc_decoder::decode_alu(unsigned & i, bc_alu& bc) {
  290.         int r = 0;
  291.         uint32_t dw0 = dw[i++];
  292.         uint32_t dw1 = dw[i++];
  293.         assert(i <= ndw);
  294.  
  295.         ALU_WORD0_ALL w0(dw0);
  296.         bc.index_mode = w0.get_INDEX_MODE();
  297.         bc.last = w0.get_LAST();
  298.         bc.pred_sel = w0.get_PRED_SEL();
  299.         bc.src[0].chan = w0.get_SRC0_CHAN();
  300.         bc.src[0].sel = w0.get_SRC0_SEL();
  301.         bc.src[0].neg = w0.get_SRC0_NEG();
  302.         bc.src[0].rel = w0.get_SRC0_REL();
  303.         bc.src[1].chan = w0.get_SRC1_CHAN();
  304.         bc.src[1].sel = w0.get_SRC1_SEL();
  305.         bc.src[1].neg = w0.get_SRC1_NEG();
  306.         bc.src[1].rel = w0.get_SRC1_REL();
  307.  
  308.         if ((dw1 >> 15) & 7) { // op3
  309.                 ALU_WORD1_OP3_ALL w1(dw1);
  310.                 bc.set_op(r600_isa_alu_by_opcode(ctx.isa, w1.get_ALU_INST(), 1));
  311.  
  312.                 bc.bank_swizzle = w1.get_BANK_SWIZZLE();
  313.                 bc.clamp = w1.get_CLAMP();
  314.                 bc.dst_chan = w1.get_DST_CHAN();
  315.                 bc.dst_gpr = w1.get_DST_GPR();
  316.                 bc.dst_rel = w1.get_DST_REL();
  317.  
  318.                 bc.src[2].chan = w1.get_SRC2_CHAN();
  319.                 bc.src[2].sel = w1.get_SRC2_SEL();
  320.                 bc.src[2].neg = w1.get_SRC2_NEG();
  321.                 bc.src[2].rel = w1.get_SRC2_REL();
  322.  
  323.         } else { // op2
  324.                 if (ctx.is_r600()) {
  325.                         ALU_WORD1_OP2_R6 w1(dw1);
  326.                         bc.set_op(r600_isa_alu_by_opcode(ctx.isa, w1.get_ALU_INST(), 0));
  327.  
  328.                         bc.bank_swizzle = w1.get_BANK_SWIZZLE();
  329.                         bc.clamp = w1.get_CLAMP();
  330.                         bc.dst_chan = w1.get_DST_CHAN();
  331.                         bc.dst_gpr = w1.get_DST_GPR();
  332.                         bc.dst_rel = w1.get_DST_REL();
  333.  
  334.                         bc.omod = w1.get_OMOD();
  335.                         bc.src[0].abs = w1.get_SRC0_ABS();
  336.                         bc.src[1].abs = w1.get_SRC1_ABS();
  337.                         bc.write_mask = w1.get_WRITE_MASK();
  338.                         bc.update_exec_mask = w1.get_UPDATE_EXEC_MASK();
  339.                         bc.update_pred = w1.get_UPDATE_PRED();
  340.  
  341.                         bc.fog_merge = w1.get_FOG_MERGE();
  342.  
  343.                 } else {
  344.                         ALU_WORD1_OP2_R7EGCM w1(dw1);
  345.                         bc.set_op(r600_isa_alu_by_opcode(ctx.isa, w1.get_ALU_INST(), 0));
  346.  
  347.                         bc.bank_swizzle = w1.get_BANK_SWIZZLE();
  348.                         bc.clamp = w1.get_CLAMP();
  349.                         bc.dst_chan = w1.get_DST_CHAN();
  350.                         bc.dst_gpr = w1.get_DST_GPR();
  351.                         bc.dst_rel = w1.get_DST_REL();
  352.  
  353.                         bc.omod = w1.get_OMOD();
  354.                         bc.src[0].abs = w1.get_SRC0_ABS();
  355.                         bc.src[1].abs = w1.get_SRC1_ABS();
  356.                         bc.write_mask = w1.get_WRITE_MASK();
  357.                         bc.update_exec_mask = w1.get_UPDATE_EXEC_MASK();
  358.                         bc.update_pred = w1.get_UPDATE_PRED();
  359.                 }
  360.         }
  361.  
  362.         bc.slot_flags = (alu_op_flags)bc.op_ptr->slots[ctx.isa->hw_class];
  363.         return r;
  364. }
  365.  
  366. int bc_decoder::decode_fetch(unsigned & i, bc_fetch& bc) {
  367.         int r = 0;
  368.         uint32_t dw0 = dw[i];
  369.         uint32_t dw1 = dw[i+1];
  370.         uint32_t dw2 = dw[i+2];
  371.         assert(i + 4 <= ndw);
  372.  
  373.         unsigned fetch_opcode = dw0 & 0x1F;
  374.  
  375.         bc.set_op(r600_isa_fetch_by_opcode(ctx.isa, fetch_opcode));
  376.  
  377.         if (bc.op_ptr->flags & FF_VTX)
  378.                 return decode_fetch_vtx(i, bc);
  379.  
  380.         // tex
  381.  
  382.         if (ctx.is_r600()) {
  383.                 TEX_WORD0_R6 w0(dw0);
  384.  
  385.                 bc.bc_frac_mode = w0.get_BC_FRAC_MODE();
  386.                 bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
  387.                 bc.resource_id = w0.get_RESOURCE_ID();
  388.                 bc.src_gpr = w0.get_SRC_GPR();
  389.                 bc.src_rel = w0.get_SRC_REL();
  390.  
  391.         } else if (ctx.is_r600()) {
  392.                 TEX_WORD0_R7 w0(dw0);
  393.  
  394.                 bc.bc_frac_mode = w0.get_BC_FRAC_MODE();
  395.                 bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
  396.                 bc.resource_id = w0.get_RESOURCE_ID();
  397.                 bc.src_gpr = w0.get_SRC_GPR();
  398.                 bc.src_rel = w0.get_SRC_REL();
  399.                 bc.alt_const = w0.get_ALT_CONST();
  400.  
  401.         } else { // eg/cm
  402.                 TEX_WORD0_EGCM w0(dw0);
  403.  
  404.                 bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
  405.                 bc.resource_id = w0.get_RESOURCE_ID();
  406.                 bc.src_gpr = w0.get_SRC_GPR();
  407.                 bc.src_rel = w0.get_SRC_REL();
  408.                 bc.alt_const = w0.get_ALT_CONST();
  409.                 bc.inst_mod = w0.get_INST_MOD();
  410.                 bc.resource_index_mode = w0.get_RESOURCE_INDEX_MODE();
  411.                 bc.sampler_index_mode = w0.get_SAMPLER_INDEX_MODE();
  412.         }
  413.  
  414.         TEX_WORD1_ALL w1(dw1);
  415.         bc.coord_type[0] = w1.get_COORD_TYPE_X();
  416.         bc.coord_type[1] = w1.get_COORD_TYPE_Y();
  417.         bc.coord_type[2] = w1.get_COORD_TYPE_Z();
  418.         bc.coord_type[3] = w1.get_COORD_TYPE_W();
  419.         bc.dst_gpr = w1.get_DST_GPR();
  420.         bc.dst_rel = w1.get_DST_REL();
  421.         bc.dst_sel[0] = w1.get_DST_SEL_X();
  422.         bc.dst_sel[1] = w1.get_DST_SEL_Y();
  423.         bc.dst_sel[2] = w1.get_DST_SEL_Z();
  424.         bc.dst_sel[3] = w1.get_DST_SEL_W();
  425.         bc.lod_bias = w1.get_LOD_BIAS();
  426.  
  427.         TEX_WORD2_ALL w2(dw2);
  428.         bc.offset[0] = w2.get_OFFSET_X();
  429.         bc.offset[1] = w2.get_OFFSET_Y();
  430.         bc.offset[2] = w2.get_OFFSET_Z();
  431.         bc.sampler_id = w2.get_SAMPLER_ID();
  432.         bc.src_sel[0] = w2.get_SRC_SEL_X();
  433.         bc.src_sel[1] = w2.get_SRC_SEL_Y();
  434.         bc.src_sel[2] = w2.get_SRC_SEL_Z();
  435.         bc.src_sel[3] = w2.get_SRC_SEL_W();
  436.  
  437.         i += 4;
  438.         return r;
  439. }
  440.  
  441. int bc_decoder::decode_fetch_vtx(unsigned & i, bc_fetch& bc) {
  442.         int r = 0;
  443.         uint32_t dw0 = dw[i];
  444.         uint32_t dw1 = dw[i+1];
  445.         uint32_t dw2 = dw[i+2];
  446.         i+= 4;
  447.         assert(i <= ndw);
  448.  
  449.         if (ctx.is_cayman()) {
  450.                 VTX_WORD0_CM w0(dw0);
  451.                 bc.resource_id = w0.get_BUFFER_ID();
  452.                 bc.fetch_type = w0.get_FETCH_TYPE();
  453.                 bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
  454.                 bc.src_gpr = w0.get_SRC_GPR();
  455.                 bc.src_rel = w0.get_SRC_REL();
  456.                 bc.src_sel[0] = w0.get_SRC_SEL_X();
  457.                 bc.coalesced_read = w0.get_COALESCED_READ();
  458.                 bc.lds_req = w0.get_LDS_REQ();
  459.                 bc.structured_read = w0.get_STRUCTURED_READ();
  460.  
  461.         } else {
  462.                 VTX_WORD0_R6R7EG w0(dw0);
  463.                 bc.resource_id = w0.get_BUFFER_ID();
  464.                 bc.fetch_type = w0.get_FETCH_TYPE();
  465.                 bc.fetch_whole_quad = w0.get_FETCH_WHOLE_QUAD();
  466.                 bc.mega_fetch_count = w0.get_MEGA_FETCH_COUNT();
  467.                 bc.src_gpr = w0.get_SRC_GPR();
  468.                 bc.src_rel = w0.get_SRC_REL();
  469.                 bc.src_sel[0] = w0.get_SRC_SEL_X();
  470.         }
  471.  
  472.         if (bc.op == FETCH_OP_SEMFETCH) {
  473.                 VTX_WORD1_SEM_ALL w1(dw1);
  474.                 bc.data_format = w1.get_DATA_FORMAT();
  475.                 bc.dst_sel[0] = w1.get_DST_SEL_X();
  476.                 bc.dst_sel[1] = w1.get_DST_SEL_Y();
  477.                 bc.dst_sel[2] = w1.get_DST_SEL_Z();
  478.                 bc.dst_sel[3] = w1.get_DST_SEL_W();
  479.                 bc.format_comp_all = w1.get_FORMAT_COMP_ALL();
  480.                 bc.num_format_all = w1.get_NUM_FORMAT_ALL();
  481.                 bc.srf_mode_all = w1.get_SRF_MODE_ALL();
  482.                 bc.use_const_fields = w1.get_USE_CONST_FIELDS();
  483.  
  484.                 bc.semantic_id = w1.get_SEMANTIC_ID();
  485.  
  486.         } else {
  487.                 VTX_WORD1_GPR_ALL w1(dw1);
  488.                 bc.data_format = w1.get_DATA_FORMAT();
  489.                 bc.dst_sel[0] = w1.get_DST_SEL_X();
  490.                 bc.dst_sel[1] = w1.get_DST_SEL_Y();
  491.                 bc.dst_sel[2] = w1.get_DST_SEL_Z();
  492.                 bc.dst_sel[3] = w1.get_DST_SEL_W();
  493.                 bc.format_comp_all = w1.get_FORMAT_COMP_ALL();
  494.                 bc.num_format_all = w1.get_NUM_FORMAT_ALL();
  495.                 bc.srf_mode_all = w1.get_SRF_MODE_ALL();
  496.                 bc.use_const_fields = w1.get_USE_CONST_FIELDS();
  497.  
  498.                 bc.dst_gpr = w1.get_DST_GPR();
  499.                 bc.dst_rel = w1.get_DST_REL();
  500.         }
  501.  
  502.         switch (ctx.hw_class) {
  503.         case HW_CLASS_R600:
  504.         {
  505.                 VTX_WORD2_R6 w2(dw2);
  506.                 bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
  507.                 bc.endian_swap = w2.get_ENDIAN_SWAP();
  508.                 bc.mega_fetch = w2.get_MEGA_FETCH();
  509.                 bc.offset[0] = w2.get_OFFSET();
  510.                 break;
  511.         }
  512.         case HW_CLASS_R700:
  513.         {
  514.                 VTX_WORD2_R7 w2(dw2);
  515.                 bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
  516.                 bc.endian_swap = w2.get_ENDIAN_SWAP();
  517.                 bc.mega_fetch = w2.get_MEGA_FETCH();
  518.                 bc.offset[0] = w2.get_OFFSET();
  519.                 bc.alt_const = w2.get_ALT_CONST();
  520.                 break;
  521.         }
  522.         case HW_CLASS_EVERGREEN:
  523.         {
  524.                 VTX_WORD2_EG w2(dw2);
  525.                 bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
  526.                 bc.endian_swap = w2.get_ENDIAN_SWAP();
  527.                 bc.mega_fetch = w2.get_MEGA_FETCH();
  528.                 bc.offset[0] = w2.get_OFFSET();
  529.                 bc.alt_const = w2.get_ALT_CONST();
  530.                 bc.resource_index_mode = w2.get_BUFFER_INDEX_MODE();
  531.                 break;
  532.         }
  533.         case HW_CLASS_CAYMAN:
  534.         {
  535.                 VTX_WORD2_CM w2(dw2);
  536.                 bc.const_buf_no_stride = w2.get_CONST_BUF_NO_STRIDE();
  537.                 bc.endian_swap = w2.get_ENDIAN_SWAP();
  538.                 bc.offset[0] = w2.get_OFFSET();
  539.                 bc.alt_const = w2.get_ALT_CONST();
  540.                 bc.resource_index_mode = w2.get_BUFFER_INDEX_MODE();
  541.                 break;
  542.         }
  543.         default:
  544.                 assert(!"unknown hw class");
  545.                 return -1;
  546.         }
  547.  
  548.         return r;
  549. }
  550.  
  551. }
  552.