From a82889e53733ffe11bf3c7a8be5fe53e382d02aa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 6 Mar 2020 20:19:11 -0500 Subject: [PATCH] mesa: add glInternalBufferSubDataCopyMESA for glthread Part-of: --- src/mapi/glapi/gen/gl_API.xml | 13 +++++++ src/mapi/glapi/gen/gl_marshal.py | 1 + src/mapi/glapi/gen/static_data.py | 1 + src/mesa/main/bufferobj.c | 41 ++++++++++++++++++++ src/mesa/main/bufferobj.h | 5 +++ src/mesa/main/tests/dispatch_sanity.cpp | 4 ++ src/mesa/state_tracker/st_cb_bufferobjects.c | 2 +- 7 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index d421e778091..4477f5833e3 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -13286,6 +13286,19 @@ + + + + + + + + + + + + + diff --git a/src/mapi/glapi/gen/gl_marshal.py b/src/mapi/glapi/gen/gl_marshal.py index 656381a0513..29032645fce 100644 --- a/src/mapi/glapi/gen/gl_marshal.py +++ b/src/mapi/glapi/gen/gl_marshal.py @@ -32,6 +32,7 @@ import sys header = """ #include "api_exec.h" #include "glthread_marshal.h" +#include "bufferobj.h" #include "dispatch.h" #define COMPAT (ctx->API != API_OPENGL_CORE) diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py index 9b15e329be9..27651b3efef 100644 --- a/src/mapi/glapi/gen/static_data.py +++ b/src/mapi/glapi/gen/static_data.py @@ -1643,6 +1643,7 @@ offsets = { "CopyImageSubDataNV": 1607, "ViewportSwizzleNV": 1608, "AlphaToCoverageDitherControlNV": 1609, + "InternalBufferSubDataCopyMESA": 1610, } functions = [ 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, diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h index d1291677222..9a22d4de440 100644 --- a/src/mesa/main/bufferobj.h +++ b/src/mesa/main/bufferobj.h @@ -359,6 +359,11 @@ void GLAPIENTRY _mesa_CopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +void GLAPIENTRY +_mesa_InternalBufferSubDataCopyMESA(GLintptr srcBuffer, GLuint srcOffset, + GLuint dstTargetOrName, GLintptr dstOffset, + GLsizeiptr size, GLboolean named, + GLboolean ext_dsa); void * GLAPIENTRY _mesa_MapBufferRange_no_error(GLenum target, GLintptr offset, diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index 6ff28309c6d..7c29833131a 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -1442,6 +1442,8 @@ const struct function common_desktop_functions_possible[] = { /* GL_NV_viewport_swizzle */ { "glViewportSwizzleNV", 11, -1 }, + { "glInternalBufferSubDataCopyMESA", 11, -1 }, + { NULL, 0, -1 } }; @@ -2457,6 +2459,8 @@ const struct function gles2_functions_possible[] = { /* GL_KHR_parallel_shader_compile */ { "glMaxShaderCompilerThreadsKHR", 20, -1 }, + { "glInternalBufferSubDataCopyMESA", 20, -1 }, + { NULL, 0, -1 } }; diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 33778df0afa..01422bb7908 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -605,7 +605,7 @@ st_copy_buffer_subdata(struct gl_context *ctx, /* buffer should not already be mapped */ assert(!_mesa_check_disallowed_mapping(src)); - assert(!_mesa_check_disallowed_mapping(dst)); + /* dst can be mapped, just not the same range as the target range */ u_box_1d(readOffset, size, &box); -- 2.30.2