The point state is complex, there are actually a lot of variations
built into GL itself which aren't obvious on first reading of the
spec.  Probably the most obscure is that wide points and point sprites
are specified to actually be rasterized differently, ie color
different pixels.  I'm doing this from memory, but Roland dug into it
in depth.  Wide points have an explicit set of rules for which pixels
they cover, but point sprites are to be rasterized with the same rules
as a quad of similar size (again from memory).  The docs do explain
it, but it's complex none the less, and I do still wonder if there is
a clear way of capturing all the variations.

On Wed, Aug 25, 2010 at 3:57 AM, Marek Olšák
<[email protected]> wrote:
> Module: Mesa
> Branch: master
> Commit: 879a73023189eed488db2840b829aa5c78e5ba3f
> URL:    
> http://cgit.freedesktop.org/mesa/mesa/commit/?id=879a73023189eed488db2840b829aa5c78e5ba3f
>
> Author: Marek Olšák <[email protected]>
> Date:   Wed Aug 25 04:55:01 2010 +0200
>
> r300g: fix gl_PointCoord
>
> Is this hackish or is this the correct way to use point_quad_rasterization?
> Copied from nvfx.
>
> ---
>
>  src/gallium/drivers/r300/r300_state.c |    9 +++++++--
>  1 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/r300/r300_state.c 
> b/src/gallium/drivers/r300/r300_state.c
> index 3e35d7a..47e359c 100644
> --- a/src/gallium/drivers/r300/r300_state.c
> +++ b/src/gallium/drivers/r300/r300_state.c
> @@ -950,6 +950,11 @@ static void* r300_create_rs_state(struct pipe_context* 
> pipe,
>     rs->rs = *state;
>     rs->rs_draw = *state;
>
> +    /* Generate point sprite texture coordinates in GENERIC0
> +     * if point_quad_rasterization is TRUE. */
> +    rs->rs.sprite_coord_enable = state->point_quad_rasterization *
> +                                 (state->sprite_coord_enable | 1);
> +
>     /* Override some states for Draw. */
>     rs->rs_draw.sprite_coord_enable = 0; /* We can do this in HW. */
>
> @@ -1051,10 +1056,10 @@ static void* r300_create_rs_state(struct 
> pipe_context* pipe,
>
>     /* Point sprites */
>     stuffing_enable = 0;
> -    if (state->sprite_coord_enable) {
> +    if (rs->rs.sprite_coord_enable) {
>         stuffing_enable = R300_GB_POINT_STUFF_ENABLE;
>         for (i = 0; i < 8; i++) {
> -            if (state->sprite_coord_enable & (1 << i))
> +            if (rs->rs.sprite_coord_enable & (1 << i))
>                 stuffing_enable |=
>                     R300_GB_TEX_ST << (R300_GB_TEX0_SOURCE_SHIFT + (i*2));
>         }
>
> _______________________________________________
> mesa-commit mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
>
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to