summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r600/r600_compiler_r700.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-07-21 15:39:23 +1000
committerJerome Glisse <jglisse@redhat.com>2010-07-21 17:05:37 -0400
commit4b2820534e3635a8ecd047f1e0139834e0a67d02 (patch)
tree986d5d76ad01b3aab78fe66af06d65d19e736d52 /src/gallium/drivers/r600/r600_compiler_r700.c
parent9433d0e8010bfe182762f8d2bd856a416a7f93bb (diff)
r600g: add r600 compile mode to compiler.
some of the ALU instructions are different on r6xx vs r7xx, separate the alu translation to separate files, and use family to pick which compile stage to use.
Diffstat (limited to 'src/gallium/drivers/r600/r600_compiler_r700.c')
-rw-r--r--src/gallium/drivers/r600/r600_compiler_r700.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/gallium/drivers/r600/r600_compiler_r700.c b/src/gallium/drivers/r600/r600_compiler_r700.c
index ca6447e553..0b43942866 100644
--- a/src/gallium/drivers/r600/r600_compiler_r700.c
+++ b/src/gallium/drivers/r600/r600_compiler_r700.c
@@ -143,14 +143,37 @@ static int r700_shader_alu_bytecode(struct r600_shader *rshader,
return 0;
}
+static int r700_shader_alu_translate(struct r600_shader *rshader,
+ struct r600_shader_node *rnode,
+ unsigned *cid)
+
+{
+ struct r600_shader_alu *alu;
+ unsigned id = *cid;
+ int i;
+ int r = 0;
+ LIST_FOR_EACH_ENTRY(alu, &rnode->alu, head) {
+ for (i = 0; i < alu->nalu; i++) {
+ r = r700_shader_alu_bytecode(rshader, rnode, &alu->alu[i], &id);
+ if (r)
+ goto out;
+ }
+ for (i = 0; i < alu->nliteral; i++) {
+ rshader->bcode[id++] = alu->literal[i];
+ }
+ }
+ out:
+ *cid = id;
+ return r;
+}
+
int r700_shader_translate(struct r600_shader *rshader)
{
struct c_shader *shader = &rshader->cshader;
struct r600_shader_node *rnode;
struct r600_shader_vfetch *vfetch;
- struct r600_shader_alu *alu;
struct c_vector *v;
- unsigned id, i, end;
+ unsigned id, end;
int r;
r = r600_shader_register(rshader);
@@ -179,16 +202,12 @@ int r700_shader_translate(struct r600_shader *rshader)
if (r)
return r;
}
- LIST_FOR_EACH_ENTRY(alu, &rnode->alu, head) {
- for (i = 0; i < alu->nalu; i++) {
- r = r700_shader_alu_bytecode(rshader, rnode, &alu->alu[i], &id);
- if (r)
- return r;
- }
- for (i = 0; i < alu->nliteral; i++) {
- rshader->bcode[id++] = alu->literal[i];
- }
- }
+ if (rshader->r6xx_compile)
+ r = r6xx_shader_alu_translate(rshader, rnode, &id);
+ else
+ r = r700_shader_alu_translate(rshader, rnode, &id);
+ if (r)
+ return r;
}
id = 0;
LIST_FOR_EACH_ENTRY(rnode, &rshader->nodes, head) {