diff options
author | Keith Whitwell <keithw@vmware.com> | 2009-12-09 19:03:10 +0100 |
---|---|---|
committer | Roland Scheidegger <sroland@vmware.com> | 2009-12-09 19:03:10 +0100 |
commit | a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa (patch) | |
tree | 595ffc983588c5441c39ff11c3a089e521f94e53 /src/gallium/auxiliary/draw/draw_pt_fetch.c | |
parent | 59f6af51b858340139fe2139e2698fef8a5ad62f (diff) | |
download | external_mesa3d-a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa.zip external_mesa3d-a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa.tar.gz external_mesa3d-a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa.tar.bz2 |
gallium: first steps to treat edgeflags as regular vertex element
The idea here is to eliminate the set_edgeflags() call in pipe_context
by treating edgeflags as a regular vertex element.
Edgeflags provoke special treatment in hardware, which means we need to
label them in some way, in this case we'll be passing them through the
vertex shader and labelling the vertex shader output with a new TGSI
semantic (TGSI_SEMANTIC_EDGEFLAG).
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_pt_fetch.c')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_fetch.c | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c b/src/gallium/auxiliary/draw/draw_pt_fetch.c index 65c3a34..cb609f8 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c @@ -120,7 +120,12 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch, fetch->translate = translate_cache_find(fetch->cache, &key); { - static struct vertex_header vh = { 0, 1, 0, UNDEFINED_VERTEX_ID, { .0f, .0f, .0f, .0f } }; + static struct vertex_header vh = { 0, + 1, + 0, + UNDEFINED_VERTEX_ID, + { .0f, .0f, .0f, .0f } }; + fetch->translate->set_buffer(fetch->translate, draw->pt.nr_vertex_buffers, &vh, @@ -128,9 +133,6 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch, } } - fetch->need_edgeflags = ((draw->rasterizer->fill_cw != PIPE_POLYGON_MODE_FILL || - draw->rasterizer->fill_ccw != PIPE_POLYGON_MODE_FILL) && - draw->pt.user.edgeflag); } @@ -158,16 +160,10 @@ void draw_pt_fetch_run( struct pt_fetch *fetch, count, verts ); - /* Edgeflags are hard to fit into a translate program, populate - * them separately if required. In the setup above they are - * defaulted to one, so only need this if there is reason to change - * that default: + /* Extract edgeflag values from vertex data into the header. */ if (fetch->need_edgeflags) { - for (i = 0; i < count; i++) { - struct vertex_header *vh = (struct vertex_header *)(verts + i * fetch->vertex_size); - vh->edgeflag = draw_pt_get_edgeflag( draw, elts[i] ); - } + extract_edge_flags( fetch, count ); } } @@ -194,16 +190,12 @@ void draw_pt_fetch_run_linear( struct pt_fetch *fetch, count, verts ); - /* Edgeflags are hard to fit into a translate program, populate - * them separately if required. In the setup above they are - * defaulted to one, so only need this if there is reason to change - * that default: + /* Extract edgeflag values from vertex data into the header. XXX: + * this should be done after the vertex shader is run. + * Bypass-vs-and-clip interaction with pipeline??? */ if (fetch->need_edgeflags) { - for (i = 0; i < count; i++) { - struct vertex_header *vh = (struct vertex_header *)(verts + i * fetch->vertex_size); - vh->edgeflag = draw_pt_get_edgeflag( draw, start + i ); - } + extract_edge_flags( fetch, count ); } } |