[Mesa-dev] [PATCH] i965: fix inverted point sprite origin when rendering to FBO
Jonathan Coome
jcoome at fastmail.co.uk
Fri Jan 20 05:00:10 PST 2012
On 19/01/2012 23:48, Yuanhan Liu wrote:
> When rendering to FBO, rendering is inverted. At the same time, we would
> also make sure the point sprite origin is inverted. Or, we will get an
> inverted result correspoinding to rendering to the default winsys FBO.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44613
>
> NOTE: This is a candidate for stable release branches.
>
> v2: add the simliar logic to ivb, too (comments from Ian)
> simplify the logic operation (comments from Brian)
>
> v3: pick a better comment from Eric
> use != for the logic instead of ^ (comments from Ian)
>
> Signed-off-by: Yuanhan Liu <yuanhan.liu at linux.intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_defines.h | 1 +
> src/mesa/drivers/dri/i965/gen6_sf_state.c | 13 +++++++++++--
> src/mesa/drivers/dri/i965/gen7_sf_state.c | 18 +++++++++++++++---
> 3 files changed, 27 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
> index 4d90a99..029be87 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -1128,6 +1128,7 @@ enum brw_message_target {
> /* DW1 (for gen6) */
> # define GEN6_SF_NUM_OUTPUTS_SHIFT 22
> # define GEN6_SF_SWIZZLE_ENABLE (1 << 21)
> +# define GEN6_SF_POINT_SPRITE_UPPERLEFT (0 << 20)
> # define GEN6_SF_POINT_SPRITE_LOWERLEFT (1 << 20)
> # define GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT 11
> # define GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT 4
> diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> index 548c5a3..163b54c 100644
> --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c
> @@ -129,6 +129,7 @@ upload_sf_state(struct brw_context *brw)
> float point_size;
> uint16_t attr_overrides[FRAG_ATTRIB_MAX];
> bool userclip_active;
> + uint32_t point_sprite_origin;
>
> /* _NEW_TRANSFORM */
> userclip_active = (ctx->Transform.ClipPlanesEnabled != 0);
> @@ -258,8 +259,16 @@ upload_sf_state(struct brw_context *brw)
> /* Clamp to the hardware limits and convert to fixed point */
> dw4 |= U_FIXED(CLAMP(point_size, 0.125, 255.875), 3);
>
> - if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT)
> - dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;
> + /*
> + * Window coordinates in an FBO are inverted, which means point
> + * sprite origin must be inverted, too.
> + */
> + if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {
> + point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;
> + } else {
> + point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;
> + }
> + dw1 |= point_sprite_origin;
>
> /* _NEW_LIGHT */
> if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) {
> diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c
> index 7691cb2..da7ef81 100644
> --- a/src/mesa/drivers/dri/i965/gen7_sf_state.c
> +++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c
> @@ -48,6 +48,9 @@ upload_sbe_state(struct brw_context *brw)
> int urb_entry_read_offset = 1;
> bool userclip_active = (ctx->Transform.ClipPlanesEnabled != 0);
> uint16_t attr_overrides[FRAG_ATTRIB_MAX];
> + /* _NEW_BUFFERS */
> + bool render_to_fbo = ctx->DrawBuffer->Name != 0;
> + uint32_t point_sprite_origin;
>
> brw_compute_vue_map(&vue_map, intel, userclip_active, vs_outputs_written);
> urb_entry_read_length = (vue_map.num_slots + 1)/2 - urb_entry_read_offset;
> @@ -65,9 +68,18 @@ upload_sbe_state(struct brw_context *brw)
> urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
> urb_entry_read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT;
>
> - /* _NEW_POINT */
> - if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT)
> - dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;
> + /* _NEW_POINT
> + *
> + * Window coordinates in an FBO are inverted, which means point
> + * sprite origin must be inverted.
> + */
> + if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {
> + point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;
> + } else {
> + point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;
> + }
> + dw1 |= point_sprite_origin;
> +
>
> dw10 = 0;
> dw11 = 0;
Is there any need for GEN6_SF_POINT_SPRITE_UPPERLEFT? It's basically 0,
so the | operation with dw1 won't have any effect, and you could remove
the else clauses. And if you wanted to clear the bit, I think you'd need
to do something like this instead:
if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {
dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;
} else {
dw1 &= ~GEN6_SF_POINT_SPRITE_LOWERLEFT;
}
-Jonathan
More information about the mesa-dev
mailing list