[PATCH 04/13] glamor: Use glamor_program and GL_LINES for 0-width lines

Markus Wick markus at selfnet.de
Tue May 27 02:24:07 PDT 2014


Hi Keith,

here a small summary of my monolog on #org-devel:

Am 2014-05-13 18:02, schrieb Keith Packard:
>> So in the end, I fear we have to add an offset based on the direction 
>> of
>> the line. But this shouldn't be as hard with instancing :)
> No, we just need to move the lines so that they line up with the GL
> pixel centers.

I don't think it's that easy. The required calculations are all done 
with floats, so they don't guarantee to hit the center of the pixel 
exactly. As a small offset from the center of the pixels affects the 
rasterization, this calculation isn't stable.

>> So neither the first nor the last pixel is defined to be
>> overwritten. I doubt X11 defines the same :/
> I don't understand this -- GL defines the lines rasterization rule to 
> be
> identical to Bresenham's algorithm.

I have reread this part of the 4.4 specs for the thrid time now, but I'm 
still unsure what it guarantees.
In the beginning of 14.5.1, it's defined in the way you're using it. But 
in the second part of this section, they relax this specs again:

"""
Because the initial and final conditions of the diamond-exit rule may be 
difficult
to implement, other line segment rasterization algorithms are allowed, 
subject to
the following rules:

[...]

4. If two line segments share a common endpoint, and both segments are 
either
    x-major (both left-to-right or both right-to-left) or y-major (both 
bottom-to-
    top or both top-to-bottom), then rasterizing both segments may not 
produce
    duplicate fragments, nor may any fragments be omitted so as to 
interrupt
    continuity of the connected segments.
"""

And this relaxed version is incompatible with the former one, eg shown 
by a horizontal from A via B to C (all on the center of pixels):
The lines A->B and C->B are defined to overdraw B in the former case but 
defined to _not_ overdraw B in the second case.

However, I've created a test program for the rasterization rules:
http://pastie.org/9175737
i965 results: http://markus.members.selfnet.de/xorg/gl_lines.png
The result should be a gray surface.

I think we have to move the endpoints to get stable + defined 
rasterization results. But this is as easy with instancing or geometry 
shaders.

What do you want to do on devices which doesn't support any of this 
extensions? imo we could fall back to mi or transfer in software :/

> I actually think that GL's semantics are pretty nice here; it defines
> lines to *never* draw the last pixel. The application can explicitly
> draw one if desired. This eliminates another piece of state without
> reducing functionality, which is pretty sweet.

Yeah, this hack is really nice. As both instancing + geometry shaders 
could be implemented in the same way (draw the first but not the last 
pixel), we could still use it. But the code lacks a comment why we just 
add 1 to some coord.


More information about the xorg-devel mailing list