summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2007-11-01 19:19:45 +1100
committerDave Airlie <[email protected]>2007-11-01 19:19:45 +1100
commitee793281b221415f794af6aadaa9764023612e0b (patch)
tree3aab374f4eec8987995c9d19c9e3882a5d66a162
parent1b880c7e3c216a4f5417aacb702e5a0124d12110 (diff)
nouveau: ppc, swap fragment programs on big endian systems.
Thanks to the PS3 RSX project for figuring this out.
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c17
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_bufferobj.h2
-rw-r--r--src/mesa/drivers/dri/nouveau/nv30_fragprog.c2
3 files changed, 16 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
index be6455a01ed..25c7b8206a0 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
@@ -224,7 +224,7 @@ nouveau_bo_init_storage(GLcontext *ctx, GLuint valid_gpu_access,
GLsizeiptrARB size,
const GLvoid *data,
GLenum usage,
- struct gl_buffer_object *bo)
+ struct gl_buffer_object *bo, int flags)
{
nouveau_buffer_object *nbo = (nouveau_buffer_object *)bo;
@@ -257,7 +257,18 @@ nouveau_bo_init_storage(GLcontext *ctx, GLuint valid_gpu_access,
if (data) {
GLvoid *map = nouveau_bo_map(ctx, GL_WRITE_ONLY_ARB, bo);
- _mesa_memcpy(map, data, size);
+#ifdef MESA_BIG_ENDIAN
+ int i;
+ if (flags) {
+ for (i = 0; i < size; i+=4) {
+ uint32_t _data = *(unsigned int *)(data+i);
+ _data = ((_data >> 16) | ((_data & 0xffff) << 16));
+ *(unsigned int *)(map+i) = _data;
+ }
+ } else
+#endif
+ _mesa_memcpy(map, data, size);
+ (void)flags; /* get rid of warning */
nouveau_bo_dirty_all(ctx, GL_FALSE, bo);
nouveau_bo_unmap(ctx, bo);
}
@@ -514,7 +525,7 @@ nouveauBufferData(GLcontext *ctx, GLenum target, GLsizeiptrARB size,
gpu_flags = NOUVEAU_BO_VRAM_OK | NOUVEAU_BO_GART_OK;
break;
}
- nouveau_bo_init_storage(ctx, gpu_flags, size, data, usage, obj);
+ nouveau_bo_init_storage(ctx, gpu_flags, size, data, usage, obj, 0);
}
static void
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.h b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.h
index cbc89a151da..fb3afc1c300 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.h
+++ b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.h
@@ -39,7 +39,7 @@ typedef struct nouveau_buffer_object_t {
extern void
nouveau_bo_init_storage(GLcontext *ctx, GLuint valid_gpu_access,
GLsizeiptrARB size, const GLvoid *data, GLenum usage,
- struct gl_buffer_object *bo);
+ struct gl_buffer_object *bo, int flags);
extern GLboolean
nouveau_bo_move_in(GLcontext *ctx, struct gl_buffer_object *bo);
diff --git a/src/mesa/drivers/dri/nouveau/nv30_fragprog.c b/src/mesa/drivers/dri/nouveau/nv30_fragprog.c
index e32452361e8..5f61f76a0ab 100644
--- a/src/mesa/drivers/dri/nouveau/nv30_fragprog.c
+++ b/src/mesa/drivers/dri/nouveau/nv30_fragprog.c
@@ -36,7 +36,7 @@ NV30FPUploadToHW(GLcontext *ctx, nouveauShader *nvs)
nvs->program_size * sizeof(uint32_t),
(const GLvoid *)nvs->program,
GL_DYNAMIC_DRAW_ARB,
- nvs->program_buffer);
+ nvs->program_buffer, 1);
offset = nouveau_bo_gpu_ref(ctx, nvs->program_buffer);