mesa: compute _PipeFormat and _ElementSize after checking if the format changed

Split _mesa_set_vertex_format into 2 functions and set the derived fields
after we know that the format is different.

This skips _PipeFormat and _ElementSize recomputation every time we get
gl*Pointer with the same format.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20287>
This commit is contained in:
Marek Olšák 2022-12-12 00:45:11 -05:00
parent 6a8c1d5043
commit 8e89f07fc8

View file

@ -644,19 +644,27 @@ vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format,
return pipe_format;
}
void
_mesa_set_vertex_format(struct gl_vertex_format *vertex_format,
GLubyte size, GLenum16 type, GLenum16 format,
GLboolean normalized, GLboolean integer,
GLboolean doubles)
static void
set_vertex_format_user(union gl_vertex_format_user *vertex_format,
GLubyte size, GLenum16 type, GLenum16 format,
GLboolean normalized, GLboolean integer,
GLboolean doubles)
{
assert(size <= 4);
vertex_format->User.Type = type;
vertex_format->User.Bgra = format == GL_BGRA;
vertex_format->User.Size = size;
vertex_format->User.Normalized = normalized;
vertex_format->User.Integer = integer;
vertex_format->User.Doubles = doubles;
vertex_format->Type = type;
vertex_format->Bgra = format == GL_BGRA;
vertex_format->Size = size;
vertex_format->Normalized = normalized;
vertex_format->Integer = integer;
vertex_format->Doubles = doubles;
}
static void
recompute_vertex_format_fields(struct gl_vertex_format *vertex_format,
GLubyte size, GLenum16 type, GLenum16 format,
GLboolean normalized, GLboolean integer,
GLboolean doubles)
{
vertex_format->_ElementSize = _mesa_bytes_per_vertex_attrib(size, type);
assert(vertex_format->_ElementSize <= 4*sizeof(double));
vertex_format->_PipeFormat =
@ -666,6 +674,18 @@ _mesa_set_vertex_format(struct gl_vertex_format *vertex_format,
assert(vertex_format->_PipeFormat <= 255);
}
void
_mesa_set_vertex_format(struct gl_vertex_format *vertex_format,
GLubyte size, GLenum16 type, GLenum16 format,
GLboolean normalized, GLboolean integer,
GLboolean doubles)
{
set_vertex_format_user(&vertex_format->User, size, type, format,
normalized, integer, doubles);
recompute_vertex_format_fields(vertex_format, size, type, format,
normalized, integer, doubles);
}
/**
* Examine the API profile and extensions to determine which types are legal
@ -754,20 +774,22 @@ _mesa_update_array_format(struct gl_context *ctx,
GLuint relativeOffset)
{
struct gl_array_attributes *const array = &vao->VertexAttrib[attrib];
struct gl_vertex_format new_format;
union gl_vertex_format_user new_format;
assert(!vao->SharedAndImmutable);
assert(size <= 4);
_mesa_set_vertex_format(&new_format, size, type, format,
normalized, integer, doubles);
set_vertex_format_user(&new_format, size, type, format,
normalized, integer, doubles);
if ((array->RelativeOffset == relativeOffset) &&
!memcmp(&new_format, &array->Format, sizeof(new_format)))
if (array->RelativeOffset == relativeOffset &&
array->Format.User.All == new_format.All)
return;
array->RelativeOffset = relativeOffset;
array->Format = new_format;
array->Format.User = new_format;
recompute_vertex_format_fields(&array->Format, size, type, format,
normalized, integer, doubles);
if (vao->Enabled & VERT_BIT(attrib)) {
ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;