mesa: skip extra state updates for clear calls

The glClear call updates draw state in the same way as other draw calls
with _mesa_update_state func

If currently used shader uses textures, _mesa_update_state will try to
update the shader texture state

But if the texture not set yet, before glClear call, it will detect
incompleted texture and will create dummy texture with default values
(see the update_single_program_texture func).
And this will be complete waste of time for glClear

Closes: #7128

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18459>
This commit is contained in:
Illia Polishchuk 2022-09-12 10:36:17 +03:00 committed by Marge Bot
parent 0971868b8b
commit 1d15dc04b5
3 changed files with 29 additions and 6 deletions

View file

@ -140,7 +140,7 @@ color_buffer_writes_enabled(const struct gl_context *ctx, unsigned idx)
* \param mask bit-mask indicating the buffers to be cleared.
*
* Flushes the vertices and verifies the parameter.
* If __struct gl_contextRec::NewState is set then calls _mesa_update_state()
* If __struct gl_contextRec::NewState is set then calls _mesa_update_clear_state()
* to update gl_frame_buffer::_Xmin, etc. If the rasterization mode is set to
* GL_RENDER then requests the driver to clear the buffers, via the
* dd_function_table::Clear callback.
@ -170,7 +170,7 @@ clear(struct gl_context *ctx, GLbitfield mask, bool no_error)
}
if (ctx->NewState) {
_mesa_update_state( ctx ); /* update _Xmin, etc */
_mesa_update_clear_state( ctx ); /* update _Xmin, etc */
}
if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
@ -349,7 +349,7 @@ clear_bufferiv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer,
FLUSH_VERTICES(ctx, 0, 0);
if (ctx->NewState) {
_mesa_update_state( ctx );
_mesa_update_clear_state( ctx );
}
if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
@ -468,7 +468,7 @@ clear_bufferuiv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer,
FLUSH_VERTICES(ctx, 0, 0);
if (ctx->NewState) {
_mesa_update_state( ctx );
_mesa_update_clear_state( ctx );
}
if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
@ -562,7 +562,7 @@ clear_bufferfv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer,
FLUSH_VERTICES(ctx, 0, 0);
if (ctx->NewState) {
_mesa_update_state( ctx );
_mesa_update_clear_state( ctx );
}
if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
@ -722,7 +722,7 @@ clear_bufferfi(struct gl_context *ctx, GLenum buffer, GLint drawbuffer,
return;
if (ctx->NewState) {
_mesa_update_state( ctx );
_mesa_update_clear_state( ctx );
}
if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {

View file

@ -503,6 +503,23 @@ _mesa_update_state( struct gl_context *ctx )
_mesa_unlock_context_textures(ctx);
}
/* This is the usual entrypoint for state updates in glClear calls:
*/
void
_mesa_update_clear_state( struct gl_context *ctx )
{
GLbitfield new_state = ctx->NewState;
if (MESA_VERBOSE & VERBOSE_STATE)
_mesa_print_state("_mesa_update_clear_state", new_state);
if (new_state & _NEW_BUFFERS) {
_mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer);
st_invalidate_buffers(st_context(ctx));
ctx->NewState &= ~_NEW_BUFFERS;
}
}
/**
* Used by drivers to tell core Mesa that the driver is going to

View file

@ -40,6 +40,12 @@ _mesa_update_state(struct gl_context *ctx);
extern void
_mesa_update_state_locked(struct gl_context *ctx);
/*
* Update state for glClear calls
*/
extern void
_mesa_update_clear_state(struct gl_context *ctx);
extern void
_mesa_set_vp_override(struct gl_context *ctx, GLboolean flag);