aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/main/clear.c
diff options
context:
space:
mode:
authorErik Faye-Lund <[email protected]>2018-09-10 22:11:16 +0200
committerErik Faye-Lund <[email protected]>2018-09-19 11:52:53 +0200
commitfb86365148d5b8f3f06c5e42d9c8440fc1f6693f (patch)
tree7efeefe05188467f60bbd035fc2ab1f518961c58 /src/mesa/main/clear.c
parent0c82e3603e195e7b0b3ba39caada6d3ff070076f (diff)
mesa: only update framebuffer-state for clears
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 <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/main/clear.c')
-rw-r--r--src/mesa/main/clear.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
index 6beff9ed842..3d2ca490c9b 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)