From c924cfae4296d07a4bfb54139e33f68723f5f7a8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 17 Nov 2022 12:02:16 -0500 Subject: [PATCH] mesa: add no_error support into get_buffer_target() Reviewed-by: Alyssa Rosenzweig Acked-by: Adam Jackson Part-of: --- src/mesa/main/bufferobj.c | 64 +++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index 3948141..b213285 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -662,11 +662,11 @@ static struct gl_buffer_object DummyBufferObject = { * \return pointer to pointer to the buffer object bound to \c target in the * specified context or \c NULL if \c target is invalid. */ -static inline struct gl_buffer_object ** -get_buffer_target(struct gl_context *ctx, GLenum target) +static ALWAYS_INLINE struct gl_buffer_object ** +get_buffer_target(struct gl_context *ctx, GLenum target, bool no_error) { /* Other targets are only supported in desktop OpenGL and OpenGL ES 3.0. */ - if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) { + if (!no_error && !_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) { switch (target) { case GL_ARRAY_BUFFER: case GL_ELEMENT_ARRAY_BUFFER: @@ -692,58 +692,61 @@ get_buffer_target(struct gl_context *ctx, GLenum target) case GL_COPY_WRITE_BUFFER: return &ctx->CopyWriteBuffer; case GL_QUERY_BUFFER: - if (_mesa_has_ARB_query_buffer_object(ctx)) + if (no_error || _mesa_has_ARB_query_buffer_object(ctx)) return &ctx->QueryBuffer; break; case GL_DRAW_INDIRECT_BUFFER: - if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_draw_indirect) || + if (no_error || + (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_draw_indirect) || _mesa_is_gles31(ctx)) { return &ctx->DrawIndirectBuffer; } break; case GL_PARAMETER_BUFFER_ARB: - if (_mesa_has_ARB_indirect_parameters(ctx)) { + if (no_error || _mesa_has_ARB_indirect_parameters(ctx)) { return &ctx->ParameterBuffer; } break; case GL_DISPATCH_INDIRECT_BUFFER: - if (_mesa_has_compute_shaders(ctx)) { + if (no_error || _mesa_has_compute_shaders(ctx)) { return &ctx->DispatchIndirectBuffer; } break; case GL_TRANSFORM_FEEDBACK_BUFFER: - if (ctx->Extensions.EXT_transform_feedback) { + if (no_error || ctx->Extensions.EXT_transform_feedback) { return &ctx->TransformFeedback.CurrentBuffer; } break; case GL_TEXTURE_BUFFER: - if (_mesa_has_ARB_texture_buffer_object(ctx) || + if (no_error || + _mesa_has_ARB_texture_buffer_object(ctx) || _mesa_has_OES_texture_buffer(ctx)) { return &ctx->Texture.BufferObject; } break; case GL_UNIFORM_BUFFER: - if (ctx->Extensions.ARB_uniform_buffer_object) { + if (no_error || ctx->Extensions.ARB_uniform_buffer_object) { return &ctx->UniformBuffer; } break; case GL_SHADER_STORAGE_BUFFER: - if (ctx->Extensions.ARB_shader_storage_buffer_object || _mesa_is_gles31(ctx)) { + if (no_error || + ctx->Extensions.ARB_shader_storage_buffer_object || + _mesa_is_gles31(ctx)) { return &ctx->ShaderStorageBuffer; } break; case GL_ATOMIC_COUNTER_BUFFER: - if (ctx->Extensions.ARB_shader_atomic_counters || _mesa_is_gles31(ctx)) { + if (no_error || + ctx->Extensions.ARB_shader_atomic_counters || _mesa_is_gles31(ctx)) { return &ctx->AtomicBuffer; } break; case GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD: - if (ctx->Extensions.AMD_pinned_memory) { + if (no_error || ctx->Extensions.AMD_pinned_memory) { return &ctx->ExternalVirtualMemoryBuffer; } break; - default: - return NULL; } return NULL; } @@ -761,7 +764,7 @@ static inline struct gl_buffer_object * get_buffer(struct gl_context *ctx, const char *func, GLenum target, GLenum error) { - struct gl_buffer_object **bufObj = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObj = get_buffer_target(ctx, target, false); if (!bufObj) { _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func); @@ -1535,7 +1538,7 @@ _mesa_BindBuffer_no_error(GLenum target, GLuint buffer) { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target); + struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target, true); bind_buffer_object(ctx, bindTarget, buffer, true); } @@ -1550,7 +1553,7 @@ _mesa_BindBuffer(GLenum target, GLuint buffer) _mesa_enum_to_string(target), buffer); } - struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target); + struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target, false); if (!bindTarget) { _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferARB(target %s)", _mesa_enum_to_string(target)); @@ -1565,7 +1568,7 @@ _mesa_InternalBindElementBuffer(struct gl_context *ctx, struct gl_buffer_object *buf) { struct gl_buffer_object **bindTarget = - get_buffer_target(ctx, GL_ELEMENT_ARRAY_BUFFER); + get_buffer_target(ctx, GL_ELEMENT_ARRAY_BUFFER, false); /* Move the buffer reference from the parameter to the bind point. */ _mesa_reference_buffer_object(ctx, bindTarget, NULL); @@ -2246,7 +2249,8 @@ inlined_buffer_storage(GLenum target, GLuint buffer, GLsizeiptr size, } } else { if (no_error) { - struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObjPtr = + get_buffer_target(ctx, target, true); bufObj = *bufObjPtr; } else { bufObj = get_buffer(ctx, func, target, GL_INVALID_OPERATION); @@ -2473,7 +2477,7 @@ _mesa_BufferData_no_error(GLenum target, GLsizeiptr size, const GLvoid *data, { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bufObj = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObj = get_buffer_target(ctx, target, true); buffer_data_no_error(ctx, *bufObj, target, size, data, usage, "glBufferData"); } @@ -2622,7 +2626,7 @@ buffer_sub_data(GLenum target, GLuint buffer, GLintptr offset, } } else { if (no_error) { - struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target, true); bufObj = *bufObjPtr; } else { bufObj = get_buffer(ctx, func, target, GL_INVALID_OPERATION); @@ -2853,7 +2857,7 @@ _mesa_ClearBufferData_no_error(GLenum target, GLenum internalformat, { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bufObj = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObj = get_buffer_target(ctx, target, true); clear_buffer_sub_data_no_error(ctx, *bufObj, internalformat, 0, (*bufObj)->Size, format, type, data, "glClearBufferData", false); @@ -2931,7 +2935,7 @@ _mesa_ClearBufferSubData_no_error(GLenum target, GLenum internalformat, { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bufObj = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObj = get_buffer_target(ctx, target, true); clear_buffer_sub_data_no_error(ctx, *bufObj, internalformat, offset, size, format, type, data, "glClearBufferSubData", true); @@ -3076,7 +3080,7 @@ GLboolean GLAPIENTRY _mesa_UnmapBuffer_no_error(GLenum target) { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target, true); struct gl_buffer_object *bufObj = *bufObjPtr; return unmap_buffer(ctx, bufObj); @@ -3422,10 +3426,10 @@ _mesa_CopyBufferSubData_no_error(GLenum readTarget, GLenum writeTarget, { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **src_ptr = get_buffer_target(ctx, readTarget); + struct gl_buffer_object **src_ptr = get_buffer_target(ctx, readTarget, true); struct gl_buffer_object *src = *src_ptr; - struct gl_buffer_object **dst_ptr = get_buffer_target(ctx, writeTarget); + struct gl_buffer_object **dst_ptr = get_buffer_target(ctx, writeTarget, true); struct gl_buffer_object *dst = *dst_ptr; bufferobj_copy_subdata(ctx, src, dst, readOffset, writeOffset, @@ -3754,7 +3758,7 @@ _mesa_MapBufferRange_no_error(GLenum target, GLintptr offset, { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target, true); struct gl_buffer_object *bufObj = *bufObjPtr; return map_buffer_range(ctx, bufObj, offset, length, access, @@ -3882,7 +3886,7 @@ _mesa_MapBuffer_no_error(GLenum target, GLenum access) GLbitfield accessFlags; get_map_buffer_access_flags(ctx, access, &accessFlags); - struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target, true); struct gl_buffer_object *bufObj = *bufObjPtr; return map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags, @@ -4037,7 +4041,7 @@ _mesa_FlushMappedBufferRange_no_error(GLenum target, GLintptr offset, GLsizeiptr length) { GET_CURRENT_CONTEXT(ctx); - struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target); + struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target, true); struct gl_buffer_object *bufObj = *bufObjPtr; _mesa_bufferobj_flush_mapped_range(ctx, offset, length, bufObj, -- 2.7.4