diff --git a/console/rgl/ps3/readelf.h b/console/rgl/ps3/readelf.h index 21c65c72d8..2f4001087a 100644 --- a/console/rgl/ps3/readelf.h +++ b/console/rgl/ps3/readelf.h @@ -58,12 +58,6 @@ typedef struct ELF_section_t *findSection(const ELF_t *elf, const char *name); int lookupSymbol(const ELF_t *elf, const char *name); -const Elf32_Sym *getSymbolByIndex(const ELF_t *elf, int idx); - -const char *findSectionInPlace(const char* memory,unsigned int size,const char *name,size_t *sectionSize); -const char *findSymbolSectionInPlace(const char *memory, unsigned int size, size_t *symbolSize, size_t *symbolCount, const char **symbolstrtab); -int lookupSymbolValueInPlace(const char *symbolSection, size_t symbolSize, size_t symbolCount, const char *symbolstrtab, const char *name); -const char *getSymbolByIndexInPlace(const char *symbolSection, size_t symbolSize, size_t symbolCount, const char *symbolstrtab, int index); #ifdef __cplusplus } diff --git a/console/rgl/ps3/rgl.cpp b/console/rgl/ps3/rgl.cpp index 395fd398b1..5382b3d2bb 100644 --- a/console/rgl/ps3/rgl.cpp +++ b/console/rgl/ps3/rgl.cpp @@ -31,8 +31,6 @@ #define pad(x, pad) (((x) + (pad) - 1 ) / (pad) * (pad)) -#define gmmAddressToOffset(address, isMain) ((isMain) ? (address)-pGmmMainAllocator->memoryBase : (address)-pGmmLocalAllocator->memoryBase) - #define GL_UNSIGNED_SHORT_8_8 GL_UNSIGNED_SHORT_8_8_SCE #define GL_UNSIGNED_SHORT_8_8_REV GL_UNSIGNED_SHORT_8_8_REV_SCE #define GL_UNSIGNED_INT_16_16 GL_UNSIGNED_INT_16_16_SCE @@ -126,7 +124,7 @@ static inline float _RGLFloatFrom_GL_FLOAT(type_GL_FLOAT v) typedef GLhalfARB type_GL_HALF_FLOAT_ARB; -const char *findSectionInPlace(const char* memory,unsigned int /*size*/,const char *name, size_t *sectionSize) +static const char *findSectionInPlace(const char* memory,unsigned int /*size*/,const char *name, size_t *sectionSize) { const Elf32_Ehdr *ehdr = (const Elf32_Ehdr*)memory; @@ -149,7 +147,7 @@ const char *findSectionInPlace(const char* memory,unsigned int /*size*/,const ch return NULL; } -const char *findSymbolSectionInPlace(const char *memory, unsigned int /*size*/, size_t *symbolSize, size_t *symbolCount, const char **symbolstrtab) +static const char *findSymbolSectionInPlace(const char *memory, unsigned int /*size*/, size_t *symbolSize, size_t *symbolCount, const char **symbolstrtab) { const Elf32_Ehdr *ehdr = (const Elf32_Ehdr*)memory; @@ -172,7 +170,7 @@ const char *findSymbolSectionInPlace(const char *memory, unsigned int /*size*/, return NULL; } -int lookupSymbolValueInPlace(const char* symbolSection, size_t symbolSize, size_t symbolCount, const char *symbolstrtab, const char *name) +static int lookupSymbolValueInPlace(const char* symbolSection, size_t symbolSize, size_t symbolCount, const char *symbolstrtab, const char *name) { for (size_t i = 0; i < symbolCount; i++) { @@ -186,7 +184,7 @@ int lookupSymbolValueInPlace(const char* symbolSection, size_t symbolSize, size_ return -1; } -const char *getSymbolByIndexInPlace(const char* symbolSection, size_t symbolSize, size_t symbolCount, const char *symbolstrtab, int index) +static const char *getSymbolByIndexInPlace(const char* symbolSection, size_t symbolSize, size_t symbolCount, const char *symbolstrtab, int index) { Elf32_Sym* elf_sym = (Elf32_Sym*)symbolSection + index; return symbolstrtab + elf_sym->st_name; @@ -562,17 +560,25 @@ static void _RGLMemcpy( const GLuint dstId, unsigned dstOffset, unsigned int pit { const GLuint firstBytes = MIN( pitch - dstOffsetAlign, size ); - _RGLTransferDataVidToVid( - dstId, - 0, - pitch, - dstOffsetAlign / 2, dstOffset / pitch, - srcId, - srcOffset, - pitch, - 0, 0, - firstBytes / 2, 1, - 2 ); + transfer_params_t transfer_params; + + transfer_params.dst_id = dstId; + transfer_params.dst_id_offset = 0; + transfer_params.dst_pitch = pitch; + transfer_params.dst_x = dstOffsetAlign / 2; + transfer_params.dst_y = dstOffset / pitch; + transfer_params.src_id = srcId; + transfer_params.src_id_offset = srcOffset; + transfer_params.src_pitch = pitch; + transfer_params.src_x = 0; + transfer_params.src_y = 0; + transfer_params.width = firstBytes / 2; + transfer_params.height = 1; + transfer_params.bpp = 2; + transfer_params.fifo_ptr = &_RGLState.fifo; + + TransferDataVidToVid(&transfer_params); + dstOffset += firstBytes; srcOffset += firstBytes; size -= firstBytes; @@ -580,30 +586,50 @@ static void _RGLMemcpy( const GLuint dstId, unsigned dstOffset, unsigned int pit const GLuint fullLines = size / pitch; const GLuint extraBytes = size % pitch; + if ( fullLines ) - _RGLTransferDataVidToVid( - dstId, - 0, - pitch, - 0, dstOffset / pitch, - srcId, - srcOffset, - pitch, - 0, 0, - pitch / 2, fullLines, - 2 ); + { + transfer_params_t transfer_params; + + transfer_params.dst_id = dstId; + transfer_params.dst_id_offset = 0; + transfer_params.dst_pitch = pitch; + transfer_params.dst_x = 0; + transfer_params.dst_y = dstOffset / pitch; + transfer_params.src_id = srcId; + transfer_params.src_id_offset = srcOffset; + transfer_params.src_pitch = pitch; + transfer_params.src_x = 0; + transfer_params.src_y = 0; + transfer_params.width = pitch / 2; + transfer_params.height = fullLines; + transfer_params.bpp = 2; + transfer_params.fifo_ptr = &_RGLState.fifo; + + TransferDataVidToVid(&transfer_params); + } + if ( extraBytes ) - _RGLTransferDataVidToVid( - dstId, - 0, - pitch, - 0, fullLines + dstOffset / pitch, - srcId, - srcOffset, - pitch, - 0, fullLines, - extraBytes / 2, 1, - 2 ); + { + transfer_params_t transfer_params; + + transfer_params.dst_id = dstId; + transfer_params.dst_id_offset = 0; + transfer_params.dst_pitch = pitch; + transfer_params.dst_x = 0; + transfer_params.dst_y = fullLines + dstOffset / pitch; + transfer_params.src_id = srcId; + transfer_params.src_id_offset = srcOffset; + transfer_params.src_pitch = pitch; + transfer_params.src_x = 0; + transfer_params.src_y = fullLines; + transfer_params.width = extraBytes / 2; + transfer_params.height = 1; + transfer_params.bpp = 2; + transfer_params.fifo_ptr = &_RGLState.fifo; + + TransferDataVidToVid(&transfer_params); + } } static void _RGLPlatformBufferObjectSetData( jsBufferObject* bufferObject, GLintptr offset, GLsizeiptr size, const GLvoid *data, GLboolean tryImmediateCopy ) @@ -1491,7 +1517,24 @@ static void _RGLPlatformValidateTextureResources( jsTexture *texture ) dst.dataId = gcmTexture->gpuAddressId; dst.dataIdOffset = gcmTexture->gpuAddressIdOffset; - _RGLTransferDataVidToVid( dst.dataId, dst.dataIdOffset, dst.pitch ? dst.pitch : (dst.bpp * dst.width), 0, 0, src.dataId, src.dataIdOffset, src.pitch ? src.pitch : (src.bpp * src.width), 0, 0, src.width, src.height, src.bpp ); + transfer_params_t transfer_params; + + transfer_params.dst_id = dst.dataId; + transfer_params.dst_id_offset = dst.dataIdOffset; + transfer_params.dst_pitch = dst.pitch ? dst.pitch : (dst.bpp * dst.width); + transfer_params.dst_x = 0; + transfer_params.dst_y = 0; + transfer_params.src_id = src.dataId; + transfer_params.src_id_offset = src.dataIdOffset; + transfer_params.src_pitch = src.pitch ? src.pitch : (src.bpp * src.width); + transfer_params.src_x = 0; + transfer_params.src_y = 0; + transfer_params.width = src.width; + transfer_params.height = src.height; + transfer_params.bpp = src.bpp; + transfer_params.fifo_ptr = &_RGLState.fifo; + + TransferDataVidToVid(&transfer_params); _RGLImageFreeCPUStorage( image ); image->dataState |= IMAGE_DATASTATE_GPU; @@ -4691,7 +4734,24 @@ static GLboolean _RGLPlatformTexturePBOImage( dataIdOffset: gcmTexture->gpuAddressIdOffset, }; - _RGLTransferDataVidToVid( dst.dataId, dst.dataIdOffset, dst.pitch ? dst.pitch : (dst.bpp * dst.width), 0, 0, src.dataId, src.dataIdOffset, src.pitch ? src.pitch : (src.bpp * src.width), 0, 0, width, height, src.bpp ); + transfer_params_t transfer_params; + + transfer_params.dst_id = dst.dataId; + transfer_params.dst_id_offset = dst.dataIdOffset; + transfer_params.dst_pitch = dst.pitch ? dst.pitch : (dst.bpp * dst.width); + transfer_params.dst_x = 0; + transfer_params.dst_y = 0; + transfer_params.src_id = src.dataId; + transfer_params.src_id_offset = src.dataIdOffset; + transfer_params.src_pitch = src.pitch ? src.pitch : (src.bpp * src.width); + transfer_params.src_x = 0; + transfer_params.src_y = 0; + transfer_params.width = width; + transfer_params.height = height; + transfer_params.bpp = src.bpp; + transfer_params.fifo_ptr = &_RGLState.fifo; + + TransferDataVidToVid(&transfer_params); } _RGLImageFreeCPUStorage( image ); diff --git a/console/rgl/ps3/rgl.h b/console/rgl/ps3/rgl.h index f9a63b0729..785ba283aa 100644 --- a/console/rgl/ps3/rgl.h +++ b/console/rgl/ps3/rgl.h @@ -22,6 +22,8 @@ typedef struct _CGcontext *CGcontext; #define SUBPIXEL_ADJUST (0.5/(1<<12)) #define gmmIdIsMain(id) (((GmmBaseBlock *)id)->isMain) +#define gmmAddressToOffset(address, isMain) ((isMain) ? (address)-pGmmMainAllocator->memoryBase : (address)-pGmmLocalAllocator->memoryBase) + #ifdef __cplusplus extern "C" @@ -678,6 +680,9 @@ typedef struct GmmAllocator uint32_t totalSize; } GmmAllocator; +extern GmmAllocator *pGmmLocalAllocator; +extern GmmAllocator *pGmmMainAllocator; + uint32_t gmmInit( const void *localMemoryBase, const void *localStartAddress, @@ -711,14 +716,23 @@ void gmmSetTileAttrib(const uint32_t id, const uint32_t tag, void *pData); COMMAND_BUFFER = (typeof(COMMAND_BUFFER))gcmContext.current; \ } -#define _RGLTransferDataVidToVid(dstId, dstIdOffset, dstPitch, dstX, dstY, srcId, srcIdOffset, srcPitch, srcX, srcY, width, height, bytesPerPixel) \ -{ \ - GmmBaseBlock *pBaseBlock_dst = (GmmBaseBlock *)dstId; \ - GmmBaseBlock *pBaseBlock_src = (GmmBaseBlock *)srcId; \ - GLuint dstOffset_tmp = gmmAddressToOffset(pBaseBlock_dst->address, pBaseBlock_dst->isMain) + dstIdOffset; \ - GLuint srcOffset_tmp = gmmAddressToOffset(pBaseBlock_src->address, pBaseBlock_src->isMain) + srcIdOffset; \ - cellGcmSetTransferImageInline( &_RGLState.fifo, CELL_GCM_TRANSFER_LOCAL_TO_LOCAL, dstOffset_tmp, (dstPitch), (dstX), (dstY), (srcOffset_tmp), (srcPitch), (srcX), (srcY), (width), (height), (bytesPerPixel) ); \ -} +typedef struct +{ + unsigned dst_id; + unsigned dst_id_offset; + unsigned dst_pitch; + unsigned dst_x; + unsigned dst_y; + unsigned src_id; + unsigned src_id_offset; + unsigned src_pitch; + unsigned src_x; + unsigned src_y; + unsigned width; + unsigned height; + unsigned bpp; + void *fifo_ptr; +} transfer_params_t; #define HOST_BUFFER_ALIGNMENT 128 @@ -801,6 +815,17 @@ struct RGLFifo: public CellGcmContextData int spuid; }; +static inline void TransferDataVidToVid(transfer_params_t *params) +{ + GmmBaseBlock *pBaseBlock_dst = (GmmBaseBlock *)params->dst_id; + GmmBaseBlock *pBaseBlock_src = (GmmBaseBlock *)params->src_id; + + GLuint dstOffset_tmp = gmmAddressToOffset(pBaseBlock_dst->address, pBaseBlock_dst->isMain) + params->dst_id_offset; + GLuint srcOffset_tmp = gmmAddressToOffset(pBaseBlock_src->address, pBaseBlock_src->isMain) + params->src_id_offset; + + cellGcmSetTransferImageInline( (RGLFifo*)params->fifo_ptr, CELL_GCM_TRANSFER_LOCAL_TO_LOCAL, dstOffset_tmp, params->dst_pitch, params->dst_x, params->dst_y, srcOffset_tmp, params->src_pitch, params->src_x, params->src_y, params->width, params->height, params->bpp); +} + typedef struct RGLRenderTarget RGLRenderTarget; typedef struct RGLCachedState RGLCachedState; typedef struct RGLBlendState RGLBlendState;