revision 219:dfd3292143f2
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 219:dfd3292143f2 |
parent | 218:cbad5a3f8387 |
child | 220:f72f8a7dff88 |
author | nkeynes |
date | Tue Aug 29 08:12:13 2006 +0000 (17 years ago) |
Initial implementation of new background support
src/Makefile.am | view | annotate | diff | log | ||
src/Makefile.in | view | annotate | diff | log | ||
src/pvr2/pvr2.h | view | annotate | diff | log | ||
src/pvr2/rendbkg.c | view | annotate | diff | log | ||
src/pvr2/render.c | view | annotate | diff | log |
1.1 --- a/src/Makefile.am Tue Aug 29 08:11:56 2006 +00001.2 +++ b/src/Makefile.am Tue Aug 29 08:12:13 2006 +00001.3 @@ -22,7 +22,7 @@1.4 aica/armcore.c aica/armcore.h aica/armdasm.c aica/armmem.c \1.5 aica/aica.c aica/aica.h aica/audio.c aica/audio.h \1.6 pvr2/pvr2.c pvr2/pvr2.h \1.7 - pvr2/tacore.c pvr2/render.c pvr2/rendcore.c \1.8 + pvr2/tacore.c pvr2/render.c pvr2/rendcore.c pvr2/rendbkg.c \1.9 pvr2/texcache.c \1.10 maple/maple.c maple/maple.h \1.11 maple/controller.c maple/controller.h \
2.1 --- a/src/Makefile.in Tue Aug 29 08:11:56 2006 +00002.2 +++ b/src/Makefile.in Tue Aug 29 08:12:13 2006 +00002.3 @@ -150,7 +150,7 @@2.4 aica/armcore.c aica/armcore.h aica/armdasm.c aica/armmem.c \2.5 aica/aica.c aica/aica.h aica/audio.c aica/audio.h \2.6 pvr2/pvr2.c pvr2/pvr2.h \2.7 - pvr2/tacore.c pvr2/render.c pvr2/rendcore.c \2.8 + pvr2/tacore.c pvr2/render.c pvr2/rendcore.c pvr2/rendbkg.c \2.9 pvr2/texcache.c \2.10 maple/maple.c maple/maple.h \2.11 maple/controller.c maple/controller.h \2.12 @@ -186,13 +186,13 @@2.13 scif.$(OBJEXT) armcore.$(OBJEXT) armdasm.$(OBJEXT) \2.14 armmem.$(OBJEXT) aica.$(OBJEXT) audio.$(OBJEXT) pvr2.$(OBJEXT) \2.15 tacore.$(OBJEXT) render.$(OBJEXT) rendcore.$(OBJEXT) \2.16 - texcache.$(OBJEXT) maple.$(OBJEXT) controller.$(OBJEXT) \2.17 - support.$(OBJEXT) interface.$(OBJEXT) callbacks.$(OBJEXT) \2.18 - gui.$(OBJEXT) mmr_win.$(OBJEXT) debug_win.$(OBJEXT) \2.19 - dump_win.$(OBJEXT) loader.$(OBJEXT) bootstrap.$(OBJEXT) \2.20 - util.$(OBJEXT) display.$(OBJEXT) audio_null.$(OBJEXT) \2.21 - audio_esd.$(OBJEXT) video_null.$(OBJEXT) video_gtk.$(OBJEXT) \2.22 - video_x11.$(OBJEXT)2.23 + rendbkg.$(OBJEXT) texcache.$(OBJEXT) maple.$(OBJEXT) \2.24 + controller.$(OBJEXT) support.$(OBJEXT) interface.$(OBJEXT) \2.25 + callbacks.$(OBJEXT) gui.$(OBJEXT) mmr_win.$(OBJEXT) \2.26 + debug_win.$(OBJEXT) dump_win.$(OBJEXT) loader.$(OBJEXT) \2.27 + bootstrap.$(OBJEXT) util.$(OBJEXT) display.$(OBJEXT) \2.28 + audio_null.$(OBJEXT) audio_esd.$(OBJEXT) video_null.$(OBJEXT) \2.29 + video_gtk.$(OBJEXT) video_x11.$(OBJEXT)2.30 lxdream_OBJECTS = $(am_lxdream_OBJECTS)2.31 lxdream_DEPENDENCIES =2.32 lxdream_LDFLAGS =2.33 @@ -215,15 +215,16 @@2.34 @AMDEP_TRUE@ ./$(DEPDIR)/loader.Po ./$(DEPDIR)/main.Po \2.35 @AMDEP_TRUE@ ./$(DEPDIR)/maple.Po ./$(DEPDIR)/mem.Po \2.36 @AMDEP_TRUE@ ./$(DEPDIR)/mmr_win.Po ./$(DEPDIR)/nrg.Po \2.37 -@AMDEP_TRUE@ ./$(DEPDIR)/pvr2.Po ./$(DEPDIR)/rendcore.Po \2.38 -@AMDEP_TRUE@ ./$(DEPDIR)/render.Po ./$(DEPDIR)/scif.Po \2.39 -@AMDEP_TRUE@ ./$(DEPDIR)/sh4core.Po ./$(DEPDIR)/sh4dasm.Po \2.40 -@AMDEP_TRUE@ ./$(DEPDIR)/sh4mem.Po ./$(DEPDIR)/sh4mmio.Po \2.41 -@AMDEP_TRUE@ ./$(DEPDIR)/support.Po ./$(DEPDIR)/syscall.Po \2.42 -@AMDEP_TRUE@ ./$(DEPDIR)/tacore.Po ./$(DEPDIR)/texcache.Po \2.43 -@AMDEP_TRUE@ ./$(DEPDIR)/timer.Po ./$(DEPDIR)/util.Po \2.44 -@AMDEP_TRUE@ ./$(DEPDIR)/video_gtk.Po ./$(DEPDIR)/video_null.Po \2.45 -@AMDEP_TRUE@ ./$(DEPDIR)/video_x11.Po ./$(DEPDIR)/watch.Po2.46 +@AMDEP_TRUE@ ./$(DEPDIR)/pvr2.Po ./$(DEPDIR)/rendbkg.Po \2.47 +@AMDEP_TRUE@ ./$(DEPDIR)/rendcore.Po ./$(DEPDIR)/render.Po \2.48 +@AMDEP_TRUE@ ./$(DEPDIR)/scif.Po ./$(DEPDIR)/sh4core.Po \2.49 +@AMDEP_TRUE@ ./$(DEPDIR)/sh4dasm.Po ./$(DEPDIR)/sh4mem.Po \2.50 +@AMDEP_TRUE@ ./$(DEPDIR)/sh4mmio.Po ./$(DEPDIR)/support.Po \2.51 +@AMDEP_TRUE@ ./$(DEPDIR)/syscall.Po ./$(DEPDIR)/tacore.Po \2.52 +@AMDEP_TRUE@ ./$(DEPDIR)/texcache.Po ./$(DEPDIR)/timer.Po \2.53 +@AMDEP_TRUE@ ./$(DEPDIR)/util.Po ./$(DEPDIR)/video_gtk.Po \2.54 +@AMDEP_TRUE@ ./$(DEPDIR)/video_null.Po ./$(DEPDIR)/video_x11.Po \2.55 +@AMDEP_TRUE@ ./$(DEPDIR)/watch.Po2.56 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \2.57 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)2.58 CCLD = $(CC)2.59 @@ -306,6 +307,7 @@2.60 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmr_win.Po@am__quote@2.61 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nrg.Po@am__quote@2.62 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pvr2.Po@am__quote@2.63 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rendbkg.Po@am__quote@2.64 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rendcore.Po@am__quote@2.65 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Po@am__quote@2.66 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scif.Po@am__quote@2.67 @@ -808,6 +810,28 @@2.68 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.69 @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rendcore.obj `if test -f 'pvr2/rendcore.c'; then $(CYGPATH_W) 'pvr2/rendcore.c'; else $(CYGPATH_W) '$(srcdir)/pvr2/rendcore.c'; fi`2.71 +rendbkg.o: pvr2/rendbkg.c2.72 +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rendbkg.o -MD -MP -MF "$(DEPDIR)/rendbkg.Tpo" \2.73 +@am__fastdepCC_TRUE@ -c -o rendbkg.o `test -f 'pvr2/rendbkg.c' || echo '$(srcdir)/'`pvr2/rendbkg.c; \2.74 +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rendbkg.Tpo" "$(DEPDIR)/rendbkg.Po"; \2.75 +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/rendbkg.Tpo"; exit 1; \2.76 +@am__fastdepCC_TRUE@ fi2.77 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pvr2/rendbkg.c' object='rendbkg.o' libtool=no @AMDEPBACKSLASH@2.78 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/rendbkg.Po' tmpdepfile='$(DEPDIR)/rendbkg.TPo' @AMDEPBACKSLASH@2.79 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.80 +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rendbkg.o `test -f 'pvr2/rendbkg.c' || echo '$(srcdir)/'`pvr2/rendbkg.c2.81 +2.82 +rendbkg.obj: pvr2/rendbkg.c2.83 +@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rendbkg.obj -MD -MP -MF "$(DEPDIR)/rendbkg.Tpo" \2.84 +@am__fastdepCC_TRUE@ -c -o rendbkg.obj `if test -f 'pvr2/rendbkg.c'; then $(CYGPATH_W) 'pvr2/rendbkg.c'; else $(CYGPATH_W) '$(srcdir)/pvr2/rendbkg.c'; fi`; \2.85 +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/rendbkg.Tpo" "$(DEPDIR)/rendbkg.Po"; \2.86 +@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/rendbkg.Tpo"; exit 1; \2.87 +@am__fastdepCC_TRUE@ fi2.88 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pvr2/rendbkg.c' object='rendbkg.obj' libtool=no @AMDEPBACKSLASH@2.89 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/rendbkg.Po' tmpdepfile='$(DEPDIR)/rendbkg.TPo' @AMDEPBACKSLASH@2.90 +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@2.91 +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rendbkg.obj `if test -f 'pvr2/rendbkg.c'; then $(CYGPATH_W) 'pvr2/rendbkg.c'; else $(CYGPATH_W) '$(srcdir)/pvr2/rendbkg.c'; fi`2.92 +2.93 texcache.o: pvr2/texcache.c2.94 @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT texcache.o -MD -MP -MF "$(DEPDIR)/texcache.Tpo" \2.95 @am__fastdepCC_TRUE@ -c -o texcache.o `test -f 'pvr2/texcache.c' || echo '$(srcdir)/'`pvr2/texcache.c; \
3.1 --- a/src/pvr2/pvr2.h Tue Aug 29 08:11:56 2006 +00003.2 +++ b/src/pvr2/pvr2.h Tue Aug 29 08:12:13 2006 +00003.3 @@ -1,5 +1,5 @@3.4 /**3.5 - * $Id: pvr2.h,v 1.15 2006-08-02 04:06:45 nkeynes Exp $3.6 + * $Id: pvr2.h,v 1.16 2006-08-29 08:12:13 nkeynes Exp $3.7 *3.8 * PVR2 (video chip) functions and macros.3.9 *3.10 @@ -158,6 +158,14 @@3.11 */3.12 gboolean pvr2_render_display_frame( uint32_t address );3.14 +3.15 +void render_backplane( uint32_t *polygon, uint32_t width, uint32_t height, uint32_t mode );3.16 +3.17 +void render_set_context( uint32_t *context, int render_mode );3.18 +3.19 +void pvr2_render_tilebuffer( int width, int height, int clipx1, int clipy1,3.20 + int clipx2, int clipy2 );3.21 +3.22 /****************************** Texture Cache ****************************/3.24 /**
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +00004.2 +++ b/src/pvr2/rendbkg.c Tue Aug 29 08:12:13 2006 +00004.3 @@ -0,0 +1,117 @@4.4 +/**4.5 + * $Id: rendbkg.c,v 1.1 2006-08-29 08:12:13 nkeynes Exp $4.6 + *4.7 + * PVR2 background renderer.4.8 + *4.9 + * Yes, it uses the same basic data structure. Yes, it needs to be handled4.10 + * completely differently.4.11 + *4.12 + * Copyright (c) 2005 Nathan Keynes.4.13 + *4.14 + * This program is free software; you can redistribute it and/or modify4.15 + * it under the terms of the GNU General Public License as published by4.16 + * the Free Software Foundation; either version 2 of the License, or4.17 + * (at your option) any later version.4.18 + *4.19 + * This program is distributed in the hope that it will be useful,4.20 + * but WITHOUT ANY WARRANTY; without even the implied warranty of4.21 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the4.22 + * GNU General Public License for more details.4.23 + */4.24 +4.25 +#include <sys/time.h>4.26 +#include "pvr2/pvr2.h"4.27 +4.28 +struct vertex_rgba {4.29 + float x,y,z;4.30 + uint32_t argb;4.31 +};4.32 +4.33 +struct vertex_all {4.34 + float x,y,z;4.35 + float u,v;4.36 + float rgba[4]; /* Note - RGBA order, as preferred by GL */4.37 + float spec_rgba[4];4.38 +};4.39 +4.40 +#define FARGB_A(x) (((float)(((x)>>24)+1))/256.0)4.41 +#define FARGB_R(x) (((float)((((x)>>16)&0xFF)+1))/256.0)4.42 +#define FARGB_G(x) (((float)((((x)>>8)&0xFF)+1))/256.0)4.43 +#define FARGB_B(x) (((float)(((x)&0xFF)+1))/256.0)4.44 +4.45 +/**4.46 + * Compute the values for an array of vertexes, given x,y for each4.47 + * vertex and the base 3-vertex triple used to define the background4.48 + * plane. Essentially the base vertexes are used to find the4.49 + * plane equation for each of z,a,r,g,b,etc, which is then solved for4.50 + * each of the required compute vertexes (normally the corner points).4.51 + *4.52 + * @param base The 3 vertexes supplied as the background definition4.53 + * @param compute An array of vertexes to compute. x and y must be4.54 + * preset, other values are computed.4.55 + * @param num_compute number of vertexes in the compute array.4.56 + */4.57 +void compute_vertexes( struct vertex_rgba *base,4.58 + struct vertex_all *compute,4.59 + int num_compute )4.60 +{4.61 + struct vertex_all center;4.62 + struct vertex_all diff0, diff1;4.63 + int i;4.64 +4.65 + center.x = base[1].x;4.66 + center.y = base[1].y;4.67 + center.z = base[1].z;4.68 + center.rgba[0] = FARGB_R(base[1].argb);4.69 + center.rgba[1] = FARGB_G(base[1].argb);4.70 + center.rgba[2] = FARGB_B(base[1].argb);4.71 + center.rgba[3] = FARGB_A(base[1].argb);4.72 + diff0.x = base[0].x - base[1].x;4.73 + diff0.y = base[0].y - base[1].y;4.74 + diff0.z = base[0].z - base[1].z;4.75 + diff1.x = base[2].x - base[1].x;4.76 + diff1.y = base[2].y - base[1].y;4.77 + diff1.z = base[2].z - base[1].z;4.78 + diff0.rgba[0] = FARGB_R(base[0].argb) - center.rgba[0];4.79 + diff0.rgba[1] = FARGB_G(base[0].argb) - center.rgba[1];4.80 + diff0.rgba[2] = FARGB_B(base[0].argb) - center.rgba[2];4.81 + diff0.rgba[3] = FARGB_A(base[0].argb) - center.rgba[3];4.82 + diff1.rgba[0] = FARGB_R(base[2].argb) - center.rgba[0];4.83 + diff1.rgba[1] = FARGB_G(base[2].argb) - center.rgba[1];4.84 + diff1.rgba[2] = FARGB_B(base[2].argb) - center.rgba[2];4.85 + diff1.rgba[3] = FARGB_A(base[2].argb) - center.rgba[3];4.86 +4.87 + float divisor = ((diff1.y) * (diff0.x)) - ((diff0.y) * (diff1.x));4.88 + if( divisor == 0 ) {4.89 + /* The points lie on a single line - no plane for you. *shrugs* */4.90 + } else {4.91 + for( i=0; i<num_compute; i++ ) {4.92 + float t = ((compute[i].x - center.x) * diff1.y -4.93 + (compute[i].y - center.y) * diff1.x) / divisor;4.94 + float s = ((compute[i].y - center.y) * diff0.x -4.95 + (compute[i].x - center.x) * diff0.y) / divisor;4.96 + compute[i].z = center.z + (t*diff0.z) + (s*diff1.z);4.97 + compute[i].rgba[0] = center.rgba[0] + (t*diff0.rgba[0]) + (s*diff1.rgba[0]);4.98 + compute[i].rgba[1] = center.rgba[1] + (t*diff0.rgba[1]) + (s*diff1.rgba[1]);4.99 + compute[i].rgba[2] = center.rgba[2] + (t*diff0.rgba[2]) + (s*diff1.rgba[2]);4.100 + compute[i].rgba[3] = center.rgba[3] + (t*diff0.rgba[3]) + (s*diff1.rgba[3]);4.101 + }4.102 + }4.103 +}4.104 +4.105 +void render_backplane( uint32_t *polygon, uint32_t width, uint32_t height, uint32_t mode ) {4.106 + struct vertex_rgba *vertex = (struct vertex_rgba *)(polygon + 3);4.107 + struct vertex_all compute[4] = { {0.0,0.0}, {width,0.0}, {width, height}, {0.0,height} };4.108 + int i;4.109 +4.110 + render_set_context(polygon, 0);4.111 + compute_vertexes( vertex, compute, 4 );4.112 + glBegin(GL_QUADS);4.113 + for( i=0; i<4; i++ ) {4.114 + glColor4fv(compute[i].rgba);4.115 + glVertex3f(compute[i].x, compute[i].y, compute[i].z);4.116 + fprintf( stderr, "BG %d,%d: %f %f %f\n", (int)compute[i].x, (int)compute[i].y,4.117 + compute[i].rgba[0], compute[i].rgba[1], compute[i].rgba[2] );4.118 + }4.119 + glEnd();4.120 +}
5.1 --- a/src/pvr2/render.c Tue Aug 29 08:11:56 2006 +00005.2 +++ b/src/pvr2/render.c Tue Aug 29 08:12:13 2006 +00005.3 @@ -1,5 +1,5 @@5.4 /**5.5 - * $Id: render.c,v 1.12 2006-08-02 06:24:08 nkeynes Exp $5.6 + * $Id: render.c,v 1.13 2006-08-29 08:12:13 nkeynes Exp $5.7 *5.8 * PVR2 Renderer support. This part is primarily5.9 *5.10 @@ -223,43 +223,6 @@5.11 #define MAX3( a,b,c ) ((a) > (b) ? ( (a) > (c) ? (a) : (c) ) : ((b) > (c) ? (b) : (c)) )5.13 /**5.14 - * Render the background plane as best we can. Unfortunately information5.15 - * is a little scant, to say the least.5.16 - */5.17 -void pvr2_render_draw_backplane( uint32_t mode, uint32_t *poly )5.18 -{5.19 -5.20 - if( (mode >> 24) == 0x01 ) {5.21 - /* Packed colour. I think */5.22 - pvr2_bgplane_packed_t bg = (pvr2_bgplane_packed_t)poly;5.23 - if( bg->colour1 != bg->colour2 || bg->colour2 != bg->colour3 ) {5.24 - WARN( "Multiple background colours specified. Confused" );5.25 - fprintf( stderr, "bgplane mode: %08X PBUF: %08X\n", mode,5.26 - MMIO_READ( PVR2, RENDER_POLYBASE ) );5.27 - fwrite_dump( poly, 80, stderr );5.28 - }5.29 - float x1 = MIN3( bg->x1, bg->x2, bg->x3 );5.30 - float y1 = MIN3( bg->y1, bg->y2, bg->y3 );5.31 - float x2 = MAX3( bg->x1, bg->x2, bg->x3 );5.32 - float y2 = MAX3( bg->y1, bg->y2, bg->y3 );5.33 - float z = MIN3( bg->z1, bg->z2, bg->z3 );5.34 - glDisable( GL_TEXTURE_2D );5.35 - glDisable( GL_DEPTH_TEST );5.36 - glColor3ub( (uint8_t)(bg->colour1 >> 16), (uint8_t)(bg->colour1 >> 8),5.37 - (uint8_t)bg->colour1 );5.38 - glBegin( GL_QUADS );5.39 - glVertex3f( x1, y1, z );5.40 - glVertex3f( x2, y1, z );5.41 - glVertex3f( x2, y2, z );5.42 - glVertex3f( x1, y2, z );5.43 - glEnd();5.44 - } else {5.45 - WARN( "Unknown bgplane mode: %08X", mode );5.46 - fwrite_dump( poly, 48, stderr );5.47 - }5.48 -}5.49 -5.50 -/**5.51 * Render a complete scene into the OpenGL back buffer.5.52 * Note: this will probably need to be broken up eventually once timings are5.53 * determined.5.54 @@ -305,7 +268,7 @@5.55 (uint32_t *)mem_get_region(PVR2_RAM_BASE + MMIO_READ( PVR2, RENDER_POLYBASE ));5.57 uint32_t *bgplane = display_list + (((bgplane_mode & 0x00FFFFFF)) >> 3) ;5.58 - pvr2_render_draw_backplane( bgplane_mode, bgplane );5.59 + render_backplane( bgplane, width, height, bgplane_mode );5.61 pvr2_render_tilebuffer( width, height, clip_x, clip_y,5.62 clip_x + clip_width, clip_y + clip_height );5.63 @@ -336,32 +299,33 @@5.64 if( buffer->render_addr == -1 )5.65 return;5.66 GLenum type, format = GL_RGBA;5.67 - int size = buffer->width * buffer->height;5.68 + int line_size = buffer->width, size;5.70 switch( buffer->colour_format ) {5.71 case COLFMT_RGB565:5.72 type = GL_UNSIGNED_SHORT_5_6_5;5.73 format = GL_RGB;5.74 - size <<= 1;5.75 + line_size <<= 1;5.76 break;5.77 case COLFMT_RGB888:5.78 type = GL_UNSIGNED_INT;5.79 format = GL_RGB;5.80 - size = (size<<1)+size;5.81 + line_size = (line_size<<1)+line_size;5.82 break;5.83 case COLFMT_ARGB1555:5.84 type = GL_UNSIGNED_SHORT_5_5_5_1;5.85 - size <<= 1;5.86 + line_size <<= 1;5.87 break;5.88 case COLFMT_ARGB4444:5.89 type = GL_UNSIGNED_SHORT_4_4_4_4;5.90 - size <<= 1;5.91 + line_size <<= 1;5.92 break;5.93 case COLFMT_ARGB8888:5.94 type = GL_UNSIGNED_INT_8_8_8_8;5.95 - size <<= 2;5.96 + line_size <<= 2;5.97 break;5.98 }5.99 + size = line_size * buffer->height;5.101 if( backBuffer ) {5.102 glFinish();5.103 @@ -376,9 +340,10 @@5.104 glReadPixels( 0, 0, buffer->width, buffer->height, format, type, target );5.105 pvr2_vram64_write( buffer->render_addr, target, size );5.106 } else {5.107 - /* Regular buffer - go direct */5.108 - char *target = mem_get_region( buffer->render_addr );5.109 + /* Regular buffer */5.110 + char target[size];5.111 glReadPixels( 0, 0, buffer->width, buffer->height, format, type, target );5.112 + pvr2_vram_write_invert( buffer->render_addr, target, size, line_size );5.113 }5.114 }
.