X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fradeon%2Fradeon_buffer_objects.c;h=71fe9302cf71b99342b7e4814f8cead7ff6efb20;hb=7f0b6a5df8e360e52a97f59948dda927fe9df15e;hp=827f1d253d64aec3754ae041cda881040d07123f;hpb=30e9c753b8434778a167f708550983688677b232;p=mesa.git diff --git a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c index 827f1d253d6..71fe9302cf7 100644 --- a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c +++ b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c @@ -25,13 +25,12 @@ * */ -#include "radeon_buffer_objects.h" - -#include "main/imports.h" #include "main/mtypes.h" #include "main/bufferobj.h" +#include "util/u_memory.h" #include "radeon_common.h" +#include "radeon_buffer_objects.h" struct radeon_buffer_object * get_radeon_buffer_object(struct gl_buffer_object *obj) @@ -40,13 +39,12 @@ get_radeon_buffer_object(struct gl_buffer_object *obj) } static struct gl_buffer_object * -radeonNewBufferObject(GLcontext * ctx, - GLuint name, - GLenum target) +radeonNewBufferObject(struct gl_context * ctx, + GLuint name) { struct radeon_buffer_object *obj = CALLOC_STRUCT(radeon_buffer_object); - _mesa_initialize_buffer_object(&obj->Base, name, target); + _mesa_initialize_buffer_object(ctx, &obj->Base, name); obj->bo = NULL; @@ -57,20 +55,23 @@ radeonNewBufferObject(GLcontext * ctx, * Called via glDeleteBuffersARB(). */ static void -radeonDeleteBufferObject(GLcontext * ctx, +radeonDeleteBufferObject(struct gl_context * ctx, struct gl_buffer_object *obj) { struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj); + int i; - if (obj->Pointer) { - radeon_bo_unmap(radeon_obj->bo); + for (i = 0; i < MAP_COUNT; i++) { + if (obj->Mappings[i].Pointer) { + radeon_bo_unmap(radeon_obj->bo); + } } if (radeon_obj->bo) { radeon_bo_unref(radeon_obj->bo); } - _mesa_free(radeon_obj); + _mesa_delete_buffer_object(ctx, obj); } @@ -78,14 +79,16 @@ radeonDeleteBufferObject(GLcontext * ctx, * Allocate space for and store data in a buffer object. Any data that was * previously stored in the buffer object is lost. If data is NULL, * memory will be allocated, but no copy will occur. - * Called via glBufferDataARB(). + * Called via ctx->Driver.BufferData(). + * \return GL_TRUE for success, GL_FALSE if out of memory */ -static void -radeonBufferData(GLcontext * ctx, +static GLboolean +radeonBufferData(struct gl_context * ctx, GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage, + GLbitfield storageFlags, struct gl_buffer_object *obj) { radeonContextPtr radeon = RADEON_CONTEXT(ctx); @@ -93,6 +96,7 @@ radeonBufferData(GLcontext * ctx, radeon_obj->Base.Size = size; radeon_obj->Base.Usage = usage; + radeon_obj->Base.StorageFlags = storageFlags; if (radeon_obj->bo != NULL) { radeon_bo_unref(radeon_obj->bo); @@ -100,30 +104,25 @@ radeonBufferData(GLcontext * ctx, } if (size != 0) { -#ifdef RADEON_DEBUG_BO radeon_obj->bo = radeon_bo_open(radeon->radeonScreen->bom, 0, size, - 32, - RADEON_GEM_DOMAIN_GTT, - 0, - "Radeon Named object"); -#else - radeon_obj->bo = radeon_bo_open(radeon->radeonScreen->bom, - 0, - size, - 32, + ctx->Const.MinMapBufferAlignment, RADEON_GEM_DOMAIN_GTT, 0); -#endif + + if (!radeon_obj->bo) + return GL_FALSE; + if (data != NULL) { radeon_bo_map(radeon_obj->bo, GL_TRUE); - _mesa_memcpy(radeon_obj->bo->ptr, data, size); + memcpy(radeon_obj->bo->ptr, data, size); radeon_bo_unmap(radeon_obj->bo); } } + return GL_TRUE; } /** @@ -133,18 +132,22 @@ radeonBufferData(GLcontext * ctx, * Called via glBufferSubDataARB(). */ static void -radeonBufferSubData(GLcontext * ctx, - GLenum target, +radeonBufferSubData(struct gl_context * ctx, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data, struct gl_buffer_object *obj) { + radeonContextPtr radeon = RADEON_CONTEXT(ctx); struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj); + if (radeon_bo_is_referenced_by_cs(radeon_obj->bo, radeon->cmdbuf.cs)) { + radeon_firevertices(radeon); + } + radeon_bo_map(radeon_obj->bo, GL_TRUE); - _mesa_memcpy(radeon_obj->bo->ptr + offset, data, size); + memcpy(radeon_obj->bo->ptr + offset, data, size); radeon_bo_unmap(radeon_obj->bo); } @@ -153,8 +156,7 @@ radeonBufferSubData(GLcontext * ctx, * Called via glGetBufferSubDataARB() */ static void -radeonGetBufferSubData(GLcontext * ctx, - GLenum target, +radeonGetBufferSubData(struct gl_context * ctx, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data, @@ -164,34 +166,41 @@ radeonGetBufferSubData(GLcontext * ctx, radeon_bo_map(radeon_obj->bo, GL_FALSE); - _mesa_memcpy(data, radeon_obj->bo->ptr + offset, size); + memcpy(data, radeon_obj->bo->ptr + offset, size); radeon_bo_unmap(radeon_obj->bo); } /** - * Called via glMapBufferARB() + * Called via glMapBuffer() and glMapBufferRange() */ static void * -radeonMapBuffer(GLcontext * ctx, - GLenum target, - GLenum access, - struct gl_buffer_object *obj) +radeonMapBufferRange(struct gl_context * ctx, + GLintptr offset, GLsizeiptr length, + GLbitfield access, struct gl_buffer_object *obj, + gl_map_buffer_index index) { struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj); + const GLboolean write_only = + (access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == GL_MAP_WRITE_BIT; - if (access == GL_WRITE_ONLY_ARB) { + if (write_only) { ctx->Driver.Flush(ctx); } if (radeon_obj->bo == NULL) { - obj->Pointer = NULL; + obj->Mappings[index].Pointer = NULL; return NULL; } - radeon_bo_map(radeon_obj->bo, access == GL_WRITE_ONLY_ARB); + obj->Mappings[index].Offset = offset; + obj->Mappings[index].Length = length; + obj->Mappings[index].AccessFlags = access; - return obj->Pointer = radeon_obj->bo->ptr; + radeon_bo_map(radeon_obj->bo, write_only); + + obj->Mappings[index].Pointer = radeon_obj->bo->ptr + offset; + return obj->Mappings[index].Pointer; } @@ -199,17 +208,20 @@ radeonMapBuffer(GLcontext * ctx, * Called via glUnmapBufferARB() */ static GLboolean -radeonUnmapBuffer(GLcontext * ctx, - GLenum target, - struct gl_buffer_object *obj) +radeonUnmapBuffer(struct gl_context * ctx, + struct gl_buffer_object *obj, + gl_map_buffer_index index) { struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj); if (radeon_obj->bo != NULL) { radeon_bo_unmap(radeon_obj->bo); - obj->Pointer = NULL; } + obj->Mappings[index].Pointer = NULL; + obj->Mappings[index].Offset = 0; + obj->Mappings[index].Length = 0; + return GL_TRUE; } @@ -221,6 +233,6 @@ radeonInitBufferObjectFuncs(struct dd_function_table *functions) functions->BufferData = radeonBufferData; functions->BufferSubData = radeonBufferSubData; functions->GetBufferSubData = radeonGetBufferSubData; - functions->MapBuffer = radeonMapBuffer; + functions->MapBufferRange = radeonMapBufferRange; functions->UnmapBuffer = radeonUnmapBuffer; }