summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@ppcg5.localdomain>2007-11-01 19:19:45 +1100
committerDave Airlie <airlied@ppcg5.localdomain>2007-11-01 19:19:45 +1100
commitee793281b221415f794af6aadaa9764023612e0b (patch)
tree3aab374f4eec8987995c9d19c9e3882a5d66a162 /src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
parent1b880c7e3c216a4f5417aacb702e5a0124d12110 (diff)
downloadexternal_mesa3d-ee793281b221415f794af6aadaa9764023612e0b.zip
external_mesa3d-ee793281b221415f794af6aadaa9764023612e0b.tar.gz
external_mesa3d-ee793281b221415f794af6aadaa9764023612e0b.tar.bz2
nouveau: ppc, swap fragment programs on big endian systems.
Thanks to the PS3 RSX project for figuring this out.
Diffstat (limited to 'src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c')
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c
index be6455a..25c7b82 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