<div dir="ltr">There are also a pile of places where we look at rb->Name == 0 to determine if it's a window-system framebuffer<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 7, 2018 at 4:01 PM, Fritz Koenig <span dir="ltr"><<a href="mailto:frkoenig@google.com" target="_blank">frkoenig@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Instead of using _mesa_is_winsys_fbo or<br>
_mesa_is_user_fbo to infer if an fbo is<br>
flipped use the InvertedY flag.<br>
---<br>
 src/mesa/drivers/dri/i965/brw_<wbr>blorp.c         |  2 +-<br>
 src/mesa/drivers/dri/i965/brw_<wbr>meta_util.c     |  4 +-<br>
 src/mesa/drivers/dri/i965/brw_<wbr>sf.c            |  6 +--<br>
 src/mesa/drivers/dri/i965/<wbr>genX_state_upload.c | 50 +++++++++----------<br>
 src/mesa/drivers/dri/i965/<wbr>intel_extensions.c  |  1 +<br>
 .../drivers/dri/i965/intel_<wbr>pixel_bitmap.c     |  8 +--<br>
 src/mesa/drivers/dri/i965/<wbr>intel_pixel_copy.c  |  4 +-<br>
 src/mesa/drivers/dri/i965/<wbr>intel_pixel_draw.c  |  2 +-<br>
 8 files changed, 39 insertions(+), 38 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_blorp.c b/src/mesa/drivers/dri/i965/<wbr>brw_blorp.c<br>
index 8c6d77e1b7..bc32c7b39c 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_blorp.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_blorp.c<br>
@@ -685,7 +685,7 @@ brw_blorp_copytexsubimage(<wbr>struct brw_context *brw,<br>
    /* Account for the fact that in the system framebuffer, the origin is at<br>
     * the lower left.<br>
     */<br>
-   bool mirror_y = _mesa_is_winsys_fbo(ctx-><wbr>ReadBuffer);<br>
+   bool mirror_y = ctx->ReadBuffer->InvertedY;<br>
    if (mirror_y)<br>
       apply_y_flip(&srcY0, &srcY1, src_rb->Height);<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_meta_util.c b/src/mesa/drivers/dri/i965/<wbr>brw_meta_util.c<br>
index d292f5a8e2..ad671f600d 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_meta_util.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_meta_util.c<br>
@@ -250,13 +250,13 @@ brw_meta_mirror_clip_and_<wbr>scissor(const struct gl_context *ctx,<br>
    /* Account for the fact that in the system framebuffer, the origin is at<br>
     * the lower left.<br>
     */<br>
-   if (_mesa_is_winsys_fbo(read_fb)) {<br>
+   if (read_fb->InvertedY) {<br>
       GLint tmp = read_fb->Height - *srcY0;<br>
       *srcY0 = read_fb->Height - *srcY1;<br>
       *srcY1 = tmp;<br>
       *mirror_y = !*mirror_y;<br>
    }<br>
-   if (_mesa_is_winsys_fbo(draw_fb)) {<br>
+   if (draw_fb->InvertedY) {<br>
       GLint tmp = draw_fb->Height - *dstY0;<br>
       *dstY0 = draw_fb->Height - *dstY1;<br>
       *dstY1 = tmp;<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_sf.c b/src/mesa/drivers/dri/i965/<wbr>brw_sf.c<br>
index 37ce999dc0..25fe9b3dfe 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_sf.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_sf.c<br>
@@ -90,7 +90,7 @@ brw_upload_sf_prog(struct brw_context *brw)<br>
       return;<br>
<br>
    /* _NEW_BUFFERS */<br>
-   bool render_to_fbo = _mesa_is_user_fbo(ctx-><wbr>DrawBuffer);<br>
+   bool inverted_y = ctx->DrawBuffer->InvertedY;<br>
<br>
    memset(&key, 0, sizeof(key));<br>
<br>
@@ -137,7 +137,7 @@ brw_upload_sf_prog(struct brw_context *brw)<br>
     * Window coordinates in a FBO are inverted, which means point<br>
     * sprite origin must be inverted, too.<br>
     */<br>
-   if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo)<br>
+   if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) == inverted_y)<br>
       key.sprite_origin_lower_left = true;<br>
<br>
    /* BRW_NEW_FS_PROG_DATA */<br>
@@ -161,7 +161,7 @@ brw_upload_sf_prog(struct brw_context *brw)<br>
        * face orientation, just as we invert the viewport in<br>
        * sf_unit_create_from_key().<br>
        */<br>
-      key.frontface_ccw = brw->polygon_front_bit == render_to_fbo;<br>
+      key.frontface_ccw = brw->polygon_front_bit != inverted_y;<br>
    }<br>
<br>
    if (!brw_search_cache(&brw-><wbr>cache, BRW_CACHE_SF_PROG,<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>genX_state_upload.c b/src/mesa/drivers/dri/i965/<wbr>genX_state_upload.c<br>
index 88fde9d12f..b5f3b6c92a 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>genX_state_upload.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>genX_state_upload.c<br>
@@ -217,7 +217,7 @@ genX(upload_polygon_stipple)(<wbr>struct brw_context *brw)<br>
        * to a FBO (i.e. any named frame buffer object), we *don't*<br>
        * need to invert - we already match the layout.<br>
        */<br>
-      if (_mesa_is_winsys_fbo(ctx-><wbr>DrawBuffer)) {<br>
+      if (ctx->DrawBuffer->InvertedY) {<br>
          for (unsigned i = 0; i < 32; i++)<br>
             poly.PatternRow[i] = ctx->PolygonStipple[31 - i]; /* invert */<br>
       } else {<br>
@@ -257,7 +257,7 @@ genX(upload_polygon_stipple_<wbr>offset)(struct brw_context *brw)<br>
        * to a user-created FBO then our native pixel coordinate system<br>
        * works just fine, and there's no window system to worry about.<br>
        */<br>
-      if (_mesa_is_winsys_fbo(ctx-><wbr>DrawBuffer)) {<br>
+      if (ctx->DrawBuffer->InvertedY) {<br>
          poly.PolygonStippleYOffset =<br>
             (32 - (_mesa_geometric_height(ctx-><wbr>DrawBuffer) & 31)) & 31;<br>
       }<br>
@@ -1468,7 +1468,7 @@ genX(upload_clip_state)(struct brw_context *brw)<br>
 #endif<br>
<br>
 #if GEN_GEN == 7<br>
-      clip.FrontWinding = brw->polygon_front_bit == _mesa_is_user_fbo(fb);<br>
+      clip.FrontWinding = brw->polygon_front_bit != fb->InvertedY;<br>
<br>
       if (ctx->Polygon.CullFlag) {<br>
          switch (ctx->Polygon.CullFaceMode) {<br>
@@ -1583,7 +1583,7 @@ genX(upload_sf)(struct brw_context *brw)<br>
<br>
 #if GEN_GEN <= 7<br>
    /* _NEW_BUFFERS */<br>
-   bool render_to_fbo = _mesa_is_user_fbo(ctx-><wbr>DrawBuffer);<br>
+   bool inverted_y = ctx->DrawBuffer->InvertedY;<br>
    UNUSED const bool multisampled_fbo =<br>
       _mesa_geometric_samples(ctx-><wbr>DrawBuffer) > 1;<br>
 #endif<br>
@@ -1635,7 +1635,7 @@ genX(upload_sf)(struct brw_context *brw)<br>
<br>
 #if GEN_GEN <= 7<br>
       /* _NEW_POLYGON */<br>
-      sf.FrontWinding = brw->polygon_front_bit == render_to_fbo;<br>
+      sf.FrontWinding = brw->polygon_front_bit != inverted_y;<br>
 #if GEN_GEN >= 6<br>
       sf.<wbr>GlobalDepthOffsetEnableSolid = ctx->Polygon.OffsetFill;<br>
       sf.<wbr>GlobalDepthOffsetEnableWirefra<wbr>me = ctx->Polygon.OffsetLine;<br>
@@ -1773,7 +1773,7 @@ genX(upload_sf)(struct brw_context *brw)<br>
        * Window coordinates in an FBO are inverted, which means point<br>
        * sprite origin must be inverted, too.<br>
        */<br>
-      if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {<br>
+      if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) == inverted_y) {<br>
          sf.<wbr>PointSpriteTextureCoordinateOr<wbr>igin = LOWERLEFT;<br>
       } else {<br>
          sf.<wbr>PointSpriteTextureCoordinateOr<wbr>igin = UPPERLEFT;<br>
@@ -2338,7 +2338,7 @@ const struct brw_tracked_state genX(cc_vp) = {<br>
<br>
 static void<br>
 set_scissor_bits(const struct gl_context *ctx, int i,<br>
-                 bool render_to_fbo, unsigned fb_width, unsigned fb_height,<br>
+                 bool inverted_y, unsigned fb_width, unsigned fb_height,<br>
                  struct GENX(SCISSOR_RECT) *sc)<br>
 {<br>
    int bbox[4];<br>
@@ -2360,7 +2360,7 @@ set_scissor_bits(const struct gl_context *ctx, int i,<br>
       sc->ScissorRectangleXMax = 0;<br>
       sc->ScissorRectangleYMin = 1;<br>
       sc->ScissorRectangleYMax = 0;<br>
-   } else if (render_to_fbo) {<br>
+   } else if (!inverted_y) {<br>
       /* texmemory: Y=0=bottom */<br>
       sc->ScissorRectangleXMin = bbox[0];<br>
       sc->ScissorRectangleXMax = bbox[1] - 1;<br>
@@ -2380,7 +2380,7 @@ static void<br>
 genX(upload_scissor_state)(<wbr>struct brw_context *brw)<br>
 {<br>
    struct gl_context *ctx = &brw->ctx;<br>
-   const bool render_to_fbo = _mesa_is_user_fbo(ctx-><wbr>DrawBuffer);<br>
+   const bool inverted_y = ctx->DrawBuffer->InvertedY;<br>
    struct GENX(SCISSOR_RECT) scissor;<br>
    uint32_t scissor_state_offset;<br>
    const unsigned int fb_width = _mesa_geometric_width(ctx-><wbr>DrawBuffer);<br>
@@ -2404,7 +2404,7 @@ genX(upload_scissor_state)(<wbr>struct brw_context *brw)<br>
     * inclusive but max is exclusive.<br>
     */<br>
    for (unsigned i = 0; i < viewport_count; i++) {<br>
-      set_scissor_bits(ctx, i, render_to_fbo, fb_width, fb_height, &scissor);<br>
+      set_scissor_bits(ctx, i, inverted_y, fb_width, fb_height, &scissor);<br>
       GENX(SCISSOR_RECT_pack)(<br>
          NULL, scissor_map + i * GENX(SCISSOR_RECT_length), &scissor);<br>
    }<br>
@@ -2519,7 +2519,7 @@ genX(upload_sf_clip_viewport)(<wbr>struct brw_context *brw)<br>
    const unsigned viewport_count = brw->clip.viewport_count;<br>
<br>
    /* _NEW_BUFFERS */<br>
-   const bool render_to_fbo = _mesa_is_user_fbo(ctx-><wbr>DrawBuffer);<br>
+   const bool inverted_y = ctx->DrawBuffer->InvertedY;<br>
    const uint32_t fb_width = (float)_mesa_geometric_width(<wbr>ctx->DrawBuffer);<br>
    const uint32_t fb_height = (float)_mesa_geometric_height(<wbr>ctx->DrawBuffer);<br>
<br>
@@ -2543,12 +2543,12 @@ genX(upload_sf_clip_viewport)(<wbr>struct brw_context *brw)<br>
 #endif<br>
<br>
    /* _NEW_BUFFERS */<br>
-   if (render_to_fbo) {<br>
-      y_scale = 1.0;<br>
-      y_bias = 0;<br>
-   } else {<br>
+   if (inverted_y) {<br>
       y_scale = -1.0;<br>
       y_bias = (float)fb_height;<br>
+   } else {<br>
+      y_scale = 1.0;<br>
+      y_bias = 0;<br>
    }<br>
<br>
    for (unsigned i = 0; i < brw->clip.viewport_count; i++) {<br>
@@ -2576,7 +2576,7 @@ genX(upload_sf_clip_viewport)(<wbr>struct brw_context *brw)<br>
       clv.YMaxClipGuardband = gb_ymax;<br>
<br>
 #if GEN_GEN < 6<br>
-      set_scissor_bits(ctx, i, render_to_fbo, fb_width, fb_height,<br>
+      set_scissor_bits(ctx, i, inverted_y, fb_width, fb_height,<br>
                        &sfv.ScissorRectangle);<br>
 #elif GEN_GEN >= 8<br>
       /* _NEW_VIEWPORT | _NEW_BUFFERS: Screen Space Viewport<br>
@@ -2593,16 +2593,16 @@ genX(upload_sf_clip_viewport)(<wbr>struct brw_context *brw)<br>
       const float viewport_Ymax =<br>
          MIN2(ctx->ViewportArray[i].Y + ctx->ViewportArray[i].Height, fb_height);<br>
<br>
-      if (render_to_fbo) {<br>
+      if (inverted_y) {<br>
          sfv.XMinViewPort = viewport_Xmin;<br>
          sfv.XMaxViewPort = viewport_Xmax - 1;<br>
-         sfv.YMinViewPort = viewport_Ymin;<br>
-         sfv.YMaxViewPort = viewport_Ymax - 1;<br>
+         sfv.YMinViewPort = fb_height - viewport_Ymax;<br>
+         sfv.YMaxViewPort = fb_height - viewport_Ymin - 1;<br>
       } else {<br>
          sfv.XMinViewPort = viewport_Xmin;<br>
          sfv.XMaxViewPort = viewport_Xmax - 1;<br>
-         sfv.YMinViewPort = fb_height - viewport_Ymax;<br>
-         sfv.YMaxViewPort = fb_height - viewport_Ymin - 1;<br>
+         sfv.YMinViewPort = viewport_Ymin;<br>
+         sfv.YMaxViewPort = viewport_Ymax - 1;<br>
       }<br>
 #endif<br>
<br>
@@ -3533,14 +3533,14 @@ genX(upload_sbe)(struct brw_context *brw)<br>
       sbe.NumberofSFOutputAttributes = wm_prog_data->num_varying_<wbr>inputs;<br>
<br>
       /* _NEW_BUFFERS */<br>
-      bool render_to_fbo = _mesa_is_user_fbo(ctx-><wbr>DrawBuffer);<br>
+      bool inverted_y = ctx->DrawBuffer->InvertedY;<br>
<br>
       /* _NEW_POINT<br>
        *<br>
        * Window coordinates in an FBO are inverted, which means point<br>
        * sprite origin must be inverted.<br>
        */<br>
-      if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo)<br>
+      if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) == inverted_y)<br>
          sbe.<wbr>PointSpriteTextureCoordinateOr<wbr>igin = LOWERLEFT;<br>
       else<br>
          sbe.<wbr>PointSpriteTextureCoordinateOr<wbr>igin = UPPERLEFT;<br>
@@ -4438,7 +4438,7 @@ genX(upload_raster)(struct brw_context *brw)<br>
    const struct gl_context *ctx = &brw->ctx;<br>
<br>
    /* _NEW_BUFFERS */<br>
-   const bool render_to_fbo = _mesa_is_user_fbo(ctx-><wbr>DrawBuffer);<br>
+   const bool inverted_y = ctx->DrawBuffer->InvertedY;<br>
<br>
    /* _NEW_POLYGON */<br>
    const struct gl_polygon_attrib *polygon = &ctx->Polygon;<br>
@@ -4447,7 +4447,7 @@ genX(upload_raster)(struct brw_context *brw)<br>
    const struct gl_point_attrib *point = &ctx->Point;<br>
<br>
    brw_batch_emit(brw, GENX(3DSTATE_RASTER), raster) {<br>
-      if (brw->polygon_front_bit == render_to_fbo)<br>
+      if (brw->polygon_front_bit != inverted_y)<br>
          raster.FrontWinding = CounterClockwise;<br>
<br>
       if (polygon->CullFlag) {<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_extensions.c b/src/mesa/drivers/dri/i965/<wbr>intel_extensions.c<br>
index 5a9369d7b4..9746f3399a 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_extensions.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_extensions.c<br>
@@ -120,6 +120,7 @@ intelInitExtensions(struct gl_context *ctx)<br>
    ctx->Extensions.APPLE_object_<wbr>purgeable = true;<br>
    ctx->Extensions.ATI_separate_<wbr>stencil = true;<br>
    ctx->Extensions.ATI_texture_<wbr>env_combine3 = true;<br>
+   ctx->Extensions.MESA_<wbr>framebuffer_flip_y = true;<br>
    ctx->Extensions.MESA_pack_<wbr>invert = true;<br>
    ctx->Extensions.NV_<wbr>conditional_render = true;<br>
    ctx->Extensions.NV_fog_<wbr>distance = true;<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_pixel_bitmap.c b/src/mesa/drivers/dri/i965/<wbr>intel_pixel_bitmap.c<br>
index f9d4829416..bc5f018403 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_pixel_bitmap.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_pixel_bitmap.c<br>
@@ -158,10 +158,10 @@ static GLuint get_bitmap_rect(GLsizei width, GLsizei height,<br>
 static inline int<br>
 y_flip(struct gl_framebuffer *fb, int y, int height)<br>
 {<br>
-   if (_mesa_is_user_fbo(fb))<br>
-      return y;<br>
-   else<br>
+   if (fb->InvertedY)<br>
       return fb->Height - y - height;<br>
+   else<br>
+      return y;<br>
 }<br>
<br>
 /*<br>
@@ -283,7 +283,7 @@ do_blit_bitmap( struct gl_context *ctx,<br>
                                      w, h,<br>
                                      (GLubyte *)stipple,<br>
                                      8,<br>
-                                     _mesa_is_winsys_fbo(fb));<br>
+                                     fb->InvertedY);<br>
          if (count == 0)<br>
            continue;<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_pixel_copy.c b/src/mesa/drivers/dri/i965/<wbr>intel_pixel_copy.c<br>
index 31838cce13..e5f888732c 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_pixel_copy.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_pixel_copy.c<br>
@@ -170,9 +170,9 @@ do_blit_copypixels(struct gl_context * ctx,<br>
<br>
    if (!intel_miptree_blit(brw,<br>
                            read_irb->mt, read_irb->mt_level, read_irb->mt_layer,<br>
-                           srcx, srcy, _mesa_is_winsys_fbo(read_fb),<br>
+                           srcx, srcy, read_fb->InvertedY,<br>
                            draw_irb->mt, draw_irb->mt_level, draw_irb->mt_layer,<br>
-                           dstx, dsty, _mesa_is_winsys_fbo(fb),<br>
+                           dstx, dsty, fb->InvertedY,<br>
                            width, height,<br>
                            (ctx->Color.<wbr>ColorLogicOpEnabled ?<br>
                             ctx->Color._LogicOp : COLOR_LOGICOP_COPY))) {<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_pixel_draw.c b/src/mesa/drivers/dri/i965/<wbr>intel_pixel_draw.c<br>
index d5d1b99e69..67b697caed 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_pixel_draw.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_pixel_draw.c<br>
@@ -127,7 +127,7 @@ do_blit_drawpixels(struct gl_context * ctx,<br>
                            pbo_mt, 0, 0,<br>
                            0, 0, src_flip,<br>
                            irb->mt, irb->mt_level, irb->mt_layer,<br>
-                           x, y, _mesa_is_winsys_fbo(ctx-><wbr>DrawBuffer),<br>
+                           x, y, ctx->DrawBuffer->InvertedY,<br>
                            width, height, COLOR_LOGICOP_COPY)) {<br>
       DBG("%s: blit failed\n", __func__);<br>
       intel_miptree_release(&pbo_mt)<wbr>;<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.18.0.rc1.242.g61856ae69a-<wbr>goog<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>