diff options
Diffstat (limited to 'src/mesa/main/bufferobj.c')
-rw-r--r-- | src/mesa/main/bufferobj.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index c8116cfda53..40118d261b9 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -3159,6 +3159,47 @@ _mesa_CopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, "glCopyNamedBufferSubData"); } +void GLAPIENTRY +_mesa_InternalBufferSubDataCopyMESA(GLintptr srcBuffer, GLuint srcOffset, + GLuint dstTargetOrName, GLintptr dstOffset, + GLsizeiptr size, GLboolean named, + GLboolean ext_dsa) +{ + GET_CURRENT_CONTEXT(ctx); + struct gl_buffer_object *src = (struct gl_buffer_object *)srcBuffer; + struct gl_buffer_object *dst; + const char *func; + + /* Handle behavior for all 3 variants. */ + if (named && ext_dsa) { + func = "glNamedBufferSubDataEXT"; + dst = _mesa_lookup_bufferobj(ctx, dstTargetOrName); + if (!_mesa_handle_bind_buffer_gen(ctx, dstTargetOrName, &dst, func)) + goto done; + } else if (named) { + func = "glNamedBufferSubData"; + dst = _mesa_lookup_bufferobj_err(ctx, dstTargetOrName, func); + if (!dst) + goto done; + } else { + assert(!ext_dsa); + func = "glBufferSubData"; + dst = get_buffer(ctx, func, dstTargetOrName, GL_INVALID_OPERATION); + if (!dst) + goto done; + } + + if (!validate_buffer_sub_data(ctx, dst, dstOffset, size, func)) + goto done; /* the error is already set */ + + dst->MinMaxCacheDirty = true; + ctx->Driver.CopyBufferSubData(ctx, src, dst, srcOffset, dstOffset, size); + +done: + /* The caller passes the reference to this function, so unreference it. */ + _mesa_reference_buffer_object(ctx, &src, NULL); +} + static bool validate_map_buffer_range(struct gl_context *ctx, struct gl_buffer_object *bufObj, GLintptr offset, |