From ee793281b221415f794af6aadaa9764023612e0b Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 1 Nov 2007 19:19:45 +1100 Subject: [PATCH] nouveau: ppc, swap fragment programs on big endian systems. Thanks to the PS3 RSX project for figuring this out. --- .../drivers/dri/nouveau/nouveau_bufferobj.c | 17 ++++++++++++++--- .../drivers/dri/nouveau/nouveau_bufferobj.h | 2 +- src/mesa/drivers/dri/nouveau/nv30_fragprog.c | 2 +- 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); -- 2.30.2