diff --git a/ps3/rgl/src/ps3/include/rgl-inline.h b/ps3/rgl/src/ps3/include/rgl-inline.h index cfa65241af..b65c8d2134 100644 --- a/ps3/rgl/src/ps3/include/rgl-inline.h +++ b/ps3/rgl/src/ps3/include/rgl-inline.h @@ -284,6 +284,42 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat) (thisContext->current)[1] = ((surface->height - (((surface->height) & 0x1000) >> 12)) | ((origin) << 12) | ((pixelCenter) << 16)); \ (thisContext->current) += 2; +static inline void rglGcmSetVertexProgramParameterBlock(struct CellGcmContextData *thisContext, + uint32_t baseConst, uint32_t constCount, const float * __restrict value) +{ + uint32_t blockCount = (constCount*4) >> 5; + uint32_t blockRemain = (constCount*4) & 0x1f; + + uint32_t i; + for (i=0; i < blockCount; i++) + { + uint32_t loadAt = baseConst+i*8; + + thisContext->current[0] = (((33) << (18)) | ((0x00001efc))); + thisContext->current[1] = (loadAt); + + __builtin_memcpy(&thisContext->current[2], value, sizeof(float)*16); + __builtin_memcpy(&thisContext->current[18], &value[16], sizeof(float)*16); + thisContext->current += 34; + value += 32; + } + + if(blockRemain) + { + thisContext->current[0] = (((blockRemain+1) << (18)) | ((0x00001efc))); + thisContext->current[1] = (baseConst + blockCount*8); + thisContext->current += 2; + + blockRemain >>= 2; + for (i=0; i < blockRemain; ++i) + { + __builtin_memcpy(thisContext->current, value, sizeof(float)*4); + thisContext->current += 4; + value += 4; + } + } +} + static inline void rglGcmSetFragmentProgramLoad(struct CellGcmContextData *thisContext, const CellCgbFragmentProgramConfiguration *conf, const uint32_t location) { uint32_t rawData = ((conf->offset)&0x1fffffff); diff --git a/ps3/rgl/src/ps3/rgl_ps3.cpp b/ps3/rgl/src/ps3/rgl_ps3.cpp index 5271ecd0b1..a6dc6b6bef 100644 --- a/ps3/rgl/src/ps3/rgl_ps3.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3.cpp @@ -3127,8 +3127,8 @@ GLAPI void RGL_EXPORT psglSwap (void) rglGcmDriver *driver = (rglGcmDriver*)_CurrentDevice->rasterDriver; const char * __restrict v = driver->sharedVPConstants; - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, 0, 8, ( float* )v ); // GCM_PORT_UNTESTED [KHOFF] + rglGcmSetVertexProgramParameterBlock(thisContext, 0, 8, ( float* )v ); rglGcmSetDitherEnable(thisContext, RGLGCM_TRUE ); RGLcontext *context = (RGLcontext*)_CurrentContext; diff --git a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp index d9d4826f20..7db5882996 100644 --- a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp @@ -168,6 +168,7 @@ template static void setVectorTypeSharedfpIndexArray (void *data, cons } template static void setVectorTypeSharedvpIndex (void *data, const void* __restrict v, const int /*index*/ ) { + CellGcmContextData *thisContext = (CellGcmContextData*)gCellGcmCurrentContext; CgRuntimeParameter *ptr = (CgRuntimeParameter*)data; const float * __restrict f = ( const float * __restrict )v; const CgParameterResource *parameterResource = rglGetParameterResource( ptr->program, ptr->parameterEntry ); @@ -182,11 +183,12 @@ template static void setVectorTypeSharedvpIndex (void *data, const voi memcpy(driver->sharedVPConstants + resource * 4 * sizeof( float ), dst, 4 * sizeof(float)); - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, resource, 1, dst ); + rglGcmSetVertexProgramParameterBlock(thisContext, resource, 1, dst ); } template static void setVectorTypeSharedvpIndexArray (void *data, const void* __restrict v, const int index ) { + CellGcmContextData *thisContext = (CellGcmContextData*)gCellGcmCurrentContext; CgRuntimeParameter *ptr = (CgRuntimeParameter*)data; const float * __restrict f = ( const float * __restrict )v; const CgParameterResource *parameterResource = rglGetParameterResource( ptr->program, ptr->parameterEntry ); @@ -201,7 +203,7 @@ template static void setVectorTypeSharedvpIndexArray (void *data, cons memcpy(driver->sharedVPConstants + resource * 4 * sizeof( float ), dst, 4 * sizeof(float)); - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, resource, 1, dst ); + rglGcmSetVertexProgramParameterBlock(thisContext, resource, 1, dst ); } @@ -275,6 +277,7 @@ template static void setMatrixvpIndex (void *dat template static void setMatrixSharedvpIndex (void *data, const void* __restrict v, const int index ) { CgRuntimeParameter *ptr = (CgRuntimeParameter*)data; + CellGcmContextData *thisContext = (CellGcmContextData*)gCellGcmCurrentContext; float * __restrict f = ( float* )v; float * __restrict dst = ( float* )ptr->pushBufferPointer; @@ -292,7 +295,7 @@ template static void setMat for ( long col = COLS; col < 4; ++col ) tmp[row*4 + col] = dst[row*4+col]; } - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, resource, ROWS, (const float*)tmp); + rglGcmSetVertexProgramParameterBlock(thisContext, resource, ROWS, (const float*)tmp); } template static void setMatrixSharedfpIndex (void *data, const void* __restrict v, const int /*index*/ ) @@ -817,7 +820,7 @@ void rglCreatePushBuffer(void *data) memset( rglGcmCurrent, 0, 4*( 4*registerCount + 3 ) ); CellGcmContextData gcmContext; gcmContext.current = (uint32_t*)rglGcmCurrent; - cellGcmSetVertexProgramParameterBlockUnsafeInline(&gcmContext, parameterResource->resource, registerCount, ( float* )rglGcmCurrent ); + rglGcmSetVertexProgramParameterBlock(&gcmContext, parameterResource->resource, registerCount, ( float* )rglGcmCurrent ); rglGcmCurrent = (typeof(rglGcmCurrent))gcmContext.current; rtParameter->pushBufferPointer = rglGcmCurrent - 4 * registerCount; @@ -834,7 +837,7 @@ void rglCreatePushBuffer(void *data) memset( rglGcmCurrent, 0, 4*( 4*registerStride + 3 ) ); CellGcmContextData gcmContext; gcmContext.current = (uint32_t*)rglGcmCurrent; - cellGcmSetVertexProgramParameterBlockUnsafeInline(&gcmContext, program->resources[resourceIndex], registerStride, ( float* )rglGcmCurrent ); + rglGcmSetVertexProgramParameterBlock(&gcmContext, program->resources[resourceIndex], registerStride, ( float* )rglGcmCurrent ); rglGcmCurrent = (typeof(rglGcmCurrent))gcmContext.current; *( programPushBuffer++ ) = ( unsigned int* )( rglGcmCurrent - 4 * registerStride ); } @@ -1758,7 +1761,7 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) case CG_FIXED2: case CG_FIXED3: case CG_FIXED4: - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 1, value ); // GCM_PORT_TESTED [Cedric] + rglGcmSetVertexProgramParameterBlock(thisContext, parameterResource->resource, 1, value ); break; case CG_FLOAT4x4: case CG_HALF4x4: @@ -1784,7 +1787,7 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) v2[13] = value[7]; v2[14] = value[11]; v2[15] = value[15]; - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 4, v2 ); // GCM_PORT_TESTED [Cedric] + rglGcmSetVertexProgramParameterBlock(thisContext, parameterResource->resource, 4, v2 ); } break; case CG_FLOAT3x3: @@ -1798,7 +1801,7 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) 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 ); + rglGcmSetVertexProgramParameterBlock(thisContext, parameterResource->resource, 3, v2 ); } break; }