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>
This commit is contained in:
Marek Olšák 2022-11-17 12:02:16 -05:00 committed by Marge Bot
parent ba91328444
commit c924cfae42

View file

@ -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,