diff --git a/ps3/rgl/src/ps3/include/rgl-inline.h b/ps3/rgl/src/ps3/include/rgl-inline.h index 4edaaae5ff..97266d04cc 100644 --- a/ps3/rgl/src/ps3/include/rgl-inline.h +++ b/ps3/rgl/src/ps3/include/rgl-inline.h @@ -23,6 +23,43 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat) } } +static inline void rglGcmSetVertexProgramParameterBlock(struct CellGcmContextData *thisContext, uint32_t baseConst, + uint32_t constCount, const float * __restrict value) +{ + uint32_t blockCount, blockRemain, i; + + blockCount = (constCount * 4) >> 5; + blockRemain = (constCount * 4) & 0x1f; + + for (i=0; i < blockCount; i++) + { + uint32_t loadAt = baseConst + i * 8; + + thisContext->current[0] = (((33) << (18)) | ((0x00001efc))); + thisContext->current[1] = (loadAt); + + memcpy(&thisContext->current[2], value, 16 * sizeof(float)); + memcpy(&thisContext->current[18], &value[16], 16 * sizeof(float)); + 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) + { + memcpy(thisContext->current, value, 4 * sizeof(float)); + thisContext->current += 4; + value += 4; + } + } +} + #define SUBPIXEL_BITS 12 #define SUBPIXEL_ADJUST (0.5/(1<current)[1] = (control1); \ (thisContext->current) += 2; +#define rglGcmSetJumpCommand(thisContext, offset) \ + thisContext->current[0] = ((offset) | (0x20000000)); \ + thisContext->current += 1 + #define rglGcmSetBlendEnable(thisContext, enable) \ { \ bool continue_func = true; \ diff --git a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp index cd845a17e1..30453d1aa6 100644 --- a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp @@ -562,7 +562,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; @@ -579,7 +579,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 ); } @@ -1379,7 +1379,6 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) rglGcmSetTextureBorder(thisContext, unit, texture, 0x1); CellGcmContextData *gcm_context = (CellGcmContextData*)&rglGcmState_i.fifo; - cellGcmReserveMethodSizeInline(gcm_context, 11); uint32_t *current = gcm_context->current; current[0] = CELL_GCM_METHOD_HEADER_TEXTURE_OFFSET(unit, 8); current[1] = CELL_GCM_METHOD_DATA_TEXTURE_OFFSET(platformTexture->gcmTexture.offset); @@ -1517,7 +1516,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(gCellGcmCurrentContext, parameterResource->resource, 1, value ); break; case CG_FLOAT4x4: case CG_HALF4x4: @@ -1543,7 +1542,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(gCellGcmCurrentContext, parameterResource->resource, 4, v2 ); } break; case CG_FLOAT3x3: @@ -1566,7 +1565,7 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count) v2[9] = value[5]; v2[10] = value[8]; v2[11] = 0; - GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 3, v2 ); + rglGcmSetVertexProgramParameterBlock(gCellGcmCurrentContext, parameterResource->resource, 3, v2 ); } break; }