(RGL) Clean up RGLTransferDataVidToVid

This commit is contained in:
Twinaphex 2012-08-15 10:49:39 +02:00
parent 84de4f23e6
commit 44ff5ec1c3
3 changed files with 134 additions and 55 deletions

View File

@ -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
}

View File

@ -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 );

View File

@ -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;