summaryrefslogtreecommitdiff
path: root/src/mesa/main
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2022-11-17 12:02:16 -0500
committerMarge Bot <emma+marge@anholt.net>2022-11-22 11:12:28 +0000
commitc924cfae4296d07a4bfb54139e33f68723f5f7a8 (patch)
tree7363e3c68f880cf36a05c89836e8a65657c448c1 /src/mesa/main
parentba9132844403da10eea25d327d7c706c70f84d49 (diff)
mesa: add no_error support into get_buffer_target()
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Acked-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19844>
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/bufferobj.c64
1 files changed, 34 insertions, 30 deletions
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index 3948141ea11..b21328596fd 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,