On 09/26/2011 12:05 PM, Eric Anholt wrote:
On Fri, 23 Sep 2011 17:37:45 -0700, Chad Versace<c...@chad-versace.us> wrote:
For example, GL_TRIANLES is converted to _3DPRIM_TRILIST.
missing a "G"
Thanks.
-static const GLenum reduced_prim[GL_POLYGON+1] = {
- GL_POINTS,
- GL_LINES,
- GL_LINES,
- GL_LINES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES
+static const GLenum
+brw_get_reduced_prim(uint32_t hw_prim)
+{
+ switch (hw_prim) {
+ case _3DPRIM_POINTLIST: return GL_POINTS;
+ case _3DPRIM_LINELIST: return GL_LINES;
+ case _3DPRIM_LINELOOP: return GL_LINES;
+ case _3DPRIM_LINESTRIP: return GL_LINES;
+ case _3DPRIM_TRILIST: return GL_TRIANGLES;
+ case _3DPRIM_TRISTRIP: return GL_TRIANGLES;
+ case _3DPRIM_TRIFAN: return GL_TRIANGLES;
+ case _3DPRIM_QUADLIST: return GL_TRIANGLES;
+ case _3DPRIM_QUADSTRIP: return GL_TRIANGLES;
+ case _3DPRIM_POLYGON: return GL_TRIANGLES;
+ default: assert(0); return 0;
+ }
};
I always get scared by changes from tables to switch statements in hot
paths because I don't trust gcc. I haven't tested to see whether it
does the wrong thing, though.
I investigated what gcc did here with -O3, and it did not do the obvious thing.
So I'll convert these back to lookup tables in v2.
@@ -79,41 +83,40 @@ static const GLenum reduced_prim[GL_POLYGON+1] = {
* programs be immune to the active primitive (ie. cope with all
* possibilities). That may not be realistic however.
*/
-static GLuint brw_set_prim(struct brw_context *brw,
+static void brw_set_prim(struct brw_context *brw,
const struct _mesa_prim *prim)
{
struct gl_context *ctx =&brw->intel.ctx;
- GLenum mode = prim->mode;
+ uint32_t hw_prim;
DBG("PRIM: %s\n", _mesa_lookup_enum_by_nr(prim->mode));
/* Slight optimization to avoid the GS program when not needed:
*/
- if (mode == GL_QUAD_STRIP&&
- ctx->Light.ShadeModel != GL_FLAT&&
- ctx->Polygon.FrontMode == GL_FILL&&
- ctx->Polygon.BackMode == GL_FILL)
- mode = GL_TRIANGLE_STRIP;
-
- if (prim->mode == GL_QUADS&& prim->count == 4&&
+ if (prim->mode == GL_QUAD_STRIP&&
ctx->Light.ShadeModel != GL_FLAT&&
ctx->Polygon.FrontMode == GL_FILL&&
ctx->Polygon.BackMode == GL_FILL) {
- mode = GL_TRIANGLE_FAN;
+ hw_prim = _3DPRIM_TRISTRIP;
+ } else if (prim->mode == GL_QUADS&& prim->count == 4&&
+ ctx->Light.ShadeModel != GL_FLAT&&
+ ctx->Polygon.FrontMode == GL_FILL&&
+ ctx->Polygon.BackMode == GL_FILL) {
+ hw_prim = _3DPRIM_TRIFAN;
+ } else {
+ hw_prim = prim_to_hw_prim[prim->mode];
}
Hmm, you know, this little optimization only matters to pre-snb (I would
guess that it's a marginally bad thing on snb). That doesn't leave much
of this function shared between the two.
How about I precede this commit with
i965: Split brw_set_prim into brw/gen6 variants
The "slight optimization to avoid the GS program" in brw_set_prim() is not
used by Gen 6, since Gen 6 doesn't use a GS program. Also, Gen 6 doesn't use
reduced primitives.
- if (mode != brw->primitive) {
- brw->primitive = mode;
+ if (hw_prim != brw->primitive) {
+ brw->primitive = hw_prim;
brw->state.dirty.brw |= BRW_NEW_PRIMITIVE;
if (brw->intel.gen< 6&&
- reduced_prim[mode] != brw->intel.reduced_primitive) {
- brw->intel.reduced_primitive = reduced_prim[mode];
+ brw->intel.reduced_primitive != brw_get_reduced_prim(hw_prim)) {
+ brw->intel.reduced_primitive = brw_get_reduced_prim(hw_prim);
brw->state.dirty.brw |= BRW_NEW_REDUCED_PRIMITIVE;
}
}
-
- return prim_to_hw_prim[mode];
}
--
Chad Versace
c...@chad-versace.us
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev