Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
  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. #ifndef R600_ASM_H
  24. #define R600_ASM_H
  25.  
  26. #include "r600_pipe.h"
  27. #include "r600_isa.h"
  28.  
  29. struct r600_bytecode_alu_src {
  30.         unsigned                        sel;
  31.         unsigned                        chan;
  32.         unsigned                        neg;
  33.         unsigned                        abs;
  34.         unsigned                        rel;
  35.         unsigned                        kc_bank;
  36.         unsigned                        kc_rel;
  37.         uint32_t                        value;
  38. };
  39.  
  40. struct r600_bytecode_alu_dst {
  41.         unsigned                        sel;
  42.         unsigned                        chan;
  43.         unsigned                        clamp;
  44.         unsigned                        write;
  45.         unsigned                        rel;
  46. };
  47.  
  48. struct r600_bytecode_alu {
  49.         struct list_head                list;
  50.         struct r600_bytecode_alu_src            src[3];
  51.         struct r600_bytecode_alu_dst            dst;
  52.         unsigned                        op;
  53.         unsigned                        last;
  54.         unsigned                        is_op3;
  55.         unsigned                        execute_mask;
  56.         unsigned                        update_pred;
  57.         unsigned                        pred_sel;
  58.         unsigned                        bank_swizzle;
  59.         unsigned                        bank_swizzle_force;
  60.         unsigned                        omod;
  61.         unsigned                        index_mode;
  62. };
  63.  
  64. struct r600_bytecode_tex {
  65.         struct list_head                list;
  66.         unsigned                        op;
  67.         unsigned                        inst_mod;
  68.         unsigned                        resource_id;
  69.         unsigned                        src_gpr;
  70.         unsigned                        src_rel;
  71.         unsigned                        dst_gpr;
  72.         unsigned                        dst_rel;
  73.         unsigned                        dst_sel_x;
  74.         unsigned                        dst_sel_y;
  75.         unsigned                        dst_sel_z;
  76.         unsigned                        dst_sel_w;
  77.         unsigned                        lod_bias;
  78.         unsigned                        coord_type_x;
  79.         unsigned                        coord_type_y;
  80.         unsigned                        coord_type_z;
  81.         unsigned                        coord_type_w;
  82.         int                             offset_x;
  83.         int                             offset_y;
  84.         int                             offset_z;
  85.         unsigned                        sampler_id;
  86.         unsigned                        src_sel_x;
  87.         unsigned                        src_sel_y;
  88.         unsigned                        src_sel_z;
  89.         unsigned                        src_sel_w;
  90.         /* indexed samplers/resources only on evergreen/cayman */
  91.         unsigned                        sampler_index_mode;
  92.         unsigned                        resource_index_mode;
  93. };
  94.  
  95. struct r600_bytecode_vtx {
  96.         struct list_head                list;
  97.         unsigned                        op;
  98.         unsigned                        fetch_type;
  99.         unsigned                        buffer_id;
  100.         unsigned                        src_gpr;
  101.         unsigned                        src_sel_x;
  102.         unsigned                        mega_fetch_count;
  103.         unsigned                        dst_gpr;
  104.         unsigned                        dst_sel_x;
  105.         unsigned                        dst_sel_y;
  106.         unsigned                        dst_sel_z;
  107.         unsigned                        dst_sel_w;
  108.         unsigned                        use_const_fields;
  109.         unsigned                        data_format;
  110.         unsigned                        num_format_all;
  111.         unsigned                        format_comp_all;
  112.         unsigned                        srf_mode_all;
  113.         unsigned                        offset;
  114.         unsigned                        endian;
  115.         unsigned                        buffer_index_mode;
  116. };
  117.  
  118. struct r600_bytecode_output {
  119.         unsigned                        array_base;
  120.         unsigned                        array_size;
  121.         unsigned                        comp_mask;
  122.         unsigned                        type;
  123.  
  124.         unsigned                        op;
  125.  
  126.         unsigned                        elem_size;
  127.         unsigned                        gpr;
  128.         unsigned                        swizzle_x;
  129.         unsigned                        swizzle_y;
  130.         unsigned                        swizzle_z;
  131.         unsigned                        swizzle_w;
  132.         unsigned                        burst_count;
  133.         unsigned                        index_gpr;
  134. };
  135.  
  136. struct r600_bytecode_kcache {
  137.         unsigned                        bank;
  138.         unsigned                        mode;
  139.         unsigned                        addr;
  140.         unsigned                        index_mode;
  141. };
  142.  
  143. struct r600_bytecode_cf {
  144.         struct list_head                list;
  145.  
  146.         unsigned                        op;
  147.         unsigned                        addr;
  148.         unsigned                        ndw;
  149.         unsigned                        id;
  150.         unsigned                        cond;
  151.         unsigned                        pop_count;
  152.         unsigned                        cf_addr; /* control flow addr */
  153.         struct r600_bytecode_kcache             kcache[4];
  154.         unsigned                        r6xx_uses_waterfall;
  155.         unsigned                        eg_alu_extended;
  156.         unsigned                        barrier;
  157.         unsigned                        end_of_program;
  158.         struct list_head                alu;
  159.         struct list_head                tex;
  160.         struct list_head                vtx;
  161.         struct r600_bytecode_output             output;
  162.         struct r600_bytecode_alu                *curr_bs_head;
  163.         struct r600_bytecode_alu                *prev_bs_head;
  164.         struct r600_bytecode_alu                *prev2_bs_head;
  165.         unsigned isa[2];
  166. };
  167.  
  168. #define FC_NONE                         0
  169. #define FC_IF                           1
  170. #define FC_LOOP                         2
  171. #define FC_REP                          3
  172. #define FC_PUSH_VPM                     4
  173. #define FC_PUSH_WQM                     5
  174.  
  175. struct r600_cf_stack_entry {
  176.         int                             type;
  177.         struct r600_bytecode_cf         *start;
  178.         struct r600_bytecode_cf         **mid; /* used to store the else point */
  179.         int                             num_mid;
  180. };
  181.  
  182. #define SQ_MAX_CALL_DEPTH 0x00000020
  183.  
  184. #define AR_HANDLE_NORMAL 0
  185. #define AR_HANDLE_RV6XX 1 /* except RV670 */
  186.  
  187. struct r600_stack_info {
  188.         /* current level of non-WQM PUSH operations
  189.          * (PUSH, PUSH_ELSE, ALU_PUSH_BEFORE) */
  190.         int push;
  191.         /* current level of WQM PUSH operations
  192.          * (PUSH, PUSH_ELSE, PUSH_WQM) */
  193.         int push_wqm;
  194.         /* current loop level */
  195.         int loop;
  196.  
  197.         /* required depth */
  198.         int max_entries;
  199.         /* subentries per entry */
  200.         int entry_size;
  201. };
  202.  
  203. struct r600_bytecode {
  204.         enum chip_class                 chip_class;
  205.         enum radeon_family              family;
  206.         bool                            has_compressed_msaa_texturing;
  207.         int                             type;
  208.         struct list_head                cf;
  209.         struct r600_bytecode_cf         *cf_last;
  210.         unsigned                        ndw;
  211.         unsigned                        ncf;
  212.         unsigned                        ngpr;
  213.         unsigned                        nstack;
  214.         unsigned                        nlds_dw;
  215.         unsigned                        nresource;
  216.         unsigned                        force_add_cf;
  217.         uint32_t                        *bytecode;
  218.         uint32_t                        fc_sp;
  219.         struct r600_cf_stack_entry      fc_stack[32];
  220.         struct r600_stack_info          stack;
  221.         unsigned        ar_loaded;
  222.         unsigned        ar_reg;
  223.         unsigned        ar_chan;
  224.         unsigned        ar_handling;
  225.         unsigned        r6xx_nop_after_rel_dst;
  226.         bool            index_loaded[2];
  227.         unsigned        index_reg[2]; /* indexing register CF_INDEX_[01] */
  228.         unsigned        debug_id;
  229.         struct r600_isa* isa;
  230. };
  231.  
  232. /* eg_asm.c */
  233. int eg_bytecode_cf_build(struct r600_bytecode *bc, struct r600_bytecode_cf *cf);
  234. int egcm_load_index_reg(struct r600_bytecode *bc, unsigned id, bool inside_alu_clause);
  235.  
  236. /* r600_asm.c */
  237. void r600_bytecode_init(struct r600_bytecode *bc,
  238.                         enum chip_class chip_class,
  239.                         enum radeon_family family,
  240.                         bool has_compressed_msaa_texturing);
  241. void r600_bytecode_clear(struct r600_bytecode *bc);
  242. int r600_bytecode_add_alu(struct r600_bytecode *bc,
  243.                 const struct r600_bytecode_alu *alu);
  244. int r600_bytecode_add_vtx(struct r600_bytecode *bc,
  245.                 const struct r600_bytecode_vtx *vtx);
  246. int r600_bytecode_add_tex(struct r600_bytecode *bc,
  247.                 const struct r600_bytecode_tex *tex);
  248. int r600_bytecode_add_output(struct r600_bytecode *bc,
  249.                 const struct r600_bytecode_output *output);
  250. int r600_bytecode_build(struct r600_bytecode *bc);
  251. int r600_bytecode_add_cf(struct r600_bytecode *bc);
  252. int r600_bytecode_add_cfinst(struct r600_bytecode *bc,
  253.                 unsigned op);
  254. int r600_bytecode_add_alu_type(struct r600_bytecode *bc,
  255.                 const struct r600_bytecode_alu *alu, unsigned type);
  256. void r600_bytecode_special_constants(uint32_t value,
  257.                 unsigned *sel, unsigned *neg);
  258. void r600_bytecode_disasm(struct r600_bytecode *bc);
  259. void r600_bytecode_alu_read(struct r600_bytecode *bc,
  260.                 struct r600_bytecode_alu *alu, uint32_t word0, uint32_t word1);
  261.  
  262. int cm_bytecode_add_cf_end(struct r600_bytecode *bc);
  263.  
  264. void *r600_create_vertex_fetch_shader(struct pipe_context *ctx,
  265.                                       unsigned count,
  266.                                       const struct pipe_vertex_element *elements);
  267.  
  268. /* r700_asm.c */
  269. void r700_bytecode_cf_vtx_build(uint32_t *bytecode,
  270.                 const struct r600_bytecode_cf *cf);
  271. int r700_bytecode_alu_build(struct r600_bytecode *bc,
  272.                 struct r600_bytecode_alu *alu, unsigned id);
  273. void r700_bytecode_alu_read(struct r600_bytecode *bc,
  274.                 struct r600_bytecode_alu *alu, uint32_t word0, uint32_t word1);
  275. void r600_bytecode_export_read(struct r600_bytecode *bc,
  276.                 struct r600_bytecode_output *output, uint32_t word0, uint32_t word1);
  277. void eg_bytecode_export_read(struct r600_bytecode *bc,
  278.                 struct r600_bytecode_output *output, uint32_t word0, uint32_t word1);
  279.  
  280. void r600_vertex_data_type(enum pipe_format pformat, unsigned *format,
  281.                            unsigned *num_format, unsigned *format_comp, unsigned *endian);
  282. #endif
  283.