mirror of
https://github.com/libretro/RetroArch
synced 2025-02-21 09:39:56 +00:00
(RGL PS3) Optimizations - significant lag reduction / fps improvement (+2fps average)
This commit is contained in:
parent
b0329be296
commit
97fc410df2
@ -688,7 +688,6 @@ static inline void rglGcmFifoGlVertexAttribPointer
|
||||
GLboolean normalized,
|
||||
GLsizei stride,
|
||||
GLushort frequency,
|
||||
GLboolean isMain,
|
||||
GLuint offset
|
||||
)
|
||||
{
|
||||
@ -746,30 +745,6 @@ static inline void rglGcmFifoGlVertexAttribPointer
|
||||
GCM_FUNC( cellGcmSetVertexDataArray, index, frequency, stride, size, gcmType, CELL_GCM_LOCATION_LOCAL, offset );
|
||||
}
|
||||
|
||||
// set the vertex attribute to the specified value.
|
||||
static inline void rglGcmFifoGlVertexAttrib4fv( GLuint index, const GLfloat v[4] )
|
||||
{
|
||||
GCM_FUNC( cellGcmSetVertexData4f, index, v );
|
||||
}
|
||||
|
||||
static inline void rglGcmFifoGlClearColor( GLfloat r, GLfloat g, GLfloat b, GLfloat a )
|
||||
{
|
||||
GCM_FUNC( cellGcmSetClearColor, 0 );
|
||||
}
|
||||
|
||||
static inline void rglGcmFifoGlClear( GLbitfield mask )
|
||||
{
|
||||
GLuint hwMask = 0;
|
||||
|
||||
if ( mask & RGLGCM_COLOR_BUFFER_BIT && rglGcmState_i.renderTarget.colorFormat)
|
||||
hwMask = CELL_GCM_CLEAR_R | CELL_GCM_CLEAR_G | CELL_GCM_CLEAR_B | CELL_GCM_CLEAR_A;
|
||||
|
||||
if (hwMask)
|
||||
{
|
||||
GCM_FUNC( cellGcmSetClearSurface, hwMask );
|
||||
}
|
||||
}
|
||||
|
||||
static inline void rglGcmFifoGlEnable( rglGcmEnum cap )
|
||||
{
|
||||
switch (cap)
|
||||
@ -808,110 +783,6 @@ static inline void rglGcmFifoGlDisable( rglGcmEnum cap )
|
||||
}
|
||||
}
|
||||
|
||||
static inline void rglFifoGlProgramParameterfvVP (const void *data, const CgParameterEntry *parameterEntry, const GLfloat *value)
|
||||
{
|
||||
const _CGprogram *program = (const _CGprogram*)data;
|
||||
const CgParameterResource *parameterResource = rglGetParameterResource( program, parameterEntry );
|
||||
|
||||
if (parameterResource->resource != (unsigned short) - 1)
|
||||
{
|
||||
switch ( parameterResource->type )
|
||||
{
|
||||
case CG_FLOAT:
|
||||
case CG_FLOAT1:
|
||||
case CG_FLOAT2:
|
||||
case CG_FLOAT3:
|
||||
case CG_FLOAT4:
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 1, value ); // GCM_PORT_TESTED [Cedric]
|
||||
break;
|
||||
case CG_FLOAT4x4:
|
||||
// set 4 consts
|
||||
{
|
||||
GLfloat v2[16];
|
||||
v2[0] = value[0];v2[1] = value[4];v2[2] = value[8];v2[3] = value[12];
|
||||
v2[4] = value[1];v2[5] = value[5];v2[6] = value[9];v2[7] = value[13];
|
||||
v2[8] = value[2];v2[9] = value[6];v2[10] = value[10];v2[11] = value[14];
|
||||
v2[12] = value[3];v2[13] = value[7];v2[14] = value[11];v2[15] = value[15];
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 4, v2 ); // GCM_PORT_TESTED [Cedric]
|
||||
}
|
||||
break;
|
||||
case CG_FLOAT3x3:
|
||||
// set 3 consts
|
||||
{
|
||||
GLfloat v2[12];
|
||||
v2[0] = value[0];v2[1] = value[3];v2[2] = value[6];v2[3] = 0;
|
||||
v2[4] = value[1];v2[5] = value[4];v2[6] = value[7];v2[7] = 0;
|
||||
v2[8] = value[2];v2[9] = value[5];v2[10] = value[8];v2[11] = 0;
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 3, v2 );
|
||||
}
|
||||
break;
|
||||
case CG_HALF:
|
||||
case CG_HALF1:
|
||||
case CG_HALF2:
|
||||
case CG_HALF3:
|
||||
case CG_HALF4:
|
||||
case CG_INT:
|
||||
case CG_INT1:
|
||||
case CG_INT2:
|
||||
case CG_INT3:
|
||||
case CG_INT4:
|
||||
case CG_BOOL:
|
||||
case CG_BOOL1:
|
||||
case CG_BOOL2:
|
||||
case CG_BOOL3:
|
||||
case CG_BOOL4:
|
||||
case CG_FIXED:
|
||||
case CG_FIXED1:
|
||||
case CG_FIXED2:
|
||||
case CG_FIXED3:
|
||||
case CG_FIXED4:
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 1, value ); // GCM_PORT_TESTED [Cedric]
|
||||
break;
|
||||
case CG_HALF4x4:
|
||||
case CG_INT4x4:
|
||||
case CG_BOOL4x4:
|
||||
case CG_FIXED4x4:
|
||||
// set 4 consts
|
||||
{
|
||||
GLfloat v2[16];
|
||||
v2[0] = value[0];
|
||||
v2[1] = value[4];
|
||||
v2[2] = value[8];
|
||||
v2[3] = value[12];
|
||||
v2[4] = value[1];
|
||||
v2[5] = value[5];
|
||||
v2[6] = value[9];
|
||||
v2[7] = value[13];
|
||||
v2[8] = value[2];
|
||||
v2[9] = value[6];
|
||||
v2[10] = value[10];
|
||||
v2[11] = value[14];
|
||||
v2[12] = value[3];
|
||||
v2[13] = value[7];
|
||||
v2[14] = value[11];
|
||||
v2[15] = value[15];
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 4, v2 ); // GCM_PORT_TESTED [Cedric]
|
||||
}
|
||||
break;
|
||||
case CG_HALF3x3:
|
||||
case CG_INT3x3:
|
||||
case CG_BOOL3x3:
|
||||
case CG_FIXED3x3:
|
||||
// set 3 consts
|
||||
{
|
||||
GLfloat v2[12];
|
||||
v2[0] = value[0];v2[1] = value[3];v2[2] = value[6];v2[3] = 0;
|
||||
v2[4] = value[1];v2[5] = value[4];v2[6] = value[7];v2[7] = 0;
|
||||
v2[8] = value[2];v2[9] = value[5];v2[10] = value[8];v2[11] = 0;
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 3, v2 );
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Look up the memory location of a buffer object (VBO, PBO)
|
||||
static inline GLuint rglGcmGetBufferObjectOrigin (GLuint buffer)
|
||||
{
|
||||
|
@ -1573,12 +1573,14 @@ void rglGcmSetOpenGLState (void *data)
|
||||
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 );
|
||||
rglGcmFifoGlClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||
GCM_FUNC( cellGcmSetClearColor, 0 );
|
||||
rglGcmFifoGlDisable( RGLGCM_BLEND );
|
||||
rglGcmFifoGlDisable( RGLGCM_PSHADER_SRGB_REMAPPING );
|
||||
|
||||
for ( i = 0; i < RGLGCM_ATTRIB_COUNT; i++ )
|
||||
rglGcmFifoGlVertexAttribPointer( i, 0, RGLGCM_FLOAT, RGLGCM_FALSE, 0, 0, 0, 0 );
|
||||
{
|
||||
GCM_FUNC( cellGcmSetVertexDataArray, i, 0, 0, 0, CELL_GCM_VERTEX_F, CELL_GCM_LOCATION_LOCAL, 0);
|
||||
}
|
||||
|
||||
rglGcmFifoGlEnable( RGLGCM_DITHER );
|
||||
|
||||
@ -2891,7 +2893,7 @@ int rglPlatformCreateDevice (void *data)
|
||||
v->w = width;
|
||||
v->h = height;
|
||||
rglGcmFifoGlViewport(v, 0.0f, 1.0f);
|
||||
rglGcmFifoGlClearColor( 0.f, 0.f, 0.f, 0.f );
|
||||
GCM_FUNC( cellGcmSetClearColor, 0 );
|
||||
|
||||
if ( fpColor )
|
||||
{
|
||||
@ -2906,7 +2908,10 @@ int rglPlatformCreateDevice (void *data)
|
||||
gcmDevice->rt.colorId[0] = gcmDevice->color[i].dataId;
|
||||
gcmDevice->rt.colorPitch[0] = gcmDevice->color[i].pitch;
|
||||
rglGcmFifoGlSetRenderTarget( &gcmDevice->rt );
|
||||
rglGcmFifoGlClear( RGLGCM_COLOR_BUFFER_BIT );
|
||||
|
||||
if (rglGcmState_i.renderTarget.colorFormat)
|
||||
GCM_FUNC( cellGcmSetClearSurface, CELL_GCM_CLEAR_R | CELL_GCM_CLEAR_G |
|
||||
CELL_GCM_CLEAR_B | CELL_GCM_CLEAR_A );
|
||||
}
|
||||
// restore parameters
|
||||
gcmDevice->rt.width = width;
|
||||
@ -2921,7 +2926,10 @@ int rglPlatformCreateDevice (void *data)
|
||||
gcmDevice->rt.colorId[0] = gcmDevice->color[i].dataId;
|
||||
gcmDevice->rt.colorPitch[0] = gcmDevice->color[i].pitch;
|
||||
rglGcmFifoGlSetRenderTarget( &gcmDevice->rt );
|
||||
rglGcmFifoGlClear( RGLGCM_COLOR_BUFFER_BIT );
|
||||
|
||||
if (rglGcmState_i.renderTarget.colorFormat)
|
||||
GCM_FUNC( cellGcmSetClearSurface, CELL_GCM_CLEAR_R | CELL_GCM_CLEAR_G |
|
||||
CELL_GCM_CLEAR_B | CELL_GCM_CLEAR_A );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1362,9 +1362,12 @@ GLAPI void APIENTRY glClear( GLbitfield mask )
|
||||
|
||||
if ( clearMask )
|
||||
{
|
||||
rglGcmFifoGlClearColor( 0, 0, 0, 0);
|
||||
GCM_FUNC( cellGcmSetClearColor, 0 );
|
||||
|
||||
if (rglGcmState_i.renderTarget.colorFormat)
|
||||
GCM_FUNC( cellGcmSetClearSurface, CELL_GCM_CLEAR_R | CELL_GCM_CLEAR_G |
|
||||
CELL_GCM_CLEAR_B | CELL_GCM_CLEAR_A );
|
||||
|
||||
rglGcmFifoGlClear( clearMask );
|
||||
newmask &= ~clearMask;
|
||||
}
|
||||
|
||||
@ -1387,16 +1390,19 @@ GLAPI void APIENTRY glClear( GLbitfield mask )
|
||||
0, sizeof(rglClearVertexBuffer));
|
||||
|
||||
__builtin_memcpy(gmmIdToAddress(bufferId), rglClearVertexBuffer, sizeof(rglClearVertexBuffer));
|
||||
rglGcmFifoGlVertexAttribPointer( 0, 3, RGLGCM_FLOAT, RGLGCM_FALSE, 3*sizeof( GLfloat ), 1, 0, gmmIdToOffset(bufferId) );
|
||||
|
||||
GCM_FUNC( cellGcmSetVertexDataArray, 0, 1, 3 * sizeof(GLfloat), 3,
|
||||
CELL_GCM_VERTEX_F, CELL_GCM_LOCATION_LOCAL, gmmIdToOffset(bufferId) );
|
||||
|
||||
RGLBIT_TRUE( LContext->attribs->DirtyMask, 0 );
|
||||
|
||||
for (int i = 1; i < RGL_MAX_VERTEX_ATTRIBS; ++i)
|
||||
{
|
||||
rglGcmFifoGlVertexAttribPointer( i, 0, RGLGCM_FLOAT, 0, 0, 0, 0, 0 );
|
||||
GCM_FUNC( cellGcmSetVertexDataArray, i, 0, 0, 0, CELL_GCM_VERTEX_F, CELL_GCM_LOCATION_LOCAL, 0);
|
||||
RGLBIT_TRUE( LContext->attribs->DirtyMask, i );
|
||||
}
|
||||
int clearcolor = 0;
|
||||
rglGcmFifoGlVertexAttrib4fv( RGL_ATTRIB_PRIMARY_COLOR_INDEX, ( GLfloat* )&clearcolor );
|
||||
GCM_FUNC( cellGcmSetVertexData4f, RGL_ATTRIB_PRIMARY_COLOR_INDEX, ( GLfloat* )&clearcolor );
|
||||
|
||||
LContext->needValidate |= RGL_VALIDATE_WRITE_MASK | RGL_VALIDATE_FRAGMENT_PROGRAM;
|
||||
|
||||
@ -1793,9 +1799,108 @@ static inline void rglValidateStates (GLuint mask)
|
||||
const CgParameterEntry *parameterEntry = program->parametersEntries + program->defaultValuesIndices[i].entryIndex;
|
||||
if (( parameterEntry->flags & CGPF_REFERENCED ) && ( parameterEntry->flags & CGPV_MASK ) == CGPV_CONSTANT )
|
||||
{
|
||||
const float *itemDefaultValues = program->defaultValues +
|
||||
const float *value = program->defaultValues +
|
||||
program->defaultValuesIndices[i].defaultValueIndex;
|
||||
rglFifoGlProgramParameterfvVP( program, parameterEntry, itemDefaultValues );
|
||||
|
||||
const CgParameterResource *parameterResource = rglGetParameterResource( program, parameterEntry );
|
||||
|
||||
if (parameterResource->resource != (unsigned short) - 1)
|
||||
{
|
||||
switch ( parameterResource->type )
|
||||
{
|
||||
case CG_FLOAT:
|
||||
case CG_FLOAT1:
|
||||
case CG_FLOAT2:
|
||||
case CG_FLOAT3:
|
||||
case CG_FLOAT4:
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 1, value ); // GCM_PORT_TESTED [Cedric]
|
||||
break;
|
||||
case CG_FLOAT4x4:
|
||||
// set 4 consts
|
||||
{
|
||||
GLfloat v2[16];
|
||||
v2[0] = value[0];v2[1] = value[4];v2[2] = value[8];v2[3] = value[12];
|
||||
v2[4] = value[1];v2[5] = value[5];v2[6] = value[9];v2[7] = value[13];
|
||||
v2[8] = value[2];v2[9] = value[6];v2[10] = value[10];v2[11] = value[14];
|
||||
v2[12] = value[3];v2[13] = value[7];v2[14] = value[11];v2[15] = value[15];
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 4, v2 ); // GCM_PORT_TESTED [Cedric]
|
||||
}
|
||||
break;
|
||||
case CG_FLOAT3x3:
|
||||
// set 3 consts
|
||||
{
|
||||
GLfloat v2[12];
|
||||
v2[0] = value[0];v2[1] = value[3];v2[2] = value[6];v2[3] = 0;
|
||||
v2[4] = value[1];v2[5] = value[4];v2[6] = value[7];v2[7] = 0;
|
||||
v2[8] = value[2];v2[9] = value[5];v2[10] = value[8];v2[11] = 0;
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 3, v2 );
|
||||
}
|
||||
break;
|
||||
case CG_HALF:
|
||||
case CG_HALF1:
|
||||
case CG_HALF2:
|
||||
case CG_HALF3:
|
||||
case CG_HALF4:
|
||||
case CG_INT:
|
||||
case CG_INT1:
|
||||
case CG_INT2:
|
||||
case CG_INT3:
|
||||
case CG_INT4:
|
||||
case CG_BOOL:
|
||||
case CG_BOOL1:
|
||||
case CG_BOOL2:
|
||||
case CG_BOOL3:
|
||||
case CG_BOOL4:
|
||||
case CG_FIXED:
|
||||
case CG_FIXED1:
|
||||
case CG_FIXED2:
|
||||
case CG_FIXED3:
|
||||
case CG_FIXED4:
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 1, value ); // GCM_PORT_TESTED [Cedric]
|
||||
break;
|
||||
case CG_HALF4x4:
|
||||
case CG_INT4x4:
|
||||
case CG_BOOL4x4:
|
||||
case CG_FIXED4x4:
|
||||
// set 4 consts
|
||||
{
|
||||
GLfloat v2[16];
|
||||
v2[0] = value[0];
|
||||
v2[1] = value[4];
|
||||
v2[2] = value[8];
|
||||
v2[3] = value[12];
|
||||
v2[4] = value[1];
|
||||
v2[5] = value[5];
|
||||
v2[6] = value[9];
|
||||
v2[7] = value[13];
|
||||
v2[8] = value[2];
|
||||
v2[9] = value[6];
|
||||
v2[10] = value[10];
|
||||
v2[11] = value[14];
|
||||
v2[12] = value[3];
|
||||
v2[13] = value[7];
|
||||
v2[14] = value[11];
|
||||
v2[15] = value[15];
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 4, v2 ); // GCM_PORT_TESTED [Cedric]
|
||||
}
|
||||
break;
|
||||
case CG_HALF3x3:
|
||||
case CG_INT3x3:
|
||||
case CG_BOOL3x3:
|
||||
case CG_FIXED3x3:
|
||||
// set 3 consts
|
||||
{
|
||||
GLfloat v2[12];
|
||||
v2[0] = value[0];v2[1] = value[3];v2[2] = value[6];v2[3] = 0;
|
||||
v2[4] = value[1];v2[5] = value[4];v2[6] = value[7];v2[7] = 0;
|
||||
v2[8] = value[2];v2[9] = value[5];v2[10] = value[8];v2[11] = 0;
|
||||
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 3, v2 );
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2024,13 +2129,13 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count)
|
||||
|
||||
rglGcmFifoGlVertexAttribPointer( i, attrib->clientSize,
|
||||
( rglGcmEnum )attrib->clientType, attrib->normalized,
|
||||
stride, freq, 0, gpuOffset );
|
||||
stride, freq, gpuOffset );
|
||||
}
|
||||
else
|
||||
{
|
||||
// attribute is disabled
|
||||
rglGcmFifoGlVertexAttribPointer( i, 0, RGLGCM_FLOAT, 0, 0, 0, 0, 0 );
|
||||
rglGcmFifoGlVertexAttrib4fv( i, attrib->value );
|
||||
GCM_FUNC( cellGcmSetVertexDataArray, i, 0, 0, 0, CELL_GCM_VERTEX_F, CELL_GCM_LOCATION_LOCAL, 0);
|
||||
GCM_FUNC( cellGcmSetVertexData4f, i, attrib->value );
|
||||
}
|
||||
}
|
||||
driver->invalidateVertexCache = GL_TRUE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user