summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/r300/compiler/Makefile1
-rwxr-xr-xsrc/mesa/drivers/dri/r300/compiler/SConscript1
-rw-r--r--src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c5
-rw-r--r--src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c2
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.c342
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.h30
-rw-r--r--src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c34
7 files changed, 0 insertions, 415 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/Makefile b/src/mesa/drivers/dri/r300/compiler/Makefile
index 51b896ae91f..12e5c2e6245 100644
--- a/src/mesa/drivers/dri/r300/compiler/Makefile
+++ b/src/mesa/drivers/dri/r300/compiler/Makefile
@@ -9,7 +9,6 @@ C_SOURCES = \
radeon_code.c \
radeon_compiler.c \
radeon_compiler_util.c \
- radeon_emulate_branches.c \
radeon_emulate_loops.c \
radeon_program.c \
radeon_program_print.c \
diff --git a/src/mesa/drivers/dri/r300/compiler/SConscript b/src/mesa/drivers/dri/r300/compiler/SConscript
index 2b4bce1c08c..f1a48375386 100755
--- a/src/mesa/drivers/dri/r300/compiler/SConscript
+++ b/src/mesa/drivers/dri/r300/compiler/SConscript
@@ -25,7 +25,6 @@ r300compiler = env.ConvenienceLibrary(
'radeon_optimize.c',
'radeon_remove_constants.c',
'radeon_rename_regs.c',
- 'radeon_emulate_branches.c',
'radeon_emulate_loops.c',
'radeon_dataflow.c',
'radeon_dataflow_deadcode.c',
diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c
index 9286733635f..005a150efc0 100644
--- a/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c
+++ b/src/mesa/drivers/dri/r300/compiler/r3xx_fragprog.c
@@ -26,7 +26,6 @@
#include "radeon_compiler_util.h"
#include "radeon_dataflow.h"
-#include "radeon_emulate_branches.h"
#include "radeon_emulate_loops.h"
#include "radeon_program_alu.h"
#include "radeon_program_tex.h"
@@ -130,15 +129,11 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c)
/* This transformation needs to be done before any of the IF
* instructions are modified. */
{"transform KILP", 1, 1, rc_transform_KILP, NULL},
- {"unroll loops", 1, is_r500, rc_unroll_loops, NULL},
- {"transform loops", 1, !is_r500, rc_transform_loops, NULL},
- {"emulate branches", 1, !is_r500, rc_emulate_branches, NULL},
{"saturate output writes", 1, sat_out, rc_local_transform, saturate_output},
{"transform TEX", 1, 1, rc_local_transform, rewrite_tex},
{"native rewrite", 1, is_r500, rc_local_transform, native_rewrite_r500},
{"native rewrite", 1, !is_r500, rc_local_transform, native_rewrite_r300},
{"deadcode", 1, opt, rc_dataflow_deadcode, dataflow_outputs_mark_use},
- {"emulate loops", 1, !is_r500, rc_emulate_loops, NULL},
{"dataflow optimize", 1, opt, rc_optimize, NULL},
{"dataflow swizzles", 1, 1, rc_dataflow_swizzles, NULL},
{"dead constants", 1, 1, rc_remove_unused_constants, &c->code->constants_remap_table},
diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
index 8ad2175eadf..76cbdb079ed 100644
--- a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
+++ b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
@@ -30,7 +30,6 @@
#include "radeon_dataflow.h"
#include "radeon_program_alu.h"
#include "radeon_swizzle.h"
-#include "radeon_emulate_branches.h"
#include "radeon_emulate_loops.h"
#include "radeon_remove_constants.h"
@@ -999,7 +998,6 @@ void r3xx_compile_vertex_program(struct r300_vertex_program_compiler *c)
/* NAME DUMP PREDICATE FUNCTION PARAM */
{"add artificial outputs", 0, 1, rc_vs_add_artificial_outputs, NULL},
{"transform loops", 1, 1, rc_transform_loops, NULL},
- {"emulate branches", 1, !is_r500, rc_emulate_branches, NULL},
{"emulate negative addressing", 1, 1, rc_emulate_negative_addressing, NULL},
{"native rewrite", 1, is_r500, rc_local_transform, alu_rewrite_r500},
{"native rewrite", 1, !is_r500, rc_local_transform, alu_rewrite_r300},
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.c b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.c
deleted file mode 100644
index 7bede344f30..00000000000
--- a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright 2009 Nicolai Hähnle <[email protected]>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#include "radeon_emulate_branches.h"
-
-#include <stdio.h>
-
-#include "radeon_compiler.h"
-#include "radeon_dataflow.h"
-
-#define VERBOSE 0
-
-#define DBG(...) do { if (VERBOSE) fprintf(stderr, __VA_ARGS__); } while(0)
-
-
-struct proxy_info {
- unsigned int Proxied:1;
- unsigned int Index:RC_REGISTER_INDEX_BITS;
-};
-
-struct register_proxies {
- struct proxy_info Temporary[RC_REGISTER_MAX_INDEX];
-};
-
-struct branch_info {
- struct rc_instruction * If;
- struct rc_instruction * Else;
-};
-
-struct emulate_branch_state {
- struct radeon_compiler * C;
-
- struct branch_info * Branches;
- unsigned int BranchCount;
- unsigned int BranchReserved;
-};
-
-
-static void handle_if(struct emulate_branch_state * s, struct rc_instruction * inst)
-{
- struct branch_info * branch;
- struct rc_instruction * inst_mov;
-
- memory_pool_array_reserve(&s->C->Pool, struct branch_info,
- s->Branches, s->BranchCount, s->BranchReserved, 1);
-
- DBG("%s\n", __FUNCTION__);
-
- branch = &s->Branches[s->BranchCount++];
- memset(branch, 0, sizeof(struct branch_info));
- branch->If = inst;
-
- /* Make a safety copy of the decision register, because we will need
- * it at ENDIF time and it might be overwritten in both branches. */
- inst_mov = rc_insert_new_instruction(s->C, inst->Prev);
- inst_mov->U.I.Opcode = RC_OPCODE_MOV;
- inst_mov->U.I.DstReg.File = RC_FILE_TEMPORARY;
- inst_mov->U.I.DstReg.Index = rc_find_free_temporary(s->C);
- inst_mov->U.I.DstReg.WriteMask = RC_MASK_X;
- inst_mov->U.I.SrcReg[0] = inst->U.I.SrcReg[0];
-
- inst->U.I.SrcReg[0].File = RC_FILE_TEMPORARY;
- inst->U.I.SrcReg[0].Index = inst_mov->U.I.DstReg.Index;
- inst->U.I.SrcReg[0].Swizzle = 0;
- inst->U.I.SrcReg[0].Abs = 0;
- inst->U.I.SrcReg[0].Negate = 0;
-}
-
-static void handle_else(struct emulate_branch_state * s, struct rc_instruction * inst)
-{
- struct branch_info * branch;
-
- if (!s->BranchCount) {
- rc_error(s->C, "Encountered ELSE outside of branches");
- return;
- }
-
- DBG("%s\n", __FUNCTION__);
-
- branch = &s->Branches[s->BranchCount - 1];
- branch->Else = inst;
-}
-
-
-struct state_and_proxies {
- struct emulate_branch_state * S;
- struct register_proxies * Proxies;
-};
-
-static struct proxy_info * get_proxy_info(struct state_and_proxies * sap,
- rc_register_file file, unsigned int index)
-{
- if (file == RC_FILE_TEMPORARY) {
- return &sap->Proxies->Temporary[index];
- } else {
- return 0;
- }
-}
-
-static void scan_write(void * userdata, struct rc_instruction * inst,
- rc_register_file file, unsigned int index, unsigned int comp)
-{
- struct state_and_proxies * sap = userdata;
- struct proxy_info * proxy = get_proxy_info(sap, file, index);
-
- if (proxy && !proxy->Proxied) {
- proxy->Proxied = 1;
- proxy->Index = rc_find_free_temporary(sap->S->C);
- }
-}
-
-static void remap_proxy_function(void * userdata, struct rc_instruction * inst,
- rc_register_file * pfile, unsigned int * pindex)
-{
- struct state_and_proxies * sap = userdata;
- struct proxy_info * proxy = get_proxy_info(sap, *pfile, *pindex);
-
- if (proxy && proxy->Proxied) {
- *pfile = RC_FILE_TEMPORARY;
- *pindex = proxy->Index;
- }
-}
-
-/**
- * Redirect all writes in the instruction range [begin, end) to proxy
- * temporary registers.
- */
-static void allocate_and_insert_proxies(struct emulate_branch_state * s,
- struct register_proxies * proxies,
- struct rc_instruction * begin,
- struct rc_instruction * end)
-{
- struct state_and_proxies sap;
-
- sap.S = s;
- sap.Proxies = proxies;
-
- for(struct rc_instruction * inst = begin; inst != end; inst = inst->Next) {
- rc_for_all_writes_mask(inst, scan_write, &sap);
- rc_remap_registers(inst, remap_proxy_function, &sap);
- }
-
- for(unsigned int index = 0; index < RC_REGISTER_MAX_INDEX; ++index) {
- if (proxies->Temporary[index].Proxied) {
- struct rc_instruction * inst_mov = rc_insert_new_instruction(s->C, begin->Prev);
- inst_mov->U.I.Opcode = RC_OPCODE_MOV;
- inst_mov->U.I.DstReg.File = RC_FILE_TEMPORARY;
- inst_mov->U.I.DstReg.Index = proxies->Temporary[index].Index;
- inst_mov->U.I.DstReg.WriteMask = RC_MASK_XYZW;
- inst_mov->U.I.SrcReg[0].File = RC_FILE_TEMPORARY;
- inst_mov->U.I.SrcReg[0].Index = index;
- }
- }
-}
-
-
-static void inject_cmp(struct emulate_branch_state * s,
- struct rc_instruction * inst_if,
- struct rc_instruction * inst_endif,
- rc_register_file file, unsigned int index,
- struct proxy_info ifproxy,
- struct proxy_info elseproxy)
-{
- struct rc_instruction * inst_cmp = rc_insert_new_instruction(s->C, inst_endif);
- inst_cmp->U.I.Opcode = RC_OPCODE_CMP;
- inst_cmp->U.I.DstReg.File = file;
- inst_cmp->U.I.DstReg.Index = index;
- inst_cmp->U.I.DstReg.WriteMask = RC_MASK_XYZW;
- inst_cmp->U.I.SrcReg[0] = inst_if->U.I.SrcReg[0];
- inst_cmp->U.I.SrcReg[0].Abs = 1;
- inst_cmp->U.I.SrcReg[0].Negate = RC_MASK_XYZW;
- inst_cmp->U.I.SrcReg[1].File = RC_FILE_TEMPORARY;
- inst_cmp->U.I.SrcReg[1].Index = ifproxy.Proxied ? ifproxy.Index : index;
- inst_cmp->U.I.SrcReg[2].File = RC_FILE_TEMPORARY;
- inst_cmp->U.I.SrcReg[2].Index = elseproxy.Proxied ? elseproxy.Index : index;
-}
-
-static void handle_endif(struct emulate_branch_state * s, struct rc_instruction * inst)
-{
- struct branch_info * branch;
- struct register_proxies IfProxies;
- struct register_proxies ElseProxies;
-
- if (!s->BranchCount) {
- rc_error(s->C, "Encountered ENDIF outside of branches");
- return;
- }
-
- DBG("%s\n", __FUNCTION__);
-
- branch = &s->Branches[s->BranchCount - 1];
-
- memset(&IfProxies, 0, sizeof(IfProxies));
- memset(&ElseProxies, 0, sizeof(ElseProxies));
-
- allocate_and_insert_proxies(s, &IfProxies, branch->If->Next, branch->Else ? branch->Else : inst);
-
- if (branch->Else)
- allocate_and_insert_proxies(s, &ElseProxies, branch->Else->Next, inst);
-
- /* Insert the CMP instructions at the end. */
- for(unsigned int index = 0; index < RC_REGISTER_MAX_INDEX; ++index) {
- if (IfProxies.Temporary[index].Proxied || ElseProxies.Temporary[index].Proxied) {
- inject_cmp(s, branch->If, inst, RC_FILE_TEMPORARY, index,
- IfProxies.Temporary[index], ElseProxies.Temporary[index]);
- }
- }
-
- /* Remove all traces of the branch instructions */
- rc_remove_instruction(branch->If);
- if (branch->Else)
- rc_remove_instruction(branch->Else);
- rc_remove_instruction(inst);
-
- s->BranchCount--;
-
- if (VERBOSE) {
- DBG("Program after ENDIF handling:\n");
- rc_print_program(&s->C->Program);
- }
-}
-
-
-struct remap_output_data {
- unsigned int Output:RC_REGISTER_INDEX_BITS;
- unsigned int Temporary:RC_REGISTER_INDEX_BITS;
-};
-
-static void remap_output_function(void * userdata, struct rc_instruction * inst,
- rc_register_file * pfile, unsigned int * pindex)
-{
- struct remap_output_data * data = userdata;
-
- if (*pfile == RC_FILE_OUTPUT && *pindex == data->Output) {
- *pfile = RC_FILE_TEMPORARY;
- *pindex = data->Temporary;
- }
-}
-
-
-/**
- * Output registers cannot be read from and so cannot be dealt with like
- * temporary registers.
- *
- * We do the simplest thing: If an output registers is written within
- * a branch, then *all* writes to this register are proxied to a
- * temporary register, and a final MOV is appended to the end of
- * the program.
- */
-static void fix_output_writes(struct emulate_branch_state * s, struct rc_instruction * inst)
-{
- const struct rc_opcode_info * opcode;
-
- if (!s->BranchCount)
- return;
-
- opcode = rc_get_opcode_info(inst->U.I.Opcode);
-
- if (!opcode->HasDstReg)
- return;
-
- if (inst->U.I.DstReg.File == RC_FILE_OUTPUT) {
- struct remap_output_data remap;
- struct rc_instruction * inst_mov;
-
- remap.Output = inst->U.I.DstReg.Index;
- remap.Temporary = rc_find_free_temporary(s->C);
-
- for(struct rc_instruction * inst = s->C->Program.Instructions.Next;
- inst != &s->C->Program.Instructions;
- inst = inst->Next) {
- rc_remap_registers(inst, &remap_output_function, &remap);
- }
-
- inst_mov = rc_insert_new_instruction(s->C, s->C->Program.Instructions.Prev);
- inst_mov->U.I.Opcode = RC_OPCODE_MOV;
- inst_mov->U.I.DstReg.File = RC_FILE_OUTPUT;
- inst_mov->U.I.DstReg.Index = remap.Output;
- inst_mov->U.I.DstReg.WriteMask = RC_MASK_XYZW;
- inst_mov->U.I.SrcReg[0].File = RC_FILE_TEMPORARY;
- inst_mov->U.I.SrcReg[0].Index = remap.Temporary;
- }
-}
-
-/**
- * Remove branch instructions; instead, execute both branches
- * on different register sets and choose between their results
- * using CMP instructions in place of the original ENDIF.
- */
-void rc_emulate_branches(struct radeon_compiler *c, void *user)
-{
- struct emulate_branch_state s;
- struct rc_instruction * ptr;
-
- memset(&s, 0, sizeof(s));
- s.C = c;
-
- /* Untypical loop because we may remove the current instruction */
- ptr = c->Program.Instructions.Next;
- while(ptr != &c->Program.Instructions) {
- struct rc_instruction * inst = ptr;
- ptr = ptr->Next;
-
- if (inst->Type == RC_INSTRUCTION_NORMAL) {
- switch(inst->U.I.Opcode) {
- case RC_OPCODE_IF:
- handle_if(&s, inst);
- break;
- case RC_OPCODE_ELSE:
- handle_else(&s, inst);
- break;
- case RC_OPCODE_ENDIF:
- handle_endif(&s, inst);
- break;
- default:
- fix_output_writes(&s, inst);
- break;
- }
- } else {
- rc_error(c, "%s: unhandled instruction type\n", __FUNCTION__);
- }
- }
-}
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.h b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.h
deleted file mode 100644
index 818ab84d0cd..00000000000
--- a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_branches.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2009 Nicolai Hähnle <[email protected]>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#ifndef RADEON_EMULATE_BRANCHES_H
-#define RADEON_EMULATE_BRANCHES_H
-
-struct radeon_compiler;
-
-void rc_emulate_branches(struct radeon_compiler *c, void *user);
-
-#endif /* RADEON_EMULATE_BRANCHES_H */
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
index 205eecd1129..049a8194a36 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_emulate_loops.c
@@ -486,37 +486,3 @@ void rc_transform_loops(struct radeon_compiler *c, void *user)
}
}
}
-
-void rc_unroll_loops(struct radeon_compiler *c, void *user)
-{
- struct rc_instruction * inst;
- struct loop_info loop;
-
- for(inst = c->Program.Instructions.Next;
- inst != &c->Program.Instructions; inst = inst->Next) {
-
- if (inst->U.I.Opcode == RC_OPCODE_BGNLOOP) {
- if (build_loop_info(c, &loop, inst)) {
- try_unroll_loop(c, &loop);
- }
- }
- }
-}
-
-void rc_emulate_loops(struct radeon_compiler *c, void *user)
-{
- struct emulate_loop_state * s = &c->loop_state;
- int i;
- /* Iterate backwards of the list of loops so that loops that nested
- * loops are unrolled first.
- */
- for( i = s->LoopCount - 1; i >= 0; i-- ){
- unsigned int iterations;
-
- if(!s->Loops[i].EndLoop){
- continue;
- }
- iterations = loop_max_possible_iterations(s->C, &s->Loops[i]);
- unroll_loop(s->C, &s->Loops[i], iterations);
- }
-}