1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com> 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef RADEON_COMPILER_H 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_COMPILER_H 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/compiler.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "memory_pool.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_code.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_program.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_emulate_loops.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_DBG_LOG (1 << 0) 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RC_DBG_STATS (1 << 1) 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_swizzle_caps; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum rc_program_type { 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_VERTEX_PROGRAM, 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_FRAGMENT_PROGRAM, 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RC_NUM_PROGRAM_TYPES 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct radeon_compiler { 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct memory_pool Pool; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct rc_program Program; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum rc_program_type type; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned Debug:2; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned Error:1; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char * ErrorMsg; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Hardware specification. */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned is_r400:1; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned is_r500:1; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned has_half_swizzles:1; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned has_presub:1; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned has_omod:1; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned disable_optimizations:1; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned max_temp_regs; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned max_constants; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int max_alu_insts; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned max_tex_insts; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Whether to remove unused constants and empty holes in constant space. */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned remove_unused_constants:1; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Variables used internally, not be touched by callers 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the compiler 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*@{*/ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct rc_swizzle_caps * SwizzleCaps; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*@}*/ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct emulate_loop_state loop_state; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned initial_num_insts; /* Number of instructions at start. */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_init(struct radeon_compiler * c); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_destroy(struct radeon_compiler * c); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_debug(struct radeon_compiler * c, const char * fmt, ...); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_error(struct radeon_compiler * c, const char * fmt, ...); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint rc_if_fail_helper(struct radeon_compiler * c, const char * file, int line, const char * assertion); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This macro acts like an if-statement that can be used to implement 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * non-aborting assertions in the compiler. 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It checks whether \p cond is true. If not, an internal compiler error is 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * flagged and the if-clause is run. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A typical use-case would be: 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if (rc_assert(c, condition-that-must-be-true)) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * return; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define rc_assert(c, cond) \ 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!(cond) && rc_if_fail_helper(c, __FILE__, __LINE__, #cond)) 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_calculate_inputs_outputs(struct radeon_compiler * c); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_move_input(struct radeon_compiler * c, unsigned input, struct rc_src_register new_input); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_move_output(struct radeon_compiler * c, unsigned output, unsigned new_output, unsigned writemask); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_copy_output(struct radeon_compiler * c, unsigned output, unsigned dup_output); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, unsigned new_input, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int full_vtransform); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_transform_fragment_face(struct radeon_compiler *c, unsigned face); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r300_fragment_program_compiler { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_compiler Base; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct rX00_fragment_program_code *code; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Optional transformations and features. */ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_program_external_state state; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Register corresponding to the depthbuffer. */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned OutputDepth; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Registers corresponding to the four colorbuffers. */ 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned OutputColor[4]; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * UserData; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*AllocateHwInputs)( 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_fragment_program_compiler * c, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*allocate)(void * data, unsigned input, unsigned hwreg), 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * mydata); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r300_vertex_program_compiler { 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct radeon_compiler Base; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct r300_vertex_program_code *code; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t RequiredOutputs; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void * UserData; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*SetHwInputOutput)(struct r300_vertex_program_compiler * c); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r3xx_compile_vertex_program(struct r300_vertex_program_compiler* c); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_vert_fc(struct radeon_compiler *compiler, void *user); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r300_vertex_program_dump(struct radeon_compiler *compiler, void *user); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct radeon_compiler_pass { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; /* Name of the pass. */ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dump; /* Dump the program if Debug == 1? */ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int predicate; /* Run this pass? */ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void (*run)(struct radeon_compiler *c, void *user); /* The main entrypoint. */ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *user; /* Optional parameter which is passed to the run function. */ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_program_stats { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_insts; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_fc_insts; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_tex_insts; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_rgb_insts; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_alpha_insts; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_presub_ops; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_temp_regs; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_omod_ops; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_inline_literals; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_get_stats(struct radeon_compiler *c, struct rc_program_stats *s); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Executes a list of compiler passes given in the parameter 'list'. */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_run_compiler_passes(struct radeon_compiler *c, struct radeon_compiler_pass *list); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_run_compiler(struct radeon_compiler *c, struct radeon_compiler_pass *list); 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_validate_final_shader(struct radeon_compiler *c, void *user); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* RADEON_COMPILER_H */ 173