If we update the program-state etc, we risk compiling needless shaders,
which can cost quite a bit of performance.

Signed-off-by: Erik Faye-Lund <erik.faye-l...@collabora.com>
---
This was motivated by seeing an unexpected shader-compile with
nonsensical state on start-up in glxgears.

 src/mesa/main/clear.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
index 6beff9ed84..3d2ca490c9 100644
--- a/src/mesa/main/clear.c
+++ b/src/mesa/main/clear.c
@@ -35,6 +35,7 @@
 #include "context.h"
 #include "enums.h"
 #include "fbobject.h"
+#include "framebuffer.h"
 #include "get.h"
 #include "macros.h"
 #include "mtypes.h"
@@ -135,10 +136,10 @@ 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()
- * 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.
+ * If __struct gl_contextRec::NewState contains _NEW_BUFFERS then calls
+ * _mesa_update_framebuffer() 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.
  */
 static ALWAYS_INLINE void
 clear(struct gl_context *ctx, GLbitfield mask, bool no_error)
@@ -165,8 +166,9 @@ clear(struct gl_context *ctx, GLbitfield mask, bool 
no_error)
       }
    }
 
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );       /* update _Xmin, etc */
+   if (ctx->NewState & _NEW_BUFFERS) {
+      _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); /* 
update _Xmin, etc */
+      ctx->NewState &= ~_NEW_BUFFERS;
    }
 
    if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
@@ -346,8 +348,9 @@ clear_bufferiv(struct gl_context *ctx, GLenum buffer, GLint 
drawbuffer,
    FLUSH_VERTICES(ctx, 0);
    FLUSH_CURRENT(ctx, 0);
 
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
+   if (ctx->NewState & _NEW_BUFFERS) {
+      _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer);
+      ctx->NewState &= ~_NEW_BUFFERS;
    }
 
    switch (buffer) {
@@ -460,8 +463,9 @@ clear_bufferuiv(struct gl_context *ctx, GLenum buffer, 
GLint drawbuffer,
    FLUSH_VERTICES(ctx, 0);
    FLUSH_CURRENT(ctx, 0);
 
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
+   if (ctx->NewState & _NEW_BUFFERS) {
+      _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer);
+      ctx->NewState &= ~_NEW_BUFFERS;
    }
 
    switch (buffer) {
@@ -549,8 +553,9 @@ clear_bufferfv(struct gl_context *ctx, GLenum buffer, GLint 
drawbuffer,
    FLUSH_VERTICES(ctx, 0);
    FLUSH_CURRENT(ctx, 0);
 
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
+   if (ctx->NewState & _NEW_BUFFERS) {
+      _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer);
+      ctx->NewState &= ~_NEW_BUFFERS;
    }
 
    switch (buffer) {
@@ -691,8 +696,9 @@ clear_bufferfi(struct gl_context *ctx, GLenum buffer, GLint 
drawbuffer,
    if (ctx->RasterDiscard)
       return;
 
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
+   if (ctx->NewState & _NEW_BUFFERS) {
+      _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer);
+      ctx->NewState &= ~_NEW_BUFFERS;
    }
 
    if (ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer)
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to