Series LGTM.
Reviewed-by: Brian Paul <bri...@vmware.com>


On 02/22/2017 05:07 PM, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

If a VAO isn't bound and u_vbuf isn't enabled because of the Core profile,
we'll get user vertex buffers in drivers if we update vertex buffers
in glClear. So don't do that.

This fixes a regression since disabling u_vbuf for Core profiles.
---
  src/mesa/state_tracker/st_atom.c          | 10 ++++++++++
  src/mesa/state_tracker/st_atom.h          |  7 +++++++
  src/mesa/state_tracker/st_cb_clear.c      |  2 +-
  src/mesa/state_tracker/st_cb_fbo.c        |  2 +-
  src/mesa/state_tracker/st_cb_msaa.c       |  2 +-
  src/mesa/state_tracker/st_cb_readpixels.c |  2 +-
  6 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
index 65ac517..4bef342 100644
--- a/src/mesa/state_tracker/st_atom.c
+++ b/src/mesa/state_tracker/st_atom.c
@@ -169,20 +169,30 @@ void st_validate_state( struct st_context *st, enum 
st_pipeline pipeline )
     case ST_PIPELINE_RENDER:
        if (st->ctx->API == API_OPENGL_COMPAT)
           check_attrib_edgeflag(st);

        check_program_state(st);
        st_manager_validate_framebuffers(st);

        pipeline_mask = ST_PIPELINE_RENDER_STATE_MASK;
        break;

+   case ST_PIPELINE_CLEAR:
+      st_manager_validate_framebuffers(st);
+      pipeline_mask = ST_PIPELINE_CLEAR_STATE_MASK;
+      break;
+
+   case ST_PIPELINE_UPDATE_FRAMEBUFFER:
+      st_manager_validate_framebuffers(st);
+      pipeline_mask = ST_PIPELINE_UPDATE_FB_STATE_MASK;
+      break;
+
     case ST_PIPELINE_COMPUTE: {
        struct st_compute_program *old_cp = st->cp;
        struct gl_program *new_cp = ctx->ComputeProgram._Current;

        if (new_cp != &old_cp->Base) {
           if (old_cp)
              st->dirty |= old_cp->affected_states;
           assert(new_cp);
           st->dirty |= st_compute_program(new_cp)->affected_states;
        }
diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h
index 37e382c..45c3e48 100644
--- a/src/mesa/state_tracker/st_atom.h
+++ b/src/mesa/state_tracker/st_atom.h
@@ -36,20 +36,22 @@

  #include "main/glheader.h"

  struct st_context;

  /**
   * Enumeration of state tracker pipelines.
   */
  enum st_pipeline {
     ST_PIPELINE_RENDER,
+   ST_PIPELINE_CLEAR,
+   ST_PIPELINE_UPDATE_FRAMEBUFFER,
     ST_PIPELINE_COMPUTE,
  };

  struct st_tracked_state {
     void (*update)( struct st_context *st );
  };


  void st_init_atoms( struct st_context *st );
  void st_destroy_atoms( struct st_context *st );
@@ -138,15 +140,20 @@ enum {
                                   ST_NEW_SAMPLERS | \
                                   ST_NEW_CONSTANTS | \
                                   ST_NEW_UNIFORM_BUFFER | \
                                   ST_NEW_ATOMIC_BUFFER | \
                                   ST_NEW_STORAGE_BUFFER | \
                                   ST_NEW_IMAGE_UNITS)

  /* All state flags within each group: */
  #define ST_PIPELINE_RENDER_STATE_MASK  (ST_NEW_CS_STATE - 1)
  #define ST_PIPELINE_COMPUTE_STATE_MASK (0xffllu << ST_NEW_CS_STATE_INDEX)
+#define ST_PIPELINE_CLEAR_STATE_MASK (ST_NEW_FB_STATE | \
+                                      ST_NEW_SCISSOR | \
+                                      ST_NEW_WINDOW_RECTANGLES)
+/* For ReadPixels, ReadBuffer, GetSamplePosition: */
+#define ST_PIPELINE_UPDATE_FB_STATE_MASK (ST_NEW_FB_STATE)

  #define ST_ALL_STATES_MASK (ST_PIPELINE_RENDER_STATE_MASK | \
                              ST_PIPELINE_COMPUTE_STATE_MASK)

  #endif
diff --git a/src/mesa/state_tracker/st_cb_clear.c 
b/src/mesa/state_tracker/st_cb_clear.c
index 158efc1..f507775 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -399,21 +399,21 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
     struct gl_renderbuffer *stencilRb
        = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
     GLbitfield quad_buffers = 0x0;
     GLbitfield clear_buffers = 0x0;
     GLuint i;

     st_flush_bitmap_cache(st);
     st_invalidate_readpix_cache(st);

     /* This makes sure the pipe has the latest scissor, etc values */
-   st_validate_state( st, ST_PIPELINE_RENDER );
+   st_validate_state(st, ST_PIPELINE_CLEAR);

     if (mask & BUFFER_BITS_COLOR) {
        for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
           GLint b = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];

           if (b >= 0 && mask & (1 << b)) {
              struct gl_renderbuffer *rb
                 = ctx->DrawBuffer->Attachment[b].Renderbuffer;
              struct st_renderbuffer *strb = st_renderbuffer(rb);
              int colormask_index = ctx->Extensions.EXT_draw_buffers2 ? i : 0;
diff --git a/src/mesa/state_tracker/st_cb_fbo.c 
b/src/mesa/state_tracker/st_cb_fbo.c
index d762ca6..78433bf 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -727,21 +727,21 @@ st_ReadBuffer(struct gl_context *ctx, GLenum buffer)
     /* Check if we need to allocate a front color buffer.
      * Front buffers are often allocated on demand (other color buffers are
      * always allocated in advance).
      */
     if ((fb->_ColorReadBufferIndex == BUFFER_FRONT_LEFT ||
          fb->_ColorReadBufferIndex == BUFFER_FRONT_RIGHT) &&
         fb->Attachment[fb->_ColorReadBufferIndex].Type == GL_NONE) {
        /* add the buffer */
        st_manager_add_color_renderbuffer(st, fb, fb->_ColorReadBufferIndex);
        _mesa_update_state(ctx);
-      st_validate_state(st, ST_PIPELINE_RENDER);
+      st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
     }
  }



  /**
   * Called via ctx->Driver.MapRenderbuffer.
   */
  static void
  st_MapRenderbuffer(struct gl_context *ctx,
diff --git a/src/mesa/state_tracker/st_cb_msaa.c 
b/src/mesa/state_tracker/st_cb_msaa.c
index 22001e4..7f1b4fd 100644
--- a/src/mesa/state_tracker/st_cb_msaa.c
+++ b/src/mesa/state_tracker/st_cb_msaa.c
@@ -38,21 +38,21 @@


  static void
  st_GetSamplePosition(struct gl_context *ctx,
                       struct gl_framebuffer *fb,
                       GLuint index,
                       GLfloat *outPos)
  {
     struct st_context *st = st_context(ctx);

-   st_validate_state(st, ST_PIPELINE_RENDER);
+   st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);

     if (st->pipe->get_sample_position)
        st->pipe->get_sample_position(st->pipe,
                                      _mesa_geometric_samples(fb),
                                      index, outPos);
     else
        outPos[0] = outPos[1] = 0.5f;
  }


diff --git a/src/mesa/state_tracker/st_cb_readpixels.c 
b/src/mesa/state_tracker/st_cb_readpixels.c
index 2bcc6be..ec6fd37 100644
--- a/src/mesa/state_tracker/st_cb_readpixels.c
+++ b/src/mesa/state_tracker/st_cb_readpixels.c
@@ -410,21 +410,21 @@ st_ReadPixels(struct gl_context *ctx, GLint x, GLint y,
     struct pipe_resource *src;
     struct pipe_resource *dst = NULL;
     enum pipe_format dst_format, src_format;
     unsigned bind;
     struct pipe_transfer *tex_xfer;
     ubyte *map = NULL;
     int dst_x, dst_y;

     /* Validate state (to be sure we have up-to-date framebuffer surfaces)
      * and flush the bitmap cache prior to reading. */
-   st_validate_state(st, ST_PIPELINE_RENDER);
+   st_validate_state(st, ST_PIPELINE_UPDATE_FRAMEBUFFER);
     st_flush_bitmap_cache(st);

     if (!st->prefer_blit_based_texture_transfer) {
        goto fallback;
     }

     /* This must be done after state validation. */
     src = strb->texture;

     /* XXX Fallback for depth-stencil formats due to an incomplete


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

Reply via email to