<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>