draw: make sure clipdistances work with geometry shaders

we were always fetching the info from the vertex shader, but if
geometry shader is present it should be used as the source of
that info.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
Zack Rusin
2013-06-05 18:06:06 -04:00
parent 3dacb7d40b
commit c1a50f5ed7
6 changed files with 22 additions and 2 deletions
@@ -111,7 +111,8 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs,
if (flags & DO_CLIP_USER) {
unsigned ucp_mask = ucp_enable;
int num_written_clipdistance = pvs->draw->vs.vertex_shader->info.num_written_clipdistance;
int num_written_clipdistance =
draw_current_shader_num_written_clipdistances(pvs->draw);
while (ucp_mask) {
unsigned plane_idx = ffs(ucp_mask)-1;
ucp_mask &= ~(1 << plane_idx);
+11
View File
@@ -737,9 +737,20 @@ draw_current_shader_clipvertex_output(const struct draw_context *draw)
uint
draw_current_shader_clipdistance_output(const struct draw_context *draw, int index)
{
if (draw->gs.geometry_shader)
return draw->gs.geometry_shader->clipdistance_output[index];
return draw->vs.clipdistance_output[index];
}
uint
draw_current_shader_num_written_clipdistances(const struct draw_context *draw)
{
if (draw->gs.geometry_shader)
return draw->gs.geometry_shader->info.num_written_clipdistance;
return draw->vs.vertex_shader->info.num_written_clipdistance;
}
/**
* Return a pointer/handle for a driver/CSO rasterizer object which
* disabled culling, stippling, unfilled tris, etc.
+6
View File
@@ -791,6 +791,12 @@ draw_create_geometry_shader(struct draw_context *draw,
gs->position_output = i;
if (gs->info.output_semantic_name[i] == TGSI_SEMANTIC_VIEWPORT_INDEX)
gs->viewport_index_output = i;
if (gs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPDIST) {
if (gs->info.output_semantic_index[i] == 0)
gs->clipdistance_output[0] = i;
else
gs->clipdistance_output[1] = i;
}
}
gs->machine = draw->gs.tgsi.machine;
+1
View File
@@ -67,6 +67,7 @@ struct draw_geometry_shader {
struct tgsi_shader_info info;
unsigned position_output;
unsigned viewport_index_output;
unsigned clipdistance_output[2];
unsigned max_output_vertices;
unsigned primitive_boundary;
@@ -389,6 +389,7 @@ uint draw_current_shader_position_output(const struct draw_context *draw);
uint draw_current_shader_viewport_index_output(const struct draw_context *draw);
uint draw_current_shader_clipvertex_output(const struct draw_context *draw);
uint draw_current_shader_clipdistance_output(const struct draw_context *draw, int index);
uint draw_current_shader_num_written_clipdistances(const struct draw_context *draw);
int draw_alloc_extra_vertex_attrib(struct draw_context *draw,
uint semantic_name, uint semantic_index);
void draw_remove_extra_vertex_attribs(struct draw_context *draw);
+1 -1
View File
@@ -196,7 +196,7 @@ tgsi_scan_shader(const struct tgsi_token *tokens,
info->output_semantic_index[reg] = (ubyte)fulldecl->Semantic.Index;
info->num_outputs++;
if (procType == TGSI_PROCESSOR_VERTEX &&
if ((procType == TGSI_PROCESSOR_VERTEX || procType == TGSI_PROCESSOR_GEOMETRY) &&
fulldecl->Semantic.Name == TGSI_SEMANTIC_CLIPDIST) {
info->num_written_clipdistance += util_bitcount(fulldecl->Declaration.UsageMask);
}