summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nvfx/nvfx_fragprog.c
diff options
context:
space:
mode:
authorLuca Barbieri <[email protected]>2010-08-23 20:27:40 +0200
committerLuca Barbieri <[email protected]>2010-08-23 20:35:56 +0200
commit4ab1001ac28b5716e1b103df44d04b8a8ddd2375 (patch)
tree711ecf243c21c343f8233d63b039023f03ba5b11 /src/gallium/drivers/nvfx/nvfx_fragprog.c
parent4b2b5f8e30347ce0a1818524f8825335d47eb5ca (diff)
nvfx: improve fp temp accounting
Diffstat (limited to 'src/gallium/drivers/nvfx/nvfx_fragprog.c')
-rw-r--r--src/gallium/drivers/nvfx/nvfx_fragprog.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/gallium/drivers/nvfx/nvfx_fragprog.c b/src/gallium/drivers/nvfx/nvfx_fragprog.c
index 7caddfab707..7f6b3f6599e 100644
--- a/src/gallium/drivers/nvfx/nvfx_fragprog.c
+++ b/src/gallium/drivers/nvfx/nvfx_fragprog.c
@@ -21,6 +21,7 @@ struct nvfx_fpc {
struct nvfx_pipe_fragment_program* pfp;
struct nvfx_fragment_program *fp;
+ unsigned max_temps;
unsigned long long r_temps;
unsigned long long r_temps_discard;
struct nvfx_reg r_result[PIPE_MAX_SHADER_OUTPUTS];
@@ -51,9 +52,9 @@ struct nvfx_fpc {
static INLINE struct nvfx_reg
temp(struct nvfx_fpc *fpc)
{
- int idx = ffsll(~fpc->r_temps) - 1;
+ int idx = __builtin_ctzll(~fpc->r_temps);
- if (idx < 0) {
+ if (idx >= fpc->max_temps) {
NOUVEAU_ERR("out of temps!!\n");
assert(0);
return nvfx_reg(NVFXSR_TEMP, 0);
@@ -1022,6 +1023,7 @@ nvfx_fragprog_translate(struct nvfx_context *nvfx,
if (!fpc)
goto out_err;
+ fpc->max_temps = nvfx->is_nv4x ? 48 : 32;
fpc->pfp = pfp;
fpc->fp = fp;
fpc->num_regs = 2;