summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/nv40
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2007-12-30 01:03:24 +1100
committerBen Skeggs <skeggsb@gmail.com>2007-12-30 01:03:24 +1100
commit24cfb7d2e29aae5afa2529d3798fa94d813dc017 (patch)
treee92536fe4bdf49e9fc3ba6d8aa7c01a919c3dc54 /src/mesa/pipe/nv40
parent09612416d74d92c22bf757fc513a70bec30f15b5 (diff)
nv40: untested fragprog mods for big-endian chips
Diffstat (limited to 'src/mesa/pipe/nv40')
-rw-r--r--src/mesa/pipe/nv40/nv40_fragprog.c26
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;
}