mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
(RGL PS3) Implement cellGcmSetTransferImage for our own purposes
This commit is contained in:
parent
0bfc16941e
commit
3d346ca532
@ -94,27 +94,93 @@ static inline void rglGcmFifoGlViewport(void *data, GLclampf zNear, GLclampf zFa
|
|||||||
clipY1 - clipY0, zNear, zFar, scale, offset );
|
clipY1 - clipY0, zNear, zFar, scale, offset );
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void rglGcmFifoGlTransferDataVidToVid
|
#define BLOCKSIZE_MAX_DIMENSIONS 1024
|
||||||
(
|
|
||||||
GLuint dstVidId,
|
|
||||||
GLuint dstVidIdOffset,
|
|
||||||
GLuint dstPitch,
|
|
||||||
GLuint dstX,
|
|
||||||
GLuint dstY,
|
|
||||||
GLuint srcVidId,
|
|
||||||
GLuint srcVidIdOffset,
|
|
||||||
GLuint srcPitch,
|
|
||||||
GLuint srcX,
|
|
||||||
GLuint srcY,
|
|
||||||
GLuint width, // size in pixel
|
|
||||||
GLuint height,
|
|
||||||
GLuint bytesPerPixel
|
|
||||||
)
|
|
||||||
{
|
|
||||||
GLuint dstOffset = gmmIdToOffset(dstVidId) + dstVidIdOffset;
|
|
||||||
GLuint srcOffset = gmmIdToOffset(srcVidId) + srcVidIdOffset;
|
|
||||||
|
|
||||||
GCM_FUNC( cellGcmSetTransferImage, CELL_GCM_TRANSFER_LOCAL_TO_LOCAL, dstOffset, dstPitch, dstX, dstY, srcOffset, srcPitch, srcX, srcY, width, height, bytesPerPixel );
|
static inline void rglGcmSetTransferImage(struct CellGcmContextData *thisContext, uint8_t mode, uint32_t dstOffset, uint32_t dstPitch, uint32_t dstX, uint32_t dstY, uint32_t srcOffset, uint32_t srcPitch, uint32_t srcX, uint32_t srcY, uint32_t width, uint32_t height, uint32_t bytesPerPixel)
|
||||||
|
{
|
||||||
|
(thisContext->current)[0] = (((1) << (18)) | ((0x00006188)));
|
||||||
|
(thisContext->current)[1] = 0xFEED0000; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
|
||||||
|
(thisContext->current) += 2;
|
||||||
|
|
||||||
|
(thisContext->current)[0] = (((1) << (18)) | ((0x0000C184)));
|
||||||
|
(thisContext->current)[1] = 0xFEED0000; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
|
||||||
|
|
||||||
|
(thisContext->current) += 2;
|
||||||
|
|
||||||
|
(thisContext->current)[0] = (((1) << (18)) | ((0x0000C198)));
|
||||||
|
(thisContext->current)[1] = ((0x313371C3));
|
||||||
|
(thisContext->current) += 2;
|
||||||
|
|
||||||
|
uint32_t srcFormat = 0;
|
||||||
|
uint32_t dstFormat = 0;
|
||||||
|
uint32_t x;
|
||||||
|
uint32_t y;
|
||||||
|
uint32_t finalDstX;
|
||||||
|
uint32_t finalDstY;
|
||||||
|
|
||||||
|
switch (bytesPerPixel)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
srcFormat = CELL_GCM_TRANSFER_SCALE_FORMAT_R5G6B5;
|
||||||
|
dstFormat = CELL_GCM_TRANSFER_SURFACE_FORMAT_R5G6B5;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
srcFormat = CELL_GCM_TRANSFER_SCALE_FORMAT_A8R8G8B8;
|
||||||
|
dstFormat = CELL_GCM_TRANSFER_SURFACE_FORMAT_A8R8G8B8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
finalDstX = dstX + width;
|
||||||
|
finalDstY = dstY + height;
|
||||||
|
|
||||||
|
for (y = dstY; y < finalDstY;)
|
||||||
|
{
|
||||||
|
uint32_t dstTop = y & ~(BLOCKSIZE_MAX_DIMENSIONS - 1);
|
||||||
|
uint32_t dstBltHeight = (( (dstTop + BLOCKSIZE_MAX_DIMENSIONS) < finalDstY)
|
||||||
|
? (dstTop + BLOCKSIZE_MAX_DIMENSIONS) : finalDstY) - y;
|
||||||
|
|
||||||
|
for (x = dstX; x < finalDstX;)
|
||||||
|
{
|
||||||
|
uint32_t dstLeft = x & ~(BLOCKSIZE_MAX_DIMENSIONS - 1);
|
||||||
|
uint32_t dstRight = dstLeft + BLOCKSIZE_MAX_DIMENSIONS;
|
||||||
|
uint32_t dstBltWidth = ((dstRight < finalDstX) ? dstRight : finalDstX) - x;
|
||||||
|
uint32_t dstBlockOffset = bytesPerPixel * (dstLeft & ~(BLOCKSIZE_MAX_DIMENSIONS - 1)) + dstPitch * dstTop;
|
||||||
|
uint32_t srcBlockOffset = bytesPerPixel * (srcX + x-dstX) + srcPitch * (srcY + y-dstY);
|
||||||
|
uint32_t safeDstBltWidth = (dstBltWidth < 16) ? 16 : (dstBltWidth + 1) & ~1;
|
||||||
|
|
||||||
|
(thisContext->current)[0] = (((1) << (18)) | ((0x0000630C)));
|
||||||
|
(thisContext->current)[1] = dstOffset + dstBlockOffset;
|
||||||
|
(thisContext->current) += 2;
|
||||||
|
|
||||||
|
(thisContext->current)[0] = (((2) << (18)) | ((0x00006300)));
|
||||||
|
(thisContext->current)[1] = (dstFormat);
|
||||||
|
(thisContext->current)[2] = ((dstPitch) | ((dstPitch) << 16));
|
||||||
|
(thisContext->current) += 3;
|
||||||
|
|
||||||
|
(thisContext->current)[0] = (((9) << (18)) | ((0x0000C2FC)));
|
||||||
|
(thisContext->current)[1] = (CELL_GCM_TRANSFER_CONVERSION_TRUNCATE);
|
||||||
|
(thisContext->current)[2] = (srcFormat);
|
||||||
|
(thisContext->current)[3] = (CELL_GCM_TRANSFER_OPERATION_SRCCOPY);
|
||||||
|
(thisContext->current)[4] = (((y - dstTop) << 16) | (x - dstLeft));
|
||||||
|
(thisContext->current)[5] = (((dstBltHeight) << 16) | (dstBltWidth));
|
||||||
|
(thisContext->current)[6] = (((y - dstTop) << 16) | (x - dstLeft));
|
||||||
|
(thisContext->current)[7] = (((dstBltHeight) << 16) | (dstBltWidth));
|
||||||
|
(thisContext->current)[8] = 1048576;
|
||||||
|
(thisContext->current)[9] = 1048576;
|
||||||
|
(thisContext->current) += 10;
|
||||||
|
|
||||||
|
(thisContext->current)[0] = (((4) << (18)) | ((0x0000C400)));
|
||||||
|
(thisContext->current)[1] = (((dstBltHeight) << 16) | (safeDstBltWidth));
|
||||||
|
(thisContext->current)[2] = ((srcPitch) | ((CELL_GCM_TRANSFER_ORIGIN_CORNER) << 16) | ((CELL_GCM_TRANSFER_INTERPOLATOR_ZOH) << 24));
|
||||||
|
(thisContext->current)[3] = (srcOffset + srcBlockOffset);
|
||||||
|
(thisContext->current)[4] = 0;
|
||||||
|
(thisContext->current) += 5;
|
||||||
|
|
||||||
|
x += dstBltWidth;
|
||||||
|
}
|
||||||
|
y += dstBltHeight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline GLuint rglGcmMapMinTextureFilter( GLenum filter )
|
static inline GLuint rglGcmMapMinTextureFilter( GLenum filter )
|
||||||
|
@ -1120,7 +1120,7 @@ static inline void gmmLocalMemcpy(void *data, const uint32_t dstOffset,
|
|||||||
{
|
{
|
||||||
while(sizeLeft >= dimension*dimension*4)
|
while(sizeLeft >= dimension*dimension*4)
|
||||||
{
|
{
|
||||||
cellGcmSetTransferImage(thisContext,
|
rglGcmSetTransferImage(gCellGcmCurrentContext,
|
||||||
CELL_GCM_TRANSFER_LOCAL_TO_LOCAL,
|
CELL_GCM_TRANSFER_LOCAL_TO_LOCAL,
|
||||||
dstOffset+offset,
|
dstOffset+offset,
|
||||||
dimension*4,
|
dimension*4,
|
||||||
@ -1146,7 +1146,7 @@ static inline void gmmLocalMemcpy(void *data, const uint32_t dstOffset,
|
|||||||
|
|
||||||
if (sizeLeft > 0)
|
if (sizeLeft > 0)
|
||||||
{
|
{
|
||||||
cellGcmSetTransferImage(thisContext,
|
rglGcmSetTransferImage(gCellGcmCurrentContext,
|
||||||
CELL_GCM_TRANSFER_LOCAL_TO_LOCAL,
|
CELL_GCM_TRANSFER_LOCAL_TO_LOCAL,
|
||||||
dstOffset+offset,
|
dstOffset+offset,
|
||||||
sizeLeft,
|
sizeLeft,
|
||||||
|
@ -2445,9 +2445,7 @@ source: RGLGCM_SURFACE_SOURCE_TEXTURE,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
rglGcmFifoGlTransferDataVidToVid( dst.dataId, dst.dataIdOffset, dstPitch, 0, 0,
|
rglGcmSetTransferImage(gCellGcmCurrentContext, CELL_GCM_TRANSFER_LOCAL_TO_LOCAL, gmmIdToOffset(dst.dataId) + dst.dataIdOffset, dstPitch, 0, 0, gmmIdToOffset(src.dataId) + src.dataIdOffset, srcPitch, 0, 0, width, height, src.bpp);
|
||||||
src.dataId, src.dataIdOffset, srcPitch, 0, 0,
|
|
||||||
width, height, src.bpp );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// free CPU copy of data
|
// free CPU copy of data
|
||||||
|
Loading…
x
Reference in New Issue
Block a user