[Mesa-dev] [PATCH] i965/Gen6-7: Do not replace texcoords with point coord if not drawing points
Chris Forbes
chrisf at ijw.co.nz
Mon Nov 24 12:32:28 PST 2014
Oops -- this is what I get for dropping that comment in at the last
minute while reviewing the mail and forgetting to adjust the header.
Will resend.
On Tue, Nov 25, 2014 at 9:22 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Mon, Nov 24, 2014 at 2:33 PM, Chris Forbes <chrisf at ijw.co.nz> wrote:
>> Partially fixes broken rendering in Windows-based QtQuick2 apps run through Wine.
>> This library sets all texture units' GL_COORD_REPLACE, leaves point
>> sprite mode enabled, and then draws a triangle fan.
>>
>> Will need a slightly different fix for Gen4-5, but I don't have my old
>> machines in a usable state currently.
>>
>> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
>> ---
>>
>> Note: This isn't quite enough to fix the issues in
>> https://bugs.freedesktop.org/show_bug.cgi?id=84651 --
>> there's still at least one other bug there.
>>
>> src/mesa/drivers/dri/i965/brw_state.h | 2 ++
>> src/mesa/drivers/dri/i965/gen6_sf_state.c | 22 +++++++++++++++++++++-
>> src/mesa/drivers/dri/i965/gen7_sf_state.c | 17 ++++++++++++++++-
>> 3 files changed, 39 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
>> index 209fab1..77dd879 100644
>> --- a/src/mesa/drivers/dri/i965/brw_state.h
>> +++ b/src/mesa/drivers/dri/i965/brw_state.h
>> @@ -271,6 +271,8 @@ calculate_attr_overrides(const struct brw_context *brw,
>> uint32_t *point_sprite_enables,
>> uint32_t *flat_enables,
>> uint32_t *urb_entry_read_length);
>> +bool
>> +brw_is_drawing_points(struct brw_context *brw);
>>
>> /* gen6_surface_state.c */
>> void gen6_init_vtable_surface_functions(struct brw_context *brw);
>> diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c
>> index 24d2754..ed8baa6 100644
>> --- a/src/mesa/drivers/dri/i965/gen6_sf_state.c
>> +++ b/src/mesa/drivers/dri/i965/gen6_sf_state.c
>> @@ -222,6 +222,17 @@ calculate_attr_overrides(const struct brw_context *brw,
>
> Something got majorly messed up. This should have been +222,18 not
> +222,17. This makes git am (and patch) very unhappy. Somehow a fake-o
> newline must have gotten in to confuse git.
>
>> }
>>
>>
>> +bool
>> +brw_is_drawing_points(struct brw_context *brw)
>> +{
>> + /* Determine if the primitives *reaching the SF* are points. */
>
> Oops?
>
>> + struct gl_context *ctx = &brw->ctx;
>> + if (ctx->GeometryProgram._Current)
>> + return ctx->GeometryProgram._Current->OutputType == GL_POINTS;
>> + else
>> + return brw->primitive == _3DPRIM_POINTLIST;
>> +}
>> +
>> +
>> static void
>> upload_sf_state(struct brw_context *brw)
>> {
>> @@ -380,6 +391,14 @@ upload_sf_state(struct brw_context *brw)
>> dw1 |= (urb_entry_read_length << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT |
>> urb_entry_read_offset << GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT);
>>
>> + /* The SandyBridge PRM doesn't explicitly say that point sprite enables
>> + * must be programmed to zero when rendering non-point primitives, but
>> + * the IvyBridge PRM does, and if we don't, we get garbage:
>> + */
>> + /* BRW_NEW_PRIMITIVE | _NEW_PROGRAM */
>> + if (!brw_is_drawing_points(brw))
>> + point_sprite_enables = 0;
>> +
>> BEGIN_BATCH(20);
>> OUT_BATCH(_3DSTATE_SF << 16 | (20 - 2));
>> OUT_BATCH(dw1);
>> @@ -411,7 +430,8 @@ const struct brw_tracked_state gen6_sf_state = {
>> _NEW_MULTISAMPLE),
>> .brw = (BRW_NEW_CONTEXT |
>> BRW_NEW_FRAGMENT_PROGRAM |
>> - BRW_NEW_VUE_MAP_GEOM_OUT),
>> + BRW_NEW_VUE_MAP_GEOM_OUT |
>> + BRW_NEW_PRIMITIVE),
>> .cache = CACHE_NEW_WM_PROG
>> },
>> .emit = upload_sf_state,
>> diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c
>> index 109b825..90ac199 100644
>> --- a/src/mesa/drivers/dri/i965/gen7_sf_state.c
>> +++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c
>> @@ -78,6 +78,20 @@ upload_sbe_state(struct brw_context *brw)
>> OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16);
>> }
>>
>> + /* From the Ivybridge PRM, Vol 2 Part 1, 3DSTATE_SBE,
>> + * description of dw10 Point Sprite Texture Coordinate Enable:
>> + *
>> + * "This field must be programmed to zero when non-point primitives
>> + * are rendered."
>> + *
>> + * FINISHME: No longer required on Haswell, so we could avoid wasting
>> + * a bit of batch space on primitive changes by splitting this atom
>> + * into a Haswell variant.
>> + */
>> + /* BRW_NEW_PRIMITIVE | _NEW_PROGRAM */
>> + if (!brw_is_drawing_points(brw))
>> + point_sprite_enables = 0;
>> +
>> OUT_BATCH(point_sprite_enables); /* dw10 */
>> OUT_BATCH(flat_enables);
>> OUT_BATCH(0); /* wrapshortest enables 0-7 */
>> @@ -93,7 +107,8 @@ const struct brw_tracked_state gen7_sbe_state = {
>> _NEW_PROGRAM),
>> .brw = (BRW_NEW_CONTEXT |
>> BRW_NEW_FRAGMENT_PROGRAM |
>> - BRW_NEW_VUE_MAP_GEOM_OUT),
>> + BRW_NEW_VUE_MAP_GEOM_OUT |
>> + BRW_NEW_PRIMITIVE),
>> .cache = CACHE_NEW_WM_PROG
>> },
>> .emit = upload_sbe_state,
>> --
>> 2.1.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list