mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 22:08:26 +02:00
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 <erik.faye-lund@collabora.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
0c82e3603e
commit
fb86365148
1 changed files with 20 additions and 14 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue