For example, GL_TRIANLES is converted to _3DPRIM_TRILIST. The conversion is necessary because HiZ and MSAA resolve operations emit a 3DPRIM_RECTLIST, which cannot be conveyed by GLenum.
As a consequence, brw_gs_prog_key.primitive is also converted. Signed-off-by: Chad Versace <c...@chad-versace.us> --- src/mesa/drivers/dri/i965/brw_context.h | 2 +- src/mesa/drivers/dri/i965/brw_draw.c | 67 ++++++++++++++++--------------- src/mesa/drivers/dri/i965/brw_gs.c | 44 +++++++++++--------- src/mesa/drivers/dri/i965/brw_gs.h | 2 +- 4 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 177aa67..96c3733 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -585,7 +585,7 @@ struct brw_query_object { struct brw_context { struct intel_context intel; /**< base class, must be first field */ - GLuint primitive; + uint32_t primitive; /**< Hardware primitive, one of _3DPRIM_*. */ GLboolean emit_state_always; GLboolean has_surface_tile_offset; diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index a7becb3..351f351 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -59,18 +59,22 @@ static GLuint prim_to_hw_prim[GL_POLYGON+1] = { _3DPRIM_POLYGON }; - -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; + } }; @@ -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]; } - 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]; } @@ -319,7 +322,6 @@ static GLboolean brw_try_draw_prims( struct gl_context *ctx, intel_prepare_render(intel); for (i = 0; i < nr_prims; i++) { - uint32_t hw_prim; int estimated_max_prim_size; estimated_max_prim_size = 512; /* batchbuffer commands */ @@ -336,7 +338,8 @@ static GLboolean brw_try_draw_prims( struct gl_context *ctx, */ intel_batchbuffer_require_space(intel, estimated_max_prim_size, false); - hw_prim = brw_set_prim(brw, &prim[i]); + brw_set_prim(brw, &prim[i]); + if (brw->state.dirty.brw) { brw_validate_state(brw); @@ -372,9 +375,9 @@ static GLboolean brw_try_draw_prims( struct gl_context *ctx, } if (intel->gen >= 7) - gen7_emit_prim(brw, &prim[i], hw_prim); + gen7_emit_prim(brw, &prim[i], brw->primitive); else - brw_emit_prim(brw, &prim[i], hw_prim); + brw_emit_prim(brw, &prim[i], brw->primitive); intel->no_batch_wrap = GL_FALSE; diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c index 0a37485..9101d48 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.c +++ b/src/mesa/drivers/dri/i965/brw_gs.c @@ -86,13 +86,13 @@ static void compile_gs_prog( struct brw_context *brw, */ switch (key->primitive) { - case GL_QUADS: + case _3DPRIM_QUADLIST: brw_gs_quads( &c, key ); break; - case GL_QUAD_STRIP: + case _3DPRIM_QUADSTRIP: brw_gs_quad_strip( &c, key ); break; - case GL_LINE_LOOP: + case _3DPRIM_LINELOOP: brw_gs_lines( &c ); break; default: @@ -122,17 +122,22 @@ static void compile_gs_prog( struct brw_context *brw, ralloc_free(mem_ctx); } -static const GLenum gs_prim[GL_POLYGON+1] = { - GL_POINTS, - GL_LINES, - GL_LINE_LOOP, - GL_LINES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_QUADS, - GL_QUAD_STRIP, - GL_TRIANGLES +static const int brw_gs_get_prim(int hw_prim) +{ + switch (hw_prim) { + case _3DPRIM_POINTLIST: return _3DPRIM_POINTLIST; + case _3DPRIM_LINELIST: return _3DPRIM_LINELIST; + case _3DPRIM_LINELOOP: return _3DPRIM_LINELOOP; + case _3DPRIM_LINESTRIP: return _3DPRIM_LINELIST; + case _3DPRIM_TRILIST: return _3DPRIM_TRILIST; + case _3DPRIM_TRISTRIP: return _3DPRIM_TRILIST; + case _3DPRIM_TRIFAN: return _3DPRIM_TRILIST; + case _3DPRIM_QUADLIST: return _3DPRIM_QUADLIST; + case _3DPRIM_QUADSTRIP: return _3DPRIM_QUADSTRIP; + case _3DPRIM_POLYGON: return _3DPRIM_TRILIST; + case _3DPRIM_RECTLIST: return _3DPRIM_RECTLIST; + default: assert(0); return 0; + } }; static void populate_key( struct brw_context *brw, @@ -147,11 +152,12 @@ static void populate_key( struct brw_context *brw, key->attrs = brw->vs.prog_data->outputs_written; /* BRW_NEW_PRIMITIVE */ - key->primitive = gs_prim[brw->primitive]; + key->primitive = brw_gs_get_prim(brw->primitive); /* _NEW_LIGHT */ key->pv_first = (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION); - if (key->primitive == GL_QUADS && ctx->Light.ShadeModel != GL_FLAT) { + if (key->primitive == _3DPRIM_QUADLIST && + ctx->Light.ShadeModel != GL_FLAT) { /* Provide consistent primitive order with brw_set_prim's * optimization of single quads to trifans. */ @@ -163,9 +169,9 @@ static void populate_key( struct brw_context *brw, key->need_gs_prog = (intel->gen >= 6) ? 0 - : (brw->primitive == GL_QUADS || - brw->primitive == GL_QUAD_STRIP || - brw->primitive == GL_LINE_LOOP); + : (brw->primitive == _3DPRIM_QUADLIST || + brw->primitive == _3DPRIM_QUADSTRIP || + brw->primitive == _3DPRIM_LINELOOP); } /* Calculate interpolants for triangle and line rasterization. diff --git a/src/mesa/drivers/dri/i965/brw_gs.h b/src/mesa/drivers/dri/i965/brw_gs.h index d8637c8..5986529 100644 --- a/src/mesa/drivers/dri/i965/brw_gs.h +++ b/src/mesa/drivers/dri/i965/brw_gs.h @@ -41,7 +41,7 @@ struct brw_gs_prog_key { GLbitfield64 attrs; - GLuint primitive:4; + GLuint primitive:8; /*< Hardware primitive, one of _3DPRIM_*. */ GLuint pv_first:1; GLuint need_gs_prog:1; GLuint nr_userclip:4; -- 1.7.6.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev