diff options
| author | Ben Skeggs <skeggsb@gmail.com> | 2007-12-30 01:03:24 +1100 | 
|---|---|---|
| committer | Ben Skeggs <skeggsb@gmail.com> | 2007-12-30 01:03:24 +1100 | 
| commit | 24cfb7d2e29aae5afa2529d3798fa94d813dc017 (patch) | |
| tree | e92536fe4bdf49e9fc3ba6d8aa7c01a919c3dc54 | |
| parent | 09612416d74d92c22bf757fc513a70bec30f15b5 (diff) | |
nv40: untested fragprog mods for big-endian chips
| -rw-r--r-- | src/mesa/pipe/nv40/nv40_fragprog.c | 26 | 
1 files changed, 21 insertions, 5 deletions
| diff --git a/src/mesa/pipe/nv40/nv40_fragprog.c b/src/mesa/pipe/nv40/nv40_fragprog.c index 6ee6a7daff..7d9676b841 100644 --- a/src/mesa/pipe/nv40/nv40_fragprog.c +++ b/src/mesa/pipe/nv40/nv40_fragprog.c @@ -781,18 +781,34 @@ nv40_fragprog_bind(struct nv40_context *nv40, struct nv40_fragment_program *fp)  	}  	if (!fp->on_hw) { +		const uint32_t le = 1; +		uint32_t *map; +  		if (!fp->buffer)  			fp->buffer = ws->buffer_create(ws, 0x100, 0, 0); +		ws->buffer_data(ws, fp->buffer, fp->insn_len * 4, NULL, 0); + +		map = ws->buffer_map(ws, fp->buffer, PIPE_BUFFER_FLAG_READ);  #if 0 -		for (i = 0; i < fp->insn_len; i++) +		for (i = 0; i < fp->insn_len; i++) {  			NOUVEAU_ERR("%d 0x%08x\n", i, fp->insn[i]); +		}  #endif -		nv40->pipe.winsys->buffer_data(nv40->pipe.winsys, fp->buffer, -					       fp->insn_len * sizeof(uint32_t), -					       fp->insn, -					       PIPE_BUFFER_USAGE_PIXEL); +		if ((*(const uint8_t *)&le)) { +			for (i = 0; i < fp->insn_len; i++) { +				map[i] = fp->insn[i]; +			} +		} else { +			/* Weird swapping for big-endian chips */ +			for (i = 0; i < fp->insn_len; i++) { +				map[i] = ((fp->insn[i] & 0xffff) << 16) | +					  ((fp->insn[i] >> 16) & 0xffff); +			} +		} + +		ws->buffer_unmap(ws, fp->buffer);  		fp->on_hw = TRUE;  	} | 
