diff --git a/engine/platform/psp/vid_psp.c b/engine/platform/psp/vid_psp.c index e29eeab5..08438a84 100644 --- a/engine/platform/psp/vid_psp.c +++ b/engine/platform/psp/vid_psp.c @@ -17,9 +17,6 @@ GNU General Public License for more details. #if !XASH_DEDICATED #include #include -#include -#include -#include "vram_psp.h" #include "common.h" #include "client.h" @@ -27,31 +24,19 @@ GNU General Public License for more details. #include "input.h" #include "vid_common.h" -// Set gu list -#define PSP_GU_STATIC_LIST 1 -#define PSP_GU_LIST_SIZE 0x40000 - // Set frame buffer #define PSP_FB_WIDTH 480 #define PSP_FB_HEIGHT 272 #define PSP_FB_BWIDTH 512 -#define PSP_FB_FORMAT 5650 //4444,5551,5650,8888 +#define PSP_FB_FORMAT PSP_DISPLAY_PIXEL_FORMAT_565 //4444,5551,565,8888 -#if PSP_FB_FORMAT == 4444 -#define PSP_FB_HW_FORMAT GU_PSM_4444 -#define PSP_FB_SW_FORMAT PSP_DISPLAY_PIXEL_FORMAT_4444 +#if PSP_FB_FORMAT == PSP_DISPLAY_PIXEL_FORMAT_4444 #define PSP_FB_BPP 2 -#elif PSP_FB_FORMAT == 5551 -#define PSP_FB_HW_FORMAT GU_PSM_5551 -#define PSP_FB_SW_FORMAT PSP_DISPLAY_PIXEL_FORMAT_5551 +#elif PSP_FB_FORMAT == PSP_DISPLAY_PIXEL_FORMAT_5551 #define PSP_FB_BPP 2 -#elif PSP_FB_FORMAT == 5650 -#define PSP_FB_HW_FORMAT GU_PSM_5650 -#define PSP_FB_SW_FORMAT PSP_DISPLAY_PIXEL_FORMAT_565 +#elif PSP_FB_FORMAT == PSP_DISPLAY_PIXEL_FORMAT_565 #define PSP_FB_BPP 2 -#elif PSP_FB_FORMAT == 8888 -#define PSP_FB_HW_FORMAT GU_PSM_8888 -#define PSP_FB_SW_FORMAT PSP_DISPLAY_PIXEL_FORMAT_8888 +#elif PSP_FB_FORMAT == PSP_DISPLAY_PIXEL_FORMAT_8888 #define PSP_FB_BPP 4 #endif @@ -84,12 +69,6 @@ static struct #endif void *draw_buffer; void *disp_buffer; - void *depth_buffer; -#if PSP_GU_STATIC_LIST - unsigned int gu_list[PSP_GU_LIST_SIZE] __attribute__( ( aligned( 64 ) ) ); -#else - unsigned int *gu_list; -#endif }vid_psp; qboolean SW_CreateBuffer( int width, int height, uint *stride, uint *bpp, uint *r, uint *g, uint *b ) @@ -100,16 +79,16 @@ qboolean SW_CreateBuffer( int width, int height, uint *stride, uint *bpp, uint * *b = 31 << 11; *bpp = 2; - vid_psp.draw_buffer = (void*)valloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); + vid_psp.draw_buffer = (void*)malloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); if( !vid_psp.draw_buffer ) Host_Error( "Memory allocation failled! (vid_psp.draw_buffer)\n"); - vid_psp.disp_buffer = (void*)valloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); + vid_psp.disp_buffer = (void*)malloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); if( !vid_psp.disp_buffer ) Host_Error( "Memory allocation failled! (vid_psp.disp_buffer)\n"); sceDisplaySetMode(0, PSP_FB_WIDTH, PSP_FB_HEIGHT); - sceDisplaySetFrameBuf(vid_psp.disp_buffer, PSP_FB_WIDTH, PSP_FB_SW_FORMAT, 1); + sceDisplaySetFrameBuf(vid_psp.disp_buffer, PSP_FB_WIDTH, PSP_FB_FORMAT, 1); return true; } @@ -126,7 +105,7 @@ void SW_UnlockBuffer( void ) vid_psp.draw_buffer = p_swap; sceKernelDcacheWritebackInvalidateAll(); - sceDisplaySetFrameBuf(vid_psp.disp_buffer, PSP_FB_BWIDTH, PSP_FB_SW_FORMAT, PSP_DISPLAY_SETBUF_NEXTFRAME); + sceDisplaySetFrameBuf(vid_psp.disp_buffer, PSP_FB_BWIDTH, PSP_FB_FORMAT, PSP_DISPLAY_SETBUF_NEXTFRAME); if ( vsync ) { @@ -134,146 +113,6 @@ void SW_UnlockBuffer( void ) } } -_inline void GU_Init( void ) -{ - vid_psp.draw_buffer = ( void* )valloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); - if( !vid_psp.draw_buffer ) - Host_Error( "Memory allocation failled! (vid_psp.draw_buffer)\n"); - - vid_psp.disp_buffer = ( void* )valloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); - if( !vid_psp.disp_buffer ) - Host_Error( "Memory allocation failled! (vid_psp.disp_buffer)\n"); - - vid_psp.depth_buffer = ( void* )valloc( PSP_FB_HEIGHT * PSP_FB_BWIDTH * PSP_FB_BPP ); - if( !vid_psp.depth_buffer ) - Host_Error( "Memory allocation failled! (vid_psp.depth_buffer)\n"); - -#if !PSP_GU_STATIC_LIST - vid_psp.gu_list = ( unsigned int* )valloc( PSP_GU_LIST_SIZE * sizeof ( unsigned int ) ); - if( !vid_psp.gu_list ) - Host_Error( "Memory allocation failled! (vid_psp.gu_list)\n"); -#endif - - // Initialise the GU. - sceGuInit(); - - // Set up the GU. - sceGuStart( GU_DIRECT, vid_psp.gu_list ); - - sceGuDrawBuffer( PSP_FB_HW_FORMAT, vrelptr( vid_psp.draw_buffer ), PSP_FB_BWIDTH); - sceGuDispBuffer( PSP_FB_WIDTH, PSP_FB_HEIGHT, vrelptr( vid_psp.disp_buffer ), PSP_FB_BWIDTH); - sceGuDepthBuffer( vrelptr( vid_psp.depth_buffer ), PSP_FB_BWIDTH); - - // Set the rendering offset and viewport. - sceGuOffset( 2048 - ( PSP_FB_WIDTH / 2 ), 2048 - ( PSP_FB_HEIGHT / 2 ) ); - sceGuViewport( 2048, 2048, PSP_FB_WIDTH, PSP_FB_HEIGHT ); - - // Set up scissoring. - sceGuEnable( GU_SCISSOR_TEST ); - sceGuScissor( 0, 0, PSP_FB_WIDTH, PSP_FB_HEIGHT ); - - // Set up texturing. - sceGuEnable( GU_TEXTURE_2D ); - - // Set up clearing. - sceGuClearDepth( 65535 ); - sceGuClearColor( GU_RGBA( 0x10, 0x20, 0x40, 0xff ) ); - - // Set up depth. - sceGuDepthOffset( 0 ); - sceGuDepthRange( 0, 65535 ); - sceGuDepthFunc( GU_LEQUAL ); - sceGuEnable( GU_DEPTH_TEST ); - - // Set up fog -// sceGuFog( 100.0f, 500.0f, 0xffffffff ); -// sceGuDisable( GU_FOG ); - - // Set the default matrices. - sceGumMatrixMode( GU_PROJECTION ); - sceGumLoadIdentity(); - sceGumMatrixMode( GU_VIEW ); - sceGumLoadIdentity(); - sceGumMatrixMode( GU_MODEL ); - sceGumLoadIdentity(); - sceGumMatrixMode( GU_TEXTURE ); - sceGumLoadIdentity(); - - sceGumUpdateMatrix(); - - // Set up culling. - sceGuFrontFace( GU_CW ); - sceGuEnable( GU_CULL_FACE ); - sceGuEnable( GU_CLIP_PLANES ); - - // Set up blending. - sceGuBlendFunc( GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0 ); - - sceGuFinish(); - sceGuSync( GU_SYNC_FINISH, GU_SYNC_WHAT_DONE ); - - // Turn on the display. - sceDisplayWaitVblankStart(); - sceGuDisplay(GU_TRUE); - - // Start a new render. - sceGuStart( GU_DIRECT, vid_psp.gu_list ); - - Con_Printf( "Vram available: %i\n", vmemavail() ); -} - -_inline void GU_Shutdown( void ) -{ - // Finish rendering. - sceGuFinish(); - sceGuSync( GU_SYNC_FINISH, GU_SYNC_WHAT_DONE ); - - // Shut down the display. - sceGuTerm(); - - // Free the buffers. - vfree( vid_psp.draw_buffer ); - vid_psp.draw_buffer = NULL; - vfree( vid_psp.disp_buffer ); - vid_psp.disp_buffer = NULL; - vfree( vid_psp.depth_buffer ); - vid_psp.depth_buffer = NULL; -#if !PSP_GU_STATIC_LIST - vfree( vid_psp.gu_list ); - vid_psp.gu_list = NULL; -#endif -} - -_inline void GU_SwapBuffers( void ) -{ -/* - // Don't forget writeback the cache - sceKernelDcacheWritebackAll(); -*/ - // Finish rendering. - size_t list_size = sceGuFinish(); -/* - if( list_size > sizeof( gu_list ) - 1000 ) - printf( "Display list size (%i) %i!\n", list_size, sizeof( gu_list ) ); -*/ - sceGuSync( GU_SYNC_FINISH, GU_SYNC_WHAT_DONE ); - - if ( vsync ) - { - sceDisplayWaitVblankStart(); - } - - // Swap the buffers. - sceGuSwapBuffers(); - - void* p_swap = vid_psp.disp_buffer; - vid_psp.disp_buffer = vid_psp.draw_buffer; - vid_psp.draw_buffer = p_swap; - - // Start a new render. - sceGuStart( GU_DIRECT, vid_psp.gu_list ); -} - int R_MaxVideoModes( void ) { return num_vidmodes; @@ -384,7 +223,7 @@ static qboolean VID_SetScreenResolution( int width, int height ) void GL_SwapBuffers( void ) { - GU_SwapBuffers(); + if ( vsync ) sceDisplayWaitVblankStart(); } int GL_SetAttribute( int attr, int val ) @@ -435,7 +274,6 @@ qboolean R_Init_Video( const int type ) case REF_GL: // refdll also can check extensions ref.dllFuncs.GL_InitExtensions(); - GU_Init(); break; case REF_SOFTWARE: default: @@ -530,8 +368,16 @@ void R_Free_Video( void ) R_FreeVideoModes(); #endif ref.dllFuncs.GL_ClearExtensions(); - if( !glw_state.software ) - GU_Shutdown(); + if( glw_state.software ) + { + if( vid_psp.draw_buffer ) + free( vid_psp.draw_buffer ); + if( vid_psp.disp_buffer ) + free( vid_psp.disp_buffer ); + + vid_psp.draw_buffer = NULL; + vid_psp.disp_buffer = NULL; + } } #endif // XASH_DEDICATED diff --git a/ref_gu/gu_image.c b/ref_gu/gu_image.c index 20448df5..2066fdbd 100644 --- a/ref_gu/gu_image.c +++ b/ref_gu/gu_image.c @@ -15,7 +15,6 @@ GNU General Public License for more details. */ #include #include -#include "vram_psp.h" #include "gu_local.h" #include "crclib.h" @@ -251,26 +250,28 @@ GL_SetTextureDimensions */ static void GL_SetTextureDimensions( gl_texture_t *tex, int width, int height ) { - int maxTextureSize; - int stepWidth, stepHeight; + int maxTextureSize = glConfig.max_texture_size; + int step = (int)gl_round_down->value; + int scaled_width, scaled_height; Assert( tex != NULL ); - maxTextureSize = glConfig.max_texture_size; - // store original sizes tex->srcWidth = width; tex->srcHeight = height; -#if 0 // scale up - stepWidth = ( int )ceilf( logf( width ) * 1.0f / logf( 2.0f ) ); - stepHeight = ( int )ceilf( logf( height ) * 1.0f / logf( 2.0f ) ); -#else // scale down - stepWidth = ( int )floorf( logf( width ) * 1.0f / logf( 2.0f ) ); - stepHeight = ( int )floorf( logf( height ) * 1.0f / logf( 2.0f ) ); -#endif - width = ( 1 << stepWidth ); - height = ( 1 << stepHeight ); + for( scaled_width = 1; scaled_width < width; scaled_width <<= 1 ); + + if( step > 0 && width < scaled_width && ( step == 1 || ( scaled_width - width ) > ( scaled_width >> step ) ) ) + scaled_width >>= 1; + + for( scaled_height = 1; scaled_height < height; scaled_height <<= 1 ); + + if( step > 0 && height < scaled_height && ( step == 1 || ( scaled_height - height ) > ( scaled_height >> step ) ) ) + scaled_height >>= 1; + + width = scaled_width; + height = scaled_height; if( width > maxTextureSize || height > maxTextureSize ) { diff --git a/ref_gu/gu_local.h b/ref_gu/gu_local.h index e6930dd4..9064e367 100644 --- a/ref_gu/gu_local.h +++ b/ref_gu/gu_local.h @@ -16,11 +16,12 @@ GNU General Public License for more details. #ifndef GL_LOCAL_H #define GL_LOCAL_H -#if 1 + #include +#include #include #include -#endif + #include "port.h" #include "xash3d_types.h" #include "cvardef.h" @@ -40,6 +41,7 @@ GNU General Public License for more details. //#include "cvar.h" #include "gu_helper.h" #include "gu_extension.h" +#include "gu_vram.h" #include "wadfile.h" #ifndef offsetof @@ -686,18 +688,7 @@ void GU_Clip( gu_vert_t *uv, size_t uvc, gu_vert_t **cv, size_t* cvc ); typedef struct { int max_texture_size; - int color_bits; - int alpha_bits; - int depth_bits; - int stencil_bits; - - gl_context_type_t context; - gles_wrapper_t wrapper; - qboolean softwareGammaUpdate; - qboolean fCustomRenderer; - int prev_width; - int prev_height; } glconfig_t; typedef struct @@ -727,8 +718,23 @@ typedef struct qboolean extended; // extended context allows to GL_Debug } glwstate_t; +typedef struct +{ + int screen_width; + int screen_height; + int buffer_width; + int buffer_format; + int buffer_bpp; + void *draw_buffer; + void *disp_buffer; + void *depth_buffer; + void *context_list; + size_t context_list_size; +}gurender_t; + extern glconfig_t glConfig; extern glstate_t glState; +extern gurender_t guRender; // move to engine extern glwstate_t glw_state; extern ref_api_t gEngfuncs; @@ -751,11 +757,9 @@ extern cvar_t *gl_round_down; extern cvar_t *gl_detailscale; extern cvar_t *gl_wireframe; extern cvar_t *gl_depthoffset; -extern cvar_t *gl_finish; extern cvar_t *gl_nosort; extern cvar_t *gl_clear; extern cvar_t *gl_test; // cvar to testify new effects -extern cvar_t *gl_stencilbits; extern cvar_t *gl_subdivide_size; extern cvar_t *r_speeds; diff --git a/ref_gu/gu_init.c b/ref_gu/gu_render.c similarity index 69% rename from ref_gu/gu_init.c rename to ref_gu/gu_render.c index 1732d559..57312499 100644 --- a/ref_gu/gu_init.c +++ b/ref_gu/gu_render.c @@ -1,4 +1,18 @@ +/* +gu_render.c - render initialization +Copyright (C) 2010 Uncle Mike +Copyright (C) 2022 Sergey Galushko +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +*/ #include "gu_local.h" cvar_t *gl_texture_lodfunc; @@ -12,12 +26,10 @@ cvar_t *gl_emboss_scale; cvar_t *gl_detailscale; cvar_t *gl_depthoffset; cvar_t *gl_wireframe; -cvar_t *gl_finish; cvar_t *gl_nosort; cvar_t *gl_vsync; cvar_t *gl_clear; cvar_t *gl_test; -cvar_t *gl_stencilbits; cvar_t *gl_subdivide_size; cvar_t *r_speeds; cvar_t *r_fullbright; @@ -54,6 +66,155 @@ gl_globals_t tr; glconfig_t glConfig; glstate_t glState; glwstate_t glw_state; +gurender_t guRender; + +// Set frame buffer +#define PSP_FB_WIDTH 480 +#define PSP_FB_HEIGHT 272 +#define PSP_FB_BWIDTH 512 +#define PSP_FB_FORMAT GU_PSM_5650 //4444,5551,5650,8888 + +#if PSP_FB_FORMAT == GU_PSM_4444 +#define PSP_FB_BPP 2 +#elif PSP_FB_FORMAT == GU_PSM_5551 +#define PSP_FB_BPP 2 +#elif PSP_FB_FORMAT == GU_PSM_5650 +#define PSP_FB_BPP 2 +#elif PSP_FB_FORMAT == GU_PSM_8888 +#define PSP_FB_BPP 4 +#endif + +#define PSP_GU_LIST_SIZE 0x100000 // 1Mb + +static byte context_list[PSP_GU_LIST_SIZE] __attribute__( ( aligned( 64 ) ) ); + +/* +=============== +GU_Init +=============== +*/ +static void GU_Init( void ) +{ + memset( &guRender, 0, sizeof( guRender )); + + guRender.screen_width = PSP_FB_WIDTH; + guRender.screen_height = PSP_FB_HEIGHT; + guRender.buffer_width = PSP_FB_BWIDTH; + guRender.buffer_format = PSP_FB_FORMAT; + guRender.buffer_bpp = PSP_FB_BPP; + + guRender.draw_buffer = ( void* )valloc( guRender.buffer_width * guRender.screen_height * guRender.buffer_bpp ); + if( !guRender.draw_buffer ) + gEngfuncs.Host_Error( "Memory allocation failled! (guRender.draw_buffer)\n" ); + + guRender.disp_buffer = ( void* )valloc( guRender.buffer_width * guRender.screen_height * guRender.buffer_bpp ); + if( !guRender.disp_buffer ) + gEngfuncs.Host_Error( "Memory allocation failled! (guRender.disp_buffer)\n" ); + + guRender.depth_buffer = ( void* )valloc( guRender.buffer_width * guRender.screen_height * guRender.buffer_bpp ); + if( !guRender.depth_buffer ) + gEngfuncs.Host_Error( "Memory allocation failled! (guRender.depth_buffer)\n" ); + + guRender.context_list = context_list; + guRender.context_list_size = sizeof( context_list ); + + // Initialise the GU. + sceGuInit(); + + // Set up the GU. + sceGuStart( GU_DIRECT, guRender.context_list ); + + sceGuDrawBuffer( guRender.buffer_format, vrelptr( guRender.draw_buffer ), guRender.buffer_width ); + sceGuDispBuffer( guRender.screen_width, guRender.screen_height, vrelptr( guRender.disp_buffer ), guRender.buffer_width ); + sceGuDepthBuffer( vrelptr( guRender.depth_buffer ), guRender.buffer_width ); + + // Set the rendering offset and viewport. + sceGuOffset( 2048 - ( guRender.screen_width / 2 ), 2048 - ( guRender.screen_height / 2 ) ); + sceGuViewport( 2048, 2048, guRender.screen_width, guRender.screen_height ); + + // Set up scissoring. + sceGuEnable( GU_SCISSOR_TEST ); + sceGuScissor( 0, 0, guRender.screen_width, guRender.screen_height ); + + // Xash default + sceGuClearColor( GU_COLOR( 0.5f, 0.5f, 0.5f, 1.0f ) ); + + sceGuDisable( GU_DEPTH_TEST ); + sceGuDisable( GU_CULL_FACE ); + sceGuEnable( GU_CLIP_PLANES ); + sceGuDepthFunc( GU_LEQUAL ); + sceGuColor( 0xffffffff ); + + // Set up stencil + if( glState.stencilEnabled ) + { + sceGuDisable( GU_STENCIL_TEST ); + /*pglStencilMask( ( GLuint ) ~0 );*/ // alpha color sceGuPixelMask + sceGuStencilFunc( GU_EQUAL, 0, ~0 ); + sceGuStencilOp( GU_KEEP, GU_INCR, GU_INCR ); + } + + sceGuDepthRange( 0, 65535 ); + sceGuDepthOffset( 0 ); + + sceGuDisable( GU_BLEND ); + sceGuDisable( GU_ALPHA_TEST ); + + sceGuBlendFunc( GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0 ); + sceGuAlphaFunc( GU_GREATER, DEFAULT_ALPHATEST, 0xff ); + sceGuEnable( GU_TEXTURE_2D ); + sceGuShadeModel( GU_SMOOTH ); + sceGuFrontFace( GU_CW ); // reversed + + // Set the default matrices. + sceGumMatrixMode( GU_PROJECTION ); + sceGumLoadIdentity(); + sceGumMatrixMode( GU_VIEW ); + sceGumLoadIdentity(); + sceGumMatrixMode( GU_MODEL ); + sceGumLoadIdentity(); + sceGumMatrixMode( GU_TEXTURE ); + sceGumLoadIdentity(); + + sceGumUpdateMatrix(); + + sceGuFinish(); + sceGuSync( GU_SYNC_FINISH, GU_SYNC_WAIT ); + + // Turn on the display. + sceDisplayWaitVblankStart(); + sceGuDisplay(GU_TRUE); + + // Start a new render. + sceGuStart( GU_DIRECT, guRender.context_list ); +} + +/* +=============== +GU_Shutdown +=============== +*/ +static void GU_Shutdown( void ) +{ + // Finish rendering. + sceGuFinish(); + sceGuSync( GU_SYNC_FINISH, GU_SYNC_WAIT ); + + // Shut down the display. + sceGuTerm(); + + // Free the buffers. + if( guRender.draw_buffer ) + vfree( guRender.draw_buffer ); + if( guRender.disp_buffer ) + vfree( guRender.disp_buffer ); + if( guRender.depth_buffer ) + vfree( guRender.depth_buffer ); + + guRender.draw_buffer = NULL; + guRender.disp_buffer = NULL; + guRender.depth_buffer = NULL; +} /* ============== @@ -88,46 +249,14 @@ static void GL_SetDefaultState( void ) glState.fogStart = 100.0f; glState.fogEnd = 1000.0f; } - +#if 0 /* =============== GL_SetDefaults =============== */ -static void GL_SetDefaults( void ) +static void GU_SetDefaults( void ) { -#if 1 -/* - sceGuFinish(); - sceGuSync(0,0); -*/ - sceGuClearColor( GU_COLOR( 0.5f, 0.5f, 0.5f, 1.0f ) ); - - sceGuDisable( GU_DEPTH_TEST ); - sceGuDisable( GU_CULL_FACE ); - //sceGuDisable( GU_SCISSOR_TEST ); - sceGuDepthFunc( GU_LEQUAL ); - sceGuColor( 0xffffffff ); - - if( glState.stencilEnabled ) - { - sceGuDisable( GU_STENCIL_TEST ); - /*pglStencilMask( ( GLuint ) ~0 );*/ - sceGuStencilFunc( GU_EQUAL, 0, ~0 ); - sceGuStencilOp( GU_KEEP, GU_INCR, GU_INCR ); - } - sceGuDepthOffset( 0 ); - - GL_CleanupAllTextureUnits(); - - sceGuDisable( GU_BLEND ); - sceGuDisable( GU_ALPHA_TEST ); - - sceGuAlphaFunc( GU_GREATER, DEFAULT_ALPHATEST, 0xff ); - sceGuEnable( GU_TEXTURE_2D ); - sceGuShadeModel( GU_SMOOTH ); - sceGuFrontFace( GU_CCW ); -#else pglFinish(); pglClearColor( 0.5f, 0.5f, 0.5f, 1.0f ); @@ -161,10 +290,10 @@ static void GL_SetDefaults( void ) pglPointSize( 1.2f ); pglLineWidth( 1.2f ); -#endif + GL_Cull( GL_NONE ); } - +#endif /* ================= @@ -178,17 +307,11 @@ void R_RenderInfo_f( void ) gEngfuncs.Con_Printf( "MAX_TEXTURE_SIZE: %i\n", glConfig.max_texture_size ); gEngfuncs.Con_Printf( "MODE: %ix%i\n", gpGlobals->width, gpGlobals->height ); gEngfuncs.Con_Printf( "VERTICAL SYNC: %s\n", gl_vsync->value ? "enabled" : "disabled" ); - gEngfuncs.Con_Printf( "Color %d bits, Alpha %d bits, Depth %d bits, Stencil %d bits\n", glConfig.color_bits, - glConfig.alpha_bits, glConfig.depth_bits, glConfig.stencil_bits ); + gEngfuncs.Con_Printf( "VRAM AVAILABLE: %i\n", vmemavail() ); } void GL_InitExtensions( void ) { -// int colorBits[3]; - - glConfig.color_bits = 5 + 5 + 5; - glConfig.alpha_bits = 1; - glConfig.stencil_bits = ( int )gl_stencilbits->value; glState.stencilEnabled = true; glConfig.max_texture_size = 256; @@ -248,14 +371,12 @@ void GL_InitCommands( void ) gl_keeptjunctions = gEngfuncs.Cvar_Get( "gl_keeptjunctions", "1", FCVAR_GLCONFIG, "removing tjuncs causes blinking pixels" ); gl_emboss_scale = gEngfuncs.Cvar_Get( "gl_emboss_scale", "0", FCVAR_GLCONFIG|FCVAR_LATCH, "fake bumpmapping scale" ); gl_showtextures = gEngfuncs.pfnGetCvarPointer( "r_showtextures", 0 ); - gl_finish = gEngfuncs.Cvar_Get( "gl_finish", "0", FCVAR_GLCONFIG, "use glFinish instead of glFlush" ); gl_nosort = gEngfuncs.Cvar_Get( "gl_nosort", "1", FCVAR_GLCONFIG, "disable sorting of translucent surfaces" ); gl_clear = gEngfuncs.pfnGetCvarPointer( "gl_clear", 0 ); gl_test = gEngfuncs.Cvar_Get( "gl_test", "0", 0, "engine developer cvar for quick testing new features" ); gl_wireframe = gEngfuncs.Cvar_Get( "gl_wireframe", "0", FCVAR_GLCONFIG|FCVAR_SPONLY, "show wireframe overlay" ); - gl_stencilbits = gEngfuncs.Cvar_Get( "gl_stencilbits", "8", FCVAR_GLCONFIG|FCVAR_READ_ONLY, "pixelformat stencil bits (0 - auto)" ); gl_subdivide_size = gEngfuncs.Cvar_Get( "gl_subdivide_size", "256.0", FCVAR_GLCONFIG, "the division value for the sky brushes" ); - gl_round_down = gEngfuncs.Cvar_Get( "gl_round_down", "2", FCVAR_GLCONFIG|FCVAR_READ_ONLY, "round texture sizes to nearest POT value" ); + gl_round_down = gEngfuncs.Cvar_Get( "gl_round_down", "1", FCVAR_GLCONFIG, "round texture sizes to nearest POT value" ); // these cvar not used by engine but some mods requires this gl_depthoffset = gEngfuncs.Cvar_Get( "gl_depthoffset", "256.0", FCVAR_GLCONFIG, "depth offset for decals" ); @@ -313,7 +434,7 @@ qboolean R_Init( void ) r_temppool = Mem_AllocPool( "Render Zone" ); - GL_SetDefaults(); + GU_Init(); R_InitImages(); R_SpriteInit(); R_StudioInit(); @@ -336,6 +457,7 @@ void R_Shutdown( void ) GL_RemoveCommands(); R_ShutdownImages(); + GU_Shutdown(); Mem_FreePool( &r_temppool ); diff --git a/ref_gu/gu_rmain.c b/ref_gu/gu_rmain.c index 9b5374e4..7c3a41ea 100644 --- a/ref_gu/gu_rmain.c +++ b/ref_gu/gu_rmain.c @@ -1091,11 +1091,7 @@ void R_BeginFrame( qboolean clearScene ) if(( gl_clear->value || ENGINE_GET_PARM( PARM_DEV_OVERVIEW )) && clearScene && ENGINE_GET_PARM( PARM_CONNSTATE ) != ca_cinematic ) { -#if 1 sceGuClear( GU_COLOR_BUFFER_BIT ); -#else - pglClear( GL_COLOR_BUFFER_BIT ); -#endif } R_CheckGamma(); @@ -1157,10 +1153,6 @@ void R_RenderFrame( const ref_viewpass_t *rvp ) // setup the initial render params R_SetupRefParams( rvp ); -#if 0 - if( gl_finish->value && RI.drawWorld ) - pglFinish(); -#endif // completely override rendering if( gEngfuncs.drawFuncs->GL_RenderFrame != NULL ) @@ -1195,7 +1187,22 @@ void R_EndFrame( void ) { // flush any remaining 2D bits R_Set2DMode( false ); - gEngfuncs.GL_SwapBuffers(); + + // finish rendering. + sceGuFinish(); + sceGuSync( GU_SYNC_FINISH, GU_SYNC_WAIT ); + + // swap the buffers. + sceGuSwapBuffers(); + + void* p_swap = guRender.disp_buffer; + guRender.disp_buffer = guRender.draw_buffer; + guRender.draw_buffer = p_swap; + + gEngfuncs.GL_SwapBuffers(); // vsync + + // start a new render. + sceGuStart( GU_DIRECT, guRender.context_list ); } /* diff --git a/engine/platform/psp/vram_psp.c b/ref_gu/gu_vram.c similarity index 99% rename from engine/platform/psp/vram_psp.c rename to ref_gu/gu_vram.c index a9a520dd..ee8ac5e8 100644 --- a/engine/platform/psp/vram_psp.c +++ b/ref_gu/gu_vram.c @@ -8,7 +8,7 @@ * Copyright (c) 2007 Alexander Berl 'Raphael' * http://wordpress.fx-world.org */ -#include "vram.h" +#include "gu_vram.h" #include // Configure the memory to be managed diff --git a/engine/platform/psp/vram_psp.h b/ref_gu/gu_vram.h similarity index 100% rename from engine/platform/psp/vram_psp.h rename to ref_gu/gu_vram.h diff --git a/ref_gu/vram_psp.h b/ref_gu/vram_psp.h deleted file mode 100644 index 0b974f99..00000000 --- a/ref_gu/vram_psp.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Helper for use with the PSP Software Development Kit - http://www.pspdev.org - * ----------------------------------------------------------------------- - * Licensed as 'free to use and modify as long as credited appropriately' - * - * vram.h - Standard C high performance VRAM allocation routines. - * - * Copyright (c) 2007 Alexander Berl 'Raphael' - * http://wordpress.fx-world.org - */ -#ifndef vram_h__ -#define vram_h__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void* vrelptr( void *ptr ); // make a pointer relative to memory base address (ATTENTION: A NULL rel ptr is not illegal/invalid!) -void* vabsptr( void *ptr ); // make a pointer absolute (default return type of valloc) - -void* valloc( size_t size ); -void vfree( void* ptr ); -size_t vmemavail(); -size_t vlargestblock(); - - -#ifdef _DEBUG -// Debug printf (to stdout) a trace of the current Memblocks -void __memwalk(); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif // ifdef vram_h__