From ea916d95d5739a0c48634bf0419e0992538f1311 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 28 Mar 2013 07:24:44 +0100 Subject: [PATCH] (RGL PS3) Disable RGB remap - was never used up to now - set gamma to 0 - call GCM functions directly - some other ghetto inlining tweaks --- ps3/rgl/src/ps3/include/rgl-inline.h | 414 --------------------------- ps3/rgl/src/ps3/rgl_ps3.cpp | 24 +- ps3/rgl/src/ps3/rgl_ps3_raster.cpp | 326 ++++++++++++++++----- 3 files changed, 264 insertions(+), 500 deletions(-) diff --git a/ps3/rgl/src/ps3/include/rgl-inline.h b/ps3/rgl/src/ps3/include/rgl-inline.h index cb76340694..da6fd0ff9e 100644 --- a/ps3/rgl/src/ps3/include/rgl-inline.h +++ b/ps3/rgl/src/ps3/include/rgl-inline.h @@ -196,224 +196,6 @@ static inline GLuint rglGcmMapWrapMode( GLuint mode ) return 0; } -static inline void rglGcmMapTextureFormat( GLuint internalFormat, uint8_t *gcmFormat, uint32_t *remap ) -{ - *gcmFormat = 0; - - switch (internalFormat) - { - case RGLGCM_ALPHA8: // in_rgba = xxAx, out_rgba = 000A - { - *gcmFormat = CELL_GCM_TEXTURE_B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_ZERO, - CELL_GCM_TEXTURE_REMAP_ZERO, - CELL_GCM_TEXTURE_REMAP_ZERO ); - - } - break; - case RGLGCM_ALPHA16: // in_rgba = xAAx, out_rgba = 000A - { - *gcmFormat = CELL_GCM_TEXTURE_X16; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_ZERO, - CELL_GCM_TEXTURE_REMAP_ZERO, - CELL_GCM_TEXTURE_REMAP_ZERO ); - - } - break; - case RGLGCM_HILO8: // in_rgba = HLxx, out_rgba = HL11 - { - *gcmFormat = CELL_GCM_TEXTURE_COMPRESSED_HILO8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_ONE, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_ONE ); - - } - break; - case RGLGCM_HILO16: // in_rgba = HLxx, out_rgba = HL11 - { - *gcmFormat = CELL_GCM_TEXTURE_Y16_X16; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_ONE, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_ONE ); - - } - break; - case RGLGCM_ARGB8: // in_rgba = RGBA, out_rgba = RGBA - { - *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - case RGLGCM_BGRA8: // in_rgba = GRAB, out_rgba = RGBA ** NEEDS TO BE TESTED - { - *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - case RGLGCM_RGBA8: // in_rgba = GBAR, out_rgba = RGBA ** NEEDS TO BE TESTED - { - *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - } - break; - case RGLGCM_ABGR8: // in_rgba = BGRA, out_rgba = RGBA ** NEEDS TO BE TESTED - { - *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - case RGLGCM_RGBX8: // in_rgba = BGRA, out_rgba = RGB1 ** NEEDS TO BE TESTED - { - *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_ONE, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - case RGLGCM_XBGR8: // in_rgba = BGRA, out_rgba = RGB1 ** NEEDS TO BE TESTED - { - *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_ONE, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - case RGLGCM_FLOAT_R32: // in_rgba = Rxxx, out_rgba = R001 - { - *gcmFormat = CELL_GCM_TEXTURE_X32_FLOAT; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_ONE, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_ZERO, - CELL_GCM_TEXTURE_REMAP_ZERO ); - - } - break; - case RGLGCM_RGB5_A1_SCE: // in_rgba = RGBA, out_rgba = RGBA - { - *gcmFormat = CELL_GCM_TEXTURE_A1R5G5B5; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XXXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - case RGLGCM_RGB565_SCE: // in_rgba = RGBA, out_rgba = RGBA - { - *gcmFormat = CELL_GCM_TEXTURE_R5G6B5; - *remap = CELL_GCM_REMAP_MODE( - CELL_GCM_TEXTURE_REMAP_ORDER_XXXY, - CELL_GCM_TEXTURE_REMAP_FROM_A, - CELL_GCM_TEXTURE_REMAP_FROM_R, - CELL_GCM_TEXTURE_REMAP_FROM_G, - CELL_GCM_TEXTURE_REMAP_FROM_B, - CELL_GCM_TEXTURE_REMAP_ONE, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP, - CELL_GCM_TEXTURE_REMAP_REMAP ); - - } - break; - default: - break; - } -} - // Fast conversion for values between 0.0 and 65535.0 static inline GLuint RGLGCM_QUICK_FLOAT2UINT (const GLfloat f) { @@ -461,99 +243,6 @@ static inline void rglGcmUtilWaitForIdle (void) rglGcmState_i.labelValue++; } -// Sets the source and destination factor used for blending. -static inline void rglGcmFifoGlBlendFunc( rglGcmEnum sf, rglGcmEnum df, rglGcmEnum sfAlpha, rglGcmEnum dfAlpha ) -{ - // syntax check - switch ( sf ) - { - case RGLGCM_ZERO: - case RGLGCM_ONE: - case RGLGCM_SRC_COLOR: - case RGLGCM_ONE_MINUS_SRC_COLOR: - case RGLGCM_SRC_ALPHA: - case RGLGCM_ONE_MINUS_SRC_ALPHA: - case RGLGCM_DST_ALPHA: - case RGLGCM_ONE_MINUS_DST_ALPHA: - case RGLGCM_DST_COLOR: - case RGLGCM_ONE_MINUS_DST_COLOR: - case RGLGCM_SRC_ALPHA_SATURATE: - case RGLGCM_CONSTANT_COLOR: - case RGLGCM_ONE_MINUS_CONSTANT_COLOR: - case RGLGCM_CONSTANT_ALPHA: - case RGLGCM_ONE_MINUS_CONSTANT_ALPHA: - break; - default: - break; - } - switch ( sfAlpha ) - { - case RGLGCM_ZERO: - case RGLGCM_ONE: - case RGLGCM_SRC_COLOR: - case RGLGCM_ONE_MINUS_SRC_COLOR: - case RGLGCM_SRC_ALPHA: - case RGLGCM_ONE_MINUS_SRC_ALPHA: - case RGLGCM_DST_ALPHA: - case RGLGCM_ONE_MINUS_DST_ALPHA: - case RGLGCM_DST_COLOR: - case RGLGCM_ONE_MINUS_DST_COLOR: - case RGLGCM_SRC_ALPHA_SATURATE: - case RGLGCM_CONSTANT_COLOR: - case RGLGCM_ONE_MINUS_CONSTANT_COLOR: - case RGLGCM_CONSTANT_ALPHA: - case RGLGCM_ONE_MINUS_CONSTANT_ALPHA: - break; - default: - break; - } - - switch ( df ) - { - case RGLGCM_ZERO: - case RGLGCM_ONE: - case RGLGCM_SRC_COLOR: - case RGLGCM_ONE_MINUS_SRC_COLOR: - case RGLGCM_SRC_ALPHA: - case RGLGCM_ONE_MINUS_SRC_ALPHA: - case RGLGCM_DST_ALPHA: - case RGLGCM_ONE_MINUS_DST_ALPHA: - case RGLGCM_DST_COLOR: - case RGLGCM_ONE_MINUS_DST_COLOR: - case RGLGCM_SRC_ALPHA_SATURATE: - case RGLGCM_CONSTANT_COLOR: - case RGLGCM_ONE_MINUS_CONSTANT_COLOR: - case RGLGCM_CONSTANT_ALPHA: - case RGLGCM_ONE_MINUS_CONSTANT_ALPHA: - break; - default: - break; - } - switch ( dfAlpha ) - { - case RGLGCM_ZERO: - case RGLGCM_ONE: - case RGLGCM_SRC_COLOR: - case RGLGCM_ONE_MINUS_SRC_COLOR: - case RGLGCM_SRC_ALPHA: - case RGLGCM_ONE_MINUS_SRC_ALPHA: - case RGLGCM_DST_ALPHA: - case RGLGCM_ONE_MINUS_DST_ALPHA: - case RGLGCM_DST_COLOR: - case RGLGCM_ONE_MINUS_DST_COLOR: - case RGLGCM_SRC_ALPHA_SATURATE: - case RGLGCM_CONSTANT_COLOR: - case RGLGCM_ONE_MINUS_CONSTANT_COLOR: - case RGLGCM_CONSTANT_ALPHA: - case RGLGCM_ONE_MINUS_CONSTANT_ALPHA: - break; - default: - break; - } - - GCM_FUNC( cellGcmSetBlendFunc, sf, df, sfAlpha, dfAlpha ); -} - // Prints out an int in hexedecimal and binary, broken into bytes. // Can be used for printing out macro and constant values. // example: rglPrintIt( RGLGCM_3DCONST(SET_SURFACE_FORMAT, COLOR, LE_A8R8G8B8) ); @@ -599,71 +288,6 @@ static inline void rglGcmFifoGlIncFenceRef (GLuint *ref) *ref = rglGcmFifoPutReference( fifo ); } -// Flush the current FIFO. -static inline void rglGcmFifoGlFlush (void) -{ - GCM_FUNC_NO_ARGS( cellGcmSetInvalidateVertexCache ); - rglGcmFifoFlush( &rglGcmState_i.fifo ); -} - -// Set blending constant, used for certain blending modes. -static inline void rglGcmFifoGlBlendColor( GLfloat r, GLfloat g, GLfloat b, GLfloat a ) -{ - rglGcmBlendState *blend = &rglGcmState_i.state.blend; - GLuint hwColor; - - // syntax check - blend->r = r; - blend->g = g; - blend->b = b; - blend->a = a; - - // program hw - switch ( rglGcmState_i.renderTarget.colorFormat ) - { - case RGLGCM_ARGB8: - RGLGCM_CALC_COLOR_LE_ARGB8( &hwColor, r, g, b, a ); - GCM_FUNC( cellGcmSetBlendColor, hwColor, hwColor ); - break; - case RGLGCM_NONE: - case RGLGCM_FLOAT_R32: - // no native support support - break; - default: - break; - } -} - -// Set the current blend equation. -static inline void rglGcmFifoGlBlendEquation( rglGcmEnum mode, rglGcmEnum modeAlpha ) -{ - // syntax check - switch ( mode ) - { - case RGLGCM_FUNC_ADD: - case RGLGCM_MIN: - case RGLGCM_MAX: - case RGLGCM_FUNC_SUBTRACT: - case RGLGCM_FUNC_REVERSE_SUBTRACT: - break; - default: - break; - } - switch ( modeAlpha ) - { - case RGLGCM_FUNC_ADD: - case RGLGCM_MIN: - case RGLGCM_MAX: - case RGLGCM_FUNC_SUBTRACT: - case RGLGCM_FUNC_REVERSE_SUBTRACT: - break; - default: - break; - } - - GCM_FUNC( cellGcmSetBlendEquation, mode, modeAlpha ); -} - static inline void rglGcmFifoGlVertexAttribPointer ( GLuint index, @@ -729,44 +353,6 @@ static inline void rglGcmFifoGlVertexAttribPointer GCM_FUNC( cellGcmSetVertexDataArray, index, frequency, stride, size, gcmType, CELL_GCM_LOCATION_LOCAL, offset ); } -static inline void rglGcmFifoGlEnable( rglGcmEnum cap ) -{ - switch (cap) - { - case RGLGCM_BLEND: - GCM_FUNC( cellGcmSetBlendEnable, RGLGCM_TRUE ); - GCM_FUNC( cellGcmSetBlendEnableMrt, RGLGCM_TRUE, RGLGCM_TRUE, RGLGCM_TRUE ); - break; - case RGLGCM_DITHER: - GCM_FUNC( cellGcmSetDitherEnable, RGLGCM_TRUE ); - break; - case RGLGCM_PSHADER_SRGB_REMAPPING: - GCM_FUNC( cellGcmSetFragmentProgramGammaEnable, RGLGCM_TRUE ); - break; - default: - break; - } -} - -static inline void rglGcmFifoGlDisable( rglGcmEnum cap ) -{ - switch (cap) - { - case RGLGCM_BLEND: - GCM_FUNC( cellGcmSetBlendEnable, RGLGCM_FALSE ); - GCM_FUNC( cellGcmSetBlendEnableMrt, RGLGCM_FALSE, RGLGCM_FALSE, RGLGCM_FALSE ); - break; - case RGLGCM_DITHER: - GCM_FUNC( cellGcmSetDitherEnable, RGLGCM_FALSE ); - break; - case RGLGCM_PSHADER_SRGB_REMAPPING: - GCM_FUNC( cellGcmSetFragmentProgramGammaEnable, RGLGCM_FALSE ); - break; - default: - break; - } -} - // Look up the memory location of a buffer object (VBO, PBO) static inline GLuint rglGcmGetBufferObjectOrigin (GLuint buffer) { diff --git a/ps3/rgl/src/ps3/rgl_ps3.cpp b/ps3/rgl/src/ps3/rgl_ps3.cpp index e0ed86f6f4..7f74f1ecf6 100644 --- a/ps3/rgl/src/ps3/rgl_ps3.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3.cpp @@ -1570,19 +1570,20 @@ void rglGcmSetOpenGLState (void *data) GLuint i; // initialize the default OpenGL state - rglGcmFifoGlBlendColor( 0.0f, 0.0f, 0.0f, 0.0f ); - rglGcmFifoGlBlendEquation( RGLGCM_FUNC_ADD, RGLGCM_FUNC_ADD ); - rglGcmFifoGlBlendFunc( RGLGCM_ONE, RGLGCM_ZERO, RGLGCM_ONE, RGLGCM_ZERO ); + GCM_FUNC( cellGcmSetBlendColor, 0, 0); + GCM_FUNC( cellGcmSetBlendEquation, RGLGCM_FUNC_ADD, RGLGCM_FUNC_ADD ); + GCM_FUNC( cellGcmSetBlendFunc, RGLGCM_ONE, RGLGCM_ZERO, RGLGCM_ONE, RGLGCM_ZERO ); GCM_FUNC( cellGcmSetClearColor, 0 ); - rglGcmFifoGlDisable( RGLGCM_BLEND ); - rglGcmFifoGlDisable( RGLGCM_PSHADER_SRGB_REMAPPING ); + GCM_FUNC( cellGcmSetBlendEnable, RGLGCM_FALSE ); + GCM_FUNC( cellGcmSetBlendEnableMrt, RGLGCM_FALSE, RGLGCM_FALSE, RGLGCM_FALSE ); + GCM_FUNC( cellGcmSetFragmentProgramGammaEnable, RGLGCM_FALSE ); for ( i = 0; i < RGLGCM_ATTRIB_COUNT; i++ ) { GCM_FUNC( cellGcmSetVertexDataArray, i, 0, 0, 0, CELL_GCM_VERTEX_F, CELL_GCM_LOCATION_LOCAL, 0); } - rglGcmFifoGlEnable( RGLGCM_DITHER ); + GCM_FUNC( cellGcmSetDitherEnable, RGLGCM_TRUE ); for ( i = 0; i < RGLGCM_MAX_TEXIMAGE_COUNT; i++ ) { @@ -1895,7 +1896,8 @@ void rglPsglPlatformExit(void) if ( LContext ) { - rglGcmFifoGlFlush(); + GCM_FUNC_NO_ARGS( cellGcmSetInvalidateVertexCache ); + rglGcmFifoFlush( &rglGcmState_i.fifo ); psglMakeCurrent( NULL, NULL ); rglDeviceExit(); @@ -3145,17 +3147,19 @@ GLAPI void RGL_EXPORT psglSwap (void) const char * __restrict v = driver->sharedVPConstants; GCM_FUNC( cellGcmSetVertexProgramParameterBlock, 0, 8, ( float* )v ); // GCM_PORT_UNTESTED [KHOFF] - rglGcmFifoGlEnable( RGLGCM_DITHER ); + GCM_FUNC( cellGcmSetDitherEnable, RGLGCM_TRUE ); RGLcontext *context = (RGLcontext*)_CurrentContext; context->needValidate = RGL_VALIDATE_ALL; context->attribs->DirtyMask = ( 1 << RGL_MAX_VERTEX_ATTRIBS ) - 1; - rglGcmFifoGlFlush(); + GCM_FUNC_NO_ARGS( cellGcmSetInvalidateVertexCache ); + rglGcmFifoFlush( &rglGcmState_i.fifo ); while (sys_semaphore_wait(FlipSem,1000) != CELL_OK); - rglGcmFifoGlFlush(); + GCM_FUNC_NO_ARGS( cellGcmSetInvalidateVertexCache ); + rglGcmFifoFlush( &rglGcmState_i.fifo ); if ( device->deviceParameters.bufferingMode == RGL_BUFFERING_MODE_DOUBLE ) { diff --git a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp index 1101fdade9..c1b891d092 100644 --- a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp @@ -1427,7 +1427,8 @@ GLAPI void APIENTRY glClear( GLbitfield mask ) gmmFree( bufferId ); } - rglGcmFifoGlFlush(); + GCM_FUNC_NO_ARGS( cellGcmSetInvalidateVertexCache ); + rglGcmFifoFlush( &rglGcmState_i.fifo ); } rglFramebuffer* rglCreateFramebuffer (void) @@ -1980,15 +1981,23 @@ static inline void rglValidateStates (GLuint mask) { GCM_FUNC( cellGcmSetBlendEnable, LContext->Blending ); - rglGcmFifoGlBlendColor( - LContext->BlendColor.R, - LContext->BlendColor.G, - LContext->BlendColor.B, - LContext->BlendColor.A); - rglGcmFifoGlBlendEquation( - (rglGcmEnum)LContext->BlendEquationRGB, - (rglGcmEnum)LContext->BlendEquationAlpha); - rglGcmFifoGlBlendFunc((rglGcmEnum)LContext->BlendFactorSrcRGB,(rglGcmEnum)LContext->BlendFactorDestRGB,(rglGcmEnum)LContext->BlendFactorSrcAlpha,(rglGcmEnum)LContext->BlendFactorDestAlpha); + rglGcmBlendState *blend = &rglGcmState_i.state.blend; + GLuint hwColor; + + blend->r = LContext->BlendColor.R; + blend->g = LContext->BlendColor.G; + blend->b = LContext->BlendColor.B; + blend->a = LContext->BlendColor.A; + + if (rglGcmState_i.renderTarget.colorFormat == RGLGCM_ARGB8) + { + RGLGCM_CALC_COLOR_LE_ARGB8( &hwColor, blend->r, blend->g, blend->b, blend->a ); + GCM_FUNC( cellGcmSetBlendColor, hwColor, hwColor ); + } + + GCM_FUNC( cellGcmSetBlendEquation, (rglGcmEnum)LContext->BlendEquationRGB, + (rglGcmEnum)LContext->BlendEquationAlpha ); + GCM_FUNC( cellGcmSetBlendFunc, (rglGcmEnum)LContext->BlendFactorSrcRGB,(rglGcmEnum)LContext->BlendFactorDestRGB,(rglGcmEnum)LContext->BlendFactorSrcAlpha,(rglGcmEnum)LContext->BlendFactorDestAlpha); } } @@ -2284,69 +2293,6 @@ void rglPlatformDropTexture (void *data) rglTextureTouchFBOs( texture ); } -// Drop unbound textures from the GPU memory -// This is kind of slow, but we hit a slow path anyway. -// If the pool argument is not RGLGCM_SURFACE_POOL_NONE, then only textures -// in the specified pool will be dropped. -void rglPlatformDropUnboundTextures (GLenum pool) -{ - RGLcontext* LContext = _CurrentContext; - GLuint i, j; - - for (i = 0; i < LContext->textureNameSpace.capacity; ++i) - { - GLboolean bound = GL_FALSE; - rglTexture *texture = ( rglTexture * )LContext->textureNameSpace.data[i]; - - if (!texture || (texture->referenceBuffer != 0)) - continue; - - // check if bound - for ( j = 0;j < RGL_MAX_TEXTURE_IMAGE_UNITS;++j ) - { - rglTextureImageUnit *tu = LContext->TextureImageUnits + j; - if ( tu->bound2D == i) - { - bound = GL_TRUE; - break; - } - } - if ( bound ) - continue; - - rglGcmTexture *gcmTexture = ( rglGcmTexture * )texture->platformTexture; - - // check pool - if ( pool != RGLGCM_SURFACE_POOL_NONE && - pool != gcmTexture->pool ) - continue; - - rglPlatformDropTexture( texture ); - } -} - -// Drop filitering mode for FP32 texture -static inline GLenum unFilter( GLenum filter ) -{ - GLenum newFilter; - switch ( filter ) - { - case GL_NEAREST: - case GL_LINEAR: - newFilter = GL_NEAREST; - break; - case GL_NEAREST_MIPMAP_NEAREST: - case GL_NEAREST_MIPMAP_LINEAR: - case GL_LINEAR_MIPMAP_NEAREST: - case GL_LINEAR_MIPMAP_LINEAR: - newFilter = GL_NEAREST_MIPMAP_NEAREST; - break; - default: - newFilter = GL_NEAREST; - } - return newFilter; -} - // Free memory pooled by a GCM texture void rglPlatformFreeGcmTexture (void *data) { @@ -2565,6 +2511,7 @@ source: RGLGCM_SURFACE_SOURCE_TEXTURE, platformTexture->gcmMethods.address.wrapR = rglGcmMapWrapMode( texture->wrapR ); platformTexture->gcmMethods.address.unsignedRemap = CELL_GCM_TEXTURE_UNSIGNED_REMAP_NORMAL; +#if 0 // now for gamma remap GLuint gamma = 0; GLuint remap = texture->gammaRemap; @@ -2574,6 +2521,9 @@ source: RGLGCM_SURFACE_SOURCE_TEXTURE, gamma |= ( remap & RGLGCM_GAMMA_REMAP_ALPHA_BIT ) ? CELL_GCM_TEXTURE_GAMMA_A : 0; platformTexture->gcmMethods.address.gamma = gamma; +#else + platformTexture->gcmMethods.address.gamma = 0; +#endif // set border colors RGLGCM_CALC_COLOR_LE_ARGB8(&(platformTexture->gcmMethods.borderColor), @@ -2591,8 +2541,225 @@ source: RGLGCM_SURFACE_SOURCE_TEXTURE, GLuint internalFormat = layout->internalFormat; // set the format and remap( control 1) - rglGcmMapTextureFormat( internalFormat, - &platformTexture->gcmTexture.format, &platformTexture->gcmTexture.remap ); + uint8_t *gcmFormat = &platformTexture->gcmTexture.format; + uint32_t *remap = &platformTexture->gcmTexture.remap; + + *gcmFormat = 0; + + switch (internalFormat) + { + case RGLGCM_ALPHA8: // in_rgba = xxAx, out_rgba = 000A + { + *gcmFormat = CELL_GCM_TEXTURE_B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_ZERO, + CELL_GCM_TEXTURE_REMAP_ZERO, + CELL_GCM_TEXTURE_REMAP_ZERO ); + + } + break; + case RGLGCM_ALPHA16: // in_rgba = xAAx, out_rgba = 000A + { + *gcmFormat = CELL_GCM_TEXTURE_X16; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_ZERO, + CELL_GCM_TEXTURE_REMAP_ZERO, + CELL_GCM_TEXTURE_REMAP_ZERO ); + + } + break; +#if 0 + case RGLGCM_HILO8: // in_rgba = HLxx, out_rgba = HL11 + { + *gcmFormat = CELL_GCM_TEXTURE_COMPRESSED_HILO8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_ONE, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_ONE ); + + } + break; + case RGLGCM_HILO16: // in_rgba = HLxx, out_rgba = HL11 + { + *gcmFormat = CELL_GCM_TEXTURE_Y16_X16; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_ONE, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_ONE ); + + } + break; +#endif + case RGLGCM_ARGB8: // in_rgba = RGBA, out_rgba = RGBA + { + *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; +#if 0 + case RGLGCM_BGRA8: // in_rgba = GRAB, out_rgba = RGBA ** NEEDS TO BE TESTED + { + *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; + case RGLGCM_RGBA8: // in_rgba = GBAR, out_rgba = RGBA ** NEEDS TO BE TESTED + { + *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + } + break; + case RGLGCM_ABGR8: // in_rgba = BGRA, out_rgba = RGBA ** NEEDS TO BE TESTED + { + *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; + case RGLGCM_RGBX8: // in_rgba = BGRA, out_rgba = RGB1 ** NEEDS TO BE TESTED + { + *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_ONE, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; + case RGLGCM_XBGR8: // in_rgba = BGRA, out_rgba = RGB1 ** NEEDS TO BE TESTED + { + *gcmFormat = CELL_GCM_TEXTURE_A8R8G8B8; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_ONE, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; + case RGLGCM_FLOAT_R32: // in_rgba = Rxxx, out_rgba = R001 + { + *gcmFormat = CELL_GCM_TEXTURE_X32_FLOAT; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XYXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_ONE, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_ZERO, + CELL_GCM_TEXTURE_REMAP_ZERO ); + + } + break; + case RGLGCM_RGB5_A1_SCE: // in_rgba = RGBA, out_rgba = RGBA + { + *gcmFormat = CELL_GCM_TEXTURE_A1R5G5B5; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XXXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; +#endif + case RGLGCM_RGB565_SCE: // in_rgba = RGBA, out_rgba = RGBA + { + *gcmFormat = CELL_GCM_TEXTURE_R5G6B5; + *remap = CELL_GCM_REMAP_MODE( + CELL_GCM_TEXTURE_REMAP_ORDER_XXXY, + CELL_GCM_TEXTURE_REMAP_FROM_A, + CELL_GCM_TEXTURE_REMAP_FROM_R, + CELL_GCM_TEXTURE_REMAP_FROM_G, + CELL_GCM_TEXTURE_REMAP_FROM_B, + CELL_GCM_TEXTURE_REMAP_ONE, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP, + CELL_GCM_TEXTURE_REMAP_REMAP ); + + } + break; + } // This is just to cover the conversion from swizzled to linear if(layout->pitch) @@ -2851,8 +3018,15 @@ void static inline rglGcmSetColorDepthBuffers(void *data, const void *data_args) { // ARGB8 and FP16 interpret some registers differently rglGcmBlendState *blend = &rglGcmState_i.state.blend; + GLuint hwColor; + rt->colorFormat = args->colorFormat; - rglGcmFifoGlBlendColor( blend->r, blend->g, blend->b, blend->a ); + + if (rglGcmState_i.renderTarget.colorFormat == RGLGCM_ARGB8) + { + RGLGCM_CALC_COLOR_LE_ARGB8( &hwColor, blend->r, blend->g, blend->b, blend->a ); + GCM_FUNC( cellGcmSetBlendColor, hwColor, hwColor ); + } } GLuint i = 0;