diff --git a/gfx/gl_common.h b/gfx/gl_common.h index f4fbb2f254..b411d4c047 100644 --- a/gfx/gl_common.h +++ b/gfx/gl_common.h @@ -303,8 +303,10 @@ typedef struct gl #ifdef HAVE_RGL extern GLvoid* glMapBufferTextureReferenceRA( GLenum target, GLenum access ); extern GLboolean glUnmapBufferTextureReferenceRA( GLenum target ); +extern void glBufferSubDataTextureReferenceRA( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data ); #define glMapBuffer(target, access) glMapBufferTextureReferenceRA(target, access) #define glUnmapBuffer(target) glUnmapBufferTextureReferenceRA(target) +#define glBufferSubData(target, offset, size, data) glBufferSubDataTextureReferenceRA(target, offset, size, data) #endif #endif diff --git a/ps3/rgl/src/ps3/rgl_ps3.cpp b/ps3/rgl/src/ps3/rgl_ps3.cpp index 11996c3f92..725bc00c48 100644 --- a/ps3/rgl/src/ps3/rgl_ps3.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3.cpp @@ -3272,14 +3272,6 @@ GLAPI void APIENTRY glBufferData( GLenum target, GLsizeiptr size, const GLvoid * } rglBufferObject* bufferObject = (rglBufferObject*)LContext->bufferObjectNameSpace.data[name]; - if ( bufferObject->refCount > 1 ) - { - rglTexNameSpaceDeleteNames( &LContext->bufferObjectNameSpace, 1, &name ); - rglTexNameSpaceCreateNameLazy( &LContext->bufferObjectNameSpace, name ); - - bufferObject = (rglBufferObject*)LContext->bufferObjectNameSpace.data[name]; - } - if (bufferObject->size > 0) rglPlatformDestroyBufferObject( bufferObject ); diff --git a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp index ef7fb95d73..e45c4cdca5 100644 --- a/ps3/rgl/src/ps3/rgl_ps3_raster.cpp +++ b/ps3/rgl/src/ps3/rgl_ps3_raster.cpp @@ -1171,6 +1171,7 @@ void rglPlatformBufferObjectSetData(void *buf_data, GLintptr offset, GLsizeiptr } } + GLAPI void APIENTRY glBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data ) { RGLcontext *LContext = (RGLcontext*)_CurrentContext; @@ -1193,33 +1194,6 @@ GLAPI void APIENTRY glBufferSubData( GLenum target, GLintptr offset, GLsizeiptr } rglBufferObject* bufferObject = (rglBufferObject*)LContext->bufferObjectNameSpace.data[name]; - - if ( bufferObject->refCount > 1 ) - { - rglBufferObject* oldBufferObject = bufferObject; - - rglTexNameSpaceDeleteNames( &LContext->bufferObjectNameSpace, 1, &name ); - rglTexNameSpaceCreateNameLazy( &LContext->bufferObjectNameSpace, name ); - - bufferObject = (rglBufferObject*)LContext->bufferObjectNameSpace.data[name]; - bufferObject->size = oldBufferObject->size; - - GLboolean created = rglpCreateBufferObject(bufferObject); - if ( !created ) - { - rglSetError( GL_OUT_OF_MEMORY ); - return; - } - rglGcmDriver *driver = (rglGcmDriver*)_CurrentDevice->rasterDriver; - - rglBufferObject *in_dst = (rglBufferObject*)bufferObject; - rglBufferObject *in_src = (rglBufferObject*)oldBufferObject; - rglGcmBufferObject* dst = (rglGcmBufferObject*)in_dst->platformBufferObject; - rglGcmBufferObject* src = (rglGcmBufferObject*)in_src->platformBufferObject; - - rglGcmTransferData( dst->bufferId, 0, src->bufferSize, src->bufferId, 0, src->bufferSize, src->bufferSize, 1 ); - } - rglPlatformBufferObjectSetData( bufferObject, offset, size, data, GL_FALSE ); } @@ -1304,6 +1278,46 @@ GLboolean rglPlatformBufferObjectUnmap (void *data) extern "C" { #endif +static void rglPlatformBufferObjectSetDataTextureReference(void *buf_data, GLintptr offset, GLsizeiptr size, const GLvoid *data, GLboolean tryImmediateCopy) +{ + rglBufferObject *bufferObject = (rglBufferObject*)buf_data; + rglGcmDriver *driver = (rglGcmDriver*)_CurrentDevice->rasterDriver; + rglGcmBufferObject *rglBuffer = ( rglGcmBufferObject * )bufferObject->platformBufferObject; + + if ( size >= bufferObject->size ) + { + // reallocate the buffer + // To avoid waiting for the GPU to finish with the buffer, just + // allocate a whole new one. + rglBuffer->bufferSize = rglPad( size, RGL_BUFFER_OBJECT_BLOCK_SIZE ); + rglpsAllocateBuffer( bufferObject ); + + // copy directly to newly allocated memory + // TODO: For GPU destination, should we copy to system memory and + // pull from GPU? + memset( gmmIdToAddress(rglBuffer->bufferId), 0, size ); + } + else + { + // partial buffer write + // STREAM and DYNAMIC buffers get transfer via a bounce buffer. + // copy via bounce buffer + GLuint id = gmmAlloc((CellGcmContextData*)&rglGcmState_i.fifo, 0, size); + memset(gmmIdToAddress(id), 0, size); + rglGcmTransferData(rglBuffer->bufferId, offset, rglBuffer->pitch, id, 0, size, size, 1); + gmmFree(id); + } +} + +GLAPI void APIENTRY glBufferSubDataTextureReferenceRA( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data ) +{ + RGLcontext *LContext = (RGLcontext*)_CurrentContext; + GLuint name = LContext->TextureBuffer; + + rglBufferObject* bufferObject = (rglBufferObject*)LContext->bufferObjectNameSpace.data[name]; + rglPlatformBufferObjectSetDataTextureReference( bufferObject, offset, size, data, GL_FALSE ); +} + char *rglPlatformBufferObjectMapTextureReference(void *data, GLenum access) { rglBufferObject *bufferObject = (rglBufferObject*)data;